发布于 

花式破解ZIP压缩包加密技巧

在做CTF题时,经常会遇到加密压缩包需要我们破解,这次便总结一下ZIP压缩包的多种加密破解方法,让大家遇到相应题目时直接秒杀

伪加密

练习靶场:https://ctf.bugku.com/challenges/detail/id/57.html

ZIP伪加密是指通过修改ZIP文件的加密标志位,让解压软件误以为文件加密,又由于压缩包实际没有设置密码,导致任何密码都无法通过验证正确解压压缩包,即无法解密的伪装加密

一个ZIP压缩包由三部分组成:压缩源文件数据区压缩源文件目录区压缩源文件目录结束标志

压缩源文件数据区:

  • 50 4B 03 04:这是头文件标记(0x04034b50)
  • 14 00:解压文件所需 pkware 版本
  • 00 00:全局方式位标记(有无加密) 头文件标记后2bytes
  • 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:扩展记录长度

压缩源文件目录区:

  • 50 4B 01 02:目录中文件文件头标记(0x02014b50)
  • 3F 00:压缩使用的 pkware 版本
  • 14 00:解压文件所需 pkware 版本
  • 00 00:全局方式位标记(有无加密,伪加密的关键) 目录文件标记后4bytes
  • 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 文件注释长度

如下使用010Editor对ZIP文件进行分析,可以看到文件根据不同颜色分为了上述的三个区

image.png

影响ZIP压缩包加密属性的只有两个值:

  1. 压缩源文件数据区-全局方式位标记,表示文件数据是否加密
  2. 压缩源文件目录区-全局方式位标记,表示文件元数据(文件名、文件大小、压缩方式等)是否加密

上图通过010Editor工具定位到全局方式位标记,长度总共4位,其中只有第2位对加密方式有影响:

  • 第2位为奇数时表示加密,如0900
  • 第2位为偶数时表示不加密,如0800
  • 第2位为0表示无加密,如0000

如下压缩包中仅有一个flag.txt文件加密,我们要破解文件数据只需要将压缩源文件数据区全局方式位标记(frFlags)第2位修改为0或者偶数即可

image.png

CRC碰撞

练习靶场:https://ctf.bugku.com/challenges/detail/id/160.html

CRC 校验是通过对文件内容进行计算得出一个校验值,当文件在传输或存储过程中发生了改变时,CRC 校验值也会发生变化,从而可以检测到文件的损坏或篡改

而ZIP 压缩包中的每个文件都会生成一个对应的CRC校验值,即便数据中一个bit发生变化,也会导致CRC值不同。若是知道一段数据的长度和CRC值,便可穷举得到数据原文,通常只适用于大小在6字节及以下的文件

如下加密压缩文件中有6字节以下的文件,便可以使用CRC32碰撞技术

image.png

使用CRC32-Tools工具指定读取压缩包中4字节文件,获取其CRC值并进行碰撞,获得加密内容

image.png

前一个工具最多仅能碰撞4字节的数据,针对6字节大小文件碰撞可以使用另一款工具,只需要输入CRC值便可以开始碰撞,6字节匹配的数据通常会有多个

image.png

像上面便是碰撞4个文件得到加密内容后,进行拼接爆破,便可以得到压缩包正确密码

暴力破解

练习靶场:https://ctf.bugku.com/challenges/detail/id/208.html

暴力破解就是通过生成指定范围字符(例如八位纯数字)或者使用字典的方式,不断验证压缩包密码,用穷举的方法暴力破解得到密码

常使用的ZIP暴力破解工具有两款:

  1. ARCHPR:可针对多款压缩包进行爆破
  2. Ziperello:仅针对ZIP进行爆破

考虑到泛用性,更推荐使用功能更加全面和强大的ARCHPR

已知明文攻击

ZIP的加密算法大致可以分为ZipCryptoAES-256两种,各自又可以分为Deflate和Store两种

而ZipCrypto是传统的zip加密方式,其相关的两种加密方式便可能存在已知明文攻击漏洞

  • ZipCrypto Deflate
  • ZipCrypto Store

已知明文攻击(Known Plaintext Attack)是一种密码学攻击方式,攻击者在已知一部分明文和对应的密文的情况下,尝试推断出加密算法的密钥或者其他未知明文的内容

对于ZIP压缩包的已知明文攻击便是通过已知一部分加密压缩包内文件内容,从而破解压缩包密码

已知一个文件

练习靶场:https://ctf.bugku.com/challenges/detail/id/27.html

当我们可以获取加密压缩包中一个明文文件时,便可以使用这种方法进行爆破

已知明文爆破需要满足的两个条件:

  1. 爆破的两个文件的格式需要一样
  2. 压缩包内只能含有单个相同的文件

实现已知明文攻击的步骤也很简单:

  1. 让加密压缩包中仅保留单个文件
  2. 将已知的文件参照加密压缩包使用同样的方法进行压缩打包
  3. 使用ARCHRP压缩包爆破工具打开加密压缩包
  4. 选取已知文件生成的压缩包作为参照,爆破加密密码

如下压缩包解压后可以得到一个图片文件logo.png和一个加密压缩包flag.zip,而flag.zip中同样存在logo.png文件

image.png

我们只需要将flag.zip中的word文档删除,然后对logo.png进行同样的压缩,便能生成两个类似的压缩包,只是一个为加密一个为不加密

加密后比对两个压缩包中文件的CRC值和算法是否一致,确保两个压缩包除了是否加密外无其他区别

image.png

如果无法爆破的话可能是压缩软件不匹配,尝试7z、WinRAR都压缩一下试试看

Store压缩算法

练习靶场:https://ctf.bugku.com/challenges/detail/id/390.html

当我们无法获取加密压缩包中的任意一个文件,且压缩包加密算法为ZipCrypto Stores时,利用该压缩算法的特性我们只需要知道加密压缩包内容的12个字节,便可以对该压缩包进行明文攻击破解

已知明文工具需要满足条件:

  1. 至少已知明文的12个字节及偏移,其中至少8字节需要连续
  2. 明文对应的文件加密方式为ZipCrypto Store

如下压缩包中仅有一个PNG图片,由于PNG图片的文件头都一致,且包含12字节,因此可以生成一个PNG图片进行已知明文攻击

image.png

PNG的十六进制头:89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52

通过指令生成一个包含PNG头部数据的文件,xxd -r -ps表示将十六进制转换为ASCII文本

1
echo 89504E470D0A1A0A0000000D49484452 | xxd -r -ps > png_header

得到PNG文件后,便是bkcrack工具进行已知明文攻击,下面介绍下主要参数:

  • -C:选择加密压缩包
  • -c:选择压缩包中的加密文件
  • -p:选择明文文件
  • -o:指定偏移量,如果明文对应于密文开头以外的部分,则可以指定偏移量
  • -k:指定内部密钥值
  • -d:提取解密后保存的文件名

首选指定明文和密文压缩包爆破获取内部密钥值

1
bkcrack -C file.zip -c flag.png -p png_header -o 0

image.png

然后用爆破出来的内部密钥值将压缩包内文件解密提取,通过-d指定另存名字

1
bkcrack -C file.zip -c flag.png -k 92802c24 9955f8d6 65c652b8 -d result.png

image.png

然后就能拿到解密后的文件result.png

除此之外该工具还有个稀疏明文攻击方式,就是只知道很短的明文和一些字节也可以进行爆破,留坑以后遇到实际案例再填

image.png




👨‍💻本站由 @鱼龙 使用 Stellar 主题创建

📃本"页面"访问 次 | 👀总访问 次 | 🥷总访客

⏱️本站已运行 小时