SECCON 2018 Online CTF Writeup – Forensics Unzip
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.zip
と makefile.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}