ksnctf #19 ZIP de kure

#ZIP de kure
https://ksnctf.sweetduet.info/problem/19

zipファイルを解析する問題。
flag.zipをダウンロードしてunzipで解凍する。

```
┌──(kali㉿kali)-[~/Downloads]
└─$ unzip flag.zip
Archive:  flag.zip
Hint:
- It is known that the encryption system of ZIP is weak against known-plaintext attacks.
- We employ ZIP format not for compression but for encryption.
[flag.zip] flag.html password: 
password incorrect--reenter: 
   skipping: flag.html               incorrect password
   skipping: Standard-lock-key.jpg   incorrect password
```

ヒントには「zipの暗号化は既知平文攻撃に弱く、圧縮ではなく暗号化にzipを使っている」と書かれている。
zipといったら圧縮するイメージだけど、暗号化としても使われている。
**既知平文攻撃は、暗号化zip内に、既知のファイルがあばそれをヒントに復号する方法**である。今回はこのヒントを頼りに既知平文攻撃を行ってみる。
unzipの結果から解凍したフォルダには、パスワードが分からないので開くことはできないが、flag.htmlとStandard-lock-key.jpgという２つのファイルがあることがわかる。flag.htmlにflagがありStandard-lock-key.jpgはそのための鍵だそ予想できる。


##解く
既知平文攻撃を行うには、既知のファイルがわかっている必要がある。zip内にはStandard-lock-key.jpgがありこれを調べてみると以下のwikiサイトが見つかった。
https://ja.wikipedia.org/wiki/ファイル:Standard-lock-key.jpg
この画像をダウンロードして既知のファイルとして攻撃を行ってみる。

攻撃には**PkCrack**というコマンドを使う。
参考：https://kaworu.jpn.org/kaworu/2012-12-07-1.php
これはパスワード付きzipを解析するためのツールで既知平文攻撃を行うことができる。

PkCrackの使い方
　-C [暗号化されたzipファイル]
　-c [暗号化されたzipファイルの中で平文がわかるファイル]
　-P [平文のファイルが入っている暗号化されていないzip]
　-p [平文のファイル]
　-d [出力先（復号したzipファイルの名前）]

以下のコマンドで実行してみる。

```
┌──(kali㉿kali)-[~/Downloads]
└─$ ../pkcrack-1.2.2/src/pkcrack -C flag.zip -p Standard-lock-key.jpg -c Standard-lock-key.jpg -d q19ans.zip                                    130 ⨯
Warning! Plaintext is longer than Ciphertext!
Files read. Starting stage 1 on Thu Sep 23 23:39:15 2021
Generating 1st generation of possible key2_500762 values...done.
Found 4194304 possible key2-values.
Now we're trying to reduce these...
Lowest number: 955 values at offset 497625
Lowest number: 902 values at offset 497621
Lowest number: 872 values at offset 497412
Lowest number: 846 values at offset 490225
Lowest number: 833 values at offset 488822
Lowest number: 831 values at offset 488821
Lowest number: 790 values at offset 488820
Lowest number: 769 values at offset 488814
Lowest number: 764 values at offset 488761
Lowest number: 747 values at offset 488738
Lowest number: 733 values at offset 488737
Lowest number: 732 values at offset 488683
Lowest number: 663 values at offset 488673
Lowest number: 646 values at offset 488508
Lowest number: 631 values at offset 483194
Lowest number: 621 values at offset 483193
Lowest number: 581 values at offset 483053
Lowest number: 580 values at offset 483051
Lowest number: 560 values at offset 483018
Lowest number: 534 values at offset 483017
Lowest number: 492 values at offset 483016
Lowest number: 461 values at offset 483015
Lowest number: 451 values at offset 482993
Lowest number: 434 values at offset 482988
Lowest number: 421 values at offset 482987
Lowest number: 415 values at offset 482985
Lowest number: 398 values at offset 482940
Lowest number: 385 values at offset 482939
Lowest number: 381 values at offset 476360
Lowest number: 343 values at offset 476359
Lowest number: 335 values at offset 476347
Lowest number: 298 values at offset 476346
Lowest number: 280 values at offset 476345
Lowest number: 278 values at offset 476291
Lowest number: 257 values at offset 475962
Lowest number: 241 values at offset 475958
Lowest number: 232 values at offset 475955
Lowest number: 221 values at offset 475338
Lowest number: 210 values at offset 475337
Lowest number: 175 values at offset 475336
Lowest number: 159 values at offset 475330
Lowest number: 153 values at offset 475306
Lowest number: 145 values at offset 475296
Lowest number: 143 values at offset 475295
Lowest number: 129 values at offset 475293
Lowest number: 121 values at offset 475247
Lowest number: 119 values at offset 475246
Lowest number: 110 values at offset 475245
Lowest number: 96 values at offset 475244
Done. Left with 96 possible Values. bestOffset is 475244.
Stage 1 completed. Starting stage 2 on Thu Sep 23 23:39:25 2021
Stage 2 completed. Starting zipdecrypt on Thu Sep 23 23:39:26 2021
No solutions found. You must have chosen the wrong plaintext.
Finished on Thu Sep 23 23:39:26 2021
```

