GPUでZIPパスワードを解析する

# GPUでZIPパスワードを解析する

企業間のファイルのやり取りにZIPファイルの暗号化がされていることが多いのですが、その暗号は意味がなかったり、弱かったり、余計にセキュリティリスクが高くなっています。ZIPの暗号化が使えないことを証明するにはパスワードを解析するのが一番です。

パスワードが解析できるなら、もうあとからパスワードを送る必要はないのです。

## 用意するもの
* Windows PC
 Windows10を使いました。

* GPU
できる限り早いやつ
ノートPCなので、外付けGPUケースにThunderbolt3でGPUを接続しています。
GTX 2080とケースで 10万円ぐらいかかっています。

* CUDA Toolkit
あらかじめ入れておきましょう。

* hashcat

https://hashcat.net/hashcat/

hashcatのWindows版で公式サイトからダウンロードしたもので、バージョンが5.1.0の場合は古いので対応していません。

* Windows版のJohn the ripper

https://www.openwall.com/john/

から john the rippper の Windows binariesをダウンロードします。

## 事前準備 (最新版は対応済みのため不要)

hashcat.exe --help で実行して、 17210 のZIPが対応してれば不要です。 (6.1.1では対応を確認)

Windows用のバイナリはLinux上から作成します。Ubuntuでコンパイルします。WindowsからならWSLのUbuntuでコンパイル可能です。

```shell
$ git clone https://github.com/hashcat/hashcat.git
$ sudo apt install  mingw-w64 win-iconv-mingw-w64-dev
```

```shell
vim src/Makefile
```
の500行目ぐらいの

/opt/win-iconv-64
を
/usr/x86_64-w64-mingw32
にパスを変更します。

```shell
$ make win
```

hashcat.exeが生成されます。


### 対応しているハッシュのサンプル

| 番号 | 対象 |
|:------:|:---------------------------------------------|
| 13600 | WinZip |
| 17200 | PKZIP (Compressed) * |
| 17210 | PKZIP (Uncompressed) * |
| 17220 | PKZIP (Compressed Multi-File) * |
| 17225 | PKZIP (Mixed Multi-File) * |
| 17230 | PKZIP (Compressed Multi-File Checksum-Only) * |

ZIPファイルの暗号化は6種類ありますが、今回は **17210** です。
https://hashcat.net/wiki/doku.php?id=example_hashes


### ハッシュの抽出

johnの中にzip2johnがあります。このプログラムがzipファイルからハッシュを取り出します。

zip2johnを使って暗号化された部分を抽出します。

```shell
C:\Users\...\john\run>zip2john.exe ..\..\testpass.zip
ver 2.0 testpass.zip/example500.hash PKZIP Encr: cmplen=47, decmplen=35, crc=6D73B418
testpass.zip/example500.hash:$pkzip2$1*1*2*0*2f*23*6d73b418*0*2d*0*2f*6d73*a033*73f283fe523fe65d3f981b0921d2a94a71f69d8c1686c2f0a5a1d62ec2402c8bb954dbb9cbef2372f560ec11f32f0e*$/pkzip2$:example500.hash:testpass.zip::..\..\testpass.zip
```

得られた結果から、$pkzip2の部分を抜き出し、zippass.txtに解析用ハッシュを書きます。


```shell
C:\..\hashcat> echo $pkzip2$1*1*2*0*2f*23*6d73b418*0*2d*0*2f*6d73*a033*73f283fe523fe65d3f981b0921d2a94a71f69d8c1686c2f0a5a1d62ec2402c8bb954dbb9cbef2372f560ec11f32f0e*$/pkzip2$ >zippass2.txt
```


## hashcatを実行します

- #1 GeForce RTX 2080
- #2 Intel(R) UHD Graphics 620

と２つのGPUを使ってくれています。

GeForce RTX 2080では10GH/s
Intel UHD 620では 180MH/s

ぐらいのスピードが出ています。秒間100億回と1.8億回試していることになります。

オプションは、ブルートフォースモードで全力で8文字パスワードを評価しています。

```shell
C:\...\hashcat>hashcat.exe -a 3 -w 4 -m 17210 ..\..\zippass.txt ?a?a?a?a?a?a?a?a
hashcat (v5.1.0-1488-g52e83c22+) starting...

* Device #1: CUDA SDK Toolkit installation NOT detected.
             CUDA SDK Toolkit installation required for proper device support and utilization
             Falling back to OpenCL Runtime

* Device #1: WARNING! Kernel exec timeout is not disabled.
             This may cause "CL_OUT_OF_RESOURCES" or related errors.
             To disable the timeout, see: https://hashcat.net/q/timeoutpatch
OpenCL API (OpenCL 1.2 CUDA 10.2.95) - Platform #1 [NVIDIA Corporation]
=======================================================================
* Device #1: GeForce RTX 2080, 6656/8192 MB (2048 MB allocatable), 46MCU

OpenCL API (OpenCL 2.1 ) - Platform #2 [Intel(R) Corporation]
=============================================================
* Device #2: Intel(R) UHD Graphics 620, 6384/6448 MB (3224 MB allocatable), 24MCU
* Device #3: Intel(R) Core(TM) i7-8565U CPU @ 1.80GHz, skipped

Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256

Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates

Applicable optimizers:
* Not-Iterated
* Single-Hash
* Single-Salt
* Brute-Force

Watchdog: Temperature abort trigger set to 90c

Host memory required for this attack: 1357 MB

[s]tatus [p]ause [b]ypass [c]heckpoint [q]uit =>

Session..........: hashcat
Status...........: Running
Hash.Name........: PKZIP (Uncompressed)
Hash.Target......: $pkzip2$1*1*2*0*2f*23*6d73b418*0*2d*0*2f*6d73*a033*...kzip2$
Time.Started.....: Thu Dec 05 16:48:19 2019 (5 secs)
Time.Estimated...: Thu Dec 12 23:51:23 2019 (7 days, 7 hours)
Guess.Mask.......: ?a?a?a?a?a?a?a?a [8]
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 10338.5 MH/s (292.36ms) @ Accel:64 Loops:1024 Thr:1024 Vec:1
Speed.#2.........:   188.9 MH/s (259.90ms) @ Accel:64 Loops:128 Thr:256 Vec:1
Speed.#*.........: 10527.4 MH/s
Recovered........: 0/1 (0.00%) Digests
Progress.........: 59710111744/6634204312890625 (0.00%)
Rejected.........: 0/59710111744 (0.00%)
Restore.Point....: 0/7737809375 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:19456-20480 Iteration:0-1024
Restore.Sub.#2...: Salt:0 Amplifier:2688-2816 Iteration:0-128
Candidates.#1....: ,lek$^&* -> WKYz,|**
Candidates.#2....: 8frerane -> Zma1Esan
Hardware.Mon.#1..: Temp: 39c Fan: 30% Util:100% Core:1980MHz Mem:6800MHz Bus:4
Hardware.Mon.#2..: N/A

$pkzip2$1*1*2*0*2f*23*6d73b418*0*2d*0*2f*6d73*a033*73f283fe523fe65d3f981b0921d2a94a71f69d8c1686c2f0a5a1d62ec2402c8bb954dbb9cbef2372f560ec11f32f0e*$/pkzip2$:dhu12345
```

あっという間に解読完了です。WordやExcelのパスワードなども解読できますが、新しいバージョンのものは固めになっています。

## 対策

zipで暗号化して送るのは会社間のプロトコルですので簡単には崩せません。ZIPパスワード形式にAESを使うとか、Officeファイルのパスワードを使ったほうがより強固です。