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

hamayanhamayan's blog

Flatt Security Speedrun CTF #2 Writeups

【イベント】タイムアタック形式のCTF「Flatt Security Speedrun CTF #2」を開催します | Flatt Security こちらに参加してきました。とても面白かったです!

開始前

ハッシュタグの素振りをしたり、 念のためFlatt Security Speedrun CTF writeup - st98 の日記帳 - コピーを見返したりしていた。

問題

5問中3完、6位でfinishでした。

1: x

ソースコードを読んでいる間に抜かされそうだったのでサイトを眺めることから始める。

You are not coming from 127.0.0.1!

と言われるので、定石のヘッダーを使った偽装を試みる。
手元に全部入りヘッダー一覧があったのでそれを張り付けて送ってみる。

X-Forwarded-Host: 127.0.0.1
X-Forwarded-Port: 127.0.0.1
X-Forwarded-By: 127.0.0.1
X-Forwarded-Scheme: 127.0.0.1
X-Frame-Options: 127.0.0.1
X-Forwarded-For: 127.0.0.1
X-Client-IP: 127.0.0.1
X-Real-IP: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-Host: 127.0.0.1
X-Cluster-Client-IP: 127.0.0.1
True-Client-IP: 127.0.0.1
Client-IP: 127.0.0.1
Origin: null
Origin: 127.0.0.1
X-Requested-With: 127.0.0.1

x header is banned!

Xのものは使えないっぽいので、X-から始まるものを削除して送るとフラグが得られた。
guessで解いたおかげかFirst Blood達成。
前回参加時も1問目First Bloodだったな。前回同様ここが最高潮だった。

2: busybox1

/bin/[入力]という形でコマンド実行できるサイトが与えられ、/flagを読むのがゴール。
だが、"cat"と"sh"は使えず、パストラバーサルも禁止されている。
適当にポチポチ試すとrev /flagでさかさまのフラグが得られた。
逆にして答える。 3rd blood.

3: busybox2

busybox2とほとんど同じで、/getflagを実行する問題。
xxdでバイナリを持ってきて実行したり、中にフラグが入ってないか探したが、ダメだった。
今冷静にソースコードを見ると、/getflag経由で/flagを見る問題だったのでそれはそう。

色々手元にあるメモから試していき、紆余曲折あり、最終的に以下でフラグが得られた。
find / -type f -exec /getflag {} +

4: semgrep 解けず…

解けなかった。
javascriptのコードを与えて、/flagを得る問題。
semgrepというSASTツールを使った検証フェーズがあり、厳しくコードがチェックされている。

解析時にsemgrepの独自機能で文字列が埋め込める?semgrepのドキュメントを読み込むべき?とか、
もしかして、この状態で真面目にjailする?とか考えていた。
が、冷静になって考えるとspeedrunでそんな複雑なことを要求しないなと思いなおし、
与えられているカスタムコード部分で何かないか探す。
怪しい部分としてはsemgrepには入力値のcodeがそのまま渡されているが、
使用するときは"use strict"; return (async () => { return ${code} })();と埋め込まれている点である。
このように検証時の形と使用時の形が異なることを利用するのはweb問の典型ではあるが、
ここに辿りつくのにかなり時間を要してしまって、ここで時間切れ。
1; }).call(1); //みたいな怪payloadを書き残してfinishしました…

この前提から色々実験するのが、この問題のより本質的な部分。
作問者の解説を聞くと、適当に後ろにくっつけるとsemgrepのパースが失敗して何でも入れられるらしい。
解説を受けた記憶を元にpayloadを構築しようとしたが刺さらない…
発想が合ってても解けなかったか…