Hunting Unknown RedTeam CobaltStrike Beacon
- Introduction
- Hunting
- TTPs
- Analysis
- Web service abuse
- Summary
- IOCs
AVTOKYO2022に登壇しました
はじめに
こんにちは。morimolymolyです。
whywaita Advent Calendar 2022 - Adventar 5日目の記事です。
昨日はなはれぽさんのTerraformをローカル環境で勉強できるようにするという記事でした。
今回はAVTOKYO2022に登壇者として参加したので参加ブログを書きます。
続きを読むイベントにおけるCode of Conductの重要性
はじめに
こんにちは。morimolymolyです。 某氏と揉めてさぞ心配&嫌厭なされた方もいらっしゃると思いますので、両者の話し合いも住んだことですし、詳細を伏せてサマリーブログを書こうと思います。
ことの成り行き
某氏が某イベントのアフターパーティにてセクシャリティを弄る行為やセクハラなどを複数人の人間に行いました。 また、そのイベントはCFPで発表者を募っており、私は登壇者として参加していました。 つまり、登壇者の顔すら立てずに(というより登壇内容に触れてくれw)自分のしたいママ、セクハラを続けていたという問題がありました。 そこで「こんな大人がいるのか」と驚き、その場では何も言えませんでしたが、以下の事を考え攻撃することにしました。 *1
「多様性が尊重されて久しい世の中、セクハラやセクシャリティを弄るような行為が“キャラ”として許されるのはどう考えてもおかしい」 「パブリックスペースでけちょんけちょんにしてやれば聴衆も気がつくのでは!」
Code of Conductがあればどうなったのか
Code of Conductがあれば、その場でより上のスタッフを呼び出禁にすることができます。 今回攻撃をしている中でわかったのは、攻撃している僕にメリットが一切ないどころか攻撃的として認識されてしまうことや、そもそも断片的な情報しか得られない第三者が情報不足が故に様々なことを勘ぐってしまうことです。 攻撃をする前に考えておくべきでした。この場を借りて謝罪させていただきます。 パブリックスペースで攻撃をせず、Code of Conductに従うことができればよかったと思っております。
もし、あなたのオーガナイズするイベントにCode of Conductがない場合、すぐさま作ることをおすすめします。
まとめ
某氏との話し合いは付きまして、今ではいざこざなど一切ない状況にあります。 そのため会社や個人に対して攻撃をすることは絶対にしないでください。
*1:今回の被害報告を個人に対する攻撃と解釈した人もいるためここでは自戒の意味も込めて攻撃と言っております。
ドラゴンの力でControl Flowからバイナリ解析を手助けする
はじめに
こんにちは。morimolymolyです。 今日はControl Flow Graphを用いてバイナリ解析を手助けする手法をご紹介いたします。
背景
GoogleCTFのRev問題についてとある人物から連絡を受けました。
「似たような処理がある関数が多数ある場合どのようにして解析していますか?」
基本、私はCFGを見ます。 ですが、CFGを一瞥して似ているなーだけで終わらせるのもあれなのでGhidraスクリプトを書いてみました。
問題は以下のようなかんじでした。
この似たような関数がまとめられると解析が楽になりそうですね。
GhidraスクリプトでCFGを生成する
スクリプトの前に実際に関数のCFGを生成してみましょう。 今回は2つの関数について生成してみます。
このようにしてみるとほぼ同一のコードであることがわかりますね(addとsubだしね)
BasicBlockの数とEdgeの数とで比較してしきい値をもうけて比較検討して関数を自動命名させてやれば解析はぐんと楽になるでしょう。
さて、GhidraスクリプトでCFGを得るにはどうしたら良いのでしょうか。
このAPIを使えば良さそうですが、なんとドキュメントもexampleもなくぶん投げてしまいました!
そのためかんたんのためにBBの数とEdgeの数を計算して求めることにしました。 いかがコードになります。
みたままBBを探して次があればそれも見に行くというコードです。 自動命名までは実装していませんが、それは読者の課題にしておきます(setNameメソッドでかんたんに命名できます)
おわりに
いかがだったでしょうか。 CFGは強力な武器になり得ることが皆様もおわかりかと思いますが、Ghidraではスクリプトの力を用いて更に強力にすることができます。
以上でおわります。
GhidraでBinDiffする
はじめに
どうもこんにちは、morimolymolyです。 最近は完全に体調を崩してしまいました。 さて、今日はGhidraでBindiffする方法を伝授いたします。
背景
2016年03月22日報道のリリースによると、GoogleによりBindiffが無償化されたようです。
また、これに伴いBindiffに必要なExportファイルをGhidraやBinary Ninjaで生成できるツールも公開されました。
GhidraでのBinExport方法
まず、binexportに必要なバージョンのGhidraをインストールします。 binexportのZIPファイルをReleaseからダウンロードします。 その後はGhidraを立ち上げて、「File→Install Extensions」からBinExportを選択します。
次に、検体をインポートした後に自動解析にかけます。 最後に検体のディスアセンブラ画面を閉じて、検体を右クリックしてExportを選択します。 ここで注意したいのは、Binary BinExport (V2) for BinDiffを選択することです。
これでBinExportは成功します。
BinDiffしてみる
BinDiffの使い方は省きますが、難しいところはないでしょう。
CFGレベルでも命令列レベルでも比較ができるので、非常に便利ですね! IDA Proなしでここまでできるのであれば文句はありません!
おわりに
いかがでしたか。 GhidraでBinDiffをやってみました。 実際、私の現状ではBinDiffを使う機会というのが少ないのですが、特定のマルウェアを追いかけている際に、バージョンごとにどのようにことなるのか大雑把に測るには丁度いいツールだと思います。
MoqHaoのiOS用ランディングページの難読化処理
はじめに
こんにちは、morimolymolyです。
MoqHaoの検体をfuckする話はアクティブディフェンス研究所でネタにしましたが、最近はそのインフラについて調査を進めています。
blog.activedefense.co.jp
また、感染端末の電話番号をどのように悪用するのかも調査をしています。
blog.activedefense.co.jp
今回はランディングページに焦点を当てようと思います。
ランディングページ概要
ランディングページには大きく分けてPC、Android、iOSの3つがあります。
SMSで配信されるURLについて、UserAgentを識別して分岐していきます。
PCには404を返し(最近の話ですが)、Androidには配信されるURLにある文字列をパスとして付与したページへ、iOSはduckdnsで取得されたページへ遷移していきます。
PC: 404
Android http://配信URL/特定の文字列
iOS hxxp://hogehoge[.]duckdns[.]org
難読化処理
さて、iOSのランディングページには難読化処理が施されており、IoCを隠す意図があると考えられます。
以下が実際に取得できたランディングページのソースコードです。
moqhao-ios-landing-page.html · GitHub
コードとしては単純で配列にある文字列の最後の要素をkeyとしてXORしてevalするだけです。
すると以下のようなコードが現れ、これを実行します。
alert("APP Storeアカウントは安全異常があるので、再度ログインしてください。");
location.replace('hxxp://yrdlaebbqt.duckdns.org');
たしかにIoCは一見すると取りづらいと思いますが、自動化の手法としてSeleniumなどを用いればかんたんに突破できます。
おわりに
MoqHaoの用いるランディングページの概要とその難読化処理を解説いたしました。
より発展した難読化処理が実装されるだろうことは予見されるため、一応備忘録的に記事を書いてみました。
CS:GOのナイフが奪われた話
はじめに
こんにちは.morimolymolyです.
DeNA 21新卒×22新卒内定者 Advent Calendar 2021の8日目の記事です.
本日は僕が2年前にCS:GOのナイフ(スキン)が奪われて,1.8万の損害を出したことについて書きたいと思います.
CS:GOにおけるスキンとは武器の見た目を切り替えるだけのもので,高級なものだとウン十万円もする代物です.
僕は2万円以下と決めて購入していました.
本記事はインターネット詐欺の撲滅を啓発する目的です.
とある日
陽気な外国人からチャットが届きました.
「Hey, 君のスキンかっこいいね!僕のと交換しない?」
相手のインベントリをみるとなかなかかっこいいスキンがあったため了承しました.
すると相手はBitSkins.comやCS.MONEYなどの正規のウェブサイトで価格の比較をするように指示してきました.
定番のサイトばかりだったので指定されたサイトでログインして比較しました.
その後,相場がわかったので値段を伝えると,じゃあこのスキンと交換しようと,僕のものより少し高いくらいのスキンを提示されました.
喜んで取引を開始し特に何も見ずに承認をすると,手元には何も残っていませんでした.
何がおかしい?
今のやり取りで一体どこに罠があったでしょうか?
- 提示されたサイトにログインしている
- 取引内容をきちんとみていない
この2点に罠がありました.
詐欺の手法
詐欺の手法は以下の通りになっています.
まず詐欺師は正規のサイトに紛れ込ませフィッシングサイトにログインさせます.
被害者はまずトレードのリクエストを送ります.(from:被害者, to:詐欺師)
詐欺師は盗んだ認証情報を用いて,詐欺師のbotが自動的にリクエストをキャンセルし,新しい偽のトレードを作ります(from:被害者, to:詐欺師のbot).
詐欺師のbotは詐欺師と同じプロフィールをしています.
トレードを承認するためにモバイルアプリを用いますが,UIがあまりよくできておらず,偽のトレードだと気づくことが難しいです.(2019年当時)
フィッシングサイト
フィッシングサイトは以下のようになっています.
一見分かりづらいですが,Steamのログイン画面はJSで作られたWindowsの窓にみせかけたフローティングウィンドウです.(picture-in-picture attack)
この攻撃に気が付かないとログイン画面は極めて正当にみえます(URLやSSL表示など)
詐欺サイトは誰が作ったのか?
早速ソースコードをダウンロードし,解析,OSINTを行いました.
github.com
このサイトを販売しているのは,Fakerと呼ばれる人物でした.
Telegram: https://t[.]me/savage67
また詐欺のチュートリアルマニュアルを発見いたしました.
- scam tutorial: https://telegra[.]ph/Coins-v2-Faker-05-01
- scam introduction: https://pastebin[.]com/HMQubyxR-
- scam introduction: https://pastebin[.]com/AXvhC9UF
- scam introduction: https://pastebin[.]com/GYeEV9BG
- scam introduction: https://pastebin[.]com/87v0fULC
Fakerの提供するサービスは以下のサイトにあります.
https://webdev0[.]com/services/
おわりに
現在でもFakerの作成したフィッシングキットは使われているようです.
謎のウェブサイトにログインするときはpicture-in-picture attackなどにも気をつけてログインしましょう.
またトレードの際にはしっかりとトレード内容を確認するようにしましょう.
Out-of-the-box VMIでチートをした話
- はじめに
- Out-of-the-box VMIとは
- memflow
- memflowの使い方
- チートシナリオ
- チートツールを書く
- スタック上の変数の改ざん
- メモリ上のコード領域の改ざん
- 結果
- 対策方法
- 最後に
はじめに
こんにちは.morimolymolyです.
DeNA 21新卒×22新卒内定者 Advent Calendar 2021の2日目の記事です.
DeNAではセキュリティ技術グループでゲームのチート対策などを行っております.
詳しいことは僕のインターン参加ブログをご参照ください.
そんなわけ(?)で今日はチートのかなりベーシックな手法をOut-of-the-box VMIで試したのでご紹介いたします.
Out-of-the-box VMIとは
Virtual Machine Introspectionとは,仮想マシン(VM)を監視・解析するための技術です.
VMIにはOut-of-the-boxとIn-the-boxの2種類存在し,前者はVMの外から,後者はVMの内部から監視・解析するものです.
Out-of-the-box VMIは完全にVMの外から監視・解析を行うことから,マルウェア解析などの用途に使われます.
libvmiやDRAKVUFなどが有名なプロダクトです.
https://libvmi.com/
drakvuf.com
Out-of-the-box VMIをチートに使うことにより,チートをしていると気づかれにくく,特権的な操作を行うことができます.
最近はアンチチートがカーネルドライバになっているケースがありますが(VALORANTのVanguardが有名),それはRing0つまりOSの権限で動くのですが,VMを管理するソフトウェアであるハイパーバイザは所謂Ring-1で動作します.したがって権限が絶対的に上になります.
そのためこれを用いたチートができないか調査をいたしました.
memflow
調査をした結果,memflowというライブラリがみつかりました.
以下に特徴を列挙いたします.
名目上,DMAライブラリとしていますが,明らかにチートツールに転用することができます.
関係ないですけどRustでかけるのがいいですね!!!!!
memflowの使い方
以下にmemflowの使い方を説明します.
まずmemflowupをします.
これはmemflowのconnectorをセットアップします.
git clone git@github.com:memflow/memflowup.git
cd memflowup
python3 memflowup.py
次に以下のリンクからReleaseされているkvmのconnector(KVMとのコミュニケーションをとるもの)をインストールします
github.com
sudo dkms install --archive memflow-0.1.4-source-only.dkms.tar.gz sudo modprobe memflow
次にmemflow-cliのインストールをします.
git clone git@github.com:memflow/memflow-cli.git make install
最後にKVMにWindows10なVMをつくり,接続テストをします.(VM名はwin10としました)
memflow conn new kvm -a win10
チートシナリオ
早速チートをしましょう!!!
対象となるゲーム?は以下のようなゲームです.
変数や関数のアドレスを表示しているのはデバッグ用でチートには使用しません.
連打してポイントを稼いで,10000000点以上になるとwin!と表示されます.
ソースコードは以下のようになっています.
#include <iostream> void win(int counter) { if (counter >= 10000000) { std::cout << "win!!!" << std::endl; } } int main() { std::cout << "Simple Counter!!!!\n"; int counter = 0; std::cout << "counter address: 0x" << &counter << std::endl; std::cout << "win address: 0x" << &win << std::endl; while (1) { win(counter); getchar(); std::cout << "counter:" << counter << std::endl; counter++; } }
シナリオとしては以下のようなものを想定します.
- 点数を自由に操作する
- win!!!を毎回表示させて優勝してお酒が飲みたい
それでは行きましょう.
チートツールを書く
以下にチートツールのレポジトリを貼ります.
github.com
チートツールで行っているチートは以下のようになっています.
- 点数を自由に操作する == スタック上の変数の改ざん
- win!!!を毎回表示させて優勝してお酒が飲みたい == メモリ上のコード領域の改ざん
スタック上の変数の改ざんには独自のメモリ検索エンジンを実装し,スタック上から目的の変数を探して改ざんします.
メモリ上のコード領域の改ざんには優勝するために改ざんするべきコードを改ざんします.
これらはすべてOut-of-the-box VMIで行われています.
完全にVMからは不可視で改ざんを行います.
スタック上の変数の改ざん
今回は変数がスタック上にあることが事前にわかっているので,スタック領域を求めます.
これはTEBを用います.
en.wikipedia.org
TEBはThread Information Blockのことで,現在走っているスレッドの情報が格納されています.
スレッドの情報にはスタックについての情報も載っています.
memflowはTEBのアドレスを求めてくれる機能があるので,そこからオフセットを用いてメモリからスタックのベースアドレスとリミットアドレスを取得します.
その後はメモリ検索エンジンを自前で実装し,終了です.
メモリ上のコード領域の改ざん
毎回優勝したい場合,10000000点以上を取らなければいけませんが,それは面倒くさいです.
なんなら変数の改ざんをしなくても済むようにコード領域を改変しましょう!
まずはどこにターゲットになるコードがあるかを解析しましょう!
まずはGhidraをおもむろに立ち上げて,exeファイルを読み込ませます.
その後に"win!!!"文字列を検索します.
みつかりました!
XREFをみるとwin!!!文字列を参照しているコードがどこにあるかがわかります.
早速みてみましょう!
これをみるとベースアドレス+ 0x1119 にあるJL命令を潰してやれば良さそうです.
memflowの動的メモリ改ざん機能でここを0x90(NOP)で潰します.
結果
それではOut-of-the-box VMIなツールでチートをします!!!!
チートツールは以下のようになっています.
結果は以下のようになっています!!!!
優勝しました!!!!!!!!!!!!!!!!!!!!!!1
対策方法
流石にチートしましただけではどうしようもないので思いつく対策を以下に列挙いたします.
……あまり参考になりませんね…….
Out-of-the-box VMI cheatを倒すにはどうしたら良いのでしょうか…….
これは今後の課題としてブログに対策方法を考えて書くことにします!!!
最後に
今回はかんたんなゲーム?に対してKVM + memflowを使ったOut-of-the-box VMIでのチートを行いました.
スタック上の変数の改ざんと,メモリ上のコード領域の改ざんでゲームをチートしました.
以上で今回の記事を終わりたいと思います.
ありがとうございました.
JIS版MagicKeyboardをLinuxで動作させるパッチがマージされた
ついにマージされてリリースされた
前回の記事
前回の記事でつくったパッチがついにマージされてリリースまで行きました。
以下が情報科学若手の会で発表した資料になります。
時系列
時系列をお話します。
- 7/29 linux-inputにパッチ投稿
- 9/15 linux-inputのメンテナからappliedされた連絡
- 10/5 AUTOSELでbotにパッチがレビューされるように選ばれる
- 10/14 あのGreg Kroah-Hartmanがマージするよ〜と連絡
- 10/17 リリースされる
今後の展望
ハックできるところがあるかちょこちょこ探すかもしれない。 いまのところ心理的障壁はかなり軽減された。
関連リンク
hid-apple.c - drivers/hid/hid-apple.c - Linux source code (v5.16.10) - Bootlin
Solanaでスマートコントラクトを書いてみた
はじめに
こんにちは,morimolymolyです. 今回はSolanaという暗号資産のチェーン上で動くプログラム,スマートコントラクトを書いてみましたのでその感想を記します.
Solanaってなに?
Solanaとは第三世代ブロックチェーンの代表格とも呼ばれているらしい*1,新興チェーンではあるものの勢いがありかつ,実用性があるチェーンだそうです.(これ全部人づてなので諸説あるらしい)
Proof of Historyと呼ばれる新規性のある高速なコンセンサスアルゴリズムを提案,実装しています. ホワイトペーパーによると,
On a 1gbps network connection the maximum number of transactions 29 possible is 1 gigabit per second / 176 bytes = 710k tps max
とのことで,めちゃくちゃすごいTPSがでていることがわかります. しかしバリデータ要件がめちゃくちゃ高いらしいので気をつけて.
オタク的嬉しいポイントとして,すべてがRustでかかれている事が挙げられます. 以下のレポジトリはSolanaのコアになっています.
また,オタク的嬉しいポイント2としてeBPF形式でコントラクトが動くというところがあります. 以下がeBPF VMの実装です. eBPFなバイナリが出力できる言語であればいいので,C/C++はもちろん,Rustもいけますね!!!(LLVMはeBPFのバックエンドをもつので)
つまりすべてがRustに収束するのです.いやーめでたい.
スマートコントラクトとは
スマートコントラクトはブロックチェーンの上で動くプログラムのことです. 一体何ができるのか?僕にもまだ詳しくはわかりませんが,DeFiなどの非中央集権的経済取引のアプリケーションを書くことができます. いままで証券会社や銀行が中央にいた経済に比べ,手数料が安く取引などが可能に,しかも信頼性のある形でできるようです. 今回は詳しく説明しませんが,日銀が注目するほどなので何やらすごいのでしょう.
ともかく,僕はネットワークの上で動く謎のコンピュータをいじってみたい!と言う動機でやってみました.
Rustでスマートコントラクトを書く
スマートコントラクトをRustで書くときにはsolana_sdkかAnchorを使う必要がありますが,テストコードがかんたんにかける,色々ラップしてくれて嬉しいということでAnchorを使いました.入門は以下の記事を読めばいいと思います.
以下にハマリポイントを書いていきます
ハマリポイント: M1 Macでうまく動かない問題
M1 Macだとsolana-test-validatorと呼ばれる必ず一度は呼ばないといけないコマンドが現在叩けません. 以下の記事でがんばってくれ!
全然Anchorの情報がない
これがマジできつかった.チュートリアル以上のことをやろうとするとすぐ詰まる. さらに破壊的変更がすぐ入って,数ヶ月前の記事が使えないことが起きる.
ここでひとつ,コホン.
テストコードがドキュメントです.
以下の場所からそれっぽいコードをみて理解しろ!
何を作ったの?
Anchorのチュートリアル的な記事として,このようなものがありました.
この記事はかんたんなカウンターを作って,スマートコントラクトで回すアプリを作っています. しかし,フロント側で毎回カウンター用のアカウント(ややこしいのですが,Solanaでいうストレージのようなものです)を使い捨てるため,カウンターが毎回初期化される問題と言うか仕様がありました.それを解決するために,PDA(Program Derived Address)を用いて問題を解決してみました.(これが正しいかはわからんしらん存ぜぬ)
PDAを使うとプログラムにアカウントを紐付けることができるので,プログラム側でアカウントの管理ができます.基本コントラクトはステートレスなのでややこしいですね. このようにして,ウォレットに紐付いたカウンターが生成されました.
脆弱性
GeT_Pwn3d!でセキュリティ絡まないのも変なので,脆弱性を埋め込んでおきました!!!(というのは嘘であきて実装を放り投げたのです)
脆弱性1: 弱い認証
PDAのseedとして,ウォレットの公開鍵の10文字のみを使用している.hashがうまいこと衝突すると問題になる.guessもかんたんだ.
脆弱性2: 認証がない
認証がないのでスマートコントラクトを呼び出す際の引数にウォレットのアドレスを入れてしまえば勝手にカウンターを操作できます.
おわりに
初心者がわけわからん散文かいてすみませんの気持ちしかありませんが,これいけてないよーとかこれこうしたほうがいいよーとかあったらコメントください!