sonickun.log

備忘録

SECCON CTF 2014 決勝戦に出場した

 SECCON CTF 2014 決勝戦にチームm1z0r3(みぞれ)として出場してきました.結果は431点で24チーム中20位,日本チームでは10位でした.SECCON CTF 2014決勝戦・全国大会カンファレンス
SECCON CTF 2014 Finals Ranking

f:id:sonickun:20150209183918j:plain

 特別賞として,「Medical × Security Hackathon賞」を頂きました.3月に福島で行われるハッカソンに招待していただけるようです.
f:id:sonickun:20150209184210j:plain


 圧倒的実力不足を痛感しました.Writeupが書けない.

 個人的に取り組んだ問題について書いていこうと思います.問題サーバは全部で6台ありましたが,主にWEB系の問題を中心にに1,2,5,6に取り組みました.

サーバ 壱

 指定されたURLにアクセスするとユーザ登録とログインが出来るようになっている.
f:id:sonickun:20150209222627p:plain
 ログインすると以下の画面が開く.各チームごとにUser NameやURLに使えない文字のブラックリストが作れるようになっている.
f:id:sonickun:20150209223639p:plain
 このサーバでは登録したユーザ数が最も多いチームにDefenseポイントが入るようになっている.ただし短時間に連続して登録できないようになっており,さらにブラックリストもかいくぐらないといけないため工夫が必要.
 Attackポイントを取るにはページ下部にあるのSendフォームが狙い目のよう.ここで指定されたURLに管理者がアクセスしてくる.実際に手元(192.168.6.9)にWEBサービスを立ち上げ,http://192.168.6.9/を指定するとGETでアクセスしてくるがとくに管理者のセッション情報はない(クロスドメインの問題がある).HTTPヘッダのUser-Agentに"Admin's Browser"の文字を発見したのでこのUAでアクセスしたがなにも起きなかった.Sendの下にShow Passwordのフォームがあるので一旦管理者にここをアクセスさせてからごにょごにょ...といろいろ考えたがここで挫折.あとで聞いた話によるとXSSが可能だったらしい.

サーバ 弐

 以下のようなキャプチャ認証がある掲示板がある.
f:id:sonickun:20150209224203p:plain
 画面下には直近の投稿履歴が表示される.一定時間ごとにこの履歴欄に表示されているチームにDefenseポイントが入る.他のチームはこの投稿を並列処理で自動化してがっぽり点を稼いでいた(ほぼDDoS攻撃の状態だった).なお自動化の際にはキャプチャの画像を見る必要はなく,cookieの設定の脆弱性を突いて認証を突破することが可能らしい.うちのチームは自動化ができなかったのでなんとか脆弱性を突いてAttackポイントをば,と思っていたが,後で投稿数が最も多いチームがフラグを得ていたことを聞き,「なんだそれ」と言った.
 bodyではダブルクオート,"script","alert"などの文字がエスケープされたり,imgタグなどが埋め込めたりなど,とっても思わせぶりな挙動をしてくれたのにXSSは全く関係なかった.

サーバ 伍

 CGIが動いていて,最初の画面がこのような表示になる.
f:id:sonickun:20150209194312p:plain
 ここに自分のチームのDefense Keyを置くことでDefenseポイントが入るようになっている.後にKeyは/flags下にあることがわかった.直感的にいま流行りのShellshockの攻撃でコマンドインジェクションができるかなと思ったができなかった.
 次にこのWEBサーバーのIPアドレスが10.100.5.2なのだが,終端が1でなく2な時点で怪しい./24でネットワークスキャンを行ったら他にも10.100.5.102,10.100.5.202,10.100.5.252も動いてることがわかった.しかもそれぞれポートがごっそり開いていて更に怪しい.全てのサーバ,全ての空いてるポートに対してnetcatするスクリプトを書いて試したがHTTPの80番ポート以外は反応はなし.ほかにもApache脆弱性を調べたりURLをごにょごにょしてみたが何も見つけられずここで頓挫.
 以下,終了後に聞いた話だが,まず/key.txtに一つ目のAttackポイントのフラグがあったらしく,「なんだそれ」と言った.こういう問題が今後の大会でも出るのかなと思うと少しつらい.ところがチームdodododoのakiymさんはこういうCTFでありがちなURLを試行するスクリプトを用意して見つけたらしく,プロは違うなと思った.ほかには/cmd.sh/svn/flagsが存在したらしく,Defense Keyが送信可能だったらしい(参考:SECCON 2014 全国大会に出た - misodengakuのブログ).これを解いたチームはほとんどいなかった模様.

