ZIP 明文攻击工具

这个国庆假期抽了点风......

写了一个假期的代码......

简介

前两天自己也不记得受了啥刺激写了个 ren3.

写完以后大概是处于亢奋状态, 突然又想开坑, 然后又花了四天完成了

  • rbkcrack fork 了 bkcrack, 然后用 Rust 重(zhao)写(chao), 再然后用 zip-rs·改 替换掉手写的 parser, 实现了对 ZIP64 的一定程度上的兼容, 再顺便加上解压. 实测成功破解了 20+GB 的zip文件.
  • p7zip 稍微改了一下计算秘钥的部分, 允许使用 -p[key1_key2_key3] 这种格式来直接指定三个 key. (世界上最遥远的距离, 不是生与死, 而是我都拿到 keys 了, 却找不到工具解压......)

示例

就拿以前测试时出的一道题为例, 下载地址文末

两个flag, 一个在flag.txt里, 一个在big_file开头

big_file里的那个我自己也弄不出来, 就又加了一个flag.txt

给了两个已知明文

hashcat是一开始随手加进来的, libc是后来为了测试工具随手加进来的

所以这里没有坑

PS. 17位大小写数字混合密码, 不用试图爆破...

cipher.zip 里有4个文件, big_file 和 flag.txt 是等待破解的.

其中 big_file 压缩前大小高达 4.8 GiB, 使得这个 ZIP 文件包含了 ZIP64 格式.

这个地方没有说这个文件是 ZIP64 格式, 而是说它包含了 ZIP64 格式.
因为一个 ZIP 文件理论上是可以包含多种压缩算法&格式(好像是这样的), 所以我们可以选择其中的原始 ZIP 格式进行破解.

然而面对这样的一个文件 pkcrack 和 AZPR 都会给出 unknown signature 一类的报错. 直接把路堵死了...

其实 pkcrack 把报错代码注释掉就能跑了

这个地方我们使用 rbkcrack.

它的前身 bkcrack 其实也能爆破, 不过作者手写的 parser 完全没有考虑 ZIP64 格式, 在面对复杂文件时可能会跪...

题目给了两个明文, libc 那个比较大, 爆破起来比较快. 于是执行如下命令开始攻击

1
rbkcrack -c libc-2.23.so -p libc-2.23.so -C cipher.zip -P plain2.zip

只花费了五秒钟就得到了keys.

2019.04.11 更新:

rbkcrack 0.2.0 增加了自动根据 CRC32 寻找合适文件的功能,
于是上面的代码可以简写成 rbkcrack -C cipher.zip -P plain2.zip -a

PS. 这个功能最大的用处其实是对付某些 GBK 编码的 zip 文件...

PS. 重写完 bkcrack 后我拿一个文件测试了一下, 发现 Rust 版竟然比 C++ 版还快了 15%...... (改用 sort_unstabe 以后快了 25%......)

2019.04.11 更新:

现在一样快了

1
2
3
4
5
6
7
8
Generated 4194304 Z values.
[22:11:22] Z reduction using 4512917 extra bytes of known plaintext
0.11 % (4855 / 4512917)
240 values remaining.
[22:11:26] Attack on 240 Z values at index 4509032
5.00 % (12 / 240)
[22:11:27] Keys
d4f34b9d a6ba3461 dcd97451

得到 keys 以后直接使用如下代码可以从 cipher.zip 中解压 flag.txt.
(这个地方没有加 -u 开关, 因为 flag.txt 的压缩方式是 store)

1
rbkcrack -c flag.txt -C cipher.zip -k d4f34b9d a6ba3461 dcd97451 -d ./flag.txt

然后得到了第一个 flag: flag{Th3Re_1s_Ano1h3r_f1ag_in_big_file}

big_file 是实打实的压缩过的, 需要加上 -u 开关提取. 由于文件非常大, 而且我们只要前面的一部分, 所以当看到 big_file 大小差不多了就可以 Ctrl+C 了.

1
rbkcrack -c big_file -C cipher.zip -k d4f34b9d a6ba3461 dcd97451 -d ./big_file -u

head 一下然后就得到了第二个 flag: flag{Th1s_i3_A_tE5t}

最后强行给 p7zip 一个出场机会, 虽然做题的时候不大可能用到, 但是真要用来干大事儿还是它靠谱.

1
7za e cipher.zip '-p[d4f34b9d_a6ba3461_dcd97451]'

下载地址: fucking_problem.zip