压缩文件处理、分析
1.伪加密
如果压缩文件是加密的,或文件头正常但解压缩错误,首先尝试文件是否为伪加密。
zip文件是否加密是通过标识符来显示的,在每个文件的文件目录字段有一位专门标识了文件是否加密,将其设置为00表示该文件未加密,如果成功解压则表示文件为伪加密,如果解压出错说明文件为真加密。
使用场景:伪加密文件
操作方法:
使用winhex打开压缩文件, 找到文件头第九第十个字符,将其修改为0000。
1.使用winhex打开文件搜索16进制504B0102,可以看到每个加密文件的文件头字段。
2.从50开始计算,第九第十个字符为加密字段,将其设置为0000即可变成无加密状态。
3.RAR文件由于有头部校验,使用伪加密时打开文件会出现报错,使用winhex修改标志位后如报错消失且正常解压缩,说明是伪加密。使用winhex打开RAR文件,找到第24个字节,该字节尾数为4表示加密,0表示无加密,将尾数改为0即可破解伪加密。
2.暴力破解
通常我们可以使用ARCHPR.exe工具来破解zip文件
使用场景: windows下加密过的zip文件
1、攻击类型选择暴力破解,在范围位置根据提示选择暴力破解范围选项设置暴力破解包含的类型、开始于和结束于选项具体范围,如果没有定义则全范围暴力破解。点击打开选择要破解的文件,点击开始进行破解。建议使用1~9位的数字密码,以及系统自带的英文字典作为密码字典。
2、攻击类型选择掩码可以进行复杂的暴力破解,比如知道密码前3位是abc,后3位为数字,则在攻击类型选择掩码,在掩码处输入acb???,暴力范围选项选择所有数字,打开要破解的点击,点击破解。此时???的部分会被我们选择的暴力破解范围中的字符代替。
3.明文攻击
明文攻击指知道加密的ZIP中部分文件的明文内容,利用这些内容推测出密钥并解密ZIP文件的攻击方法,相比于暴力破解,这种方法在破解密码较为复杂的压缩包时效率更高。
使用场景:已知加密的zip部分文件明文内容
例:
假设一个加密的压缩包中有两个文件readme.txt和flag.txt,其中flag txt的内容是我们希望知道的内容,而我们拥有readme.txt的明文文件,使用上述两个文件即可进行明文攻击。
操作:
1、将readme.txt的明文文件进行压缩,变成readme1.zip。
2、打开archpr, 攻击类型选择明文,明文文件路径选择readme1.zip ( 即将明文文件不加密压缩后的文件),加密的文件选择要破解的文件,点击开始,破解成功后会获得密码。
有时不一定能破解出文件口令,但是能够找到加密密钥等信息,可以直接将文件解密,点击确定保存解密后的文件即可。
使用该方法需要注意两个关键点: 1、有一个明文文件,压缩后CRC值与加密压缩包中的文件一致。 2、明文文件的压缩算法需要与加密压缩文件的压缩算法一致。
RAR文件格式 有时候给出的RAR文件的头部各个字块会故意给错导致无法识别。
题目复现
题目:[broken_hash]
- 题目来源:Polarctf-misc-[broken_hash]
- 解题:
靶场给了一个压缩包,解压后得到两个没有扩展名的文件
用010eiditor
打开png
文件,在其头部看到了png图片文件扩展名89 50 4E 47
并在其尾部发现了flag字样
猜测png
可能是由多个文件合并而来,使用binwalk工具进行分离:binwalk -e --directory=./output ./png
分离得到三个文件:空文本文件3E
,二进制文件3E.zlib
、加密的压缩包8E3EE.rar
使用010打开得到的二进制文件,在其末尾发现了可疑数据CMT7bf21a26cd6
,其中的CMT
猜测为comment(提示)的缩写
打开压缩包同样观察到这段可疑数据:
查看靶场给的另一个文件tip
提示压缩包密码是由小写字母和数字组成、长度为4的字符串的md5值,目前猜测那段可疑数据为密码md5值的前半部分,写脚本爆破密码(md5值为128位,16字节,一般使用32个十六进制字符表示)
import hashlib
import re
import string
pass1_md5 = "7bf21a26cd6"
dic = string.ascii_letters+string.digits
for i in dic:
for j in dic:
for x in dic:
for y in dic:
pass_test = str(i)+str(j)+str(x)+str(y)
pass_md5 = hashlib.md5(pass_test.encode()).hexdigest()
if re.findall(pass1_md5+'(.*?)',pass_md5):
print("找到密码为:",pass_md5)
exit()
得到密码为7bf21a26cd627170e0e05ceee551c044
输入密码将压缩包解压,得到一个没有后缀的flag
文件
010打开,得到flag:flag{dbee4535f4853a3adc9ac3bbe1358819}