SECCON CTF 2014 Online Qualifications Write-Up
SECCON 2014 オンライン予選(英語)にチームm1z0r3(みぞれ)として参加しました.結果は2100点で1067チーム中65位.完敗です.世界の壁は高かった...
ただ,m1z0r3は国内予選6位で既に全国大会の切符を手に入れているので,本番までにもっと力を蓄えていきたいです.
今回のSECCONで自分が解答した or 解答に携わった問題のWrite-Upを書きます.実際大した問題はあまり解いていない.鮮やかにHeartBleedの攻撃とかやりたかったです(HearBleedはリーダーが解いてくれた).
SECCON CTF 2014 Online
はじまった!!! #seccon
— そにっくん/sonickun (@y_hag) December 6, 2014
Reverse it (Binary, 100)
"Reverseit"というファイルが渡される.fileコマンドを打つと"data"とだけ.さっそくバイナリを上から下まで眺めていると終端が"FF 8D FF"になっている.
これどこかで見たことある......と思ったら"FF D8 FF"はJPEGの先頭のマジックナンバーであること気づく.先頭のバイナリに戻って見てみると"9D FF"...JPEGの終端のバイナリは"FF D9"...
どうやらJPEGのバイナリが4bit(16進数1桁)ごと逆順に並んでいるよう."Reverse it"とはこのことか(笑) Pythonでコードを書いて並び替える.
f = open("Reverseit","rb").read() g = open("Reverseit.jpg","wb") f = f.encode('hex')[::-1].decode('hex') g.write(f) g.close()
生成したファイルを開くとこの画像.またもやReverseになっている.
ということでこれも逆さにして,フラグはSECCON{6in_tex7}
.バイナリからすぐマジックナンバーを思い出せたのは嬉しかった.
REA-JUU WATCH (Web, 200)
問題文のURLにアクセスすると「リア充ウォッチ」という,なんとも愉快で不愉快なWEBアプリが現れる.
次の画面でIDとパスワードが生成され,ログインすると次のような問題が始まる.
6問ほど回答すると,リザルト画面に自分のリア充度スコアが表示される.
FiddlerでHTTPリクエストを眺めていると,最後の問題を解いた後,別のURL(http://reajuu.pwn.seccon.jp/users/chk/[id]
)にもアクセスしている.[id]にはユーザーIDに対応した数字が入っているよう.試しにid=1にして,1番目のユーザーのところへつなぎに行くと,以下の文字が出現する.
{"username":"rea-juu","password":"way_t0_f1ag","point":99999}
このようにユーザーの名前,パスワード,ポイントの情報が表示される.この情報を用いてもう一度ログインして問題に解答し,リザルト画面へ行くとフラグが現れた.
ということで晴れて真のリア充になることができた.フラグはSECCON{REA_JUU_Ji8A_NYAN}
.
Get the key.txt (Forensics, 100)
"forensic100"という名前のシステムファイルデータが渡される.FTK-Imagerでマウントして見てみる.すると,中身に"key.txt"とあるファイルを見つける.
先頭バイナリ"1F 8B"を見た瞬間にgzipだと気づいたので,このファイルをエクスポートして解凍するとフラグが得られた.
フラグ→SECCON{@]NL7n+-s75FrET]vU=7Z}
Get the key (Network, 100)
nw100.pcapというpcapログが渡される.
- だーっと眺めているとHTTP通信をしているよう.(10秒)
- とあるURLにアクセスしている(中には"key.html"ヘのリンクが含まれている).(20秒)
- 実際にアクセスするとBasic認証が必要みたい.(30秒)
- pcapにもどり,BASE64でエンコードされた認証データを抜き出す.(40秒)
- BASE64をデコードし,IDとパスワードを取得.(50秒)
- Basic認証を突破しkey.htmlにアクセスしてフラグゲット.(1分)
瞬殺でした.フラグ→SECCON{Basic_NW_Challenge_Done!}
フレーム番号21番のパケットのHTTPヘッダーが以下のようになっている.
Hypertext Transfer Protocol GET /nw100/ HTTP/1.1\r\n [Expert Info (Chat/Sequence): GET /nw100/ HTTP/1.1\r\n] [GET /nw100/ HTTP/1.1\r\n] [Severity level: Chat] [Group: Sequence] Request Method: GET Request URI: /nw100/ Request Version: HTTP/1.1 Accept: text/html, application/xhtml+xml, */*\r\n Accept-Language: ja-JP,en-US;q=0.5\r\n User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko\r\n Accept-Encoding: gzip, deflate\r\n Host: 133.242.224.21:6809\r\n Authorization: Basic c2VjY29uMjAxNDpZb3VyQmF0dGxlRmllbGQ=\r\n Credentials: seccon2014:YourBattleField Connection: Keep-Alive\r\n DNT: 1\r\n \r\n [Full request URI: http://133.242.224.21:6809/nw100/] [HTTP request 1/1]
http://133.242.224.21:6809/nw100/
へ接続している.
"Basic c2VjY29uMjAxNDpZb3VyQmF0dGxlRmllbGQ="とあるので,これをBASE64エンコードすると"seccon2014:YourBattleField"となる.つまりBasic認証のユーザー名が"seccon2014",パスワードが"YourBattleField"となる.
Get from curious "FTP" server (Network, 300)
FTPサーバのURLが渡される.ここにアクセスしてフラグとなるファイルをダウンロードしてくる問題らしい.
さっそくアクセスして,ディレクトリ情報を取得しようとしたが,ls
やdir
などの,いわゆるLIST
コマンドが使えない.
$ ftp ftpsv.quals.seccon.jp Connected to ftpsv.quals.seccon.jp. 220 (vsFTPd 2.3.5(SECCON Custom)) Name (ftpsv.quals.seccon.jp:****): anonymous 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 200 PORT command successful. Consider using PASV. 502 LIST not implemented. ftp> dir 200 PORT command successful. Consider using PASV. 502 LIST not implemented. ftp> quote list 502 LIST not implemented.
"502 LIST not implemented."とは,つまりLISTコマンドが実装されていないという意味.ほかにもNLSTなどのコマンドも使えない.この状態でどうやってディレクトリ情報を取り出すかがこの問題のミソとなっている.また,get ./*
のようにワイルドカード(*)を使用することもできないようになっている.
他の使えそうなコマンドを探してみる.以下のサイトを参考にした.
このサイトを見てみるとSTATコマンドの説明に「現在のシステムや転送状態の情報を表示する。ファイル/ディレクトリ名が与えられた場合は、その情報を表示する(NLSTなどとほぼ等価)」とある.そこでquote stat /
を実行してみるとディレクトリ情報が取得できた.
ftp> quote stat / 213-Status follows: drwxr-xr-x 2 0 107 4096 Nov 29 04:43 . drwxr-xr-x 2 0 107 4096 Nov 29 04:43 .. -rw-r--r-- 1 0 0 38 Nov 29 04:43 key_is_in_this_file_afjoirefjort94dv7u.txt 213 End of status ftp> get key_is_in_this_file_afjoirefjort94dv7u.txt 200 PORT command successful. Consider using PASV. 150 Opening BINARY mode data connection for key_is_in_this_file_afjoirefjort94dv7u.txt (38 bytes). 226 Transfer complete. 38 bytes received in 0.000115 seconds (330434 bytes/s)
ということで,"key_is_in_this_file_afjoirefjort94dv7u.txt"をgetでダウンロードして開くとフラグが得られた.
フラグ→SECCON{S0m3+im3_Pr0t0c0l_t411_4_1i3.}
version2 (Network, 200)
「もうすぐ version 2 が来るけど準備はいいかい?」という問題文で,さらに「srv h2o.pwn.seccon.jp.」とドメインが与えられる.雑魚なのでこの時点で「version 2」が何のことが分かっていない.とりあえず「srv」とは何なのかを調べる.
SRVとはDNSに含まれるレコードの一つで,動いているサービスやプロトコル,使用しているポート番号などの情報を保持しているらしい.SRVテーブルの情報はnslookupを用いて以下の様なコマンドで取得することができる.
$ nslookup > set type=srv > h2o.pwn.seccon.jp Server: 10.1.2.1 Address: 10.1.2.1#53 Non-authoritative answer: *** Can't find h2o.pwn.seccon.jp: No answer Authoritative answers can be found from: seccon.jp origin = ns1.value-domain.com mail addr = hostmaster.seccon.jp serial = 1417939413 refresh = 16384 retry = 2048 expire = 1048576 minimum = 2560 > _http._tcp.h2o.pwn.seccon.jp Server: 10.1.2.1 Address: 10.1.2.1#53 Non-authoritative answer: _http._tcp.h2o.pwn.seccon.jp service = 1 1 65080 h2o.pwn.seccon.jp. Authoritative answers can be found from: > _https._tcp.h2o.pwn.seccon.jp Server: 10.1.2.1 Address: 10.1.2.1#53 Non-authoritative answer: _https._tcp.h2o.pwn.seccon.jp service = 2 0 65432 h2o.pwn.seccon.jp. Authoritative answers can be found from:
SRV,nslookupに関して参考にしたサイト
- 実用 BIND 9で作るDNSサーバ(14):DNSの拡張仕様、SRVレコードとENUM (1/2) - @IT
- How to verify that SRV DNS records have been created for a domain controller
以上のことから,h2o.pwn.seccon.jp.では,65080番ポートでHTTP,65432番ポートでHTTPSが動いていることがわかった.実際にこのポートを指定してHTTP接続してみると以下の様なページが表示される.
この時点で「version 2」とはHTTP/2のことであると気づく.
HTTP/2 - Wikipedia, the free encyclopedia
要はこのページにHTTP/2で接続すれば良い.Chrome ChromeのSPDYではHTTP/2が実装されている.HTTP/2の設定を有効にして接続すると以下の様なページが表示される.(HTTP/2はSSL必須なのでHTTPSで繋ぎに行く)
「HPACK」とはデータの圧縮形式の一つで,HTTP/2で通信を行う際はこの形式でデータを圧縮して送信しているらしい.
Chromeのデベロッパーツールでレスポンスヘッダを見てみたらフラグの書かれているヘッダが含まれていた.
ということで,フラグはSECCON{spdy4isSoC001}
HTTP/2,SPDYに関して参考にしたサイト
- HTTP2を試してみる | GREE Engineers' Blog
- SPDY Tools and Debugging - The Chromium Projects
- 【SPDY】HTTP/2ハッカソンに行ってきた【HPACK】 | FiS Project
余談だが,自分の代わりにHTTP/2でWEBサイトにつなぎに行ってくれるサービスもあったらしい.
所感
前回の国内予選から約半年間で,ある程度成長が実感できた.自分の知識や経験則からある程度攻略が楽になった問題もあったし,瞬殺すべき問題はきっちり瞬殺できたのもよかった.ただ,CTFを始めて数ヶ月の雑魚には変わりはないので,今後は自分の得意分野を伸ばして全国大会でも戦える力をつけていきたい.あとCTFはやっぱり楽しい.ちなみに近々チーム内CTFが開催されるのでとても楽しみです.