第 97 章 隐写术与媒体取证(Steganography)
隐写术(Steganography)= 把秘密藏在"看起来正常"的载体里(图片/音频/视频/文档)。这是 CTF 取证大类(misc/forensics)的核心,也是恶意软件数据隐藏的手法。本章覆盖隐写分类、取证方法、工具链与完整流程。核心原则:先理解容器结构,再找隐藏通道,最后提取还原——不要盲目暴力。
📍 知识点地图 | 主题:隐写术 | 前置:第9章 | 后续:— | 核心概念:LSB、附加数据、频谱图、Polyglot、binwalk
97.1 隐写分类学(先懂藏哪了)
按载体:
图片: LSB/调色板/EXIF/附加数据/像素差异
音频: 频谱图/低比特位/回声隐藏
视频: 帧间差异/隐藏轨道
文档: 隐藏文本/宏/对象流/元数据
容器: 附加压缩包/文件拼接/多格式(polyglot)
按原理:
替换型: 用秘密位替换载体冗余位(LSB)
附加型: 秘密拼在文件尾(最常见!)
转换型: 变换域(DCT 系数/频域)
生成型: 载体本身就是从秘密生成的
元数据类型: EXIF/注释/时间戳
97.2 取证流程(四步方法论)
Step 1: 容器真相(Container Truth)—— 先搞清楚文件"真实结构"
□ 头部/块表/EXIF/元数据/缩略图/文件大小异常
□ 声明格式 vs 实际结构(polyglot/附加尾部/畸形尾)
□ 记录关键偏移/帧号/通道边界
Step 2: 候选通道检查(Inspect Candidate Channels)
□ Alpha/调色板顺序/RGB-YUV 平面/LSB/频谱图特征
□ 文档对象流/视频帧差异
□ 按证据驱动尝试(不盲目暴力所有变换)
Step 3: 载荷路径重建(Reconstruct Payload Path)
容器 → 通道/载体 → 提取 → 解压/解码 → 最终解析
分离"提取成功"与"最终解读"(通道命中 ≠ 拿到数据)
Step 4: 验证与打包证据
最终载荷 + 使用的通道 + 每步命令
(如果提取后主要是密码学问题 → 转第 9/34 章)
97.3 图片隐写(最常见的载体)
LSB(最低有效位)
原理: 像素的 R/G/B 最低位替换为秘密位(肉眼不可见)
检测: 文件大小异常(每 8 像素藏 1 字节)/ 颜色分布异常
提取: 按位序提取 → 拼字节 → 还原文件
工具: zsteg(综合)/ LSB-Stegano / Stegsolve(逐位查看)
zsteg image.png # 自动尝试常见 LSB 变体
附加数据(最常被忽略)
原理: 秘密直接拼在文件尾(JPEG 的 EOI 后 / PNG 的 IEND 后)
检测: 文件尾部有未知数据 / 大小异常
提取: binwalk / 手动 dd 截取
binwalk image.png # 发现尾部嵌入的 ZIP/数据
dd if=image.png bs=1 skip=<偏移> of=hidden.bin
调色板与元数据
调色板顺序: GIF 调色板重排藏数据(Stegsolve 看)
EXIF: 注释/缩略图/厂商字段(exiftool -a)
PNG IDAT: 像素数据的压缩流(深度分析)
97.4 音频隐写
频谱图(最常考):
频谱里直接画出文字/图像
工具: Audacity → 频谱图视图(Spectrogram)
LSB 音频: 低比特替换(steghide / DeepSound)
回声隐藏: 回声延迟编码(少见)
相位编码: 相位修改(罕见)
检查清单:
□ 频谱图(第一优先!)
□ 波形异常(幅度/周期)
□ 尾部附加数据(binwalk)
□ 元数据(ID3 标签)
97.5 视频与文档隐写
视频:
帧间差异(隐藏帧/慢速闪帧)
隐藏音轨/字幕轨
时间戳/元数据
工具: ffmpeg 抽帧 / 逐帧对比
文档(PDF/Office):
隐藏文本(白字/零宽字符)
对象流(PDF 压缩对象)
宏/嵌入对象
文档元数据(作者/公司/时间)
工具: pdf-parser / oletools / 文本提取对比
97.6 容器与多格式(Polyglot)
Polyglot = 一个文件同时是多种格式(JPEG+ZIP 等)
头是图片,尾是压缩包(binwalk 直接发现)
用于: 绕过文件类型过滤(上传漏洞配合)
检测: binwalk 全扫 / file 与实际结构对比
提取: binwalk -e(自动提取所有内嵌)
97.7 隐写工具链
| 工具 | 用途 |
|---|---|
| binwalk | 附加数据/内嵌文件发现(第一优先) |
| exiftool | 元数据全量提取 |
| zsteg | PNG/BMP LSB 综合 |
| Stegsolve | 图片逐位通道分析 |
| steghide | 音频/图片隐藏与提取 |
| Audacity | 频谱图/波形分析 |
| ffmpeg | 视频抽帧 |
| oletools | Office 文档分析 |
| pdf-parser | PDF 对象流 |
| strings | 永远先跑(隐藏的明文) |
| CyberChef | 提取后的解码链 |
97.8 完整取证流程(端到端)
1. file + strings + binwalk(三连扫,最省力)
2. exiftool 元数据
3. 按类型深入:
图片 → Stegsolve 通道 + zsteg
音频 → 频谱图 + steghide
视频 → 抽帧对比
文档 → oletools/pdf-parser
4. 提取出数据后:
解压(binwalk -e)/ 解码(CyberChef)
若加密 → 转密码学章节
5. 验证: 最终载荷完整/可读
97.9 检查清单
□ file 类型确认
□ strings 明文扫描
□ binwalk 附加数据/内嵌
□ exiftool 元数据
□ 图片: LSB/调色板/通道
□ 音频: 频谱图/波形
□ 视频: 帧差异/轨道
□ 文档: 对象流/宏/隐藏文本
□ Polyglot 检测
□ 提取 → 解压/解码 → 最终载荷
□ 记录: 每步命令 + 通道 + 载荷
动手练习
- 用 steghide 或 LSB 工具自己藏一段文本进图片,再按流程提取(体验藏与取的对称性)。
- 在 Audacity 里生成一个含文字频谱的音频(Spectrogram 上写字),练习识别。
- 用 binwalk 分析一个"图片尾接 ZIP"的 polyglot,完整提取内嵌文件。
- 分析一张图片的 EXIF(exiftool -a),找出所有元数据字段。
深入阅读
- 仓库:
CTF-Sandbox-Orchestrator/competition-stego-media/(隐写 CTF 子技能) - 仓库:
CTF-Sandbox-Orchestrator/competition-stego-media/references/stego-media.md(隐写检查清单) - 仓库:
CTF-Sandbox-Orchestrator/competition-crypto-mobile/(提取后密码学衔接) - 仓库:
skills/reverse-engineering/crypto-decode-tools.md(解码链)