0x00:关于zip的一些基础知识

文件头:50 4B 03 04
50 4B 16进制ascii转字符后是zip格式文件创始人的名称的缩写P K
0x50 => P
0x4B => K

zip压缩后压缩包内每个文件都有一个CRC值,CRC值只和文件内容有关

0x01:用ZipCenOp破解伪加密

先切换到ZipCenOp.jar的目录,然后将zip伪加密的压缩包拷到同级目录下,然后执行下列命令后就可以正常解压了

1
java -jar ZipCenOp.jar r 11.zip

该工具除了破解伪加密,还可以将一个正常的压缩包进行伪加密
比如有一个1.zip压缩包

1
java -jar ZipCenOp.jar r 1.zip

如果想要试一下伪加密破解的,可以先用第二条命令对zip进行伪加密,然后再用第一条命令来解除伪加密

0x02:用Ziperello暴力破解zip压缩包

Ziperello的使用很简单
第一步选择待破解zip包,点击next

第二步选择破解方式

一般选择字典破解,进去后选择字典,再设置好单词的变化就ok了

然后点击开始破解:

0x03:用AZPR实施已知明文攻击

利用前提:有一个zip中的文件
原理:同一个zip包里所有文件都是使用同一个加密密钥来加密的

比如我们有个aaa.zip文件,里面有个aaa.txt和flag.txt文件,我们想知道flag.txt文件的内容,但是压缩文件有密码

而如果我们现在已经有了aaa.txt文件,那么就可以通过ZAPR实施已知明文攻击得到压缩包密码
首先我们需要包aaa.txt压缩为zip文件aa.zip
然后打开AZPR

设置好了后点击start,然后等待一会儿密码就出来了

0x04:CRC32碰撞攻击

由于压缩文件的CRC32值是根据文件内容来生成的,因此当文件内容比较简单的时候,我们可以通过爆破CRC32值来得到文件内容
比如我们新建一个文件a.txt,然后内容为9314,然后将其压缩加密(当然加不加密都无所谓,我们的目的是通过CRC直接爆破文件内容,而加密与不加密文件的CRC32值都是相同的)

a.txt的crc32值为0x6da3c0f9
再python中我们可以使用binascii模块很轻易的计算一个字符串的CRC32值
我们先定义一个得到字符串crc32值的函数,得到的值用十六进制表示:

1
2
3
import binascii
def getcrc32(str):
return '0x%x' % (binascii.crc32(str)&0xffffffff)

如果我们知道文件内容为四位数字,那么我们可以调用这个函数来爆破

1
2
3
4
5
6
7
8
crc32 = "0x6da3c0f9"
for i in range(0, 9999):
stri = str(i)
if len(stri)<4:
extr_len = 4-len(stri)
stri = extr_len * "0"+stri # 补足4位
if getcrc32(stri) == crc32:
print stri

然后完整的脚本为:

1
2
3
4
5
6
7
8
9
10
11
12
#encoding:utf-8
import binascii
def getcrc32(str):
return '0x%x' % (binascii.crc32(str)&0xffffffff)
crc32 = "0x6da3c0f9"
for i in range(0, 9999):
stri = str(i)
if len(stri)<4:
extr_len = 4-len(stri)
stri = extr_len * "0"+stri # 补足4位
if getcrc32(stri) == crc32:
print stri

运行结果:

成功爆破出了文件内容,当然crc32碰撞的使用局限性还是很大在现实环境中很难碰到

最后更新: 2018年07月28日 19:26

原始链接: http://drac0nids.top/2018/07/28/杂项中zip的总结/

× 请我吃糖~
打赏二维码