sonickun.log

備忘録

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
 


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になっている.
f:id:sonickun:20141207224641j:plain
 ということでこれも逆さにして,フラグはSECCON{6in_tex7}.バイナリからすぐマジックナンバーを思い出せたのは嬉しかった.
 
 
 

REA-JUU WATCH (Web, 200)

 問題文のURLにアクセスすると「リア充ウォッチ」という,なんとも愉快で不愉快なWEBアプリが現れる.
 f:id:sonickun:20141207225243p:plain
 次の画面でIDとパスワードが生成され,ログインすると次のような問題が始まる.
 f:id:sonickun:20141207225256p:plain
 6問ほど回答すると,リザルト画面に自分のリア充度スコアが表示される.
 f:id:sonickun:20141207225302p:plain

 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}

 このようにユーザーの名前,パスワード,ポイントの情報が表示される.この情報を用いてもう一度ログインして問題に解答し,リザルト画面へ行くとフラグが現れた.
f:id:sonickun:20141207230211p:plain
 ということで晴れて真のリア充になることができた.フラグはSECCON{REA_JUU_Ji8A_NYAN}


 

Get the key.txt (Forensics, 100)

 "forensic100"という名前のシステムファイルデータが渡される.FTK-Imagerでマウントして見てみる.すると,中身に"key.txt"とあるファイルを見つける.
f:id:sonickun:20141207231543p:plain
 先頭バイナリ"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が渡される.ここにアクセスしてフラグとなるファイルをダウンロードしてくる問題らしい.
 さっそくアクセスして,ディレクトリ情報を取得しようとしたが,lsdirなどの,いわゆる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に関して参考にしたサイト

 以上のことから,h2o.pwn.seccon.jp.では,65080番ポートでHTTP,65432番ポートでHTTPSが動いていることがわかった.実際にこのポートを指定してHTTP接続してみると以下の様なページが表示される.
f:id:sonickun:20141207235607p:plain
 この時点で「version 2」とはHTTP/2のことであると気づく. 
 HTTP/2 - Wikipedia, the free encyclopedia
 要はこのページにHTTP/2で接続すれば良い.Chrome ChromeのSPDYではHTTP/2が実装されている.HTTP/2の設定を有効にして接続すると以下の様なページが表示される.(HTTP/2はSSL必須なのでHTTPSで繋ぎに行く)
 f:id:sonickun:20141207235940p:plain
 「HPACK」とはデータの圧縮形式の一つで,HTTP/2で通信を行う際はこの形式でデータを圧縮して送信しているらしい.
 Chromeデベロッパツールでレスポンスヘッダを見てみたらフラグの書かれているヘッダが含まれていた.
 f:id:sonickun:20141208000247p:plain
 ということで,フラグはSECCON{spdy4isSoC001}

 HTTP/2,SPDYに関して参考にしたサイト

 余談だが,自分の代わりにHTTP/2でWEBサイトにつなぎに行ってくれるサービスもあったらしい.

f:id:sonickun:20141208000850p:plain



所感

 前回の国内予選から約半年間で,ある程度成長が実感できた.自分の知識や経験則からある程度攻略が楽になった問題もあったし,瞬殺すべき問題はきっちり瞬殺できたのもよかった.ただ,CTFを始めて数ヶ月の雑魚には変わりはないので,今後は自分の得意分野を伸ばして全国大会でも戦える力をつけていきたい.あとCTFはやっぱり楽しい.ちなみに近々チーム内CTFが開催されるのでとても楽しみです.