使⽤pkcrack明⽂⽅式破解zip压缩⽂件密码
使⽤场景
⼀般破解加密压缩⽂件常规的⽅式主要有穷举、字典破解等⽅法。穷举破解的⽅式效率太低,字典破解需要碰运⽓。但是如果⼿上刚好有加密zip中的某个⽂件时,可以使⽤明⽂破解。这种⽅式利⽤了加密算法的BUG,相⽐穷举,能提⾼破解效率。但是有⼀个限制:我们把所持有的⽂件暂且成为明⽂⽂件(plaintext),该⽂件的⼤⼩必须⼤于12Byte
环境&准备
Ubuntu 20.04LTS
字符集
字符集需要注意的有3点:
1. 系统使⽤的字符集
2. 压缩⽂件使⽤的字符集
3. 终端(Terminal)使⽤的字符集
小宋佳的老公是谁
⼀般windows下zip压缩包使⽤GBK编码(⼜称CP936编码),Ubuntu系统使⽤的是UTF-8编码。当使⽤unzip命令时,默认采⽤UTF-8编码读取⽂件名,此时输出到终端为乱码,解决⽅案有两种:
1. 改变系统的编码
# 改变编码
袈裟为什么也叫百纳衣?
export LANG=zh_CN.GBK
# 查看结果
小说怎么下载到手机
locale
系统编码改完后,unzip就会使⽤GBK编码读取⽂件名。但还要注意⼀点,如果程序输出的是GBK编码,⽽终端以UTF-8编码展⽰,会出现⼀堆的问号,此时需要修改终端,⽐如xshell、x-terminal-emulator的字符集为GBK编码
# 打印压缩包信息
unzip -v xxx.zip
2. 直接使⽤unzip命令提供的-O参数
# 打印压缩包信息,以下命令指明压缩包的字符集为GBK,所以unzip会把压缩包中的GBK格式转为UTF-8格式输出到终端
unzip -O CP936 -v xxx.zip
压缩⽂件
使⽤pkcrack进⾏明⽂破解需要注意⼀点:压缩包中可能包含多个加密⽂件,但我们只要持有其中⼀个⽂件即可,该⽂件必须和压缩包中的某个⽂件⼀模⼀样。在破解前,需要先把明⽂⽂件进⾏压缩。如果使⽤zip命令直接压缩可能会出现压缩率的问题。windows下可以使⽤7-zip⼀类的桌⾯应⽤进⾏压缩。使⽤7-zip进⾏压缩时,会有⼀个压缩率的选项,可以调整word size的⼤⼩,如果这个压缩率和加密⽂件的压缩率不匹配,破解时可能会出现⽂件长度不匹配问题
#查看加密压缩包的压缩率,windows下可以可以借助winrar、360压缩、7zip等查看
zipdetails -v xxx.zip
0664 0004 50 4B 01 02 CENTRAL HEADER #1    02014B50
0668 0001 1E          Created Zip Spec      1E '3.0'
0669 0001 03          Created OS            03 'Unix'
066A 0001 14          Extract Zip Spec      14 '2.0'
066B 0001 00          Extract OS            00 'MS-DOS'
066C 0002 00 00      General Purpose Flag  0000
[Bits 1-2]            0 'Normal Compression'
066E 0002 08 00      Compression Method    0008 'Deflated'
0670 0004 E9 AE 78 51 Last Mod Time        5178AEE9 'Tue Nov 24 21:55:18 2020'
0674 0004 B2 EF 76 9E CRC                  9E76EFB2
0678 0004 FE 05 00 00 Compressed Length    000005FE
067C 0004 F0 0B 00 00 Uncompressed Length  00000BF0
0680 0002 2C 00      Filename Length      002C
0682 0002 18 00      Extra Length          0018
0684 0002 00 00      Comment Length        0000
2022年是新中国成立几周年0686 0002 00 00      Disk Start            0000
0688 0002 00 00      Int File Attributes  0000
[Bit 0]              0 'Binary Data'
068A 0004 00 00 B4 81 Ext File Attributes  81B40000
068E 0004 00 00 00 00 Local Header Offset  00000000
0692 002C 63 6C 69 63 Filename              'clickhouse-client-1.1.54236-
6B 68 6F 75                      4.el6.x86_64.rpm'
73 65 2D 63
6C 69 65 6E
74 2D 31 2E
31 2E 35 34
32 33 36 2D
34 2E 65 6C
36 2E 78 38
36 5F 36 34
2E 72 70 6D
安装pkcrack
cd /root/pkcrack
vim install.sh
#!/bin/bash -ex
wget www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack/pkcrack-1.2.
tar xzf pkcrack-1.2.
cd pkcrack-1.2.2/src
make
mkdir -p ../../bin
cp extract findkey makekey pkcrack zipdecrypt ../../bin英语命题作文
cd../../
chmod +x install.sh
./install.sh
执⾏破解
#设置字符集
export LANG=zh_CN.GBK
#如果明⽂⽂件在压缩包中的⽂件名刚好是中⽂,可以使⽤以下的⼦shell形式获取⽂件名,就不会出现编码问题
bin/pkcrack -C /root/pkcrack/crypt.zip -c $(unzip -v crypt.zip |grep'info'|cut -d ' ' -f 19) -P /root/pkcrack/plaintext.zip -p '明⽂⽂件.info' -d /root/pkcrack/decr ypt.zip
参数解读
C:要破解的⽬标⽂件(含路径)
-c:破解⽂件中的明⽂⽂件的名字(其路径不包括系统路径,从zip⽂件⼀层开始)
-P:压缩后的明⽂⽂件
-p:压缩的明⽂⽂件中明⽂⽂件的名字(也就是明⽂⽂件.info在plaintext.zip中的位置) -
d:指定⽂件名及所在的绝对路径,将解密后的zip⽂件输出
补充说明
pkcrack的破解分为对压缩⽂档的破解和对压缩⽂档密码的破解,直接破解压缩⽂档只需要计算出3个关键的key,计算这3个key的效率⾮常⾼。⽽计算压缩⽂档密码则需要在算出来3个key的基础上再进⾏穷举,虽然⽐⼀般的⾮明⽂破解的穷举效率要⾼,但是根据密码的长度,计算难度呈指数级增长。所以当密码⾮常长的情况下,破解难度相当⼤。其实⽆论什么情况下,直接破解⽂档都⽐破解密码更划算,因为破解密码最终也还是为了拿到⽂件。。。
当命令带-d参数时,pkcrack会直接对 通常情况下,pkcrack程序执⾏后,会先计算出3个key,再根据这3个key直接⽣成未加密的压缩⽂档。如下,是stdin打印出来的三个key。如果没有加-d参数,则会计算压缩⽂档的密码
Ta-daaaaa! key0=a6f3eaa9, key1=798254cd, key2=1f5aeee1
Probabilistic test succeeded for 1510 bytes.
Ta-daaaaa! key0=a6f3eaa9, key1=798254cd, key2=1f5aeee1
Probabilistic test succeeded for 1510 bytes.
Ta-daaaaa! key0=a6f3eaa9, key1=798254cd, key2=1f5aeee1
Probabilistic test succeeded for 1510 bytes.
Ta-daaaaa! key0=a6f3eaa9, key1=798254cd, key2=1f5aeee1
Probabilistic test succeeded for 1510 bytes.
如果⼀开始没加-d参数,⽽程序也⼀直没有得到密码,当程序打印出3个key后,就可以使⽤bin下的zipdecrypt命令破解该压缩⽂档,得到未加密的压缩⽂档,使⽤⽅法如下:
zipdecrypt key0 key1 key2 encrypted_archive decrypted_archive
#最后使⽤unzip命令解压,加-O防⽌乱码
unzip -O CP936 decrypted_archive.zip
明⽂⽂件必须⼤于12Byte是由pkzip的规范决定的,pkzip会在加密前,在压缩⽂件的⽂件前加12Byte的随机数/CRC校验值。所以pkcrack程序内部会判断,如果明⽂⽂件和加密⽂件的⽂件⼤⼩有差异,差异⼤于或⼩于12Byte都会报错。
汽车玻璃膜
超⼤的压缩⽂件使⽤pkcrack⽣成压缩包时可能出现签名错误的问题,使⽤unzip和winrar解压被解密过的压缩包可能会出现压缩包损坏的情况,经测试使⽤7zip解压不会报错
sudo apt-get install p7zip convmv
#LANG=C表⽰以US-ASCII这样的编码输出⽂件名
LANG=C 7za x your-zip-file.zip
#上条命令解压的⽂件可能出现乱码,使⽤convmv命令,它会通过mv命令将⽂件逐条从GBK编码的⽂件名转化为UTF8编码,-r表⽰递归访问⽬录convmv -f GBK -t utf8 --notest -r .
参考资料