SECCON 2015 final (intercollege)
もう既に各所ニュースサイトなんかでは取り上げられてますが SECCON 2015 final (intercollege) でチーム dodododo として出場して優勝しました。
めっちゃ「 dodododo のリーダー」みたいな呼ばれ方してるんですが、本来のリーダーは akiym さんで今回は SANS Netwars で自分が出場権を取ってきたのでリーダーとして立ちまわってただけです。
適当なサイトで読めるような内容を再び書いても面白く無いので、決勝戦で何をやっていたかということについて書きます。
環境整備
環境整備の中でも特に WAF の導入をやった。
作戦として、 ModSecurity と OWASP Core Rule Set で Web アプリに対する基本的な攻撃をブロックするルールを適用して攻撃に使える時間を増やすことを考えた。
事前準備として、問題サーバが外部インターネットに繋がらない可能性を考慮して Ubuntu 用の deb パッケージの用意をしたり、 Core Rule Set の中からどのルールを適用するかを決めておいたりしたのに OS が CentOS だったため対応する rpm をダウンロードしてくる羽目になった。
vulnerable_blog の SLA チェックが安定しない
サービスは3つあり、そのうち ModSecurity が効くのは Apache 配下の vulnerable_blog と sbox2015 です。
WAF 導入後、 sbox2015 の SLA は安定しているのになぜか vulnerable_blog の SLA チェックが安定して通らない。 WAF を導入したことが原因かと思い込み、 ModSecurity のモードを DetectionOnly にしたり Off にしたりしたが状況は改善しない。
試行錯誤している間に hiromu が vulnerable_blog の脆弱性をすべて潰してくれたので WAF を外してみたものの、やはり SLA チェックは安定せず。運営しっかりしてくれ。
こうして競技時間の半分以上が溶けた。
sbox2015 の任意コード実行から vulnerable_blog の keycode を読む
任意コード実行を利用すると他のサービスの管理者パスワードをリークできるというので最後の1時間くらいはこれをやっていた。
適当に試したところ、スクリプト実行を許していてかつある程度ポイントを保持しているチーム ( security_anthem ) があったので 15 フラグくらい頂いた。
おまけ
vulnerable_blog のページ番号のパラメータのエスケープを間違えているチームが非常に多かった。
ページ番号は LIMIT 句に入ってくるので文字列としてプリペアドステートメントに突っ込んでしまうと SQL インジェクションが発生してしまう。ただ、今回は CodeIgniter が SQL のエラーをうまく表示してくれなかったのでうまく exploit に繋げられなかった。
ORDER BY , LIMIT 以降で効率よく SQL インジェクションする方法があったら教えてください。