🕊️

【CTF】 SECCON 2015 online「Unzip the file」解説

2024/06/25に公開

はじめに

前提

https://github.com/SECCON/SECCON2015_online_CTF/tree/master/Crypto/100_Unzip the file

  • 問題一式
    • question.txt
    • unzip
    • flag.txt
  • 環境
    • macOS
    • M1チップ
    • brew コマンドが導入されている
  • 目標
    • question.txtunzip の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.zipmv コマンドを使って名前を変えておこう.

$ 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 を用いた暗号化方式を用いるなどがある.

参考文献

https://gihyo.jp/book/2022/978-4-297-13180-7

その他

Discussion