reverse-skills-max: initial public release (restored, redacted, hardened)

This commit is contained in:
baradok609hecl1pq6qi
2026-10-20 02:17:15 +03:00
commit da24c2bd20
2227 changed files with 443931 additions and 0 deletions

View File

@@ -0,0 +1,118 @@
---
name: re-stego
type: atomic
description: >
隐写术检测与提取:文件尾附加、图片 LSB、音频与其他载体、提取验证。
触发词:隐写、stego、LSB、文件尾附加、隐写提取、图片隐写。
capabilities: [stego-detection]
---
# 隐写术检测与提取
## 何时使用 / 何时不用
- 用:隐写怀疑(CTF 题/取证对象)、文件尾异常、图片/音频异常(尺寸/噪声/文件结构不匹配)
- 用:文件结构异常(IEND 后仍有数据/EXIF 段超长/像素数与文件大小不匹配)
- 用:多载体组合(题目/取证场景常见——多文件各藏一部分)
- 用:取证场景未分配空间/文件系统残留扫描(与 [[re-disk-forensics]] 配合)
- 不用:正常文件分析(各归各域技能);加密数据解密(密文 ≠ 隐写,载荷解密转 [[re-crypto-decrypt]]);未知文件类型识别([[re-triage]] 先行)
- 不用:无载体线索的漫无目的扫描(先有怀疑特征再动手,见 [[decision-tree]])
## 工具准备
### zsteg(图片 LSB 扫描)
- 多平台: `gem install zsteg` 或源码(GitHub)
- 验证: `zsteg -h` 或 `gem list zsteg`
- 覆盖范围:PNG/BMP 支持好,GIF 支持有限——GIF 载体换 python 脚本路径
### steghide(图片/音频隐写)
- Linux: `apt install steghide` / `dnf install steghide`;macOS: `brew install steghide`
- 验证: `steghide --version`;`steghide info file.jpg`(查看是否嵌入数据,无需密码)
### binwalk(尾部扫描)
- 安装与验证见 [[re-fw-extract]] 工具准备
### 其他检测/提取工具
- exiftool(EXIF/元数据):Linux `apt install libimage-exiftool-perl` / `dnf install perl-Image-ExifTool`;macOS `brew install exiftool`;验证 `exiftool -ver`
- pngcheck(PNG 结构校验/异常):Linux `apt install pngcheck`;macOS `brew install pngcheck`;验证 `pngcheck -v`
- sox(音频处理/频谱图):Linux `apt install sox`;macOS `brew install sox`;验证 `sox --version`
- foremost(数据雕刻,取证场景):`apt install foremost` / `brew install foremost`
- stegsolve(逐位平面查看,Java GUI):GitHub 下载 jar(`java -jar stegsolve.jar`)
- outguess(JPEG DCT 域,旧工具):Linux `apt install outguess`
- ffmpeg(音频格式转换,可选):`apt install ffmpeg` / `brew install ffmpeg`
- python3(位操作/验证脚本 + PIL):安装见 [[re-python]];`pip install pillow`;验证 `python3 -c "from PIL import Image"`
## 操作步骤
按顺序执行,每步产物存档(路径 + sha256,见 [[re-triage]])。
1. **文件尾附加检测**:
```sh
binwalk sample.png | tail -20 # 附加数据扫描
hexdump -C sample.png | tail -10 # 尾部目检
```
- 尾部附加:文件正常但尾部有多余数据(衔接尾部附加经验([[re-patching]] 补丁制作思路))
- 结构核对:`pngcheck -v sample.png` 看 IEND 位置与文件尾差距(差值 ≈ 附加数据量)
- 弱线索快速扫:`strings -a sample.png | grep -iE 'flag|ctf|http'`
- 大小核对:与声称内容明显不符(如 3MB 的「小图」)是弱线索
- 提取:binwalk 自动分割或 dd 按偏移提取(`dd if=sample.png of=tail.bin bs=1 skip=<偏移>`)→ magic 检查([[re-triage]])
- EXIF 查看:`exiftool -a sample.jpg`(全段列出,异常字段/大块注释可疑)
- 其他文件冗余区:EXIF 元数据(exiftool 查看)、文件头保留区、压缩文件未用空间
2. **图片 LSB**:
```sh
zsteg sample.png # 全通道 LSB 扫描
zsteg -E 'b1,rgb,lsb,xy' sample.png # 指定通道/位平面提取
```
- 通道:RGB/alpha 各通道最低位;位平面:b1/b2(低 2 位)——alpha 通道也常被用于隐藏
- zsteg 常用参数:`-a` 全通道扫描、`-v` 详细输出、`-E` 指定提取;输出解读:`b1,rgb,lsb,xy` 行 = 该平面提取结果,全 `failed` ≈ 无该平面隐写
- 顺序:行序/位序影响提取结果(见坑 1;枚举组合见 [[decision-tree]] 提取失败分支)
- 无工具时的脚本路径:python3 + PIL 按像素遍历提取位序列(`getpixel` 取通道低 bit → 拼位序列 → 转字节;参考 [[gotchas]] 顺序坑)
- 脚本枚举模板:行序 × 位序 × 通道三重循环,每种组合输出文件并逐一 `file` 检查
- stegsolve 逐位平面查看(GUI):多平面图对比,找视觉图案(LSB 图像隐写常见)
3. **其他载体**:
- 音频:频谱隐写(sox 频谱图:`sox in.wav -n spectrogram -o out.png` 后目检频域图案)、steghide 提取(`steghide extract -sf file.wav`)、相位/回声隐写
- 音频分支:先看波形/频谱(频域图案呈文本/二维码形状 → 频谱隐写),再按时域(LSB 类,steghide)与频域(相位/回声,需专门工具)区分处理
- 图片 DCT 域(JPEG):outguess 类工具(旧工具,对新格式支持有限,见 [[gotchas]])
- 文件冗余区:EXIF、文件头保留区、压缩文件未用空间(ZIP 内 CRC/未用空间)
- 其他载体:文本(空白字符/行距)、网页(注释/隐藏标签)——按场景扩展
- 多载体组合(题目常用):各文件分片拼接(按顺序/按特征关联,参考 [[re-triage]] 元数据初勘)
4. **提取验证**:
- magic 检查(提取物头部特征)
- 可读性验证(strings/file)
- 提取物再检测:提取出的文件本身可能再藏(嵌套)——提取物走一遍完整流程;为脚本/压缩包时按对应域继续([[re-script-deob]] / [[re-python]] 等)
- 验证产物:提取物 `file` 类型与预期一致才定「确认嵌入」(分级表见 [[decision-tree]])
- 隐写前压缩:先提取再解压(提取物查压缩头——zlib `78 9C` / gzip `1F 8B` / bzip2 `42 5A 68`,见坑 3)
- 加密载荷:无密钥时标注不可提取(不硬破解);有密钥线索走 [[re-crypto-decrypt]]
## 跨域联合
- [[re-ctf]] 网关:本技能归属
- [[re-fw-extract]]:binwalk 复用
- [[re-patching]]:尾部附加经验衔接
- [[re-triage]]:提取物初勘
- [[re-crypto-decrypt]]:载荷解密衔接
- [[re-disk-forensics]]:未分配空间/文件系统侧隐写(取证场景)
## 常见坑与陷阱
- **LSB 顺序**:现象——提取乱码;原因——行序(从上到下/从下到上)/位序(LSB 优先/MSB 优先);对策——工具自动尝试或脚本枚举组合
- **多载体误判**:现象——一个文件中多个隐写层;原因——嵌套隐写;对策——分层提取,每层验证
- **隐写前压缩**:现象——提取物乱码;原因——明文先压缩再嵌入;对策——先查压缩特征(zlib/gzip/bzip2 头)再解压
- **工具输出噪声**:现象——大量候选;原因——扫描输出含误报;对策——按 magic/可读性过滤
- **载体本身异常**:现象——文件损坏;原因——隐写写入破坏结构;对策——先修复/容忍损坏(按位提取不依赖结构)
- **JPEG 有损混淆**:现象——LSB 提取出噪声;原因——JPEG 有损压缩覆盖了位平面(LSB 类隐写主要针对 PNG/BMP,JPEG 走 DCT 域);对策——先判格式(pngcheck)再选方法
- **熵误报**:现象——扫描报「有隐写」但无内容;原因——压缩/随机数据天然高熵;对策——熵特征只作怀疑线索,不单独定性(判定分级见 [[decision-tree]])
- **steghide 密码**:现象——无密码提取失败;原因——需要口令(CTF 常给提示);对策——先无密码试,再按提示/密钥线索尝试,无则标注
- **单工具盲区**:现象——zsteg 无结果但有隐写;原因——工具覆盖的通道/算法有限;对策——zsteg + steghide + 脚本多路交叉
- **载体副本差异**:现象——同一文件不同来源扫描结果不同;原因——副本被转码/压缩;对策——用原始载体(哈希核对,见 [[re-triage]])
- **题目/场景提示被忽略**:现象——扫了图片半天,载荷其实在配套文件里;原因——多载体提示未看;对策——先看提示,按提示分载体
- **压缩层与隐写层混淆**:现象——把压缩数据的随机性当成隐写线索;原因——压缩内容天然高熵;对策——先解压再分析内容(压缩不是隐写)
- **乱码三分支判定**:现象——提取出内容但像乱码;原因——可能是压缩/加密/顺序错,也可能就是随机填充;对策——按压缩头/可读性/统计分布走 [[decision-tree]] 提取失败分支
- 检测/提取分支与证据分级见 [[decision-tree]];边界与反例见 [[gotchas]]

