3.3 KiB
3.3 KiB
隐写检测决策树与证据分级
隐写检测先按载体定方法,提取失败按顺序枚举。本文档与 SKILL.md 步骤 1-4 配套使用。
载体 × 特征决策树
怀疑对象
├─ 文件尾部异常(大小不整/尾随数据)→ 尾部附加检查(binwalk/hexdump)
├─ 图片(PNG/BMP)→ LSB 位平面扫描(zsteg/脚本/stegsolve)
├─ 图片(JPEG)→ DCT 域方法(outguess 类),不做 LSB(有损压缩已破坏位平面)
├─ 音频 → 频谱图目检(sox spectrogram)+ steghide 尝试
├─ EXIF/元数据 → exiftool 查看异常字段
├─ 压缩包未用空间 → 解包后对比原始大小/CRC 检查
└─ 无特征 → 不进入隐写流程(先 [[re-triage]] 确认文件类型与可疑点)
工具选择分支
确认载体后
├─ PNG/BMP + 怀疑 LSB → zsteg 全通道 → 指定平面提取(-E 语法)
├─ 任何载体 + 怀疑常规隐写 → steghide extract(需要密码则标注)
├─ 尾部/附加数据 → binwalk 分割提取 → magic 验证
├─ 需要逐位平面目检 → stegsolve(Java GUI)
└─ 工具无输出但怀疑仍在 → python3 脚本(按位提取 + 顺序枚举)
提取失败分支
提取乱码/无结果
├─ 怀疑顺序问题 → 枚举组合:行序(正/逆)× 位序(LSB/MSB)× 通道(RGB 各通道/组合)× 位平面(b1/b2…)
├─ 怀疑压缩 → 查压缩头(zlib 78 9C / gzip 1F 8B / bzip2 42 5A 68)→ 先解压再读
├─ 怀疑加密 → 查密钥线索(密码提示/附近文件)→ 有则 [[re-crypto-decrypt]],无则标注
├─ 怀疑嵌套 → 每层提取物再过一遍检测流程(多载体分层)
└─ 全部排除 → 标注「未检出」(不等于不存在,见 [[gotchas]])
检测结论分级表
| 级别 | 判据 | 处置 |
|---|---|---|
| 确认嵌入 | 提取出有效数据(magic 命中/可读内容) | 提取 + 存档(路径 + sha256) |
| 强烈可疑 | 结构异常 + 熵异常 + 工具命中但提取无效 | 继续枚举顺序/压缩/加密假设 |
| 可疑特征 | 单一特征(如高熵段) | 列为线索,不定性;与其他线索合并判断 |
| 未检出 | 无特征/枚举穷尽无果 | 输出「未检出」+ 已用方法清单(盲区声明) |
组合套路(完整流程)
- 文件初勘(re-triage:类型/magic/大小核对)
- 结构检查(pngcheck/exiftool/hexdump 尾部)
- 隐写扫描(zsteg/steghide/binwalk 按载体)
- 提取 → 验证(magic/可读性/压缩头)
- 枚举(顺序/通道/位平面)→ 仍无 → 标注未检出 + 方法清单
实现教训(内化)
- 检测结论分三级,熵/结构异常只是线索不是证据——定性必须提取成功或结构级异常确认
- 提取顺序枚举是最高频的失败修复手段,脚本化枚举比手工快
- 「未检出」要带方法清单与盲区声明(隐藏方可用非常规顺序/加密/新型载体)
- 每步产物 sha256 存档,验证结论可复核
使用注意
- 取证场景先确认授权范围(目标载体/数据类别)
- 提取物初勘走 re-triage;解密衔接 re-crypto-decrypt
- CTF 场景留意 flag 格式(题目说明的 flag 前缀),提取物先 strings 扫一遍