MNCTF 2017 Writeup
7月6日にMacnica Networks DAY 2017 Day1(Day2は7月11日とのこと)に参加し、午前中に行われたMNCTF2017にもチャレンジしてきました。
結果は11位ぐらい(今は問題も公開されて、当日のランキングは崩れていて分からず)。
正直もっといけるかと、はりきっていました。。。
会場も広く、90人以上いた感じです。
(会場には運営として、問題に登場する「やまざき君」や、「てしがわら君」がいました。ちなみに問題にでてくるような所業は一切していないとの弁明がありました。。)
しおりにWriteUp書くまでがCTFとあったので、書きます。。
公開されたサイトは下記。
※これからやる人はネタばれになるので見ないでくださいませ。。
制限時間が1時間30分なため、効率も考えてとかないとすぐ時間なくなりそう。。
オンサイトのCTFなんて、数年ぶり?で緊張した。
得点は1問100点スタートで、回答者が多くなると点数が低くなっていく方式でした。
■練習問題
入力テスト。これは競技時間前に入力可能。
よくわからない予習の成果で「MNCTF2017」と予想していたが、「MNCTF」だった。
■通信記録
最初に公開された問題。
これは解けなかったうえ、かなり時間をとられてしまった。。
pcapファイルが与えられて、突かれた脆弱性の名前を答えるというもの。
通信も大量に記録されていて、適当にぶち込んだNetworkMinerが戻ってくるまでだいぶ時間かかったような。。
SMBの通信も大量に記録されており、これは直近で話題のWannaCryでは?と気づいた。
が、脆弱性の名前とあったので、CVE識別番号などをうっていたが当たらず。。
stringsなどの結果でも何もビットはたたず。。
昔使ったオンラインのpcap分析サービスの試用版を思い出そうとしていたが、思い出せず(ARBORだったような)。
正解は「EternalBlue」とのこと。それは攻撃ツールの名前では??
しかし、一回ぐらい答えとしてダメもとで入力はしておくべきだったかと。。
解き方としては、pcapをsnortなどに解析させて、検知ログを見ればOKとのこと。
windows版があるとのことでやってみた。
(インストールしてからちゃんと動くまでなんかいろいろはまった。。基本的にはsnort -v -c snort.confを実行してエラーで怒られた行番号のところを調べたり修正したりした。)
〇pcap読み込ませて分析。
snort -r pcap.pcap -c snort.conf
〇下記検知ログ抜粋。同時に投入されるバックドア「Doublepulsar」の検知ログもあった。なるほどです。
[**] [1:41978:4] OS-WINDOWS Microsoft Windows SMB remote code execution attempt [**]
[Classification: Attempted Administrator Privilege Gain] [Priority: 1]
05/16-15:27:09.267824 10.211.55.32:49348 -> 10.211.55.34:445
TCP TTL:128 TOS:0x0 ID:8740 IpLen:20 DgmLen:1500 DF
***AP*** Seq: 0x1250A1DC Ack: 0x1411471A Win: 0xFE TcpLen: 20
[Xref => http://technet.microsoft.com/en-us/security/bulletin/MS17-010][Xref => http://isc.sans.edu/forums/diary/ETERNALBLUE+Possible+Window+SMB+Buffer+Overflow+0Day/22304/][Xref => http://blog.talosintelligence.com/2017/05/wannacry.html][Xref => http://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-0146][Xref => http://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-0144]
[**] [1:42329:1] MALWARE-CNC Win.Trojan.Doublepulsar variant successful ping response [**]
[Classification: A Network Trojan was Detected] [Priority: 1]
05/16-15:27:22.498716 10.211.55.34:445 -> 10.211.55.32:49676
TCP TTL:128 TOS:0x0 ID:7806 IpLen:20 DgmLen:79 DF
***AP*** Seq: 0x8CC329A5 Ack: 0xD56435DC Win: 0xF9B2 TcpLen: 20
[Xref => http://www.virustotal.com/file/15ffbb8d382cd2ff7b0bd4c87a7c0bffd1541c2fe86865af445123bc0b770d13/analysis/][Xref => http://countercept.com/our-thinking/analyzing-the-doublepulsar-kernel-dll-injection-technique/]
■昇進試験
「factor」と「column」は思い浮かばず、Linuxコマンド一覧をカンニングしながらといた。。
詳細省略。
■不審起動
不審なスクリプトが実行される。そのスクリプトの通信先のFQDNを答えてくださいとのこと。
pastbinのサイトからスクリプト本体を持ってきて実行する感じのもの。
JScriptで記載され、難読化されている。。
難読化解除のサイトは調べ済さ、ということでみたらJScriptは対応してなかった。。
時間がなくなってきていたので、マクニカネットワークスさんを信じて実行することにする。
JScriptの部分を抜き出し、hoge.jsとしてファイルに保存。クリックして実行した。
wiresharkでクエリーを捕まえた。
(うまく捕まらない場合は、 ipconfig /flushdns してキャッシュをクリアしたほうがいいかも。)
■脅迫文書
文書中にURLとパスワードが書かれている。
Tor上にサイトがある模様。URLをよくみればわかる問題だったが、本番ではよく見ず、スルーしてしまった。。
Tor2Web などのプロキシサーバを使用すればよかったらしい。
(例:hogehoge.onionならば、hogehoge.onion.toとしてアクセスすると、専用ブラウザなくてもみれるらしい。勉強になったです。)。
■宛先暗号
不審な実行ファイルが検出されたとのこと。下記を分析して、通信先を特定せよとのこと。
解けなかった。
・svchost.exe(マルウェア本体)
・vm.dat(マルウェアと同じディレクトリにあったファイル)
・EDR_log.csv(エンドポイント対策のログ)
下記に投げて宛先を分析しようとしたが、これを防止するためか、vm.datがないと動かないようになっている模様。
上記のみであきらめてしまったが、EDRのログを検索すれば実行時のコマンドパラメータが判明する。。冷静にみればよかった。。
これもマクニカネットワークスさんを信じて、EDRのログのとおりに実行することで、WireSharkで宛先を捕まえることができる。
■攻撃痕跡
これも先ほどの宛先暗号と同じような感じで、EDRのログと、攻撃者が残したファイルが与えられる。
解けなかった。
EDRのログをよくみて、各ファイルを調べていく感じ。
実際の調査で行われた事例とのことで、勉強になりました。
(実際役に立ちそう。)
■情報照合
ハッシュ値のリストが与えられるので、とあるサイトのAPIを利用して、「RAT.A.aa74e」と判定されるハッシュを見つけるというもの。
やるだけ問題のようだが、手を付けれなかった。
■賭博遊戯
解けなかった。
Web問。JavaScriptが難読化されている。これを解除せずに指定の金額になるまで
勝ち進めなければならない。
うまく解析できないような作りになっているようだが、diceArrayという配列の中身がConsoleで確認できるらしく、次にでる目がわかる(勉強になりました)。
掛け金も改ざんしないと、規定回数で目標金額に達さないらしい。
(それもデベロッパーツールでできる。)
■脆弱会話
下記が与えられる。
・Feuder.exe (Feuder本体)
・Feuder.cpp (Feuderのソースコード)
・exploit.py (脆弱性を突くためのPython)
・hint.png (PoCと一緒に入手したヒント)
・send_pattern.py (番地を調べるためのPython)
hint.pngがスタックバッファーオーバーフローの存在を示している。
その中で、攻撃成功時に利用した領域のサイズが答えとのこと(バッファの先頭アドレスから、リターンアドレス直前までの大きさ)。
ソースもあるので、すぐに下記の部分が危ないとわかる(strcpy)。
void pr( char *str)
{
char buf[1015];
strcpy(buf,str);
}
アライメントの関係で、バッファは1016ぐらいで確保されるかなと考え、あとはsaved ebpを考慮して+4する。答えは、1020。
と、できたらよかったが、実際はアライメントを考慮せず計算したり、
デバッガも使っていろいろやっていた。。
send_pattern.pyをうちこんで、計測するのが想定解とのこと。
なんとか時間内に正解できた。
まとめ
仕事でも使えそうなものがちりばめられており、大変勉強になりました。
懇親会の料理が結構豪華(!)で満たされました。