SECCON 2018 Online CTF Writeup – Forensics Unzip

セキュリティTech

SECCON 2018 Online CTF にチャレンジしました。
用事の合間にしか取り組めませんでしたが、ひとまず一番簡単だと思われる Unzip 問題が解けたため writeup を残しておきます。(さらに解けたらまた書くかも)

Forensics Unzip

フォレンジック系の出題です。
渡されたファイル (unzip.zip) からフラグを探し出します。

まずはファイルをダウンロード、ついでにリネーム。

$ wget https://score-quals.seccon.jp/files/296d9f0e60456b666e962f25df63de86/unzip.zip_26c0cb5b40e9f78641ae44229cda45529418183f
$ mv unzip.zip_26c0cb5b40e9f78641ae44229cda45529418183f unzip.zip

unzip コマンドで普通に展開してみます。

$ unzip unzip.zip
Archive:  unzip.zip
 extracting: flag.zip
  inflating: makefile.sh

flag.zipmakefile.sh が抽出できました。
flag.zip の中にフラグが含まれていそうですね。

makefile.sh を読み解く

しかし肝心の flag.zip にはパスワードが掛かっています。

$ unzip flag.zip
Archive:  flag.zip
[flag.zip] flag.txt password:

makefile.sh の中身も確認します。2行だけのスクリプトでした。

$ echo 'SECCON{'`cat key`'}' > flag.txt
$ zip -e --password=`perl -e "print time()"` flag.zip flag.txt

flag.txt を作成して、ZIP ファイルに固めていることが分かります。
perl -e "print time()" の結果がパスワードになっています。

ZIP ファイルの生成時刻=パスワード

perl で print time() を実行すると現在の unixtime が取得できます。

$ perl -e "print time()"
1540700100     // 2018-10-28 13:15:00 の実行例

つまり、makefile.sh が実行された時刻を特定できればパスワードが判明します。
ls --full-time で ZIP ファイルの生成日時を確認してみます。

$ ls --full-time flag.zip
-rw-r--r-- 1 yuu26 yuu26 225 2018-10-27 00:10:42.000000000 +0900 flag.zip

flag.zip を展開する

2018-10-27 00:10:42 を unixtime にすると 1540566642 です。
date コマンドや Unixtime相互変換ツール などで変換できます。

$ date "+%s" -d "2018-10-27 00:10:42.000000000 +0900"
1540566642

パスワードを 1540566642 として試したものの失敗。

$ unzip -P 1540566642 flag.zip
Archive:  flag.zip
   skipping: flag.txt                incorrect password

ファイル書き出しのラグを考慮して 1秒前の時刻 1540566641 で試すと成功しました。

$ unzip -P 1540566641 flag.zip
Archive:  flag.zip
  inflating: flag.txt

正しいアプローチであったかは不明ですが、無事にフラグ獲得です。

$ cat flag.txt
SECCON{We1c0me_2_SECCONCTF2o18}

おすすめ記事