CTF入门之隐写我的小秘密,你只能爆破密码

0 阅读9分钟

一、什么是MISC

MISC 是 Miscellaneous 的缩写,意思是“杂项”或“综合性内容”。在CTF(夺旗赛)中,MISC 类题目通常不属于 Web、Pwn、Reverse、Crypto 等传统技术分类,而是包罗万象、形式多变的一类挑战。这类题目可能涉及隐写术、网络流量分析、各种编码与解码技巧、多媒体文件(如图片、音频、视频)的处理、社会工程线索的挖掘、加密压缩包的破解、系统或应用日志的分析等等。简而言之,MISC 题目的核心在于“信息的隐藏与还原”,考验选手的综合知识面、细致观察力和灵活应变能力——你永远不知道下一题会是什么,但总得想办法把藏起来的信息找出来。

二、隐写术

(一)什么是隐写术

隐写术算是一种加密技术,是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。现在各大CTF比赛中都有关于图片隐写术相关的题目,通过将flag隐藏在图片中或者通过图片的其他方式隐藏起来,选手通过各种方式找出正确的flag并提交。

(二)哪些地方用隐写术

“隐写术”主要分为图片隐写、压缩包隐写以及多种文件格式(如mp3、pdf、html、doc)和数据包中的隐写技术。其中,图片隐写包括图种、隐藏数据、文件格式缺失、jpg/gif隐写及利用载体隐藏信息;压缩包隐写则涉及伪加密、明文攻击和暴力破解等手段。隐写术在不同媒介中隐藏信息具有多样性和复杂性,并广泛应用于CTF等信息安全竞赛中。

(三)binwalk工具

Binwalk是一个固件的分析工具,旨在协助研究人员对固件非分析,提取及逆向工程用处。简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模块。

1.安装工具

Linux:

在 Kali Linux 中,Binwalk 通常已预装;若未安装,可通过命令 sudo apt-get install binwalk 快速安装。

Windows:

(1)从官方 GitHub 仓库下载源码压缩包,解压到任意目录。随后将解压后 scripts 文件夹的完整路径添加到系统的环境变量 PATH 中。配置完成后,即可在命令提示符(CMD)中通过 python binwalk <目标文件> 的方式调用工具。

(2)进入解压目录下的 scripts 文件夹,找到名为 binwalk 的无扩展名文件,将其重命名为 binwalk.py。此后,也可直接在 CMD 中使用 python binwalk.py <目标文件> 来运行 Binwalk。

2.使用工具
(1)基本扫描

最简单的使用方式是直接指定目标文件路径:

$ binwalk test.file

该命令会自动扫描文件,识别其中嵌入的各类文件系统、压缩包、固件结构等,并显示其类型与偏移位置。

(2)结果过滤
  • 使用 -y 选项仅显示包含指定关键字的扫描结果:

    $ binwalk -y zip test.jpg
    

    上例将只显示与 “zip” 相关的条目(如 ZIP 归档)。

  • 使用 -x 选项排除包含指定关键字的结果:

    $ binwalk -x jffs2 firmware.bin
    

    此命令会跳过所有 JFFS2 文件系统的匹配项。

(3)自动化提取

使用 -e(或 --extract)选项可自动提取所有识别出的嵌入文件,并保存到 _firmware.bin.extracted/ 等子目录中:

$ binwalk -e firmware.bin
(4)手动精细提取

通过 --dd 选项可自定义提取规则,格式为:

<type>:<extension>[:<command>]

type:Binwalk 签名库中定义的小写类型标识(支持正则表达式);

extension:保存文件时使用的扩展名;

command(可选):提取后自动执行的 shell 命令,%e 代表提取出的文件路径。

示例:

$ binwalk --dd='zip archive:zip:unzip %e' firmware.bin

此命令会找到所有被识别为 “zip archive” 的数据块,以 .zip 为扩展名保存,自动调用 unzip 解压该文件。

(5)十六进制比对

使用 -W(或 --hexdump)选项可生成一个并排的十六进制转储视图,并以颜色高亮显示差异:

$ binwalk -W firmware1.bin firmware2.bin firmware3.bin

