2017年06月25日

Trend Micro CTF 2017 writeup

 6月24日(土)13:00から6月25日(日)13:00にかけて、Trend Micro CTF 2017が開催されました。

 今回はいろいろと用事があったため、チームでは参加しませんでした。後日の練習用に問題だけダウンロードしようと思い、今朝ほどスコアサーバにアクセスしたのですが、問題をみるとやはり挑戦したくなります。短い時間でしたが、3問解くことができて楽しかったです。取り急ぎ、簡単なwriteupを書きます。

Forensic100

[問題の概要]

 パソコンに感染したマルウェアの不審な通信(PCAPファイル)を解析し、流出した情報を特定する問題。

[解き方]

 PCAPファイルをWiresharkで見てみると、不審なDNSクエリが大量に発生していることが分かります。

PCAP

 DNSクエリのホスト名部分に、暗号化した情報を埋め込まれている可能性が高そうです。まずはDNSクエリを抽出します。本当はPythonで必要な情報のみ抽出するとカッコイイのですが、ヘタレなので、WiresharkからCSV形式で抽出した文字列をエクセル関数で加工し、DNSクエリのホスト名部分だけ取り出しました。

 暗号化されている情報は全てASCII文字列なので、Base64でエンコードされているかもしれないと思いつきます。しかし、Base64であれば記号が含まれそうなものですが、記号は見当たりません。念のため、Base64によるデコードも試してみますが、やはり上手くいきませんでした。

 暗号化されている文字列は、アルファベット(大文字、小文字)と数字で構成されているようです。Base64のほかに何か無いかと調べていたら、Base58というエンコード方式があることが分かりました。Base58は、Base64で利用する文字列から記号、および見た目が紛らわしい文字(大文字O(オー)と数字の0(ゼロ)など)を取り除いたエンコード方式です。

 ググったら、Base58に対応したPythonスクリプトが見つかったので、デコードすると、英文テキストが現れ、末尾にフラグが書かれていました。

フラグ: 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が続いており、シェルコードっぽい雰囲気です。

1.tmp

 まずは、仮想マシンのなかで、取り出した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のスレッド内でフラグが復号されていました。ちなみに、このフラグは画面やファイルに出力されず、メモリにしか存在しないため、リバースエンジニアリングしないと発見できません・・・。

1.tmp

 個人的な感想ですが、問題の難易度はともかく、フォレンジック問題として「悪意のあるインディケーターを探せ」と言うのであれば、ファイルのハッシュ、不審な通信先、レジストリの痕跡などをフラグにしたほうが適切なのでは、と思ってしまいました。

フラグ: TMCTF{static_analyzer}

Reversing100

[問題の概要]

 問題ファイルのJPGファイルに埋め込まれているZIPを抽出したり、PE形式の実行プログラムをリバースエンジニアリングしてメモリに展開されたフラグ文字列を抽出したりする問題。

[解き方]

 とにかくやるだけです・・・。ちなみに、解いた人にはわかると思いますが「シュークリームじゃなくて、クリームシューって呼ぶのかー。お洒落だなぁ」→ハズレという流れで少し理不尽な思いをさせられます 笑

フラグ:TMCTF{choux_cream}

posted by やまと at 15:13| Comment(0) | CTF

2017年06月12日

「仙台CTF」の募集を開始しました

 MISA 一般社団法人宮城県情報サービス産業協会様が主催する「仙台CTF」が開催されます!
仙台CTFは、サイバー攻撃による被害を低減するために必要となる、情報セキュリティ技術を学ぶ「セキュリティ技術勉強会」と、技術力を競う「セキュリティ技術競技会(CTF)」を行うセキュリティイベントです。

 私は実行委員として、勉強会講師およびCTF問題作成を担当させていただきます。
初心者の方も気軽にご参加ください。

  • 開催日時:11月12日(日)10:00〜17:00(9:30受付開始)
  • 会場:仙台市市民活動サポートセンター 地下1階 市民活動シアター
  • 参加費:1,000円 (当日受付時に支払い)

開催案内の詳細はこちら

タグ:CTF
posted by やまと at 00:18| Comment(0) | 実験日誌