SECCON for Beginners CTF 2020 writeup
SECCON for Beginners CTFに参加しました。
去年から全然進歩せずほとんど解けませんでした…
とりあえず戒めのためにwriteup書いておきます。
目次
Web
unzip
Unzip Your .zip Archive Like a Pro.
https://unzip.quals.beginners.seccon.jp/
Hint:
index.php (sha1: 968357c7a82367eb1ad6c3a4e9a52a30ea
Hint:
(updated at 5/23 17:30) docker-compose.yml
アクセスするとこんな感じ。

まずindex.phpのソースから怪しい箇所を探す。
// prepare the session
$user_dir = "/uploads/" . session_id();
if (!file_exists($user_dir))
mkdir($user_dir);
if (!isset($_SESSION["files"]))
$_SESSION["files"] = array();
// return file if filename parameter is passed
if (isset($_GET["filename"]) && is_string(($_GET["filename"]))) {
if (in_array($_GET["filename"], $_SESSION["files"], TRUE)) {
$filepath = $user_dir . "/" . $_GET["filename"];
header("Content-Type: text/plain");
echo file_get_contents($filepath);
die();
} else {
echo "no such file";
die();
}
}
ここでファイル名が相対パスを指定できれば、必要なパスが取れそうというのがわかりました。SESSIONのfilesにfilenameが含まれることが前提っぽいです。
docker-compose.yml
version: "3"
services:
nginx:
build: ./docker/nginx
ports:
- "127.0.0.1:$APP_PORT:80"
depends_on:
- php-fpm
volumes:
- ./storage/logs/nginx:/var/log/nginx
- ./public:/var/www/web
environment:
TZ: "Asia/Tokyo"
restart: always
php-fpm:
build: ./docker/php-fpm
env_file: .env
working_dir: /var/www/web
environment:
TZ: "Asia/Tokyo"
volumes:
- ./public:/var/www/web
- ./uploads:/uploads
- ./flag.txt:/flag.txt
restart: always
uploadsのフォルダと同じ場所にflag.txtがあるのがわかります。
相対パスとかでうまく取り出せないかなと思いました。
脆弱性を探すとZipSlipという脆弱性がヒットしたので、それをやってみることに。
ためしに以下のURLにあるPocのzipをアップロードしてみることに。

アップロードできました。
いけそうなので自分で作成してみることに。
作り方もぐぐったらでてきました。
https://stackoverflow.com/questions/50849406/how-to-create-a-file-to-test-zip-slip-vulnerability-from-commandline

あとはこのzipファイルをあげると…

あとはこのリンクをクリックするだけです。
ctf4b{y0u_c4nn07_7ru57_4ny_1npu75_1nclud1n6_z1p_f1l3n4m35}
Misc
emoemoencode
Do you know emo-emo-encode?
emoemoencode.txt
とりあえずテキストファイルを見てみる。
🍣🍴🍦🌴🍢🍻🍳🍴🍥🍧🍡🍮🌰🍧🍲🍡🍰🍨🍹🍟🍢🍹🍟🍥🍭🌰🌰🌰🌰🌰🌰🍪🍩🍽
バイナリエディタでも見てみる。

なんか1~4バイトと5~8バイトを比べると、F0 9F 8D A3→F0 9F 8D B4で17の差がある。
今回のctfのフラグはctf4bで始まることからcとtの差がちょうど17だったので、この法則でASCIIコード表とにらめっこしながら解いていく。
途中、4のときにF0 9F 8C B4のように3バイト目が8Cとなる場合があったのでその場合は数字の4からの相対で求めることとした。
ctf4b{stegan0graphy_by_em000000ji}
コメントを残す