解析できなかった。
Warning! Plaintext is longer than Ciphertext!
No solutions found. You must have chosen the wrong plaintext.
この２文から既知のファイル(plaintext)が暗号文より長くて間違ったファイルを選んでいるっぽい。
![スクリーンショット 2021-09-24 12.45.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1182752/a7f5ce42-b27a-8218-5a3d-563686b1679e.png)
既知のファイルは現在の版の2018年8月6日のものを使った。次は2010年8月29日のファイルを使ってみる。

```
┌──(kali㉿kali)-[~/Downloads]
└─$ ../pkcrack-1.2.2/src/pkcrack -C flag.zip -p Standard-lock-key.jpg -c Standard-lock-key.jpg -d q19ans.zip
Files read. Starting stage 1 on Thu Sep 23 23:50:57 2021
Generating 1st generation of possible key2_255975 values...done.
Found 4194304 possible key2-values.
Now we're trying to reduce these...
Lowest number: 986 values at offset 248213
Lowest number: 948 values at offset 248202
Lowest number: 945 values at offset 247980
Lowest number: 928 values at offset 247965
Lowest number: 894 values at offset 247957
Lowest number: 883 values at offset 244764
Lowest number: 825 values at offset 244113
Lowest number: 820 values at offset 243180
Lowest number: 769 values at offset 243179
Lowest number: 758 values at offset 243175
Lowest number: 723 values at offset 243172
Lowest number: 702 values at offset 243171
Lowest number: 694 values at offset 243170
Lowest number: 657 values at offset 243162
Lowest number: 653 values at offset 243151
Lowest number: 652 values at offset 243149
Lowest number: 638 values at offset 243143
Lowest number: 621 values at offset 243106
Lowest number: 567 values at offset 243104
Lowest number: 546 values at offset 243103
Lowest number: 534 values at offset 243102
Lowest number: 510 values at offset 243073
Lowest number: 498 values at offset 243054
Lowest number: 476 values at offset 242992
Lowest number: 472 values at offset 242990
Lowest number: 396 values at offset 242989
Lowest number: 359 values at offset 242984
Lowest number: 321 values at offset 242983
Lowest number: 311 values at offset 242977
Lowest number: 310 values at offset 242939
Lowest number: 296 values at offset 242935
Lowest number: 270 values at offset 242934
Lowest number: 268 values at offset 242921
Lowest number: 244 values at offset 242915
Lowest number: 224 values at offset 242880
Lowest number: 215 values at offset 242879
Lowest number: 209 values at offset 242878
Lowest number: 188 values at offset 242877
Lowest number: 187 values at offset 242867
Lowest number: 186 values at offset 242866
Lowest number: 167 values at offset 242865
Lowest number: 164 values at offset 242670
Lowest number: 157 values at offset 242669
Lowest number: 141 values at offset 242655
Lowest number: 132 values at offset 242654
Lowest number: 112 values at offset 242652
Lowest number: 91 values at offset 242651
Done. Left with 91 possible Values. bestOffset is 242651.
Stage 1 completed. Starting stage 2 on Thu Sep 23 23:51:10 2021
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Ta-daaaaa! key0=7adffffe, key1=468d5ff6, key2=259a116a
Probabilistic test succeeded for 13329 bytes.
Stage 2 completed. Starting zipdecrypt on Thu Sep 23 23:51:14 2021
Decrypting flag.html (250d8b78ce908fe210d7c091)... OK!
Decrypting Standard-lock-key.jpg (037d8119e2c2884a4a665d91)... OK!
Finished on Thu Sep 23 23:51:14 2021
                                    
```
うまく解析できた。

flag.htmlを開いてみるとflagが得られた。

##まとめ
パスワード付きzipの解析ができた。
pkcrackはCTFで使う機会が多そうなのでちゃんと使い方を覚えておきたい。