在输出结果中: 绿色:表示所有文件在该字节位置的值完全相同
红色:表示该字节在所有文件中均不相同
蓝色:表示该字节在部分文件中不同(即并非全部一致,也非全部不同)。

(四)隐写术演示

1.制作样本

  1. 准备一个需要隐藏的文件或文件夹,将其压缩成 1.zip

  2. 准备一张正常的 JPG 图片,命名为 2.jpg

  3. 在 Windows 命令行中执行以下命令:

    copy /b 2.jpg + 1.zip output.jpg
    

    此命令以二进制(/b)模式将 2.jpg1.zip 拼接,生成新的文件 output.jpg

  4. 由于 JPEG 格式在数据末尾有固定的结束标识符 FF D9,图像查看器读取到该标记后即停止解析,因此附加在后面的 ZIP 数据不会影响图片的正常显示,形成一张看似普通但内含隐藏数据的“图种”。

2.检测样本

  1. 使用 WinHex 等十六进制编辑器手动检查

    • 打开图片文件,定位到末尾。
    • 正常 JPG 应以 FF D9 结尾。若在此之后仍有大量非零数据,则可能附加了其他文件。
  2. 使用 binwalk 工具自动分析

    • 执行命令:

    • binwalk output.jpg
      
    • binwalk 会扫描整个文件,通过识别常见文件头(如 ZIP 的 PK..)判断是否存在嵌入内容,并显示其偏移位置。

3.提取样本

  1. 使用 WinHex 手动提取

    • 根据 binwalk 提供的偏移地址(或从 FF D9 后开始),选中后续数据并另存为新文件(如 hidden.zip)。
  2. 使用 dd 或 foremost 等工具自动提取

    • 例如:dd if=output.jpg bs=1 skip=<偏移量> of=extracted.zip
    • 即可还原出原始隐藏的压缩包。

(五)常见隐写方法

1.图片

JPG
JPHide 隐写算法原理

JPHide 是一种基于 JPEG 图像 DCT(离散余弦变换)系数最低有效位(LSB) 的隐写算法。与在空间域(如 BMP)直接修改像素值不同,JPHide 在 JPEG 压缩后的频域中嵌入信息,具有隐蔽性更强、鲁棒性较好、结合 Blowfish 加密等优势。

此外,JPEG 文件本身结构也常被用于简单隐写:文件以 FF D8 开头、FF D9 结尾,图像查看器通常只解析到 FF D9,其后附加的数据(如 ZIP、TXT)会被忽略,从而实现“图种”式隐藏——但这属于文件拼接隐写,与 JPHide 的算法级隐写不同。

使用 JPHS 工具进行隐藏

JPHS(JPHide and JPSeek)是 JPHide 算法的经典实现工具,操作流程如下:

  1. 下载 JPHS,加载一张正常的 JPEG 图片(如 cover.jpg);
  2. 点击 “Hide” 按钮;
  3. 在弹出的两个密码输入框中输入相同密码(例如 flag),用于 Blowfish 加密;
  4. 选择要隐藏的文件(如 t.txt);
  5. 点击 “Save jpeg as”,将生成的新图像保存为 h.jpg

此时,h.jpg 外观与原图无异,但已嵌入加密后的秘密信息。

检测与提取隐藏信息

(1)检测是否使用 JPHide

可使用 Stegdetect 工具初步判断图片是否被 JPHide、OutGuess、F5 等算法处理过:

stegdetect.exe -tjopi -s 10.0 hide.jpg
  • -tjopi:指定检测 JPHide (j)、OutGuess (o)、F5 (p)、Invisible Secrets (i) 等;
  • -s 10.0:设置敏感度(值越高越敏感,但可能误报)。

若输出包含 hide.jpg: jphide(***%),则表明极可能使用了 JPHide。

(2)暴力破解密码

当密码未知时,可使用 Stegbreak(Stegdetect 套件中的破解工具)进行字典攻击:

stegbreak.exe -r rules.ini -f password.txt -t p hide.jpg
  • -r rules.ini:指定规则文件(定义攻击模式);
  • -f password.txt:提供密码字典;
  • -t p:指定目标为 JPHide(p 对应 JPHide/JSteg)。

注意:确保 stegbreak.exehide.jpgpassword.txtrules.ini 在同一目录。

(3)提取隐藏信息(JPSeek)

