読者です 読者をやめる 読者になる 読者になる

/home/cympfh/

数式を $$ で囲んで書いてますが面倒くさいので、いちいち、はてな書式にしたりしません

日記 - SECCON 2015 Intercollege final

プロコン CTF 日記

タイトルのそれに、negainoido というチームで参加しました. 18チーム中11位でした. あまりチームの力になれず、 当たり前のSQLインジェクションを見つけて、 それに対応できてないチームが最後まで少なからずいたので、 わずかに点数を吸い上げることをしていた.

というわけで Write Up 的なことは書けないです.

言い訳

いわゆるネット上で行われる、人vs鯖だけのCTFがAttackだとして、 それには十分慣れていたけれど、 本戦のスタイルであったAttack&Defenceというスタイルが一切分からず、 最初の30分は何をしたらいいのか分からなかった. 自分たちの鯖のIPが分からずスタートしてから告知された等、運営の悪口を連ねてもしょうがないので建設的なことを書く.

ルールと態度

SECCON 2015 Intercollege 本戦 はおおよそ、次のようなルールでした. 各自、一つの鯖が与えられ、3つのwebサービスのソースだけが用意されている. 一つは Apache かなんかで動いてる php製のブログ. 一つは競馬シミュレータみたいなやつで、 node で動かすスクリプト群. nohup node app.js ってやって自分たちで動かした. 一つは、なんかよくわからない. 最後まで自分はこれには手を付けてない.

たぶんだけど、どのチームの鯖でも全く (?) 同一のソースコードがある. ので、ソース丸見え状態のCTFになる.

最初の15分は、攻撃をせずただソースコードを読む時間として、与えられる. だから、すべきことは、 ソースコードを精査して、いかにも脆弱そうなところを治すこと. また逆に、それが攻撃箇所になるのだから、リストアップして、チーム全員で共有すること.

ブログは、 ブラウザでアクセスすると、 「タイトル」、「削除キー」、「本文」 を送信して書き込むことができるようになっている.

本戦の運営側のチェックとして、5分おきに書き込みが行われる. 自分たちのDBはソースコードを見ればパスワードがあって覗けるので、 除いてみると、運営の書き込みにおける「削除キー」が、自分たちのフラグのようである. つまり、他チームはこれを奪って送信すると、自分たちからスコアを一定の割合で吸い取ることができる.

運営は運営の書き込みにおける「削除キー」がたしかにあるかどうかをチェックし、 確かにあるとき、ディフェンスポイントといって、鯖を管理するチームに点数が入る.

運営がどういうチェックをしてるのかは実際は知らされない. ネタばらしも何も無い. だから例えば、先のブログのチェックでいえば、 運営からだけ正しく表示できるようにしてもいい. それで確かに点数が加点されてるのをチェックしたら問題ないことになる.

競馬は javascript で書かれていて、SQLインジェクションを許すようなのが、 あちこちにあったので、安全になりそうなエスケープをした. 何の準備もしてなかったので、特殊文字をエスケープしたり、 コメントアウトのトークンを置換するとかいうヤバイことをした. まともな方法を予め用意しておくべきだった. どう考えてもDefenceにおける定石だ. 脆弱性以外にも、意地悪な入力によって地味に死んでしまうコード箇所があったので、 ログを読んで直して再起動するみたいなことを繰り返してた.