【CTF】 SECCON 2015 online「Unzip the file」解説
はじめに
前提
-
問題一式
question.txt
unzip
flag.txt
- 環境
- macOS
- M1チップ
-
brew
コマンドが導入されている
- 目標
-
question.txt
とunzip
の2種類のファイルからflag.txt
と同じ情報を取り出す.
-
本題
問題把握
cat コマンド
問題文を確認するため,question.txt
の中身を cat
コマンドで確認しよう.
$ cat unzip
Unzip the file
unzip
おそらく, unzip
ファイルを解凍すれば良いことがわかる.
unzip ファイルの確認
file コマンド
file
コマンドを用いて, unzip
ファイルの正体を一応確認しておく.もしかしたら, zip ファイルのフリをしてるだけかもしれない.
$ file unzip
unzip: Zip archive data, at least v2.0 to extract, compression method=deflate
おそらく zip ファイルっぽい.
mv コマンド
わかりやすさのため, unzip
ファイルを unzip.zip
に mv
コマンドを使って名前を変えておこう.
$ mv unzip unzip.zip
unzip コマンド
unzip
コマンドでとりあえず解凍を試みよう.
unzip unzip.zip
Archive: unzip.zip
[unzip.zip] backnumber08.txt password:
skipping: backnumber08.txt incorrect password
skipping: backnumber09.txt incorrect password
skipping: flag incorrect password
パスワードが要求されたが,わかるわけがないので,解凍ができなさそう..
だがどうやら,このパスワードを知るorクラックすることで, flag
ファイルが手に入りそうだ.
zipinfo コマンド
unzip.zip
ファイルの情報を少しでも見たいので, zipinfo
コマンドを使ってみる.
$ zipinfo unzip.zip
Archive: unzip.zip
Zip file size: 21710 bytes, number of entries: 3
-rw-r----- 3.0 unx 14182 TX defN 15-Nov-30 16:23 backnumber08.txt
-rw-r----- 3.0 unx 12064 TX defN 15-Nov-30 16:22 backnumber09.txt
-rw------- 3.0 unx 22560 BX defN 15-Dec-01 15:21 flag
3 files, 48806 bytes uncompressed, 21148 bytes compressed: 56.7%
うーん.よくわからない. だけど, flag
以外のファイルの実体が分かれば, 既知平文攻撃 ができそうだ.
backnumber08.txt ファイルを探す
ググる
backnumber08.txt
がワンチャンネットに転がってないかな.ググってみよう.
なんか出た.これで,パスワードをクラックできるかもしれない.
curl コマンド
ググって出てきたリンクを curl
コマンドで引き込んでみよう.
$ curl -O https://2014.seccon.jp/mailmagazine/backnumber08.txt
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:- 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:-100 14182 100 14182 0 0 79039 0 --:--:-- --:--:-- --:--:-- 81976
持ってこれた.しかも,バイト数が 14182
で, zipinfo
で出た情報と一緒だ.おそらく,本物だ.
既知平文攻撃をする
cmake を導入する
pkcrack
を用いて既知平文攻撃を行う.それを導入するにあたって, cmake
コマンドが必要になるので,導入しておく.
$ brew install cmake
pkcrack を導入する
このリポジトリから入手する.手順はリポジトリに書いてある通りにすすめる.また,ディレクトリの位置を便宜上元に戻しておく.
$ git clone https://github.com/keyunluo/pkcrack
$ mkdir pkcrack/build
pkcrack/build$ cd pkcrack/build
pkcrack/build$ cmake ..
pkcrack/build$ make
pkcrack/build$ cd ../..
zip コマンド
既知平文攻撃に必要な, zip ファイルを作成しておく. 具体的には, backnumber08.txt
の zip ファイルを作成しておく.
$ zip backnumber08.zip backnumber08.txt
これで前準備は終わった.
pkcrack コマンド
じゃあ,パスワードをクラックするか. pkcrack
コマンドを実行する.一応,オプションについても軽く解説する.
オプション | 内容 |
---|---|
-C | 「クラックしたい zip ファイル」 |
-c | 「自分で用意した実体ファイル」 |
-P | 「自分で用意した実体ファイル」を zip で圧縮したもの |
-p | 「クラックしたい zip ファイル」に含まれるファイル |
-d | クラックした zip ファイルの出力先 |
-a | 詳しく調べてない.おまじない? |
$ ./pkcrack/bin/pkcrack -C unzip.zip -c backnumber08.txt -P backnumber08.zip -p backnumber08.txt -d output.zip -a
Files read. Starting stage 1 on Tue Jun 25 19:35:46 2024
Generating 1st generation of possible key2_5299 values...done.
Found 4194304 possible key2-values.
Now we're trying to reduce these...
Lowest number: 984 values at offset 970
Lowest number: 932 values at offset 969
Lowest number: 931 values at offset 967
Lowest number: 911 values at offset 966
Lowest number: 906 values at offset 965
Lowest number: 904 values at offset 959
Lowest number: 896 values at offset 955
Lowest number: 826 values at offset 954
Lowest number: 784 values at offset 606
Lowest number: 753 values at offset 206
Done. Left with 753 possible Values. bestOffset is 206.
Stage 1 completed. Starting stage 2 on Tue Jun 25 19:35:59 2024
Ta-daaaaa! key0=270293cd, key1=b1496a17, key2=8fd0945a
Probabilistic test succeeded for 5098 bytes.
Ta-daaaaa! key0=270293cd, key1=b1496a17, key2=8fd0945a
Probabilistic test succeeded for 5098 bytes.
Stage 2 completed. Starting zipdecrypt on Tue Jun 25 19:36:22 2024
Decrypting backnumber08.txt (5315a01322ab296c211eecba)... OK!
Decrypting backnumber09.txt (83e6640cbec32aeaf10ed1ba)... OK!
Decrypting flag (34e4d2ab7fe1e2421808bab2)... OK!
Finished on Tue Jun 25 19:36:22 2024
クラックできたっぽい.
unzip
クラックできたやつを解凍しますか. unzip
コマンドを実行すると,「ファイルを置き換えますか?」って言われるから,一応別名( crack_08.txt
)で出力しよう.
$ unzip output.zip
Archive: output.zip
replace backnumber08.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: r
new name: crack_08.txt
inflating: crack_08.txt
inflating: backnumber09.txt
inflating: flag
うを.クラックできたね.
答え合わせ
file コマンド
flag
ファイルがどんなファイルかわからんね.とりあえず, file
コマンドで調べてみようか.
$ file flag
flag: Microsoft Word 2007+
なんだ. Word
ファイルか.マイクロソフトさんの力をかりますか.
open コマンド
Word
はみなさんに搭載されていますよね?されてなかったら,入れてください.
さて, Word
アプリで flag
ファイルを開きましょう.筆者はイキって open
コマンドで開いてますが,拡張子を変えてダブルクリックでもいいし,とにかく, flag
ファイルを Word
アプリで開いてください.
$ open -a /Applications/Microsoft\ Word.app flag
開けたね.何も書かれてないと思いきや,なんか青色でアンダーラインが引かれている部分がありますね.その部分を選択して,検索エンジンの部分にコピペしてみましょう.
正体表したね. SECCON{1s_th1s_passw0rd_ weak?}
という文字列が得られました.
flag.txt
ファイルに書かれている内容(2024/06/25時点では flag.txt
の最初の文字が欠損していますが,特に気にしなくて良いと思います)と一致しました.これにて終了です.
おわりに
まとめ
-
zip
の暗号化方式の脆弱性に関する問題である. - デフォルトの
zip
だと,圧縮されている他の実体を把握されると,既知平文攻撃をされる可能性がある. - 対策として,
AES
を用いた暗号化方式を用いるなどがある.
参考文献
Discussion