CTF
seccon

SECCON2017国内決勝大会 Write-up

どうも。
Yone-laboチームで出場したおのかちおです。
他のチームがWriteupを書いてるみたいなので自分も書いてみます。

府中

どうやら、音楽のランキングの上位を返すjsonが、ディフェンスフラグの監視対象になってるので、自分のチームのディフェンスフラグを曲名にした曲をアップロードして、自作自演で高評価をつけまくるらしい。
ただ、チームの中にElectronがわかる人が居ないため結局どこのAPIを叩いてるのかわからなかった。
grepを駆使した結果、nuxt.jsというものでうごいってるっぽい。
アタックフラグは全くわからなかった。

船橋

指紋を一定時間内に判別する問題。10回連続で10秒以内に同じ指紋を判別するとアタックフラグが守られる。さらに15回連続になると自分のディフェンスフラグを書き込める。

本当はTensorflowでclassify_image.pyとか使えば簡単に機械学習ができたはず。
(トップページには学習用のサンプルデータが乗っていたのもある。
もちろんチーム内に人工知能理解してるおじさんはいなかった。
自分もcassify_image.pyは少し画像認識に使った程度だったので、何をどうすればいいかわからなかった。

ただ、弊チームは人力でときました(解けちゃいました。
ヒューマンラーニングとでも言いましょうか…(おい

幕張

スマートキーのバイナリが降ってくるので、それを解析する問題。

たぶんバイナリはgoで作られてた。通信方式はMQTTというIoT向け。
パブリッシャー、サブスクライバー、ブローカーの3つの役割があるらしい。
今回降ってきたバイナリは2つで、片方はICカードの読み取り、もう一つは鍵の解錠・施錠をするもの。
なのでIC読み取りがpublisher、施錠管理がsubscriber。ここで本来は正統なブローカーがあるだが、自分の手元からだと接続できない。
ので、自分の手元にブローカーを構築する。自分はmosca (https://github.com/mcollina/mosca )を使ってみたがうまく情報が取れなかった。

梅田

画像を投稿するサイトの問題。
ディフェンスフラグは、most-likedな画像の最新のコメントから読まれる。
よって、Botかなにかを使って大量にコメントを自動投稿しなければならない。

また、ページはcrsf対策として、crsf_name、csrf_valueの2つのhidden inputがある。また、PHPのセッションにも保管しているみたいなので、その3つを含めてHTTPリクエストを送ってあげなきゃいけない。
自分は最初はcurlとシェル芸でゴリ押ししていた(以下)

$ curl -Ss http://umeda.koth.seccon/login|tr '<>' '\n\n' > a ; rg "csrf_name" a|sed -E 's/.*(name=)(.*)(value)/\1/'|sed -E 's/name=="//'|sed -E 's/"//' > csrf_name ; rg "csrf_value" a|sed -E 's/.*(name=)(.*)(value)/\1/'|sed -E 's/name=="//'|sed -E 's/"//' > csrf_value ; curl -Ss -X POST -d "csrf_name=$(cat csrf_name)&csrf_value=$(cat csrf_value)&name=test&password=test" http://umeda.koth.seccon/register -i

が、だんだんめんどくさくなってきたため、tampermonkeyというブラウザ拡張を使って、ブラウザの動作をjqで自動化した。

コードは以下

(async() => {
    const content = document.getElementsByClassName('uk-input uk-text-large')[0];
    const button = document.getElementsByClassName('uk-button uk-button-default')[0];
    content.value = "64ccf53cf25dc8b8ef7ff4e6eb060f86";
    button.click();
})();

ただフォームに入力してsubmitしてるだけ。

アタックフラグについては、色々方法があるそうだった。
まず、一つ目は最初のmost-likedのページに表示されてたもの。

弊チームは、adminユーザーにブルートフォースアタックを仕掛けたら、まんまとパスワードがわかったのでそれでログインした。
2つめと3つめは、adminでログインした際にcookieに勝手に保存されてた。

また、ログを表示するページに、ディレクトリトラバーサルの脆弱性があった。具体的には、?p=../../../../とかやるとそのディレクトリがみえちゃう脆弱性。
ということで、まずそれでカレントディレクトリの一個上を見ると「yeeeeee_this_is_flag.txt」みたいな自己主張の激しいファイルがあるので、中身を見ると3つめのフラグ。

また、このサービスはslimで実装されているみたいだが、src/routes.phpをみると、「SESSION['is_admin']がtrueのときにSESSION['FLAG4']にフラグを代入する」というphpコードが見える。
そのため、じぶんのセッションを覗き見る必要がある。
phpはデフォルトでセッションを/tmp/sess_に保管する。
そのため、まずcookieから自分のセッションIDを確認した後、その名前のファイルを見る。
と、SECCON{}フラグがある。これで4つめ。

まとめ

最終的な点数は627で、順位は9位。
割と裏技感が否めなかったが、楽しかった!!

次回もぜひ(参加できればだが)参加したい。