追記(2015/02/16)

 他の人のWriteupを見て,実はこの問題はガッツリNetworkな問題だということがわかった.じつは5つ目のサーバが存在し,パケットをよく監視しているとそれに気づくことができるという./key.txtの存在もその流れで知ることができる.こういうことに気づけないようではパケリストとしてまだまだだなあとおもう.
 問題の詳細についてはもりたこさんのブログを参照されたい

 

サーバ 六

 暗号の問題.平文と暗号文の対応を見て暗号化のアルゴリズムを読み解き,Keyとなる暗号文を解読する.問題は全部で4問ある.1~3問目までは素直な問題だったらしく,チームの先輩がすぐに解いてくれた.4問目はかなりの難問で,自分も加わって協力して解いた.
 暗号文は以下のとおり.

AAAAgBX7KsK03QWS3Leud1FmWe5LyodjFstpL6Eo1JFKpioWItFrXBdrv6Vrf9ZwOK3TmBqriKkisDVXD/E45TcNOQUwNumw8L8pNiO4vLfxzsz6FYGDMB25IvYwO2ZI6qzbhOMi4dfSGkQfd8h5YAB

 平文と暗号文の対応のサンプルは以下のとおり.

ede     AAAAA1lsiAB
edb	AAAAA1iWSy8AA
dbac	AAAABCw2JY7JpAB

 まず,暗号文に使われる文字は大文字,小文字のアルファベットに加え,"_"と"/"の全部で64種類であることがわかった.これはBASE64と同じで,全ての文字を6bitで表現できるため,BASE64の変換表を用いて文字を全て2進数になおした.

ede    000000000000000000000000000000110101100101101100100010000000000001
edb    000000000000000000000000000000110101100010010110010010110010111100000000000000
dbac   000000000000000000000000000001000010110000110110001001011000111011001001101001000000000001

 01に直すと前半分は文字列長を表す領域になっていて,中盤部分は出現する文字をASCII変換したものが出現頻度順に並んでいた.後半部分は文字の並びを表現しているようだったが,途中でハフマン符号っぽいことに気づいた.

 ところが平文を一つ一つ手作業で符号化していくと,文字の種類が多い時にハフマン木が思ったとおりにならない.ここでこの符号化はハフマン符号に似たシャノン符号ではないかと思ったらビンゴで,チームの先輩がコードを書いて復号してくれた.

 暗号文を複合した結果は以下のとおり.

Password_located_you_done_of_you_that_mailing_and_C/C_Japanese_I_university_of_fend_time_used_Free_Basic_at_get_take_in_debug_Li


所感

 自分の実力不足を痛感した大会だった.自分は端から比較的得意なWEB問題を担当するつもりだったが,点数に直結する貢献がまったくできなかった.また序盤にDefenseに取り組んだチームが大きくリードしたように思えたが,うちのチームは1日目にDefenseポイントがまったく取れず,2日目に追い上げるのが困難な状況となってしまった.戦略によってはもう少し点も取れたかも知れない.
 一方で,みんなで協力して議論しながら問題を解いたことは嬉しかったし楽しかった.とくに6番目の暗号のwriteupは簡単に書いたが,あれは徹夜して紙に起こした0と1の羅列をひたすら眺めてみんなで解いた問題だった.あの感覚を忘れず今後もCTFを続けていきたい.

 ちなみに私は来年度からのm1z0r3の次期代表を拝命したので,そういった面でも頑張って行きたい.