View File

@@ -0,0 +1,68 @@
# 隐写检测决策树与证据分级
隐写检测先按载体定方法,提取失败按顺序枚举。本文档与 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) |
| 强烈可疑 | 结构异常 + 熵异常 + 工具命中但提取无效 | 继续枚举顺序/压缩/加密假设 |
| 可疑特征 | 单一特征(如高熵段) | 列为线索,不定性;与其他线索合并判断 |
| 未检出 | 无特征/枚举穷尽无果 | 输出「未检出」+ 已用方法清单(盲区声明) |
## 组合套路(完整流程)
1. 文件初勘([[re-triage]]:类型/magic/大小核对)
2. 结构检查(pngcheck/exiftool/hexdump 尾部)
3. 隐写扫描(zsteg/steghide/binwalk 按载体)
4. 提取 → 验证(magic/可读性/压缩头)
5. 枚举(顺序/通道/位平面)→ 仍无 → 标注未检出 + 方法清单
## 实现教训(内化)
- 检测结论分三级,熵/结构异常只是线索不是证据——定性必须提取成功或结构级异常确认
- 提取顺序枚举是最高频的失败修复手段,脚本化枚举比手工快
- 「未检出」要带方法清单与盲区声明(隐藏方可用非常规顺序/加密/新型载体)
- 每步产物 sha256 存档,验证结论可复核
## 使用注意
- 取证场景先确认授权范围(目标载体/数据类别)
- 提取物初勘走 [[re-triage]];解密衔接 [[re-crypto-decrypt]]
- CTF 场景留意 flag 格式(题目说明的 flag 前缀),提取物先 strings 扫一遍

