利用 Zipcrypto 文件头漏洞破解 ZIP 压缩包
本文介绍了如何利用 ZIP 压缩中旧的加密算法
zipcrypto
的文件头漏洞来破解压缩包。1
破解要求:
条件 | 重要性 | 备注 & 导致无法破解的情况 |
---|---|---|
ZIP 压缩包且采用 Zipcrypto 算法加密 | 必需 | 如果算法采用的另外一种 AES-256 ,则不存在该漏洞,无法破解。早期(2015年前后)的压缩软件默认情况下用的是旧的加密算法。 |
目标文件的压缩方法是 Store 仅存储 | 只知道文件头情况下必需 | 如果用的是 Deflate 压缩,要破解整个压缩包,则需要拥有压缩包内同样的一个文件,将该文件也用 Deflate 压缩后才能用 pkcrack 破解。 |
压缩包内的某一个文件的文件头存在固定格式 | 至少12字节 | 已知的字节至少有8个是连续的,剩余字节可以不连续,如果总计小于12个字节则无法破解。 |
例如,ZIP 压缩包内套 ZIP 压缩包,内部的这个压缩包头部是可以猜测得到;XML/PNG 等等文件有固定头部。不过一般情况下除非文件比较小,压缩的时候因为压缩率不高而仅存储,大部分时候同时满足固定文件头和Store
两个条件的文件一般都是压缩包或者比较小的图片文件。
破解 #
如果要破解的压缩包符合上表的条件,则可以破解。要破解的压缩包包括如下文件:
|
|
下载工具 #
猜测文件头 #
ZIP 压缩包文件头存在固定内容,其余还有几位我们可以猜测出来。
偏移 | 内容 | 其他可能 | 作用 |
---|---|---|---|
0 | 504B 0304 | ZIP 固定文件头 | |
- | 1400 | 0A00 | pkware 最低版本 |
- | 0000 | 0100 | 通用比特标志 |
- | 0800 | 0000 | 08代表 Deflate 压缩 |
27 | 00 | 文件名长度的后一字节 | |
28 | 0000 | 扩展区长度 |
根据上表,偏移0~9共10个字节是连续的符合最低8连续字节要求,再加上27~29共3个字节合计13个字节符合最低12字节的要求,因此只要猜测出其中不确定的位,最多试 2^3=8
次即可完成破解。
在我的实验里,以下两种文件头的可能性比较大:
|
|
使用工具 #
以 Win10
平台为例,下载完成后解压缩进入工具目录。使用 WinHex
或者 Sublime
等等软件将0~9这10个字节新建为 header10 文件。将要破解的压缩包复制入工具的目录。运行以下命令:
|
|
如果输出结果为未找到密钥,则按照表中其他可能更换连续二进制文件中的字节,重复运行,直到返回结果。
处理结果 #
完成破解后, bkcrack
会返回 ZIP 压缩包中用于加密的密钥,将密钥填入以下命令,解密该压缩包中其他的文件:
|
|
因为该文本文件是经过 Deflate 压缩的,所以解密得到的文件还要经过 bkcrack/tool
内的 inflate.py
脚本处理。
|
|
附录 #
其他格式文件头 #
|
|
其他例如 EXE/XML/HTML 等等都可能有足够12字节的固定文件头。
时空乱流记录