Aizu CTF #2に参加した「感想」
※一回もflagをsubmitできなかったのでwriteupではございません
10月1日(土)に会津大学で開催されたAizu CTF #2に、普段組んでいる初心者CTFチームのメンバーと共に参加してきました。
結果から言うと、下から4番目でした。参加者は14,5人いたのでそのくらいです(適当)
当日
前半が講義、後半が実際に手を動かしてAttack & Defense形式のCTFをやる(個人戦)、と言う感じでした。
前半
まず講義ですが、Webセキュリティの基礎ということでSQL Injection, XSSなどの攻撃やその他様々な攻撃手法を教えてもらいました。
自分が特に面白いと思った攻撃手法がTime-based Injectionです。
SQLの実行結果がどうであってもロジックには全く影響しない、と言うケースに使われるという話で、 どうするのかと思ったらレスポンスが返ってくるまでの時間でパスワードを推測していくという事で、なるほどなぁと思いました。
後半
さぁいよいよ演習の時間です。
今まではJeopardy形式のCTFしか参加したことはなかったので、とても新鮮でした。
まず問題だったのが、有線でローカルネットワークに繋ぐのですが、LANケーブル挿しただけじゃ繋がらない、IP設定して云々という事で僕にはさっぱりわかりませんでした、はい。
ですが、すぐバッタさんが来てくれて僕のUbuntuマシンをカチャカチャやってくれて繋がりました。(ありがとうございました・・・)
その後競技がスタートしたのですが、ネットに繋がらない云々があったので遅れてあたふたしながら始めました。
ルールとしては、各チームに与えられたサーバ上で動いている脆弱なWebアプリケーションを防御しながら他の人のサーバを攻撃してflagをゲットします。
最初の30分は他の人のWebアプリケーションにはアクセスできないようになっていたので、とりあえずソースコードを読んだりしていました。
途中で「どこにflagがあるのか」と考えた結果、「データベースじゃね?」と思ったので、MySQL開いてテーブル見てごにょごにょしていると、usersテーブルの中にflagを見つけました。
これを守って、さらに他の人のflagを取ることを考えた結果、防御手法としては「flag付きのuserを削除する(これはアホだった)」、攻撃手法としては「SQL Injectionなどして、頑張って読み出す」という方針に決まりました。
なぜflag付きのuserを削除するのがアホだったかというと、毎ラウンドSLAがチェックしているためflagが存在しないとそのぶん防御ptが入らなかった。(と思ったけど、実際そうだったのかわからない・・)
次に、攻撃しようと思ったのですがユーザログインのフォームでSQL Injectionしてみるもできない。なんとかしてadminになれないかと試行錯誤するもダメでした。
次にXSSすることを考えて、Webアプリケーションが掲示板のような感じだったので、とりあえず
<script>alert('xss');</script>
とかしてみると、脆弱性があることがわかりました。
講義でのXSSの解説に、alertを出すこと自体がXSSとして世間に誤認されてしまっている、alertを出すことが目的ではない、と言う話で僕もalert脳から脱却しようと頑張ったのですが、どうやればいいかわからずギブアップ。
結果、嫌がらせのようなXSSしか思い浮かびませんでした。(すみません)
<script>while(1){alert('xss');}</script>
無限ループでalertを出し続けるという感じで、いくつかのチームに仕込んで回っていました。
でも、これに手間を取られたチームもいてくれたみたいで、結果的に妨害行為的なのはできたのかなと思いました。
悪夢だったのが、
DOM構造が変更されています。タイムアウトしました。
という警告で、Webアプリのホームのレイアウトがめちゃくちゃになる、というもので「なんだこれはあああ」とずっと思ってました。
どうやらMySQL再起動して、アプリも再起動すれば直るらしく、何回も何回も再起動していました。
この警告が出ていると、防御ptが全く入らなくて前半の防御ptがほぼ0みたいな状態で、厳しかった。
あとは終盤は、怪しそうなuserや怪しそうなpostがあったら手動で消していくみたいなことをしていて、ひたすら防御に回っていました。
そしたら、DOM構造が変更されています、の警告がようやく出なくなって、よかったです。(未だになにが原因だったのかわかりません・・・)
まとめ
話には聞いていたけど、やっぱりAttack & Defenseって攻撃と防御を自動化等して、いかに両立できるかだなぁと感じました。
つらかったけど、最高に楽しかったです。