View File

@@ -0,0 +1,30 @@
# 隐写方法论坑与边界
## 检测坑
- **熵误报**:压缩数据/随机填充天然高熵,熵特征单独出现时只是线索——与结构异常合并判断([[decision-tree]] 分级表)
- **JPEG 有损混淆**:LSB 类隐写基本只适用于 PNG/BMP(无损);JPEG 重压缩会破坏位平面——先确认格式再选方法,别在 JPEG 上浪费时间做 LSB
- **工具版本差异**:zsteg/steghide 版本间通道枚举默认值不同(如 b1 位序、alpha 通道是否默认扫)——换版本/加参数重扫是常见修复
- **签名伪造**:文件头正常不代表整体正常(附加数据可伪装成注释块/元数据)——按结构逐段核对(pngcheck 查 IEND 位置、EXIF 段长度)
- **未检出 ≠ 不存在**:隐写可藏在非常规顺序/新型载体/多载体分片中——「未检出」必须带已用方法清单
## 提取坑
- **顺序组合爆炸**:行序 × 位序 × 通道 × 位平面组合多——先按工具默认试,再枚举常见组合(zsteg -E 各变体),最后脚本全枚举
- **隐写前压缩**:嵌入前 deflate/gzip 的明文提取出来是乱码——提取物先查压缩头(zlib `78 9C`、gzip `1F 8B`、bzip2 `42 5A 68`),常见于 CTF
- **隐写前加密**:加密载荷无密钥不可提取——查题目/场景的密钥线索(密码提示、同批文件);无则标注,不硬破解
- **多载体重叠**:同一文件多个隐写层/多文件分片——每层提取物独立验证,分片按特征(文件尾偏移/序号/内容连续性)拼接
- **嵌入损坏**:部分写入/载体处理导致提取数据损坏——容忍损坏(magic 部分匹配、可读片段),修复载体后再提取
## 载体坑
- **载体损坏**:隐写写入破坏文件结构(坏 PNG/异常 EXIF)——先修复(pngcheck 定位损坏处)或按位提取不依赖结构
- **EXIF 干扰**:EXIF 段内的注释/缩略图可能被误报为附加数据——用 exiftool 列清元数据段,区分「合法元数据」与「附加载荷」
- **压缩载体**:ZIP/RAR 内文件的未用空间与 CRC 域是隐写点——先解包对比原始大小/校验(binwalk 扫描容器内偏移)
- **JPEG DCT 域**:JPEG 隐写在 DCT 系数里,位平面工具无效——用 outguess 类工具或 DCT 系数统计(JPEG 隐写检测需重压缩分析,超出基础流程时标注)
## 使用注意
- 取证场景:授权范围(载体/数据类别)先行;产物 sha256 存档([[re-triage]] 初勘 + [[re-analyze/analysis-contract]] 交付)
- CTF 场景:按题目提示缩小范围(载体类型/顺序暗示/密钥提示),别全量枚举耗时
- 本技能覆盖文件类载体(图片/音频/文件冗余区/未分配空间);网络协议/流量侧隐写不在本技能([[re-netcap]] / [[re-proto-rev]] 场景评估)