WaniCTF2023 ゆるく出た - writeup
こんにちは。calloc134です。
前回のRicercaCTFに引き続き、WaniCTF2023にも参加しました。
開始すぐに参加して、二時間くらいで四問解きました。
そのあとはweb以外にもトライしようと思ったのですが、気が抜けてしまい放置してしまいました…
とりあえず解けた問題を共有します。

IndexedDB
まず以下のような画面が表示されます。

任意のパスを指定するとリダイレクトされますが、このリダイレクトはJavascriptにて行っており、リダイレクト前のレスポンスにフラグが存在します。

Extract Service 1 & Extract Service 2
まず以下のような画面が表示されます。

任意のファイルをアップロードすると、以下のようなエラーが表示されます。

ここで、docxファイルの中身がzipファイルであるということを念頭に置きます。
そして、内部の処理ではzipファイルを展開して
word/document.xmlを読み込んでいることがわかります。
ここでは、zipファイルにシンボリックリンクを埋め込み、word/document.xmlにフラグへのシンボリックリンクを配置することで、フラグを読み取ることができます。
このzipファイルの作成にはWSLを利用しました。
以下のようなディレクトリ構成でzipを作成します。
./
├── word
└── document.xml (これが/flagへのシンボリックリンク)

その後、以下のコマンドで、シンボリックリンクを含んだzipファイルを作成します。
zip -ry TARGET.zip word/

これをアップロードしてフラグを読み取ります。

同じ手法で、Extract Service 2も解くことができます。

Certified 1
まず以下のような画面が表示されます。

エラーより、バックエンドでImageMagickを利用していることがわかります。

ここで、ImageMagickのLFIの脆弱性を探しました。
最終的に、CVE-2022-44268で攻撃が通りました。
利用したPoCは以下のものです。
以下のコマンドで、エクスプロイト画像を生成します。
python3 generate.py -f "/flag_A" -o exploit.png
このようにエクスプロイト画像を生成します。

アップロードすると以下のような画像が生成されます。

これをwgetでダウンロードした後、ファイルを解析します。
以下のコマンドを利用します。
identify -verbose (output).png

Raw profile typeに付属している16進数の値をデコードすると、フラグが得られます。
python3 -c 'print(bytes.fromhex("464c41477b3768655f736563306e645f663161395f31735f77343174316e395f6630725f793075217d0a").decode("utf-8"))'

おわりに
以上でWaniCTF2023のwriteupを終わります。
初心者でしたが、なかなか楽しく解けました。
他のwriteupも色々読んでいて、気が付かされるものばかりでした。
今後も、積極的にCTFに参加していきたいと思います。
Discussion