ZIP明文攻击
简介
明文攻击主要利用大于 12 字节的一段已知明文数据进行攻击,从而获取整个加密文压缩包的数据。也就是说,如果我手里有一个未知密码的压缩包和压缩包内某个文件的一部分明文(不一定非要从头开始,能确定偏移就行),那么我就可以通过这种攻击来解开整个压缩包。
条件
1.完整的明文文件
2.明文文件需要被相同的压缩算法标准压缩(也可理解为被相同压缩工具压缩)
3.明文对应文件的加密算法需要是 ZipCrypto Store
ZIP的加密算法大致分为两种ZipCrypto和AES-256,各自又分Deflate和Store。
ZipCrypto Deflate
ZipCrypto Store
AES-256 Deflate
AES-256 Store
ZipCrypto算是传统的zip加密方式。只有使用ZipCrypto Deflate/Store才可以使用 ZIP已知明文攻击进行破解。
使用7Zip打开压缩包,即可看到加密算法
或者通过7Zip的命令行工具
1 | 7z l -slt yourfile.zip |
利用
一般在CTF中,考法是比较固定的,题目一般是一个加密的压缩包,但是不对目录加密,可以看到里面的文件,通过其他条件获取到里面的其中一个文件,然后实施明文攻击,这种攻击不在赘述,我们来研究一下根据一部分文件数据如何进行明文攻击
条件
实现这种明文攻击的条件如下
至少已知明文的12个字节及偏移,其中至少8字节需要连续。
明文对应的文件加密方式为ZipCrypto Store
该方法对于ZIP加密的算法有要求,明文对应的文件加密方式需要为ZipCrypto Store。经大佬测试,Winrar(v5.80)、7zip(v19.00)默认状态下加密使用的就是AES256算法,直接排除。360压缩(v4.0.0.1220)、好压(v6.2)使用的是ZipCrypto,不固定使用Store或Deflate。不过一般不用担心怎么制作一个可以明文攻击的压缩包,直接检查压缩包的加密类型即可。
制作ZipCrypto Store压缩包使用360压缩-自定义,压缩方式选择存储,加密时选择ZIP经典加密即可。
工具
在Github下载对应操作系统release即可
bkcrack常用参数:
1 | -c 提取的密文部分 |
明文攻击
明文.txt中存放连续8字节以上的十进制明文即可
附加明文需要4字节以上的十六进制明文
1 | bkcrack -C 加密压缩包 -c 明文攻击文件 -o 明文偏移量 -p 明文.txt -x 附加明文偏移量 附加明文(16进制) |
解密压缩包,已获得key,长度为24位
1 | bkcrack -C 加密压缩包 -c 明文攻击文件 -k key -D 加密压缩包 |
破解密码
1 | bkcrack.exe -k key -r 明文密码长度 字符选项 |
明文密码制作key
1 | bkcrack --password 明文密码 |
多线程
1 | -j, --jobs <count> Number of threads to use for parallelized operations |
但是经过测试,还是不指定多线程,使用单线程总体表现更好,CPU都给我干满了。
案例1 txt
单文本文件压缩包
flag.txt
1 | # 已知明文 |
把连续八字节的明文放在txt中
把74f6
转为16进制37346636
然后尝试明文攻击,大概半个小时
1 | bkcrack -C flag_360.zip -c flag.txt -p plain1.txt -o 1 -x 29 37346636 |
然后可以解密
1 | bkcrack -C flag_360.zip -c flag.txt -k b21e5df4 ab9a9430 8c336475 -d flag.txt |
有时会遇到解出来的文件会有乱码的问题
可以使用密钥改密码,然后自行解压
1 | 把flag_360.zip改密码为123456,并另存为new.zip |
案例2 png
压缩包内含有图片
根据PNG图片结构
1 | 0000h: 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 ; 塒NG........IHDR |
一般可以认为,PNG的前16字节为
1 | 89504E470D0A1A0A0000000D49484452 |
如果知道图片的长宽,甚至还能获得更多明文字节,但是16字节已经满足最低12字节的破解需求,所以尝试破解。
注意写入数据要转化为十进制
大概五分钟,然后解密即可
案例3 zip
zip里还有zip
zip的文件结构应该还是比较熟悉的,除了经典的文件头,zip里面的文件名会在压缩包里明文存放,偏移量为30
里面有一个明文breakthroughentry.txt+flag.txt.zip的压缩包,可以尝试明文攻击
猜测里面有两个文件,一个是breakthroughentry.txt,另一个是flag.txt
有两种可能,需要猜两个文件谁在前面,因为只有第一个文件才能确定这个文件名在这个压缩包的偏移量30处
不过都试一遍即可
1 | bkcrack.exe -C zip_guessinteger.zip -c breakthroughentry.txt+flag.txt.zip -o 30 -p plain1 -x 0 504B0304 |
爆破之后验证一下,确实是breakthroughentry.txt在前
案例4 exe
EXE文件
很多的EXE文件,在第64字节开始,会有连续的64字节的固定数据
称为DOS存根(不绝对,因为此处可以修改)
1 | 0E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000 |
尝试破解
1 | bkcrack.exe -C nc64.zip -c nc64.exe -o 64 -p plain1 -x 0 4D5A |
案例5 pcapng
Block Type 始终为 0A0D0D0A;Block Total Length 是小端存储的 Header长度,显然不会超过 64KB,所以高两位都是 00;Byte-Order Magic 在小端机器上始终为4D3C2B1A;Major Version 目前只有 0100;Minor Version 目前只有 0000。
其实蓝色部分也是可以猜出来的:Section Length 是可选字段,大多数软件(比如 WireShark)在保存 pcapng 时会写入-1(即 8 个字节的 FF)。
压缩包如下
根据上面的研究,可以构造一个plain文件
然后可以结合文件头,尝试明文攻击
1 | bkcrack.exe -C secertpcapng.zip -c secert.pcapng -o 6 -p plain -x 0 0A0D0D0A |
案例6 xml
xml文件是网站中很常见的配置文件,一般由<?xml version="1.0" encoding="UTF-8"?>
开头
写好plain文件
尝试使用xml常见的头部进行明文攻击
1 | bkcrack.exe -C xml.zip -c 123/web.xml -o 0 -p plain |
据此,很多有固定开头的文件格式都可以作为明文攻击的切入点
比如
1 | *.html |
当然,这些都不绝对,比如svg开头还有很多种类等等。
案例7 doxs、xlsx
由于网上没有找到这两个文件的详细文件格式讲解,尝试在一部分文件中找规律,不过本质和压缩包类似。
有时docs、xlsx文件中会存在大量的连续的0,只需要其中的12个,偏移量可以尝试。
于是尝试用连续的12字节的0来明文爆破,因为目标中连续的0很多,所以偏移量可以试。
尝试攻击
1 | bkcrack.exe -C xlsx.zip -c 1.xlsx -o 64 -p plain |
除了连续的0,还发现在有的docx、xlsx文件中,在偏移量30起,都是[Content_Types].xml
,类似压缩包中的文件名位置,虽然他俩本来也就是个压缩包格式。应该也可以利用这点明文攻击,但是可能跟docx、xlsx的版本有关
1 | bkcrack.exe -C xlsx.zip -c 1.xlsx -o 30 -p plain |
另外一种是在30偏移量处的内容为docProps/PK
,加上文件头也达到了爆破的最低要求。
参考
https://www.freebuf.com/articles/network/255145.html
https://flandre-scarlet.moe/blog/1685/
https://www.freebuf.com/articles/database/355244.html
https://blog.csdn.net/Rick66Ashley/article/details/130015948
https://ctf-wiki.org/misc/picture/png/