misc-压缩包分析

ZJ Lv100

根据压缩包文件的内容和结构存在着多种破解方式,如暴力破解,字典攻击与明文攻击等方法

前言

这里会提供一些来自buuctf的案例,但这章比较简单,题目就自行前往靶场去试试吧,就不再写WP了

工具介绍

提供的工具若未破解或链接已挂,请自行搜索破解版使用

010Editor 16进制编辑器

ARCHPR 多种压缩格式密码爆破

Ziperello ZIP格式的密码爆破

CRC32-Tools CRC32碰撞脚本工具

常见压缩包格式

ZIP文件格式与RAR文件格式,是比较常见的压缩包格式

ZIP文件格式

ZIP文件一般包含:压缩源文件数据区、压缩源文件目录区、压缩源文件目录结束标志。

需要记住的压缩源文件数据区的文件字节和压缩源文件目录区的文件字节如下

压缩源文件数据区含义及其字节

含义 字节数
文件头标记 4bytes(504b0304
解压文件所需版本 2bytes
通用位标记 2bytes
压缩方式 2bytes
最后修改文件时间 2bytes
最后修改文件日期 2bytes
CRC-32 4bytes

压缩源文件目录区含义及其字节

含义 字节数
文件头标记 4bytes(504b0102
压缩使用的版本 2bytes
解压文件所需版本 2bytes
通用位标记 2bytes
压缩方式 2bytes
最后修改文件时间 2bytes
最后修改文件日期 2bytes
CRC-32 4bytes

区别:

RAR可以兼容ZIP,能够压缩或解压缩ZIP文件,但是ZIP无法完成对RAR文件的解压缩,且RAR当压缩包破损但恢复记录足够多时,可以对损坏的压缩包进行恢复

常见压缩包破解方法

伪加密破解

一般指ZIP伪加密

加密手段分为:未加密、真加密和伪加密

未加密,即压缩源文件数据区的通用位标记0000压缩源文件目录区的通用位标记也为0000

image-20240923000331714

伪加密,即压缩源文件数据区的通用位标记为任意值,压缩源文件目录区的通用位标记09000100这种奇数

image-20240922235342789

真加密,即压缩源文件数据区的通用位标记0900压缩源文件目录区的通用位标记也为0900

image-20240923001101101

判断是否为伪加密,将压缩源文件目录区的通用位标记改为偶数即可,改完后能够解压文件并不需要密码就是伪加密。

或者将压缩包放在linux系统,伪加密是可以直接打开的。

暴力破解

通过枚举的方式将所有可能的情况都进行一遍尝试

工具内容较多,这里只演示其中一小部分

范围中可以指定每位的具体字符是什么

image-20240923004327752

长度中可以指定口令长度

image-20240923004410091

也可以指定自己的字典

image-20240923004420356

以及后面会遇到的明文恢复

image-20240923004452161

下面是一个恢复成功的例子

image-20240923004312436

字典破解

若题目中给我了一些对密码的提示,可以用自己建立的字典进行破解

这里用是superdic 生成字典

假设场景:密码长度为7,且前3位为abc(先生成再修改)

选择每一位需要的字符

image-20240923005349351

选择每一个密码前插入字符串

image-20240923005417618

选择保存路径和密码长度

这里应该选择4位,因为我们生成了4位,然后在这些的前面加上abc,而不是直接生成了abc一起的7位

image-20240923005519607

开始生成字典,会弹出生成的字典大小(太大不建议直接生成)

image-20240923005645268

image-20240923005718226

然后用该字典破解压缩包

image-20240923010020435

image-20240923010104947

掩码破解

知道了密码的其中几位,可以构造将某几位写上,其他几位以掩码的形式生成字典并进行破解

image-20240923125837381

明文攻击

若能得到压缩包中的一个被加密的文件,通过相同的压缩方式将压缩后的与有密码的压缩文件进行对比,找出两个文件的不同点,就能得到我们的key了。

或一直某单一文件的至少12字节的内容也可以进行明文攻击。

明文对应文件的加密算法必须是ZipCrypto Store或者是ZipCrypto Deflate算法

这里没有具体题目案例,我套用的网图作演示

在这里插入图片描述

在这里插入图片描述

拿到加密秘钥就可以破解了

CRC32碰撞

CRC32,即循环冗余检验,每一个CRC32都对应不同的内容,若是知道CRC32就可以反推枚举文件内容了,但如果文件内容过大,这种方法就失效了

image-20240923160947718

可以使用开源小工具CRC32-Tools (目前基本只支持1-4Bytes的文件)

image-20240923154832889

1
python CRC32-Tools.py -4 atta.zip

image-20240923160715580

也可以自己编写小脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import binascii
import itertools
import string

printable = string.printable
crc32 = 0x6526b899 #文件的crc32码
sign = 1
for i in itertools.product(printable, repeat=4): #生成4位数字典
s = "".join(i)
if crc32 == binascii.crc32(s.encode()):
print(s)
sign = 0
if sign == 0:
break
  • Title: misc-压缩包分析
  • Author: ZJ
  • Created at : 2024-09-23 00:00:00
  • Updated at : 2025-01-17 14:17:41
  • Link: https://blog.overlordzj.cn/2024/09/23/ctf/data/misc/压缩包分析/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments