ZIP伪加密
zip 伪加密是在文件头的加密标志位做修改,进而再打开文件时识被别为加密压缩包 一个 ZIP 文件由三个部分组成: 压缩源文件数据区 + 压缩源文件目录区 + 压缩源文件目录结束标志。
压缩源文件数据区
主要记录了压缩前后文件的元数据以及存放压缩后的文件,记录格式如下:
第0~3个字节:50 4B 03 04,代表了文件头标志
第4~5个字节:14 00,代表了解压文件所需的pkware版本
第6~7个字节:00 00,代表了全局方式位标记(用来判断有没有加密)
第8~9个字节:08 00,代表了压缩方式
第10~11个字节:1D 9B,代表了最后修改文件的时间
第12~13个字节:3D 56,代表了最后修改文件的日期
第14~17个字节:5A 48 63 5C,是zip文件的crc-32校验值
第18~21个字节:77 00 00 00,是文件压缩后的尺寸
第22~25个字节:B1 00 00 00,是文件未压缩前的尺寸
第26~27个字节:10 00,代表文件名长度
第28~29个字节:00 00,代表扩展记录长度
压缩源文件目录区
压缩源文件目录区是由一系列压缩源文件目录记录所组成,一条压缩文件目录记录对应数据区中的一个压缩文件记录,压缩源文件目录记录由以下部分构成:
第0~3个字节:50 4B 01 02,代表了目录文件头标记
第4~5个字节:02 3F,代表了压缩使用的pkware版本
第6~7个字节:14 00,代表了解压文件所需的pkware版本
第8~9个字节:00 00,代表了全局方式位标记(用来判断是否为伪加密)
第10~11个字节:08 00,代表了压缩方式
第12~13个字节:1D 9B,代表了最后修改文件的时间
第14~15个字节:3D 56,代表了最后修改文件的日期
第16~19个字节:5A 48 63 5C,是zip文件的crc-32校验值
第16~19个字节:77 00 00 00,是文件压缩后的大小
第24~27个字节:B1 00 00 00,是文件未压缩前的大小
第28~29个字节:10 00,代表文件名长度
第30~31个字节:00 00,代表扩展字段长度
第32~33个字节:00 00,代表文件注释长度
判断加密方式
通常全局方式位标记为 2 bytes 长度,第一字节数字为偶数表示无加密,为奇数表示有加密。
无加密的 zip 压缩包压缩源文件数据区的全局加密应当为偶数,且压缩源文件目录区的全局方式位标记也为偶数。
真加密的 zip 压缩包压缩源文件数据区的全局加密应当为奇数,且压缩源文件目录区的全局方式位标记也为奇数。
伪加密的 zip 压缩包压缩源文件数据区的全局加密应当为偶数,且压缩源文件目录区的全局方式位标记为奇数。
暴力破解
ARCHPR 下载地址:https://advanced-archive-password-recovery.software.informer.com/download/#downloading
CRC碰撞
每个文件都有唯一的CRC32值,即使文件中有个一个bit发生了变化,CRC32值也会不同。
CRC32爆破就是知道文件中一段数据的长度和文件的CRC32值,通过脚本程序,利用穷举法,与其CRC32对照,从而达到猜解数据的目的(通常只适用于较小的文本文件,文件太大穷举难度太大)。
爆破脚本:
import string
import binascii
import zipfile
# 枚举4字节字符串并匹配CRC32值
def crack_crc(crc):
for i in dic:
for j in dic:
for p in dic:
for q in dic:
s = i + j + p + q # 枚举所有可能的4字节字符串
s = s.encode() # 转换为字节串
if crc == (binascii.crc32(s) & 0xffffffff): # 匹配CRC32值
return s
# 获取ZIP文件中指定文件的内容
def crack_zip(file_name):
with zipfile.ZipFile('path_to_your_zip_file.zip', 'r') as f: # 替换为你的ZIP文件路径
file_info = f.getinfo(file_name)
crc = file_info.CRC # 获取文件的CRC32值
return crack_crc(crc)
# 可打印字符集
dic = string.printable
# 爆破ZIP文件中的所有文件
with zipfile.ZipFile('path_to_your_zip_file.zip', 'r') as zip_file: # 替换为你的ZIP文件路径
file_list = zip_file.namelist() # 获取所有文件名
flag = b""
for file_name in file_list:
flag += crack_zip(file_name)
print(flag.decode()) # 输出破解结果明文攻击
有zip中的一个已知文件(文件大小要大于12Byte)时,因为同一个zip压缩包里的所有文件都是使用同一个加密密钥来加密的,所以可以用已知文件来找加密密钥,利用密钥来解锁其他加密文件。明文对应文件的加密算法需要是ZipCrypto Store。
bkcrack明文攻击
只知道加密文件的一部分字节数据(至少12个字节及偏移),这时候如果满足加密算法(ZipCrypto Store)条件,就可以使用bkcrack进行明文攻击。
下载地址:https://github.com/kimci86/bkcrack
RAR伪加密
文件结构分析
RAR不同于ZIP,RAR是一种专利文件格式
2.0 版本前加密算法未公开,2.0 版本后使用AES算法加密
RAR 5.0签名和RAR4.x的签名不一样:
RAR 5.0 签名由8个字节组成:0x52 0x61 0x72 0x21 0x1A 0x07 0x01 0x00
RAR 4.x 签名由7字节组成:0x52 0x61 0x72 0x21 0x1A 0x07 0x00
因为rar是商业格式,所以不同软件不同版本所压缩出来的可能会有细微差别,可以参考010中的rar模板
标记块(MARK_HEAD)
| 字段名称 | 长度(byte) | 说明 |
|---|---|---|
| HEAD_CRC | 2 | 总是0x6152 |
| HEAD_TYPE | 1 | 0x72 |
| HEAD_FLAGS | 2 | 总是0x1A21 |
| HEAD_SIZE | 2 | 块大小 = 0x0007,即7个字节 |
所以这里标记块的大小固定是7个字节,且是一个固定的字节序列。标记块也称为Magic number。
压缩文件头(MAIN_HEAD)
| 字段名称 | 长度(byte) | 说明 |
|---|---|---|
| HEAD_CRC | 2 | HEAD_TYPE到RESERVED2的CRC |
| HEAD_TYPE | 1 | 0x73 |
| HEAD_FLAGS | 2 | 位标记 |
| HEAD_SIZE | 2 | 压缩文件头总大小(包括压缩文件注释) |
| RESERVED1 | 2 | 保留 |
| RESERVED2 | 4 | 保留 |
对于压缩文件头里的位标记,如果它的第9位(从左到右)被置1(则位标记应为0x0080),块头被加密,也就是通常所说的加密文件名,打开这样加密的RAR文件时,需要先输入密码才能看到压缩包内的文件列表
文件头(FILE_HEAD)
| 字段名称 | 长度(byte) | 说明 |
|---|---|---|
| HEAD_CRC | 2 | 从HEAD_TYPE到FILE_NAME的CRC |
| HEAD_TYPE | 1 | 0x74 |
| HEAD_FLAGS | 2 | 位标记 |
| HEAD_SIZE | 2 | 文件头的全部大小(包含文件名和注释) |
| PACK_SIZE | 4 | 已压缩文件大小 |
| UNP_SIZE | 4 | 未压缩文件大小 |
| HOST_OS | 1 | 保存压缩文件使用的操作系统 |
| FILE_CRC | 4 | 文件CRC |
| FTIME | 4 | MS DOS标准格式的日期和时间 |
| UNP_VER | 1 | 解压文件所需要最低RAR版本,版本编码方法:10 * 主版本 + 副版本。 |
| METHOD | 1 | 压缩方式 |
| NAME_SIZE | 2 | 文件名大小 |
| ATTR | 4 | 文件属性 |
| HIGH_PACK_SIZE | 4 | 可选值,已压缩文件大小64位值的高4字节。只HEAD_FLAGS中的0x100位被设置才存在。 |
| HIGH_UNP_SIZE | 4 | 可选值,未压缩文件大小64位值的高4字节。只有HEAD_FLAGS中的0x100位被设置才存在。 |
| FILE_NAME | NAME_SIZE | 文件名 - NAME_SIZE字节大小字符串 |
| SALT | 8 | 可选值,如果(HEAD_FLAGS & 0x400)!= 0,则存在 |
| EXT_TIME | 可变大小 | 可选值,扩展时间区域,如果(HEAD_FLAGS & 0x1000)!= 0,则存在 |
在这个块中,存在两个CRC值,一个是文件头块中从块类型到文件名的校验,后一个则是压缩包中所含文件的CRC校验,解压时,会计算解压后生成文件的CRC值,如果等于这里的CRC,则解压完成,如果不同,则报错中断。
结尾块(ENDARC_HEAD)
| 字段名称 | 长度(byte) | 说明 |
|---|---|---|
| HEAD_CRC | 2 | 从HEAD_TYPE 到HEAD_SIZE 的CRC校验值 |
| HEAD_TYPE | 1 | 0x7B |
| HEAD_FLAGS | 2 | 位标记 |
| HEAD_SIZE | 2 | 结尾块大小 |
与标记块类似的是,结尾块也是一个固定字节串的块,依次是C4 3D 7B 00 40 07 00
伪加密
rar在伪加密状态下会显示压缩包已损坏或压缩格式未知,所以很容易判断rar是否是伪加密
修改FILE_HEAD中的HEAD_FLAGS即可
RAR暴力破解
各类jogn下载地址:https://www.openwall.com/john/
rar2john先提取hash
$rar5$16$6385fa42c4d3cb1318e1ea71c1dcbfa3$15$cc4e558d99f6c846eb0fc54073e2293c$8$03d8cf03ed478602
hashcat爆破密码
hashcat -m 13000 -a 3 $rar5$16$6385fa42c4d3cb1318e1ea71c1dcbfa3$15$cc4e558d99f6c846eb0fc54073e2293c$8$03d8cf03ed478602 ?u?u?u?u?u?u
7z2hashcat
7z2hashcat 是一个专门用于从 7-Zip 存档中提取哈希值以供 hashcat 使用的工具。 GitHub地址:https://github.com/philsmd/7z2hashcat
主要功能
-
从 7z 存档中提取加密哈希
-
将提取的哈希格式化为 hashcat 可识别的格式
-
支持 AES-256 加密的 7z 文件
用法
perl 7z2hashcat file.7z