若已知密码,使用 JPHS 的 “Seek” 功能:

  1. 打开 JPHS,加载含隐写的图片(如 h.jpg);
  2. 点击 “Seek”
  3. 输入正确密码(如 flag);
  4. 若验证成功,工具会自动提取原始隐藏文件,可另存为 extracted.txt
GIF
GIF 隐写原理与考察点

GIF是一种支持多帧动画的图像格式,其动态效果通过按顺序播放多张图像帧实现。每帧可设置独立的显示时长(帧间隔,单位为百分秒),通常用于控制动画速度。

在隐写术中,攻击者可利用帧间隔或特定帧内容隐藏信息:

  • 帧间隔隐写:将数据编码为帧延迟时间(如 0 表示比特 0,10 表示比特 1),由于人眼对极短时间(如 0~2 帘)的切换不敏感,这些帧几乎“一闪而过”,难以察觉;
  • 冗余帧隐写:插入肉眼不可见的纯色帧、透明帧或微小差异帧,携带隐藏信息;
  • 文件结构隐写:在 GIF 文件头、注释块、应用扩展块等非图像数据区域嵌入 payload。
分析与提取方法
(1)拆分 GIF 帧

使用在线工具 ezgif 或命令行工具(如 gifsicleffmpeg)将 GIF 拆分为单帧图像,便于逐帧检查:

# 使用 gifsicle 拆分
gifsicle -e animation.gif

观察是否存在:

  • 异常短暂的帧(延迟时间为 0 或 1);
  • 内容看似无意义但包含二进制图案(如黑白像素代表 0/1);
  • 帧末尾附加非图像数据。
(2)检查帧延迟时间

GIF 每帧包含 2 字节的延迟时间字段(单位:1/100 秒)。可通过十六进制编辑器(如 WinHex)或脚本解析该字段,将其转换为二进制或 ASCII 数据。

例如:

  • 延迟序列为 [0, 10, 0, 10, 10, 0] → 可能对应 010110 → 转换为字符;
  • 所有延迟均为 0 的帧可能被用作“隐藏通道”。
(3)查看文件结构

使用 binwalkxxd 检查 GIF 是否在 FF D9(JPEG 结束符,注意:GIF 无此标识)之后附加数据——但需注意:GIF 文件以 47 49 46 38(即 "GIF8")开头,无固定结束符,因此更常见的是在末尾直接追加 ZIP、TXT 等文件(类似图种),此时可用 binwalk 直接提取。

EXIF信息

EXIF(Exchangeable Image File Format,可交换图像文件格式) 是专为数码相机照片设计的一种元数据标准,用于记录照片的属性信息和拍摄参数,例如相机型号、光圈、快门速度、ISO、拍摄时间,甚至 GPS 位置等。EXIF 数据可嵌入在 JPEG、TIFF、RIFF 等图像文件格式中。

在 Linux 系统中,可使用 exiftool 工具直接查看图像中的 EXIF 信息。例如:

exiftool image.jpg

若在输出中发现类似 ZmxhZ3t0aDFzX0lzX2V4aWZfYmEkZTY0fQ== 的字符串,这通常是 Base64 编码的内容。可通过以下命令解码:

echo "ZmxhZ3t0aDFzX0lzX2V4aWZfYmEkZTY0fQ==" | base64 -d

解码结果为:flag{th1s_Is_exif_ba$e64},即隐藏的 flag 或关键信息。

Stegsolve-LSB隐写

LSB(Least Significant Bit,最低有效位)隐写是一种利用图像像素颜色值的最低二进制位隐藏信息的技术。在PNG等无损图像格式中,每个像素由RGB三个通道组成,每个通道占8位,取值范围为0x00~0xFF,共可表示16,777,216种颜色;而人眼仅能分辨约1000万种颜色,对单个通道最低位的微小变化(如128变为129)几乎无法察觉。因此,通过修改RGB各通道的LSB,可在不引起视觉差异的前提下,使每个像素携带3比特的秘密信息。

原理: 从多个像素的RGB通道中提取每个字节的最低位,按顺序组合成一个完整的二进制数据。例如8个像素的最低位(从上到下为01100001),拼接后得到二进制数01100001,对应十六进制0x61,ASCII码值为小写字母'a'(注意图中标注为'A'有误,应为'a')。这说明通过读取图像像素的LSB位,可以还原出隐藏的字符信息。

