SECCON2014 online CTF Write-Up(2014年12月6日〜7日)

2014年12月6日〜7日にかけて行われましたSECCON2014 online CTFに、チーム/dev/nullで参戦しました。1,700点で90位と、参戦2回目にしてはまずまずだったと思います。
自分で解けた問題だけですが、せっかくなのでWrite-Upを書こうと思います。

問題一覧




Welcome to SECCON

ジャンルStart
ポイント100
問題答えは、「SECCON{20141206}」です。
練習問題。というか接続試験。これをそのまま入れればポイントゲット。
でも少し手こずりました。最初、{ }の中だけ入れてincollectを出しました(w

Easy Cipher

ジャンルCrypto
ポイント100
問題
一番最初に解いた問題。
たくさんの数字と少々のアルファベットが大量に並んでいる文字列が表示される。
よく見ると、"5a"とか"4f"とか"1001111"とかある。これはすぐに2進数、8進数、10進数、16進数がランダムに並んでいるんだな。と気づく。8進数は数値の前に"0"が付いているのでわかりやすい。
最初、ASCIIコード表を見ながら1つ1つ手で変換していたが、これは終わらないな、と思い、Numbersに貼り付けてOCT2HEXやDEC2HEXで16進数に統一して、perlで
s/([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
こんな感じで変換。
答えは...
Welcome to the SECCON 2014 online CTF.The SECCON is the biggest hacker contest in Japan.Oops$ you want to know the flag, don't you?Here you are.SECCON{W31C0M 70 7H3 53CC0N ZOIA}Have fun!
こういうのを、サササッとプログラムで書けるようになると格好いいんだろうな。でもプログラム全然描けないのでダメです私。

Get the key

ジャンルNetwork
ポイント100
問題nw100.pcap
パケットキャプチャのpcapファイルが渡される。パケットを解析してフラグを入手する問題。
とりあえずwiresharkで開いて"Export Object"→"HTTP"でコンテンツを抜き出したら、HTMLファイルが2つ出てきた。一方を見てみたら、 http://xxx.xxx.224.21:6809/nw100/ のディレクトリインデックスのリストが出てきて、key.htmlというファイルが置いてあるのがわかった。
で、恐る恐る(不正アクセスじゃないよね...と気にしつつ)そのURLへアクセスしてみた。

そうしたところ、BASIC認証でパスワードがかかっている。
再度wiresharkのパケットを見てみると、認証に成功しているパケットがあるので、その時に送信していた認証文字列を、BurpSuiteを使って送りつけてみた。そうしたところ、key.htmlファイルを開くことができた。
SECCON{Basic_NW_Challenge_Done!}


Get from curious "FTP" server

ジャンルNetwork
ポイント300
問題ftp://xxxx.quals.seccon.jp/
FTPサーバのアドレスが渡される(一応上記は伏せました)。
これはウチのチームメイトが解いたのですが、「サーバにFTPで繋いでファイルを入手したらキーがあったよ」と言っていた。

Read it

ジャンルForensics
ポイント300
問題Readit
謎なバイナリファイルが配布される。ダウンロードしたファイルをFTKImagerで開こうとしたが、ディスクイメージじゃないよと怒られた。 で、file Readitするとこんな感じ。
$ file Readit
Readit: (Corel/WP)
Corel/WPでググってみたら、Corel社のWordPerfectというオフィススイートがヒット。でもフリーで入手できないので、チームメイトにWordで開いてもらったが読めなかったらしい。仕方ないのでLibreOfficeで開いたらパスワードを要求された。とりあえず適当にパスワードを入力していたら開けてしまった...。
SECCON{0ld_Mac_753}
本当はちゃんとパスワードをどこかで見つけなければならないのだろう。あとで調べてみることにする。

Shuffle

ジャンルBinary
ポイント100
問題find the string before randomizing.
こちらも謎なファイルを配布される。file shuffleを実行するとLinuxのELF32バイナリらしい。
shuffle: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, not stripped
手元にあるDeft Linux上で動かしてみると、どうやらフラグの文字列(結構長い)をランダムに入れ替えたり一部消去したりして画面にoutputしているようだ。コマンドを実行するたびに表示される文字列や長さが変わる(文字列の一部が消去されるので、outputされる文字列の長さも変わる)。
何度も繰り返しているとなんとなく答えがわかりそうだったんだけど...

DeftLinux上で objdump -d shuffle と実行して逆アセンブルすると、アセンブラが表示される。これを見ていてもよくわからないのだけど、main関数のところでいろいろmovしているのに気がつく。
どうやらASCIIコードを1バイトずつレジスタに入れているみたい。
ということで、このmovの部分を抜き出して手作業でデコードしてみると....
SECCON{Welcome to the SECCON 2014 CTF!}
繰り返しますが、プログラム苦手なので、手作業したほうが早いのです(w

Reverse it

ジャンルBinary
ポイント100
問題Reverseit
これも謎バイナリが配られる。Reverse itという問題なので、何か逆にするんだろうなと思いつつ、Stirlingで眺める。とりあえず1バイトずつファイルをひっくり返してみるが何にもならない。fileコマンドでもdataとしか出てこない...


ファイルを眺めていたら、ファイルの最後の4byteが「0e ff 8d ff」。これを4bitずつ逆にすると「ff d8 ff e0」でJPEG画像になることに気づいた。でもどうやって4bitずつ入れ替えればいいかわからず、ここでチームメイトに相談。そうしたらpythonでスクリプトを作ってくれて、見事JPEG画像を取り出してくれた。
SECCON{6in_tex7}
上記のフラグが表裏逆になっている画像が出てきた。

SECCON Wars:The Flag Awakens

ジャンルQR
ポイント300
問題
ここから2日目。朝起きたら誰かがQR300を解いていた。後で確認したらもう一人のウチのチームメイトが解いていたらしい。話を聞くと、Youtubeの動画の中にバラバラ?のQRコードが出てくるので、それを集めて1つのQRコードにしたらしい。ふむふむ。

Choose the number

ジャンルProgramming
ポイント100
問題nc xxxx.quals.seccon.jp 31337
sorry fixed URL
一応アドレスは伏せてみました。上記のポートへ繋ぐと、ランダムな数字が2個出てくる。 その数字の中から最大値か最小値を答えるように促される(繋ぐたびにどちらを選ぶかはランダムに変わるようだ)。 1問あたり制限時間は約10秒(体感的に)。 正解していくと、表示される数字の量と桁数が増えてきて、途中からとてもじゃないが人間の力では答えられない。
以下は問題のイメージ(メッセージはうろ覚え)
-5, 8
Choose minimum number? -5

3, 0, -2
Choose maximum number? 3
(正解するごとにどんどん数字のかずと桁数が増えていく...)
で、リモートホストに繋いでデータを取得して計算してデータを送り返す、というプログラムを作成する。
100問目でフラグ!
SECCON{Programming is so fun!}
自分、PHPしか書けないので、PHPで書いていました。

version2

ジャンルNetwork
ポイント200
問題もうすぐ version 2 が来るけど準備はいいかい?
srv h2o.xxxx.seccon.jp.
これも一応アドレスを伏せました。2日目ラスト10分ということろでギリギリ解けた問題です。
"srv"と来たので、DNSのSRV RRだな。とすぐに気づいたので、digる。
$ dig srv _http._tcp.h2o.xxxx.seccon.jp
_http._tcp.h2o.xxxx.seccon.jp. 120 IN SRV 1 1 65080 h2o.xxxx.seccon.jp.
ということで、該当のサーバの65080ポートへブラウザで繋いでみると"Plz connect version2"(メモってなかったのでうろ覚え)のメッセージが。
チームメイトから、H2Oは水じゃなくてhttp/2.0だよね。とのツッコミがやってきた(w
で、http/2.0はほぼSPDYだよね?ということで、httpじゃなくてhttpsで再度digってみると、違うポート番号が帰ってくる!
% dig srv _https._tcp.h2o.xxxx.seccon.jp
_https._tcp.h2o.xxxx.seccon.jp. 120 IN SRV 2 0 65432 h2o.xxxx.seccon.jp

開発版のChromeでHTTP/2.0が使えるという情報を見つけたのでダウンロードしてインストール。見つけたページに従って、オプションをつけて起動。
$ /Applications/Google\ Chrome\ Cana.app/Contents/MacOS/Google\ Chrome\ Canary --enable-spdy4
で、該当サーバの65432ポートへ接続。すると「Plz see your HPACK」というメッセージが。HPACKはどうやらhttp/2.0のヘッダ圧縮技術らしく、とにかくヘッダ内にフラグがあるだろうと探し始めるが、wiresharkでパケットキャプチャしてもhttpsなので読めない。
ググってみると、「chrome://net-internals/#spdy」へアクセスするとSPDY(http/2.0)でアクセスしているセッション?の情報が読めるとのこと。で見てみると、ヘッダ情報が参照でき、フラグが見つかった。
SPDY_SESSION_RECV_HEADERS
(略)
x-flag-is: SECCON{spdy4isSoC001}

http://ucchi.info/ 09,Dec 2014