TDU(東京電機大学)の有志が行っているTDU CTFに参加してきた。
TDU CTFについて
前回まではTDUの中でやっていて、今回から外部の人向けにやるようにしたらしい。
楽しそうだけど初心者向けということで、最初は自重しようかなと思ったけど、
何だかんだで初心者(笑)みたな人が多かったので参加してみた。
最終的に、CTFer達のオフ会みたいな感じでわいわい出来たので、行って良かったかなあと…
初心者向けということで、得意分野であるネットワーク問題を早めに沈めて、本当に初心者な他のジャンルをやろうと思ったが、
思った以上にネットワークの問題が難しくてそこに時間かけて終わってしまった。。
他の分野も問題にも手を付けたかった…
Writeup
ネットワークの問題 (3問)は、すべて柚子胡椒氏@mzyy94さんの作問だった。
本人が問題を公開しているので、興味ある人は見てみるといいかも。
TDUCTFの柚子胡椒問題を公開しますので遊びたい方どうぞ #tductfhttps://t.co/KDMIg0dI68
— え、もう本番ですか? (@mzyy94) 2015年3月31日
それに加えて、みむらさんがバイナリの分野でpcap問題を出していた。(終わってから本人に聞いて気づいた)
今回は、この4問のWriteupを書く。
Network 100 (柚子胡椒 100)
「PINを探せ」という問題だった。この問題文から何となくBluetoothのパケットぽいなっと察してて、Wiresharkで開くとやっぱりそうだった。
WiresharkはBluetoothのパケットを解釈してくれるので、落ち着いてPINを交換しているパケットを探して行くと、"Sent PIN Code Request Reply"というパケットにFLAGがあった。
FLAG: TDU{PiNC0De2}
ちなみに、Fake FLAGも取れちゃうけど、stringsコマンドでも解ける。
Network 200 (柚子胡椒 200)
「タイプした文字は?」みたいな問題だった。
とりあえずダウンロードしたgzip形式のファイルを解凍して、拡張子が.logだったのでfileコマンドで確認。
$ file type.log type.log: BTSnoop version 1, Unencapsulated HCI
BTSnoopって何だそれと思ってggると、hcidumpと呼ばれるBluetoothのパケットをキャプチャするものがあるらしくそのファイル形式らしい。
またしてもBluetoothのパケット(´・ω・`)
このファイル形式はWiresharkが対応してるので、Wiresharkで開ける。
(Network 100もfileコマンドしたらこの形式であることに後で気づいた)
参考 : Bluetoothトラフィックをキャプチャしてみる - 思い立ったら書く日記
次にstringsコマンドも実行してみると、以下の文字列が現れた。
TDU{bLu3T00tHDeTH} TDU{BURU-TUUU}
こんな簡単に出るわけないよなあと思いつつSubmitしてみたけど、やっぱりダメ。
という訳で、Wiresharkでパケットを眺めていった。
パケットを眺めたり、ググったりしてたけど、どの辺にデータ入ってるのか見当がつかなかった。そう思っていると作問者からこんなヒントが。
これを基にサイトの中をいろいろ見てると、この資料に辿り着いた。NW200(a.k.a. 柚子胡椒 Vol.2)はhttp://t.co/pcXW2Mv6VfのHIDテーブルを参考にしてください #TDUCTF
— え、もう本番ですか? (@mzyy94) 2015年3月29日
http://www.usb.org/developers/hidpage/Hut1_12v2.pdf
この資料には、どのキーが押されたときにどのキーコードが対応しているかが載っている。
FLAGのフォーマットは"TDU{~}“なので、これらがタイプされたという推測を働かせて、 Wiresharkの検索機能で"T"のキーコード(0x17)を探して、その後に"D”(0x07), “U”(0x18), “{”(0x2F)が続いてる部分を探した。
検索に引っかかった320番目の"Sent Remote Supported Features"というパケットから1個ずつPackets Byteの同じ部分(12byte目)を見ていくと、
17 00 07 00 18 00 2f …となっている。
ここで、00 は"no event indicated"なので無視する。また、10byte目が02だとShiftが押された状態である。
12byte目が00のパケットを抜いて、これらを整理すると以下のようになる。
10byte目 | 12byte目 | 入力された文字 |
---|---|---|
02 | 17 | T |
02 | 07 | D |
02 | 18 | U |
02 | 2f | { |
02 | 05 | B |
00 | 05 | b |
00 | 17 | t |
02 | 13 | P |
00 | 21 | 4 |
02 | 06 | C |
00 | 06 | c |
00 | 0e | k |
00 | 20 | 3 |
02 | 17 | T |
02 | 30 | } |
02 | 28 | Enter |
bとcが2つ入力されてたりしてるが、意味が通るようにするとこれがFLAGだった。
FLAG: TDU{BtP4Ck3T}
このキーコードのアイディア自体は残り40分くらいで気づいてたが何度やっても通らなくて、
10byte目が02だとShiftが押されていることに気づいたのが1分くらい前だった。
そして、FLAGをSubmit出来たのは残り10秒のところだった。
4時間のうちほとんどこの問題に時間を取られてしまったが、久しぶりにスリルが味わえたので良かったw
Network 300
「フラッグを探せ」という問題だった。やっとTCP/IPなパケットだったが、Wiresharkが解釈してくれないプロトコルでよくわからない。
サーバのポート番号が3240で、このポート番号でggると、以下のサイトがヒットした。
How to use USB/IP on a wireless router to share USB devices | Perception
このサイトから、このパケットはUSB/IPというソフトウェアを使って何かUSBデバイスを共有したのではないかと考えた。
また、TCPでデータのやり取りしてるのでFollow TCP Streamを使ってデータ部を見てみる。
“USB Receiver"や"Logitech"みたいな文字列が見えるので、200と同様にKeyboardから入力されたものがFLAGかなと推測してみる。
そこで、TCP Follow Streamの画面をhex形式で表示して眺めてみる。
すると、00000813の行が200の時と同様に、 02 00 17… となっている部分 (サーバから送られてくるデータの49byte目と51byte目) がある。
この部分を整理すると以下のようになる。(51byte目が 00 のデータも除く)
49byte目 | 51byte目 | 入力された文字 |
---|---|---|
02 | 17 | T |
02 | 18 | U |
00 | 50 | ← |
02 | 07 | D |
00 | 4f | → |
02 | 2f | { |
02 | 30 | } |
02 | 50 | ← |
00 | 18 | u |
00 | 22 | 5 |
00 | 25 | 8 |
00 | 0c | i |
02 | 13 | P |
00 | 0b | h |
02 | 1e | ! |
00 | 2a | DEL |
00 | 1e | 1 |
02 | 07 | D |
200と違って、カーソルキーが入ってたりDELが入ってたりするので、それも踏まえると以下のようなFLAGになった。
FLAG: TDU{u58iPh1D}
pcapファイルなBinary
NetworkとMiscしか解いてなかったのでBinaryは詳しくみてないから気付かなかったが、みむらさんに「パケリストなら解けるでしょ」とか煽られてしまったので終わった後解いた。
まず、question.pcapというファイルが渡される。pcapなのでとりあえずWiresharkで見てみると、"TDU{~} //This is not a flag" みたいなデータが入っているICMPパケットがたくさんある。
Wiresharkでパケット見てても何か解けそうにないので、バイナリエディタで開いて見てみる。
ここではpcapファイルフォーマットを確認しながら、どこかおかしいところがないかを確認した。
pcapファイルのフォーマットを次に示す。
参考 : パケットキャプチャのファイルフォーマット:プログラマー社長のブログ:オルタナティブ・ブログ
ファイルフォーマットとpcapのバイナリをよく見比べると、前のパケットと次のパケットのヘッダの間に6byte分余計なデータが入っていることに気づいた。
通常Wireshark等でパケットキャプチャすると、通常は"Packet Header"のcaplenとlenが同じであるが、このファイルではcaplenが74で、lenが80になっている。
Wiresharkではcaplenの値でパケット長を判断するらしく、(len - caplen) byte(今回の場合は6byte)はWiresharkでは表示されないようだ。
この各パケットに付いている6byte分のデータを一つずつ見ていくと、"TDU"という文字や"{PC"という文字が見えたので、"G}“となっているところまで取り出して、それらを連結したものがFLAGであった。
FLAG: TDU{PCAPBLOCKPADDING}
感想
自分が解いたネットワークやバイナリ問題は、解いてみると、「ああなるほど」という感じで面白いしとても身のある問題だったと思う。
Bluetoothのパケットは普段見ることないし、pcapファイルをここまで調べるととはないのでとても勉強になった今回のCTFだった。
p.s. Network 300解いたので柚子胡椒頂きました。ありがとうございます