6月24日(土)13:00から6月25日(日)13:00にかけて、Trend Micro CTF 2017が開催されました。
今回はいろいろと用事があったため、チームでは参加しませんでした。後日の練習用に問題だけダウンロードしようと思い、今朝ほどスコアサーバにアクセスしたのですが、問題をみるとやはり挑戦したくなります。短い時間でしたが、3問解くことができて楽しかったです。取り急ぎ、簡単なwriteupを書きます。
Forensic100
[問題の概要]
パソコンに感染したマルウェアの不審な通信(PCAPファイル)を解析し、流出した情報を特定する問題。
[解き方]
PCAPファイルをWiresharkで見てみると、不審なDNSクエリが大量に発生していることが分かります。

DNSクエリのホスト名部分に、暗号化した情報を埋め込まれている可能性が高そうです。まずはDNSクエリを抽出します。本当はPythonで必要な情報のみ抽出するとカッコイイのですが、ヘタレなので、WiresharkからCSV形式で抽出した文字列をエクセル関数で加工し、DNSクエリのホスト名部分だけ取り出しました。
暗号化されている情報は全てASCII文字列なので、Base64でエンコードされているかもしれないと思いつきます。しかし、Base64であれば記号が含まれそうなものですが、記号は見当たりません。念のため、Base64によるデコードも試してみますが、やはり上手くいきませんでした。
暗号化されている文字列は、アルファベット(大文字、小文字)と数字で構成されているようです。Base64のほかに何か無いかと調べていたら、Base58というエンコード方式があることが分かりました。Base58は、Base64で利用する文字列から記号、および見た目が紛らわしい文字(大文字O(オー)と数字の0(ゼロ)など)を取り除いたエンコード方式です。
ググったら、Base58に対応したPythonスクリプトが見つかったので、デコードすると、英文テキストが現れ、末尾にフラグが書かれていました。
Base58(英語)
https://pypi.python.org/pypi/base58/0.2.4
フラグ: TMCTF{DNSTunnelExfil}
Forensic200
[問題の概要]
マルウェアに感染したパソコンのメモリイメージを解析し、悪意のある挙動の痕跡(インディケータ)を特定する問題
[解き方]
メモリ解析といえば、まずは黙ってVolatility。
volat -f VictimMemory.img --kdbg=0x8333ec28 --profile=Win7SP1x86_23418 c:\work>volat -f VictimMemory.img imageinfo Volatility Foundation Volatility Framework 2.6 INFO : volatility.debug : Determining profile based on KDBG search... Suggested Profile(s) : Win7SP1x86_23418, Win7SP0x86, Win7SP1x86 AS Layer1 : IA32PagedMemoryPae (Kernel AS) AS Layer2 : FileAddressSpace (C:\work\VictimMemory.img) PAE type : PAE DTB : 0x185000L KDBG : 0x8333ec28L Number of Processors : 1 Image Type (Service Pack) : 1 KPCR for CPU 0 : 0x8333fc00L KUSER_SHARED_DATA : 0xffdf0000L Image date and time : 2017-04-11 02:35:28 UTC+0000 Image local date and time : 2017-04-11 11:35:28 +0900 c:\work>
利用するプロファイル名(Win7SP1x86_23418)と、KDBG(0x8333ec28)を特定できました。次に不審な通信が発生していないか確認しようと思いましたが、conscanはエラー・・・(補足:netscanを利用すべきでしたが、勘違い)。不審なプロセスが存在しないか、pstreeで確認してみます。
c:\work>volat -f VictimMemory.img --kdbg=0x8333ec28 --profile=Win7SP1x86_23418 pstree Volatility Foundation Volatility Framework 2.6 Name Pid PPid Thds Hnds Time -------------------------------------------------- ------ ------ ------ ------ ---- 0x89d8a530:wininit.exe 412 344 3 78 2017-04-11 02:27:45 UTC+0000 . 0x88a0c030:lsass.exe 516 412 7 547 2017-04-11 02:27:48 UTC+0000 . 0x88a056d8:services.exe 508 412 7 220 2017-04-11 02:27:47 UTC+0000 .. 0x869fa6c0:VSSVC.exe 2304 508 12 194 2017-04-11 02:33:08 UTC+0000 .. 0x89d6b030:mscorsvw.exe 3096 508 6 74 2017-04-11 02:30:34 UTC+0000 (中略) 0x89da3530:winlogon.exe 444 396 3 114 2017-04-11 02:27:45 UTC+0000 0x88bbaab8:explorer.exe 940 356 31 865 2017-04-11 02:28:23 UTC+0000 . 0x8691c030:cmd.exe 4080 940 1 20 2017-04-11 02:32:02 UTC+0000 .. 0x88abfa78:svchost.exe 3828 4080 1 7 2017-04-11 02:35:18 UTC+0000 . 0x88bca030:vmtoolsd.exe 2216 940 6 191 2017-04-11 02:28:51 UTC+0000 c:\work>
露骨に怪しいsvchost.exeがあります。もう絶対コレでしょと確信。svchost.exeは、cmd.exeから起動されているため、どのように起動されたのかconsolesで調べます。
c:\work>volat -f VictimMemory.img --kdbg=0x8333ec28 --profile=Win7SP1x86_23418 consoles Volatility Foundation Volatility Framework 2.6 ************************************************** ConsoleProcess: conhost.exe Pid: 1868 Console: 0xfd81c0 CommandHistorySize: 50 HistoryBufferCount: 2 HistoryBufferMax: 4 OriginalTitle: %SystemRoot%\system32\cmd.exe Title: C:\Windows\system32\cmd.exe - svchost.exe 1.tmp 0x0 1 AttachedProcess: svchost.exe Pid: 3828 Handle: 0x190 AttachedProcess: cmd.exe Pid: 4080 Handle: 0x58 ---- CommandHistory: 0x31e818 Application: svchost.exe Flags: Allocated CommandCount: 0 LastAdded: -1 LastDisplayed: -1 FirstCommand: 0 CommandCountMax: 50 ProcessHandle: 0x190 ---- CommandHistory: 0x33a338 Application: cmd.exe Flags: Allocated, Reset CommandCount: 2 LastAdded: 1 LastDisplayed: 1 FirstCommand: 0 CommandCountMax: 50 ProcessHandle: 0x58 Cmd #0 at 0x33a700: cd %temp% Cmd #1 at 0x2d3b38: svchost.exe 1.tmp 0x0 1 ---- Screen 0x2d7f00 X:80 Y:300 Dump: c:\work>
カレントディレクトリを「%temp%」(Windows7では、各ユーザープロファイルフォルダ内のAppdata\Local\Tempフォルダ)に変更した後、svchost.exeの引数として、「1.tmp」という不審ファイルを指定しているようです。
1.tmpが存在しているか、filescanで確認します。また、svchost.exeも偽物の可能性が高いため、パスを確認します。
c:\work>volat -f VictimMemory.img --kdbg=0x8333ec28 --profile=Win7SP1x86_23418 filescan Volatility Foundation Volatility Framework 2.6 Offset(P) #Ptr #Hnd Access Name ------------------ ------ ------ ------ ---- 0x0000000000026038 2 1 RW-r-- \Device\HarddiskVolume1\Windows\ServiceProfiles\LocalService\NTUSER.DAT{6cced2f1-6e01-11de-8bed-001e0bcd1824}.TMContainer00000000000000000002.regtrans-ms 0x000000000016e038 3 0 R--r-d \Device\HarddiskVolume1\Windows\System32\AudioEng.dll (以下、注目すべき個所のみ抜粋) 0x000000000b3f2588 8 0 R--r-d \Device\HarddiskVolume1\Windows\System32\svchost.exe 0x000000000f26fa68 2 0 R--r-- \Device\HarddiskVolume1\Users\Taro\AppData\Local\Temp\svchost.exe 0x000000000a0c07c0 10 1 R--rw- \Device\HarddiskVolume1\Users\Taro\AppData\Local\Temp\1.tmp
やはりsvchost.exeは偽物でした。また、1.tmpも存在しているようです。これら2つのファイルを抽出します。
c:\work>volat -f VictimMemory.img --kdbg=0x8333ec28 --profile=Win7SP1x86_23418 procdump --pid=3828 -D proc\ Volatility Foundation Volatility Framework 2.6 Process(V) ImageBase Name Result ---------- ---------- -------------------- ------ 0x88abfa78 0x00ed0000 svchost.exe OK: executable.3828.exe c:\work> c:\work>volat -f VictimMemory.img --kdbg=0x8333ec28 --profile=Win7SP1x86_23418 dumpfiles --name -D dumpfiles\ -r Temp\\1.tmp$ Volatility Foundation Volatility Framework 2.6 DataSectionObject 0x88bb47c0 3828 \Device\HarddiskVolume1\Users\Taro\AppData\Local\Temp\1.tmp SharedCacheMap 0x88bb47c0 3828 \Device\HarddiskVolume1\Users\Taro\AppData\Local\Temp\1.tmp c:\work>
バイナリエディタで1.tmpを確認したところ、冒頭に0x90が続いており、シェルコードっぽい雰囲気です。