当两张外观、大小和像素都基本相同的JPG图片出现时,可以考虑通过结合分析来探索是否存在隐写信息。具体方法包括对两张图片的每个像素的RGB值执行XOR(异或)、ADD(加法)、SUB(减法)等操作,以此来检测是否有隐藏的信息被嵌入到图像中。stegsolve是一款非常适合进行这类分析的工具,它能够方便地对两个文件进行上述运算,并支持更细致的分析,例如通过Analyse -> Data Extract尝试提取最低有效位(LSB)。在进行这些操作时,有时需要考虑图片的顺序问题,即交换第一张和第二张图片的位置后再次进行XOR、ADD、SUB等操作,因为不同的组合可能会产生不同的结果或者揭示出隐藏的信息。这种技术对于发现双图隐写术中的秘密消息特别有用。

盲水印技术

当遇到两张外观几乎完全相同、尺寸和内容一致的图片时,可能存在盲水印隐藏信息。与 LSB 隐写不同,盲水印通常基于频域(如 DCT 或 DFT)嵌入水印,具有更强的鲁棒性,即使图像经过压缩、裁剪或轻微修改仍可恢复。

利用开源工具盲水印by python,可通过命令 :

python bwm.py decode 1.png 2.png flag.png

以原始图 1.png 和含水印图 2.png 为输入,提取出隐藏的水印信息(如 flag.png)。

该方法必须同时拥有原图和含水印图,属于“非盲”提取(尽管项目名为“盲水印”,但其 Python 实现实际依赖原图),常用于 CTF 隐写题中检测频域隐藏内容。

zsteg 简介

zsteg 是一款用于检测 PNG 和 BMP 图像中隐写数据的工具,支持 LSB 隐写、zlib 压缩数据、OpenStego、Camouflage 1.2.1 等多种隐写方式。

官方 GitHub 项目地址:zed-0xff/zsteg

安装方法

通过 RubyGems 安装(推荐):

gem install zsteg

从源码安装:

git clone https://github.com/zed-0xff/zsteg
cd zsteg/
gem install bundler
bundle install

国内用户若 gem 安装缓慢,可更换源:

gem sources --remove https://rubygems.org/
gem sources --add https://gems.ruby-china.com/
gem sources -l
常用命令

快速扫描图像中的 LSB 隐写信息:

zsteg aaa.png

显示详细分析结果(包括偏移、数据类型等):

zsteg aaa.png -v

尝试所有已知的隐写检测组合:

zsteg aaa.png -a

检测 zlib 压缩数据(例如嵌入的 ZIP 或 PDF):

zsteg zlib.bmp -b 1 -o xy -v

提取指定通道和顺序的隐藏数据并保存到文件:

zsteg -E "b1,bgr,lsb,xy" aaa.png > p.exe
注意事项
  • 仅支持无损格式 PNG 和 BMP,不适用于 JPEG

  • 若图像曾被有损压缩或格式转换,LSB 数据可能已损坏

2.音频

mp3

MP3 隐写主要分为两类技术路径,分别基于编码层隐写和音频信号层隐写:

基于 Mp3Stego 的编码层隐写

Mp3Stego 是一种利用 MP3 编码过程中的冗余信息进行数据隐藏的工具。其原理是在 MP3 压缩编码阶段嵌入秘密信息,这些信息对音频听感无影响,但可通过配套解码工具提取。

使用条件:

  • 必须已知嵌入时使用的密码(key)。
  • 需使用 Mp3Stego 提供的 decode 工具进行解密。

操作流程:

  1. 若题目或文件中隐含密码,记录该密码。

  2. 执行解码命令:

    decode -X target.mp3 -P <password>
    
  3. 成功解码后会生成一个 .txt 文件,内容可能为明文 flag,也可能经过进一步编码(如 Base6二十四、Base32 等),需继续解码处理。

基于音频信号的隐写

当未提供密码且仅有一个 MP3 文件时,隐写很可能发生在音频的时域(波形)或频域(频谱)中,不依赖 Mp3Stego 这类专用工具。

