🚀

SECCON 2015 Online Unzip the file WriteUp

2023/05/19に公開

今回は Crypto を解いていきます。
問題は SECCON 2015 Online より Unzip the file を解いていきたいと思います。
https://github.com/SECCON/SECCON2015_online_CTF/tree/master/Crypto/100_Unzip the file
Cryptoというと RSA復号 が定番と思ってたりしますが、
今回は unzip ということでzipファイルの復号の模様。まぁ暗号化zipでしょう。

設問

さて問題文(question.txt)を見ると…Unzip the fileということでzipを解凍せよ、とあります。
ではまず
それではunzipファイルを見てみます。
私が普段利用している端末は Windows 10 Pro で、WSL2 導入済みです。
ということで wsl コマンドで ubuntu のコマンドが使えますので、
file unzip で確認すると…

[host名]:/mnt/c/Users/user$ file unzip
unzip: Zip archive data, at least v2.0 to extract

ということで、やはりzipファイルでした。
ではunzipコマンドで解凍を試みてみます。

[host名]:/mnt/c/Users/user$ unzip unzip
Archive:  unzip
[unzip] backnumber08.txt password:
   skipping: backnumber08.txt        incorrect password
   skipping: backnumber09.txt        incorrect password
   skipping: flag                    incorrect password

パスワードを求められはじかれました。
中にはtxt二つと、明らかにFlagが書かれていそうなファイルが…
では、zipのパスワードをどう解くか…

Zipの脆弱性

zipのパスワードをどう解くかにあたって、zipの脆弱性調べてみました。
有名どころは以下の模様です。

  • 既知平文攻撃
  • ZipSlip

まず、既知平文攻撃ですが、wikipediaより、

難解で不可解に思える暗号文でも、手がかりとして
元となる平文中の数語から数フレーズが既知もしくは想定可能であれば
解読の糸口をつかむことができる。
また総当たり攻撃の場合でも、復号した文中にクリブが見つかれば、
試みた復号方法が正しいらしいと知ることができ、全文の解読につながる。

https://ja.wikipedia.org/wiki/既知平文攻撃

とあります。暗号化zipにおける既知平文攻撃が成功する条件は
・暗号化されたZIPファイルの中に1つでも中身のわかるファイルが存在する場合
となっています。

なお、zipslipのほうはディレクトリトラバーサルであって、
解凍時に意図しないファイルの置き換えを起こさせる、というものなので
復号化には利用できないです(Pwnとかで使えそうですね)
参考記事
https://scrapbox.io/satoooon-ctf-wiki/Zip_Slip

既知平文攻撃の実施

それでは、暗号化zipへの既知平文攻撃を実施していきます。
先ほど書いた
「暗号化されたZIPファイルの中に1つでも中身のわかるファイルが存在する場合」
という条件を満たすために、backnumber08.txt か backnumber09.txt が必要です。
ググってみると…以下発見できます。
https://2017.seccon.jp/mail-magazine/text/backnumber08.txt
https://2017.seccon.jp/mail-magazine/text/backnumber09.txt

既知平文攻撃には bkcrack を使ってみます。
https://github.com/kimci86/bkcrack

既知平文には以下組み合わせて実施できます。

Load data from zip archives
Having a zip archive encrypted.zip with the entry cipher being the ciphertext
and plain.zip with the entry plain as the known plaintext,
bkcrack can be run like this:

bkcrack -C encrypted.zip -c cipher -P plain.zip -p plain

Unlock encrypted archive
It is also possible to generate a new encrypted archive
with the password of your choice:

bkcrack -C encrypted.zip -k 12345678 23456789 34567890 -U unlocked.zip password

bkcrack -C encrypted.zip -k 12345678 23456789 34567890 -U unlocked.zip password

とあるので、まず、plain.zip にあたるものを作っておきます。

[host名]:/mnt/c/Users/user$ zip backnumber09.zip backnumber09.txt
  adding: backnumber09.txt (deflated 60%)

そして、bkcrackを実行。

PS C:\Users\user\Desktop\bkcrack-1.5.0-win64> .\bkcrack -C unzip.zip -c backnumber09.txt -P backnumber09.zip -p backnumber09.txt -U unlocked.zip password
bkcrack 1.5.0 - 2022-07-07
[21:10:28] Z reduction using 4832 bytes of known plaintext
100.0 % (4832 / 4832)
[21:10:29] Attack on 3202 Z values at index 1124
Keys: 270293cd b1496a17 8fd0945a
2.8 % (91 / 3202)
[21:10:29] Keys
270293cd b1496a17 8fd0945a
[21:10:29] Writing unlocked archive unlocked.zip with password "password"
100.0 % (3 / 3)
Wrote unlocked archive.

Flag確認

これで、パスワードが "password" である unlocked.zip ができましたので、
解凍して中を見ていきましょう。

[host名]:/mnt/c/Users/user$ unzip -d unlock unlocked.zip
Archive:  unlocked.zip
[unlocked.zip] backnumber08.txt password:
  inflating: unlock/backnumber08.txt
  inflating: unlock/backnumber09.txt
  inflating: unlock/flag
[host名]:/mnt/c/Users/user$ file ./unlock/flag
./unlock/flag: Microsoft Word 2007+
kaiinaba@TABLET-GRCEDDNQ:/mnt/c/Users/kaiinaba$

flagファイルは Word ファイルということなので flag.doc とでもリネームして、
Wordで開くと、白紙のファイルかと見えますが、文字の色が白なだけなので
文字色変えるなりすると… flagを入手できました。

SECCON{1s_th1s_passw0rd_ weak?}

このように暗号化zipは簡単に復号されてしまう可能性があるので
注意が必要、ということですね…AESを暗号化方式に採用するという対策もありますが…
とくにMacOSなんかは、平文ファイルとして .DS_Store ファイルを利用できてしまう
恐れがあるそうで・・・皆さんお気をつけてください。
https://blog.nflabs.jp/entry/2021/10/06/095121

それでは、今回はここまでとなります。
次はForensicsをやってみたいと思います。

Discussion