まずは、仮想マシンのなかで、取り出した2つのファイルをconsolesで確認した手順のとおりに実行し、動的解析してみます。
C:\Windows\System32>cd %temp% C:\Users\Student\AppData\Local\Temp>svchost.exe 1.tmp 0x0 1 file name is 1.tmp offset is 0 Createthread successful! C:\Users\Student\AppData\Local\Temp>
Process Moniter、RegShotなどを活用し、ネットワーク通信、レジストリ、ファイル作成状況などを確認しますが、問題文にあったような「悪意のあるインディケータ」らしきものは見つかりません。なんとなく、理不尽問題の予感・・・。
続いて、偽svchost.exeと、1.tmpをIDAで逆アセンブルしてみたところ、偽svchost.exeは、1.tmpのデータをメモリに展開し、CreateThread関数でコードとして実行するようです。1.tmpのコードを静的解析すれば良さそうな気もしますが、時間も無いので、OllyDbgでコードを実行してみたところ、1.tmpのスレッド内でフラグが復号されていました。ちなみに、このフラグは画面やファイルに出力されず、メモリにしか存在しないため、リバースエンジニアリングしないと発見できません・・・。

個人的な感想ですが、問題の難易度はともかく、フォレンジック問題として「悪意のあるインディケーターを探せ」と言うのであれば、ファイルのハッシュ、不審な通信先、レジストリの痕跡などをフラグにしたほうが適切なのでは、と思ってしまいました。
フラグ: TMCTF{static_analyzer}
Reversing100
[問題の概要]
問題ファイルのJPGファイルに埋め込まれているZIPを抽出したり、PE形式の実行プログラムをリバースエンジニアリングしてメモリに展開されたフラグ文字列を抽出したりする問題。
[解き方]
とにかくやるだけです・・・。ちなみに、解いた人にはわかると思いますが「シュークリームじゃなくて、クリームシューって呼ぶのかー。お洒落だなぁ」→ハズレという流れで少し理不尽な思いをさせられます 笑
フラグ:TMCTF{choux_cream}