Trend Micro CTF 2017 Writeup

https://ctf.trendmicro.com/

400点で101位でした。全体的に難しい…

# Forensic 200

メモリダンプからフラグを探す問題。フォレンジックツールに慣れてなかったのでいい練習になった。

参考: [「Volatility Frameworkを使ったメモリフォレンジック」と言うハンズオンに参加させて頂きました。 ｜ Developers.IO](http://dev.classmethod.jp/?p=186823)

まずはOSの特定。

```
> volatility_2.6_win64_standalone.exe -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\TMCTF2017\for200\VictimMemory\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
```

`filescan`でファイル一覧を取得。
1300件程度だったので結果をファイル名でソートして見やすくして目grep。
変なパスにsvchost.exeがあった。怪しい。

```
0x000000000f26fa68      2      0 R--r-- \Device\HarddiskVolume1\Users\Taro\AppData\Local\Temp\svchost.exe
```

取り出す。

```
> volatility_2.6_win64_standalone.exe -f VictimMemory.img --profile=Win7SP1x86 dumpfiles -D dump -r svchost
Volatility Foundation Volatility Framework 2.6
ImageSectionObject 0x88a47588   616    \Device\HarddiskVolume1\Windows\System32\svchost.exe
ImageSectionObject 0x86942ad0   3828   \Device\HarddiskVolume1\Users\Taro\AppData\Local\Temp\svchost.exe
DataSectionObject 0x86942ad0   3828   \Device\HarddiskVolume1\Users\Taro\AppData\Local\Temp\svchost.exe
```

中を見ると以下の文字列。ファイルの一部をコードとして実行するツールらしい。

```
usage: this.exe <input file> <offset> <isLongSleep>
C:\work\project\ExecSpecificAddr\Release\ExecSpecificAddr.pdb
```

引数のファイル名とオフセットを探そう。
`pstree`してみると、cmd.exeからsvchost.exeが呼ばれてる。不自然。
ちょうどこのツールを実行中？

```
 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
```

ならコマンドラインが取れそう。

```
> volatility_2.6_win64_standalone.exe -f VictimMemory.img --profile=Win7SP1x86 cmdline -p 3828
Volatility Foundation Volatility Framework 2.6
************************************************************************
svchost.exe pid:   3828
Command line : svchost.exe  1.tmp 0x0 1
```

1.tmpを手に入れる。
`filescan`の結果を改めて確認すると

```
0x000000000a0c07c0     10      1 R--rw- \Device\HarddiskVolume1\Users\Taro\AppData\Local\Temp\1.tmp
```

`dumpfiles`で抽出。これで必要なものは揃った。
逆アセンブルしてみると、いかにもフラグを生成してそうな感じ。

```
================ B E G I N N I N G O F P R O C E D U R E ================

EntryPoint:
00000000 nop
00000001 nop
00000002 nop
00000003 nop
00000004 nop
00000005 nop
00000006 nop
00000007 nop
00000008 nop
00000009 nop
0000000a nop
0000000b nop
0000000c nop
0000000d nop
0000000e nop
0000000f nop
00000010 push ebp
00000011 mov ebp, esp
00000013 sub esp, 0x60
00000016 mov byte [ss:ebp+var_26], 0xa8
0000001a mov byte [ss:ebp+var_25], 0xff
0000001e mov byte [ss:ebp+var_24], 0x88
00000022 mov byte [ss:ebp+var_23], 0xd0
00000026 mov byte [ss:ebp+var_22], 0xb2
0000002a mov byte [ss:ebp+var_21], 0xf6
0000002e mov byte [ss:ebp+var_20], 0xf8
00000032 mov byte [ss:ebp+var_1F], 0xea
00000036 mov byte [ss:ebp+var_1E], 0xff
0000003a mov byte [ss:ebp+var_1D], 0xff
0000003e mov byte [ss:ebp+var_1C], 0xd2
00000042 mov byte [ss:ebp+var_1B], 0xff
00000046 mov byte [ss:ebp+var_1A], 0xff
0000004a mov byte [ss:ebp+var_19], 0xc2
0000004e mov byte [ss:ebp+var_18], 0xdc
00000052 mov byte [ss:ebp+var_17], 0xc2
00000056 mov byte [ss:ebp+var_16], 0xd8
0000005a mov byte [ss:ebp+var_15], 0xff
0000005e mov byte [ss:ebp+var_14], 0xf6
00000062 mov byte [ss:ebp+var_13], 0xff
00000066 mov byte [ss:ebp+var_12], 0xfa
0000006a mov byte [ss:ebp+var_11], 0xff
0000006e mov byte [ss:ebp+var_44], 0x55
00000072 mov byte [ss:ebp+var_43], 0x8b
00000076 mov byte [ss:ebp+var_42], 0xec
0000007a mov byte [ss:ebp+var_41], 0x51
0000007e mov byte [ss:ebp+var_40], 0xe8
00000082 mov byte [ss:ebp+var_3F], 0x0
00000086 mov byte [ss:ebp+var_3E], 0x0
0000008a mov byte [ss:ebp+var_3D], 0x0
0000008e mov byte [ss:ebp+var_3C], 0x0
00000092 mov byte [ss:ebp+var_3B], 0x58
00000096 mov byte [ss:ebp+var_3A], 0x2d
0000009a mov byte [ss:ebp+var_39], 0x52
0000009e mov byte [ss:ebp+var_38], 0x1f
000000a2 mov byte [ss:ebp+var_37], 0x34
000000a6 mov byte [ss:ebp+var_36], 0x1
000000aa mov byte [ss:ebp+var_35], 0x2d
000000ae mov byte [ss:ebp+var_34], 0x52
000000b2 mov byte [ss:ebp+var_33], 0x1f
000000b6 mov byte [ss:ebp+var_32], 0x34
000000ba mov byte [ss:ebp+var_31], 0x1
000000be mov byte [ss:ebp+var_30], 0xe8
000000c2 mov byte [ss:ebp+var_2F], 0x0
000000c6 mov byte [ss:ebp+var_2E], 0x0
000000ca mov byte [ss:ebp+var_2D], 0x0
000000ce mov byte [ss:ebp+var_2C], 0x0
000000d2 mov byte [ss:ebp+var_2B], 0x90
000000d6 mov byte [ss:ebp+var_2A], 0x90
000000da mov byte [ss:ebp+var_29], 0xc9
000000de mov byte [ss:ebp+var_28], 0xc3
000000e2 mov byte [ss:ebp+var_27], 0xcc
000000e6 mov byte [ss:ebp+var_5A], 0x0
000000ea mov byte [ss:ebp+var_59], 0x5b
000000ee mov byte [ss:ebp+var_58], 0x0
000000f2 mov byte [ss:ebp+var_57], 0x0
000000f6 mov byte [ss:ebp+var_56], 0x0
000000fa mov byte [ss:ebp+var_55], 0x0
000000fe mov byte [ss:ebp+var_54], 0x0
00000102 mov byte [ss:ebp+var_53], 0x0
00000106 mov byte [ss:ebp+var_52], 0x2b
0000010a mov byte [ss:ebp+var_51], 0x17
0000010e mov byte [ss:ebp+var_50], 0x0
00000112 mov byte [ss:ebp+var_4F], 0x19
00000116 mov byte [ss:ebp+var_4E], 0x3f
0000011a mov byte [ss:ebp+var_4D], 0x0
0000011e mov byte [ss:ebp+var_4C], 0x0
00000122 mov byte [ss:ebp+var_4B], 0x0
00000126 mov byte [ss:ebp+var_4A], 0x0
0000012a mov byte [ss:ebp+var_49], 0x3
0000012e mov byte [ss:ebp+var_48], 0x0
00000132 mov byte [ss:ebp+var_47], 0x13
00000136 mov byte [ss:ebp+var_46], 0x0
0000013a mov byte [ss:ebp+var_45], 0x5
0000013e mov dword [ss:ebp+var_4], 0x16
00000145 mov dword [ss:ebp+var_C], 0x0
0000014c mov dword [ss:ebp+var_10], 0x0

00000153 mov eax, dword [ss:ebp+var_10] ; XREF=EntryPoint+457
00000156 cmp eax, 0x16
00000159 jae 0x1cb

0000015b lea edx, dword [ss:ebp+var_26]
0000015e mov eax, dword [ss:ebp+var_10]
00000161 add eax, edx
00000163 movzx eax, byte [ds:eax]
00000166 movzx eax, al
00000169 mov dword [ss:ebp+var_8], eax
0000016c lea edx, dword [ss:ebp+var_5A]
0000016f mov eax, dword [ss:ebp+var_10]
00000172 add eax, edx
00000174 movzx eax, byte [ds:eax]
00000177 movzx eax, al
0000017a mov dword [ss:ebp+var_C], eax

0000017d cmp dword [ss:ebp+var_C], 0x0 ; XREF=EntryPoint+395
00000181 jle 0x18d

00000183 add dword [ss:ebp+var_8], 0x1
00000187 sub dword [ss:ebp+var_C], 0x1
0000018b jmp 0x17d

0000018d mov eax, dword [ss:ebp+var_4] ; XREF=EntryPoint+385
00000190 sub eax, 0x1
00000193 movzx eax, byte [ss:ebp+eax+var_44]
00000198 movzx eax, al
0000019b sub dword [ss:ebp+var_8], eax
0000019e mov eax, dword [ss:ebp+var_4]
000001a1 sub eax, 0x1
000001a4 movzx eax, byte [ss:ebp+eax+var_44]
000001a9 movzx eax, al
000001ac xor dword [ss:ebp+var_8], eax
000001af sar dword [ss:ebp+var_8], 0x1
000001b2 mov eax, dword [ss:ebp+var_8]
000001b5 mov ecx, eax
000001b7 lea edx, dword [ss:ebp+var_26]
000001ba mov eax, dword [ss:ebp+var_10]
000001bd add eax, edx
000001bf mov byte [ds:eax], cl
000001c1 sub dword [ss:ebp+var_4], 0x1
000001c5 add dword [ss:ebp+var_10], 0x1
000001c9 jmp 0x153

000001cb nop ; XREF=EntryPoint+345
000001cc leave
000001cd ret
; endp
```

静的解析は面倒そうなので、Ollydbgでデバッグ実行。
`VirtualAlloc`して1.tmpをロードし(アドレス`00020000`)、そこを別スレッドで実行するらしい。
別スレッドのデバッグの仕方が分からない…

しばらく考えて、`CreateThread`の呼び出し箇所を`call 00020000`にパッチ。
そうすればメインスレッドのスタックに書き込んでくれるはず。本来のスタックが破壊されるかもしれないが直後の命令で止めれば問題ない。

```
CPU Stack
Address   Value      ASCII Comments
0019D7C4   4D54CCC3  ÃÌTM
0019D7C8   7B465443  CTF{
0019D7CC   74617473  stat
0019D7D0   615F6369  ic_a
0019D7D4   796C616E  naly
0019D7D8   7D72657A  zer}
```

```
TMCTF{static_analyzer}
```

# Reversing 100

zipとrarの入れ子を解凍。biscuit1.exeとbiscuit2.zipが出てきた。
biscuit2.zipはパスワード付き。

```
> biscuit1.exe
Please find sweets name starting from m for biscuit2.
```

エスパーで`macaron`で試す。正解。

biscuit3, 4, 5が出てきた。

- biscuit3
    - jpgと見せかけて、ファイル末尾にzipが付いてる。解凍すると`cream`
- biscuit4
    - 下記のテキスト。

```
Please create flag.

hint:

Flag = TMCTF{biscuit3_ biscuit5}
```

- biscuit5
    - exe。

biscuit5をOllydbgにかけてみる。下記の部分でテーブル作成してて怪しい

```
Address   Hex dump          Command                                           Comments
0040151E  |.  C78424 CD0000 MOV DWORD PTR SS:[ESP+0CD],64636261
00401529  |.  C78424 D10000 MOV DWORD PTR SS:[ESP+0D1],68676665
00401534  |.  C78424 D50000 MOV DWORD PTR SS:[ESP+0D5],6C6B6A69
0040153F  |.  C78424 D90000 MOV DWORD PTR SS:[ESP+0D9],706F6E6D
0040154A  |.  C78424 DD0000 MOV DWORD PTR SS:[ESP+0DD],74737271
00401555  |.  C78424 E10000 MOV DWORD PTR SS:[ESP+0E1],78777675
00401560  |.  66:C78424 E50 MOV WORD PTR SS:[ESP+0E5],7A79
0040156A  |.  C68424 E70000 MOV BYTE PTR SS:[LOCAL.5+3],0
00401572  |.  C78424 9B0000 MOV DWORD PTR SS:[ESP+9B],63736962
0040157D  |.  C78424 9F0000 MOV DWORD PTR SS:[ESP+9F],746975
00401588  |.  8D8424 A30000 LEA EAX,[LOCAL.22+3]

Address   Hex dump                                         ASCII
0060FF0D  61 62 63 64|65 66 67 68|69 6A 6B 6C|6D 6E 6F 70| abcdefghijklmnop
0060FF1D  71 72 73 74|75 76 77 78|79 7A 00 00|             qrstuvwxyz
```

この後をステップ実行し、適当なところでスタックを見ると

```
CPU Dump
Address   Hex dump                                         ASCII
0060FE6A                                         63 68 6F|              cho
0060FE7A  75 78                                            ux
```

`choux`ってなんだろうとググるとシュークリームが出てくる。「シュー」ってこんなスペルなのか。

というわけで

```
TMCTF{cream_choux}
```

Incorrect。あれ？

```
TMCTF{choux_cream}
```

通った。biscuit4間違ってるじゃん…

# IoT/OSINT/SCADA 100

まずは問題文の `definitelynotaphishingsite.com` を whois

```
Registrant Name: osint isfun

For complete domain details go to:
http://who.godaddy.com/whoischeck.aspx?domain=definitelynotaphishingsite.com

Registrant Name: osint isfun
Registrant Organization: 
Registrant Street: 230 Earls Court Road
Registrant Street: Kensington
Registrant City: London
Registrant State/Province: London
Registrant Postal Code: SW5 9AA
Registrant Country: UK
Registrant Phone: +44.7441911980
Registrant Phone Ext:
Registrant Fax:
Registrant Fax Ext:
Registrant Email: osintisfun@gmx.com
Registry Admin ID: 
```

osintisfun@gmx.comでFacebook, Twitter検索 -> いない
osintisfun@gmx.comでググると

https://pastebin.com/TyEDZsaA

```
Domain Name: T3M4.COM
```

https://paste2.org/8LpMBye6

```
Domain Name: T3M4.COM
```

T3M4.COMにアクセス -> https://t3m4haxor.wordpress.com/ に飛ばされる。
中の人のブログっぽい。

t3m4haxorでTwitter検索。いた。

ここまでは合ってるらしい。
https://twitter.com/T3M4haxor/status/851503574580420611

```
T3-M4 Haxor‏ @T3M4haxor 4月10日
You are doing well - keep going. Only a few steps left...
```

プロフィールは

```
CTF Lover. FTR FanBoi. Star Wars Nerd. Loves Tokyo in the Wintertime
```

フォロー・フォロワーから関係者を探す。
いろいろ試行錯誤したあと、[@DavikSurik](https://twitter.com/DavikSurik) のプロフィールが気になった。

```
IT Security Professional. Star Wars Fanboi
```

かなり初期のフォロワーだし、Star Warsの共通項が気になる。
あと「2017年5月に登録」が、問題用に作ったアカウントっぽい。

Davik Surikでググるとlinkedinが出てくる
https://uk.linkedin.com/in/davik-surik-b04198141

```
Proud to have helped with the Trend Micro CTF 2017 - especially Secret Challenge "13" -> GZPGS{SGE0FVAG101} 
```

あったー。rot13ね。

```
TMCTF{FTR0SINT101}
```

# リンク
[問題ごとの正解チーム数](https://twitter.com/trendmicro_jp/status/878855947312967680)

他の方のWriteup

- [Trend Micro CTF 2017 オンライン予選 Write-up - Qiita](http://qiita.com/kusano_k/items/3fa0d84376a81a84a07d)
- [Trend Micro CTF 2017 Writeup - A painter and a black cat](http://raintrees.net/news/105)
- [セクタンラボ 実験日誌](http://sectanlab.sblo.jp/archives/20170625-1.html)
- [TMCTF : MISC 200 | b0tchsec](http://b0tchsec.com/2017/tmctf/misc-200)
- [TMCTF : OSINT 200 | b0tchsec](http://b0tchsec.com/2017/tmctf/osint-200)
- [TMCTF : OSINT 300 | b0tchsec](http://b0tchsec.com/2017/tmctf/osint-300)