CSAW CTF 2015 writeup
CSAW CTF Qualification Round 2015にvulscryptosとして参加しました.
31/35問を解いて5860pt 14位(日本勢1位)でした.
チームメンバーのwriteup:
CSAW CTF 2015 writeup - しゃろの日記 http://charo-it.hatenablog.jp/entry/2015/09/23/144438
write-ups
僕がsubmitしたflagはweb200+web500+web600+exp100+exp400+crypto50+crypto50+crypto50+rev300+for100で,比較的面白かった問題のwriteupをいくつか置いておきます.
notesy (crypto 100)
flagをencryptしてくれるサービス.見るからに単一換字なのだが,encryptされたflagが見つからない.
pythonでデコーダを書いてチームのdocsに置いておいたら誰かが解いてくれた.
|
|
UNHMAQWZIDYPRCJKBGVSLOETXF
がflagだったらしい.クソ
Weebdate (Web 500)
適当なアカウントでログインして遊んでいると,edit profileのところでプロフィール画像のURLに対してurllibでアクセスしているっぽいことがわかる.file://localhost:/etc/passwd
のようなURLを入れることで任意のファイルが読めることに\@a_r_g_v氏が気付き,数分後にサーバー側で動いているコード(/var/www/weeb/server.py
,utils.py
, settings.py
)を取得した.
ログインしたいアカウントのidはdonaldtrump
で
あることがわかっていたので,これでコードの通りにsessionを生成するとdonaldtrumpのアカウントでログインできた.
が,この時点でまだweb500のsolvesは0であり,プロフィールや他のアカウントとのメッセージのやり取りを見てもflagが見つからない.IRCでコンタクトを取ろうとしても作問者が寝ているので待ってとのこと(クソ)だったのでしばらく待っていると,数時間後に次のhintが公開された.
Flag is md5($totpkey.$password)
どうやらdonaldのアカウントでログインするだけでは不十分で,平文のパスワードとtotpkeyを取得する必要があるらしい.totpkeyは容易に求まるが,パスワードに関しては見た感じSQL injectionの脆弱性もないし,そもそもデータベースに格納されているのはsha256(username+password)
だし……
しばらくserver.py
を眺めていると,get_csp_report
にSQLiの脆弱性があることに気付いた.
|
|
ここだけcursorのplaceholderではなく%を使ってformatされていた.本来ならここは%ではなく,が入るべきだった(1文字違い).わかりにくいバグだ……
というわけでcsp_reportの方で1 and 1=2 union select 1, user_password from users where user_name='donaldtrump';--
のようなクエリを投げるとdonaldのuser_passwordが抜けた.
あとは
|
|
となるようなpasswordを求めるだけ.
適当に総当たりをするコードを書いて動かしていたらzebra
が見つかった.
totpkey: 6OIMTPLHSQ6JUKYP
password: zebra
$ echo -n '6OIMTPLHSQ6JUKYPzebra' | md5sum
flag: a8815ecd3c2b6d8e2e884e5eb6916900
precision (Exp 100)
canaryっぽいのが実装されている.運営のミスで問題ファイルが2回ぐらい変わってキレた.
|
|
flag: flag{1_533_y0u_kn0w_y0ur_w4y_4r0und_4_buff3r}
FTP (Rev 300)
認証部分のコードを読んでいると,
username: blankwall
で独自のhash値が0xD386D209になるパスワード送れば良いことがわかる.
hash値の計算部分を見てみると
|
|
このような感じになっていて,2週間前のMMACTFの問題(Simple Hash)と同じなことがわかる(Mod=4294967296).
http://charo-it.hatenablog.jp/entry/2015/09/08/005012 にあるしゃろプロのソルバのパラメータを書き換えて動かしたらpasswordが求まった.
password: UJD737
というわけでpasswordの時だけ^Dで入力を切るとログインできた.RDF
を叩いてflag.
flag: flag{n0_c0ok1e_ju$t_a_f1ag_f0r_you}
memeshop (Exp 400)
解法はしゃろプロのwriteupに詳しく書いてあるのでそちらを参照してください.
一応exploitだけ:
|
|
flag: flag{dwn: please tell us your meme. I'm not going to stop asking}
最後に
今回は某社の会議室をお借りして会場6~10人+リモート5人ぐらいで取り組んでいました.
ピザ美味しかったです :)
会場の様子です pic.twitter.com/I5T0oM5zmi
— Ikumi Shimizu (@_193s) 2015, 9月 18
flag pic.twitter.com/KOZ8meRWk5
— Ikumi Shimizu (@_193s) 2015, 9月 20