CTF 中对压缩包的处理

伪加密修复

工具

010 Editor

修复步骤

50 4B 03 04 14 0050 4B 01 02 1F 00 后面的这两个字节改为 00 00

  • 修复前:

伪加密修复1

  • 修复后:

伪加密修复2


CRC32 碰撞

工具

theonlypwner/crc32

攻击条件

被加密的文本文档很小(通常 4kb)

爆破多个压缩包中的 4 字节文件

攻击步骤

这里调用了 theonlypwner/crc32,要把下面的脚本放到同一个目录中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import zipfile
import string
from crc32 import CRC32Reverse

def crack_zip(file_path, file_name, charset):
charset_bytes = set(charset.encode('latin-1'))

with zipfile.ZipFile(file_path, 'r') as zip_file:
info = zip_file.getinfo(file_name)
target_crc = info.CRC

crc32_reverse = CRC32Reverse(0xEDB88320)

for patch in crc32_reverse.find_reverse(target_crc, 0):
if all(b in charset_bytes for b in patch):
candidate = patch.decode('latin-1')
return candidate
return "未找到匹配的CRC组合"

def main():
file_path = "E:/Desktop"
file_name = "data.txt"
charset = string.ascii_letters + string.digits + '+/='

result = []

# 这里要修改文件名和循环次数
for i in range(0, 68):
result.append(crack_zip(f"{file_path}/out{i}.zip", file_name, charset))

print(''.join(result))

if __name__ == "__main__":
main()

爆破单个文件

攻击步骤

先获取到该文件的 CRC 码

然后将 CRC 码带入到下面的命令中运行

1
python crc32.py reverse [CRC]

运行得到以下输出(此处以 python crc32.py reverse 0x75F90D3A 为例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
4 bytes: z5Bz {0x7a, 0x35, 0x42, 0x7a}
verification checksum: 0x75f90d3a (OK)
6 bytes: 2BHS9N (OK)
6 bytes: 4zPLa0 (OK)
6 bytes: 7gJsJx (OK)
6 bytes: 9hUCvv (OK)
6 bytes: Gzefs4 (OK)
6 bytes: MqgWNY (OK)
6 bytes: QoY76E (OK)
6 bytes: RORDuU (OK)
6 bytes: VKOEt6 (OK)
6 bytes: XDPuH8 (OK)
6 bytes: bmE3S_ (OK)
6 bytes: guV_H1 (OK)
6 bytes: j6113k (OK)
6 bytes: jgSP_w (OK)
6 bytes: zV8BCl (OK)

明文攻击

工具

ARCHPR

kimci86/bkcrack

已知完整的明文文件

攻击条件

有一个加密的压缩包以及一个压缩包内存在的文件 (可以通过 CRC 码判断,相同就是同一个文件)

明文攻击1

攻击步骤

1. 构造压缩包并处理加密压缩包

先将该已知的文件 logo.png 使用相同的方式压缩

明文攻击2

然后被攻击包内仅保留一个已知的文件,其他文件都删除

2. 明文攻击获取解压密码

在 ARCHPR 打开处理过的加密压缩包 flag.zip,攻击类型选择明文,明文文件选择刚刚构造好的压缩包 logo.zip

明文攻击3

如果试了几次都是未找到,那很有可能是压缩软件出了问题

明文攻击4

换一个软件压缩 logo.png,然后重复上述操作

明文攻击5

这一次就顺利恢复了,这个加密压缩包的密码就是 q1w2e3r4

明文攻击6

已知少部分明文字节

攻击条件

  1. 已知 12 个字节及偏移
    • 需获取加密文件中 12 字节的明文数据及偏移,其中至少 8 字节需要连续(如文件头、固定格式标识符)。
  2. 加密算法为 ZipCrypto
    • 仅支持传统 ZIP 加密(ZipCrypto),不支持 AES 加密。
    • 需确认加密方式为 ZipCrypto DeflateZipCrypto Store

攻击步骤(以 PNG 为例)

1. 构造构造文件头

1
python -c "import binascii; open('png_header', 'wb').write(binascii.unhexlify('89504E470D0A1A0A0000000D49484452'))"

2. 提取密文数据

使用 bkcrack 从加密 ZIP 中提取目标文件的密文数据:

1
bkcrack -C encrypted.zip -c target_file.png -p png_header -o 0
  • -C:指定加密的 ZIP 文件。
  • -c:指定 ZIP 中被加密的目标文件(如 target_file.png)。

运行得到以下输出:

1
2
3
4
5
6
7
8
9
10
bkcrack 1.7.1 - 2024-12-21
[14:19:35] Z reduction using 9 bytes of known plaintext
100.0 % (9 / 9)
[14:19:35] Attack on 704864 Z values at index 6
Keys: 97d30dcc 173b15a8 6e0e7455
34.5 % (242933 / 704864)
Found a solution. Stopping.
You may resume the attack with the option: --continue-attack 242933
[14:21:15] Keys
97d30dcc 173b15a8 6e0e7455

得到三个密钥:97d30dcc 173b15a8 6e0e7455

3. 使用密钥解密文件

通过恢复的密钥解密目标文件:

1
bkcrack -C encrypted.zip -c target_file.png -k 97d30dcc 173b15a8 6e0e7455 -d decrypted_data
  • -k:输入恢复的密钥(顺序为 key0 key1 key2)。
  • -d:指定解密后的输出文件名(如 decrypted_data)。

运行得到以下输出:

1
2
3
bkcrack 1.7.1 - 2024-12-21
[14:22:30] Writing deciphered data decrypted_data
Wrote deciphered data (not compressed).

此时你的根目录下将会出现一个经过解密得到的文件 decrypted_data

4. 处理解密后的数据

根据加密时的压缩方式,可能需要进一步处理解密后的数据:

  • 场景 1:文件以 Store 模式加密(未压缩)
    解密后的数据即原始文件,直接重命名即可。

  • 场景 2:文件以 Deflate 模式加密(需解压)

​ 解密后的数据需要进一步解压,使用 tools 文件夹提供 Python 解压脚本:

1
python tools/inflate.py < decrypted_data > output.png

掩码攻击

工具

ARCHPR

攻击条件

已知压缩包密码的长度,还知道密码的其中一部分

攻击步骤

攻击类型选择掩码,左边选择好范围,在右边输入掩码

掩码攻击

比如说已知压缩包的密码是以 1391040 开头的手机号,那么掩码就可以填 1391040????,这里的 ? 可以理解为一个占位符


字典爆破

工具

shadowabi/S-BlastingDictionary: 自己搜集的爆破字典,包括常用用户名、密码弱口令、SQL 万能密码等

zxcvbn001/password_brute_dictionary: 口令爆破字典,有键盘组合字典、拼音字典、字母与数字混合这三种类型

insightglacier/Dictionary-Of-Pentesting: Dictionary collection project such as Pentesing, Fuzzing, Bruteforce and BugBounty. 渗透测试、SRC 漏洞挖掘、爆破、Fuzzing 等字典收集项目。

rootphantomer/Blasting_dictionary: 爆破字典