压缩包攻击手段

仅以此作为本人学习过程的记录

图种

这种情况是指图片(一般是zip)中含有压缩包。这种方法的原理是:以jpg格式的图片为例,一个完整的 JPG 文件由 FF D8 开头,FF D9 结尾,图片浏览器会忽略 FF D9 以后的内容,因此可以在 JPG 文件中加入其他文件。
解决方法:
1. 借助工具(如linux下的binwalk或者foremost)
2. 直接将后缀名改成隐藏文件的后缀名(一般为zip),但这种方法不适用于一张图片含有多个同类型隐藏文件的情况

伪加密

先阐述一下源文件的数据区

一个文件=压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志详解链接

举例,如图:

其中源文件前部分

50 4B 03 04:这是头文件标记(0x04034b50) 
14 00:解压文件所需 pkware 版本 
00 00:全局方式位标记(有无加密) 
08 00:压缩方式 
5A 7E:最后修改文件时间 
F7 46:最后修改文件日期 
16 B5 80 14:CRC-32校验(1480B516) 
19 00 00 00:压缩后尺寸(25) 
17 00 00 00:未压缩尺寸(23) 
07 00:文件名长度 
00 00:扩展记录长度 
6B65792E7478740BCECC750E71ABCE48CDC9C95728CECC2DC849AD284DAD0500 
压缩源文件目录区: 
50 4B 01 02:目录中文件文件头标记(0x02014b50) 
3F 00:压缩使用的 pkware 版本 
14 00:解压文件所需 pkware 版本 
00 00:全局方式位标记(有无加密,这个更改这里进行伪加密,改为09 00打开就会提示有密码了) 
08 00:压缩方式 
5A 7E:最后修改文件时间 
F7 46:最后修改文件日期 
16 B5 80 14:CRC-32校验(1480B516) 
19 00 00 00:压缩后尺寸(25) 
17 00 00 00:未压缩尺寸(23) 
07 00:文件名长度 
24 00:扩展字段长度 
00 00:文件注释长度 
00 00:磁盘开始号 
00 00:内部文件属性 
20 00 00 00:外部文件属性 
00 00 00 00:局部头部偏移量

源文件后部分

50 4B 05 06:目录结束标记 
00 00:当前磁盘编号 
00 00:目录区开始磁盘编号 
01 00:本磁盘上纪录总数 
01 00:目录区中纪录总数 
59 00 00 00:目录区尺寸大小 
3E 00 00 00:目录区对第一张磁盘的偏移量 
00 00:ZIP 文件注释长度

所以伪加密就是更改了全局方式位标记,使得原来没有加密的文件被解码时误判为加密。
解决方法:

  1. 用压缩软件自带的修复功能
  2. ZipCenOp.jar判断是否为伪加密,附下载链接https://pan.baidu.com/s/1SXeRg0zS93TbWNPNGO71uw 提取码:prmy
  3. 放在部分linux如kali中打开
  4. 手动将源文件的全局方式位标记更改成正常值

文件损坏

漏洞成因:文件数据源被人为改动
解决办法:用winhex或者其他16进制编辑器修复一下文件头或者文件尾。附常见文件头https://blog.csdn.net/xiangshangbashaonian/article/details/80156865
文件缺头或者缺尾分别在binwalk中的显示

爆破/字典/掩码攻击

特别说明:掩码攻击是指在暴力破解密码的时候知道密码的部分,从而对破解密码起到巨大的作用。
举例:比如知道密码含有19700708这样的生日格式,或者知道密码组成是“hello????(?为未知字符)”或者知道密码的第三位是数字6等等
利用方法: 生成含有指定掩码的密码字典,再利用字典对压缩包进行暴力破解
解决方法:构造字典,然后进行攻击

zip明文攻击

转自搜狐http://www.sohu.com/a/274916484_704736

我们为zip压缩文件所设定的密码,首先被转换成3个32bit的key,所以可能的key的组合是2^96,这是个天文数字,如果用暴力穷举的方式是不太可能的,除非你的密码比较短或者有个厉害的字典。

压缩软件用这3个key加密所有包中的文件,也就是说,所有文件的key是一样的,如果我们能够找到这个key,就能解开所有的文件。

如果我们找到加密压缩包中的任意一个文件,这个文件和压缩包里的文件是一样的,我们把这个文件用同样的压缩软件同样的压缩方式进行无密码的压缩,得到的文件就是我们的Known plaintext(已知明文)。用这个无密码的压缩包和有密码的压缩包进行比较,分析两个包中相同的那个文件,抽取出两个文件的不同点,就是那3个key了,如此就能得到key。两个相同文件在压缩包中的字节数应该相差12个byte,就是那3个key了。虽然我们还是无法通过这个key还原出密码,但是我们已经可以用这个key解开所有的文件,所以已经满足我们的要求了,毕竟对我们而言,得到解压后的文件比得到密码本身更重要。

要求压缩包是zip且手上有一个包中的已知文件且要求文件大小大于12B,且另一个未知的压缩包有和已知的文件相同的CRC32,像下图这样

那基本就可以确认这是明文攻击。
工具一般是用下面其中一个(暂时只提供windows的下载地址)
PKCRACK下载地址https://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack.html
ARCHPR下载地址https://pan.baidu.com/s/1qWep_yN1S8MejpFHqRJoqw
提取码:kczb

下面演示的是用ARCHPR进行明文攻击,选择好被攻击的文件以及已知文件的压缩包,选择明文攻击,开始。

普遍等待时间为几分钟,但由于ARCHPR的版本不同可能已经解密了但是没有自动停止这时需要手动停止。
另外两点注意事项:

  1. PKCRACK的运行环境是32位系统,64位系统不能运行。
  2. ARCHPR可能出现这种情况

原因是因为,压缩原数据包的加密算法与自己压缩的加密算法不一样
针对这种情况的解决方法:

  1. 使用原包含已知文件和加密压缩包的压缩包作为明文
  2. 使用与原压缩包相同的压缩应用,大概率为7z

CRC32攻击

CRC32:CRC本身是“冗余校验码”的意思,CRC32则表示会产生一个32bit(8位十六进制数)的校验值。

在产生CRC32时,源数据块的每一位都参与了运算,因此即使数据块中只有一位发生改变也会得到不同的CRC32值,利用这个原理我们可以直接爆破出加密文件的内容(有点像哈希碰撞)
例题

构造python代码

#coding=utf=8
import binascii
real = 0x56EA988D
for y in range(1000,9999):
    if real == (binascii.crc32(str(y)) & 0xffffffff):
        print(y)
print('End')

备注:在 Python 2.x 的版本中,binascii.crc32 所计算出來的 CRC 值域为[-2^31, 2^31-1] 之间的有符号整数,为了要与一般CRC 结果作比对,需要将其转为无符号整数,所以加上& 0xffffffff来进行转换。如果是 Python 3.x 的版本,其计算结果为 [0, 2^32-1] 间的无符号整数,因此不需额外加上& 0xffffffff

附六位python脚本https://github.com/usercbase/crc32
使用方法为

python crc32.py reverse 你的crc32密文

内容复杂度越高碰撞时间越长,基本六位数就要几十分钟。普通cpu基本只能解六位或者以下的

小结

压缩包的常用手段基本是以上几种
部分资料参考来自
https://www.360zhijia.com/360anquanke/217342.html
https://www.cnblogs.com/ECJTUACM-873284962/p/9387711.html
https://blog.csdn.net/weixin_43659360/article/details/86748483

说点什么
支持Markdown语法
在"常见压缩包攻击手段"已有1条评论
Loading...