1. 波形隐写(时域隐写)

原理: 将二进制数据映射为音频波形的幅度变化。例如,高电平代表比特“1”,低电平代表“0”,形成可解析的数字信号。

分析方法:

  • 使用音频编辑软件(如 Audacity)导入 MP3 文件。
  • 切换到波形视图,观察是否存在规律性脉冲或方波结构。
  • 手动或脚本化读取高低电平序列,转换为二进制字符串。
  • 将二进制按 8 位分组转为 ASCII,或进一步识别为摩斯电码等编码格式。

特点: 音频开头或结尾常用于放置此类信号,听感上可能表现为“滴答”声或短促脉冲。

2. 频谱隐写(频域隐写)

原理: 将文本信息以图像形式绘制在音频的频谱图中。通过控制特定频率在特定时间的能量强度,形成可视字符。

分析方法:

  • 在 Audacity 中选择音频片段,点击 Plot Spectrum(或切换至频谱视图)。
  • 调整窗口大小、FFT 长度等参数以提高分辨率。
  • 若频谱中出现清晰字母、数字或图案,直接读取即可获得信息。

特点: 此类音频通常包含宽频噪声或高频啸叫,因需激发多频段能量,信息稳定性较好,轻微压缩不易完全破坏可视内容。

3. LSB(最低有效位)音频隐写

原理: 类似于图像 LSB 隐写,将秘密数据嵌入音频采样点的最低有效位。由于人耳对 LSB 变化不敏感,嵌入后听感几乎不变。

分析方法: 使用支持 LSB 音频隐写的工具进行提取。

特点: 适用于未压缩的 WAV 文件效果最佳;MP3 因有损压缩可能导致 LSB 数据丢失,若原始文件为 MP3,需确认是否由 WAV 转换而来且未经历多次压缩。

3.文档

PDF 隐写

技术原理:该方法利用 PDF 文件结构中的非显示区域(如文件头或未被标准解析器处理的部分)插入隐藏数据。Adobe Acrobat Reader 等主流阅读器会忽略这些额外信息,从而实现隐蔽性。

工具wbStego4open会将用户输入的数据嵌入到 PDF 文件中,且不改变其外观或可读性。

编码方式

  1. 将每个 ASCII 字符转换为二进制形式。
  2. 每一位二进制数字进行替换:
    • 0 → 十六进制 20
    • 1 → 十六进制 09
  3. 最终生成由 2009 组成的十六进制字节序列。
  4. 这些字节被嵌入到 PDF 文件中,通常位于文件头部或尾部等非关键区域。

特征识别:查看修改后的 PDF 文件的十六进制内容时,会发现大量重复出现的 2009 字节组合。

HTML隐写

技术原理

在纯文本文件的末尾通过控制空白字符的数量来隐藏信息。由于浏览器或文本编辑器对末尾空格的渲染不一致,这类数据在视觉上不可见。

具体机制

在文本文件最后添加若干个制表位(Tab)空格(Space)。利用“最多可添加7个空格”的限制(即一个 tab 可以等效于多个空格),形成一种编码方式。每 8 列可以嵌入 3 位数据(可能使用类似三进制或变长编码的方式)。

解密工具

  1. 命令行工具

下载地址:The SNOW Home Page

隐藏消息(加密 + 压缩):

snow -C -m "Secret Message" -p "mypassword" input.html output.html

提取消息:

snow -C -p "mypassword" output.html

参数说明:

  • -C:启用压缩(提高效率,减少空白字符数量)
  • -m:直接指定要隐藏的字符串
  • -p:设置密码(AES-like 加密)
  • -l 72:限制每行长度(避免邮件客户端自动换行破坏结构)
  1. 在线网页版

Snow Web Page Encryption/Decryption

注意:

  • URL 必须是直链(不能有重定向,如 301/302
  • 加密后需手动保存为 “HTML only” 格式(不能选“完整网页”)
  • 解密时需提供相同密码和原始 URL(或上传 HTML 文件)

检测方法

  1. 打开文本文件,检查其末尾是否有异常数量的空格或 Tab。
  2. 使用文本编辑器(如 Notepad++、Sublime Text)开启“显示所有字符”功能,查看不可见字符。
  3. 记录每个位置的空格/Tab 数量,按规则映射为二进制或三进制值。
  4. 使用在线工具或脚本自动解析。

(六)常见处理文件工具

  1. file 通过文件头识别文件真实类型,若显示异常(如 “data”)可能表示文件头损坏。
    示例

    file suspicious_file
    
  2. strings
    从二进制文件中提取可打印字符串,常用于查找隐藏文本或 flag。
    示例

    strings noexif | grep "flag"
    ```bash
    
  3. foremost 基于文件头/尾特征恢复或分离嵌入的文件,适合处理 binwalk 失败的情况。
    示例

    foremost zip -o output_dir
    
  4. stegdetect 专用于检测 JPEG 图像是否使用 JSteg、F5、OutGuess 等工具嵌入隐写信息。
    示例

    stegdetect image.jpg
    
  5. steghide 支持在图像/音频中提取 LSB 或加密隐藏数据,需密码时会提示输入。
    示例

    steghide info pic.jpg` 
    steghide extract -sf pic.jpg
    
  6. SilentEye
    图形化工具,可将文本或文件隐写/提取到 WAV 音频中(常用于简单音频隐写题)。

三、加密技术

(一)伪加密

ZIP 伪加密 是一种“欺骗性”的加密手段,它不真正对文件内容进行加密,而是通过修改 ZIP 文件头中的某些标志位,让解压软件误以为该 ZIP 文件是加密的,从而提示用户输入密码。

一个标准的 ZIP 文件由三部分组成:

部分说明
压缩数据区(文件头 + 数据)每个压缩文件的实际数据块
中央目录区包含所有文件的元信息
中央目录结束标志标记整个 ZIP 结构的结尾

在 ZIP 文件中,General Purpose Bit Flag 是一个 2 字节的字段(通常位于 Local File HeaderCentral Directory Entry 的第 8~9 字节),决定文件是否被加密或使用其他特性。

含义
Bit 0是否使用了“加密”(Encryption)
Bit 1是否使用了“压缩校验和”(Strong Encryption)

实现方法

1. 定位关键位置

在 ZIP 文件的中央目录条目中:

  • 找到 General Purpose Bit Flag 字段(偏移量通常是 0x0E,即第 14 字节)
  • 默认值为 00 00(表示未加密)
  • 修改为 09 00(即:0x09 = 二进制 00001001
2. 实际操作
原始: 00 00   → 未加密
修改: 09 00   → 伪造加密标志

此时,ZIP 解压工具看到这个标志后,会认为文件已被加密,提示“需要密码”。但实际上,文件内容并未加密!只是“骗过”了解压程序。

修复伪加密

  1. 使用 HxD、010 Editor 或 WinHex 打开 ZIP 文件查看
  2. 定位到:
    • Local File Header: 从 50 4B 03 04 开始
    • Central Directory: 从 50 4B 01 02 开始
  3. 在这两个地方查找 General Purpose Bit Flag 字段(偏移 0x0E)
  4. 若值为 09 00 或类似非零值,则可能是伪加密,将其中的 09 00 改回 00 00即可。

(二)CRC32碰撞

CRC32碰撞是指两个不同的输入数据经过CRC32算法计算后,得到相同的32位校验值(即哈希值相同)。由于CRC32的输出空间固定为2³²(约42.9亿)个可能值,而输入数据的可能组合远大于此,根据鸽巢原理,必然存在多个不同输入产生相同输出的情况。CRC32并非设计用于密码学或唯一标识,而是用于检测数据传输或存储中的偶然错误(如突发位错误),因此不具有抗碰撞性。在CTF或ZIP破解场景中,若加密文件很小(如4字节)且已知其CRC32值,可通过暴力枚举所有可能内容,找到与该CRC32匹配的明文,从而实现“碰撞还原”。尽管CRC32碰撞在理论上概率较低(对随机数据约为1/2³²),但在小数据空间(如固定长度短字符串)中,穷举是可行的,实际碰撞极易发生。因此,CRC32不能用于需要唯一性或安全性的场合(如数字签名、主键生成),应改用更安全的哈希算法(如SHA-256)。

使用方法

  1. 确定目标CRC32值,获取待恢复文件的CRC32校验值。

  2. 确认原始文件长度和可能的内容类型,以缩小搜索空间。

  3. 根据上下文设定合理的字符范围。

  4. 使用程序对指定长度的所有可能组合进行遍历(暴力枚举)。

  5. 对每个候选明文调用CRC32算法,将结果与目标值比较。

    注意需对结果执行& 0xFFFFFFFF以确保为无符号32位整数。

  6. 一旦发现计算出的CRC32等于目标值,即找到一个碰撞明文,该明文极可能就是原始文件内容。

(三)明文攻击

明文攻击是一种在已知 ZIP 压缩包中部分文件明文内容的情况下,通过对比明文与密文之间的压缩和加密关系,恢复出加密密钥或解密其他文件的攻击方法。

ZIP 文件使用 PKZIP 流加密(传统加密方式) 时,其加密是在压缩后的数据上进行的。如果攻击者拥有:

  1. 加密 ZIP 中某个文件的明文版本
  2. 并且能用相同的压缩参数重新压缩该明文,生成与原 ZIP 中完全相同的压缩流

那么就可以利用工具进行明文攻击,恢复内部密钥,进而解密整个 ZIP 包。

攻击方法

  1. 打开zip文件,查看其中包含的文件并记录该文件的:原始大小、压缩后大小、CRC32 校验值。

  2. 获取你本地的完全相同的未压缩的文件,并用 相同压缩工具和参数将其压缩成 ZIP。

  3. 对比你压缩的 hash.exe 与原 ZIP 中的条目的压缩后大小和CRC32 ,如果两者 完全一致,说明可进行攻击。

  4. 使用工具进行明文攻击

(1)使用 AZPR

(2)使用bkcrack

# 1. 提取加密 ZIP 中 hash.exe 的压缩数据(即使加密也能提取密文流)
#    使用 bkcrack 自带的 extract 工具或直接指定偏移
# 2. 准备明文压缩版本(plain.zip 中的 hash.exe 必须未加密且压缩方式一致)
# 3. 运行攻击:
./bkcrack -C encrypted.zip -c hash.exe -P plain.zip -p hash.exe
# 4. 若成功,会输出 internal state (三个 32-bit keys)
# 5. 用该密钥解密整个 ZIP:
./bkcrack -C encrypted.zip -k <key1> <key2> <key3> -d decrypted.zip

(四)密码爆破

1. fcrackzip

适用于传统 PKZIP 加密(ZipCrypto),不支持 AES。

爆破 8 位纯数字密码

fcrackzip -u -c d -l 8 encrypted.zip

参数说明:

  • -u:尝试解压验证密码正确性

  • -c d:字符集为数字(0–9)

  • -l 8:密码长度为 8

  • -p:指定起始密码

  • -v:显示详细过程

2. John the Ripper + zip2john

先提取 ZIP 的哈希,再用 John 爆破,支持更灵活的规则和掩码。

  1. 提取 ZIP 哈希

    zip2john encrypted.zip > zip.hash
    
  2. 使用字典爆破

    john --wordlist=/usr/share/wordlists/rockyou.txt zip.hash
    

    使用掩码爆破 8 位纯数字(需配合 --mask

    john --mask=?d?d?d?d?d?d?d?d zip.hash
    
  3. 查看结果

    john --show zip.hash
    

3. hashcat

  1. 提取哈希并转换为 hashcat 格式

    zip2john encrypted.zip | tail -n +2 > zip.hash
    # 或手动提取类似 $zip2$...$ 的行
    
  2. 使用 hashcat 爆破 8 位数字

    hashcat -m 13600 zip.hash ?d?d?d?d?d?d?d?d
    

参数说明:

  • -m 13600:指定 ZIP PKZIP 加密的 hash 类型
  • ?d?d?d?d?d?d?d?d:8 位数字掩码

密码字典

Crunch

Linux下的字典生成工具Crunch,创造自己的专属字典 - FreeBuf网络安全行业门户

Pydictor

github.com/LandGrey/py…

github.com/LandGrey/py…

用法示例: | pydictor

Cewl

Kali Linux字典生成工具Cewl使用全指南 - FreeBuf网络安全行业门户

压缩包注释中也可以隐藏信息,但是可能你会看不到,可以复制到编辑器中,然后鼠标选中。