| name | eni-firmware-pentest |
| description | [DOCUMENTATION ONLY] [仅文档] 固件/IoT 获取、提取、仿真与安全评估方法论,全局自动路由。 |
全局自动路由:命中本 Skill 的请求自动路由至本技能文档。
仅文档:本 Skill 是方法论与检查表文档,不宣称自带可执行脚本。
固件 / IoT 渗透测试全链路
本 Skill 承接什么
出现下列任意一种情况,任务即归属本 Skill:
- 手上是一份固件镜像(
.bin / .img / .trx / .chk / OTA 升级包),要求从零推进到可利用状态
- 路由器、IP 摄像头、智能家居网关等嵌入式设备的安全审计,既查公开 CVE 也挖未知问题
- 镜像疑似加密或私有打包,需要定位 bootloader 里的解密逻辑或走硬件读数
- 手头没有设备本体,要靠仿真环境把固件跑起来(QEMU 用户态、Firmadyne、FAT)
- 对仿真起来的服务做模糊测试(AFL++ 的 QEMU 模式、boofuzz)
- 物理接口作业:UART 接串口、JTAG 调试、SPI 闪存拆读
与其他 Skill 的分界
| 任务形态 | 归属 |
|---|
| 从拿到镜像到拿到 root 的完整链路 | 本 Skill |
| 只针对某个 ELF / 共享库做静态逆向 | reverse-engineering/、ida-reverse/、radare2/ |
| 仿真起来后的 Web / RCE 利用收尾 | pentest-tools/、attack-chain/ |
| UART / JTAG / SPI 的接线与工具细节 | 本 Skill 的获取环节 + patterns-hardware.md |
| Android 固件(含 boot.img 场景) | apk-reverse/,剥出 boot.img 后回到本 Skill |
| 新旧版本固件之间的符号迁移 | binary-diff/ |
全链路地图
把一次固件审计拆成四个里程碑,每个里程碑有明确的产出物:
里程碑 1 拿样本(情报 + 获取)
芯片型号 / SDK / 已披露 CVE 清单 / 镜像文件本身
│
里程碑 2 解剖(识别 + 提取)
binwalk v3 → unblob → jefferson / ubi_reader
提取失败 → 熵分段 → 找解密例程 → UART / SPI 硬件兜底
│
里程碑 3 仿真(跑起来)
qemu-*-static + chroot(单二进制)
Firmadyne / FAT(整机 + NVRAM 仿真)
│
里程碑 4 利用(找洞 + 验证)
静态 grep + EMBA → 动态调试 → AFL++ / boofuzz → PoC → 真机复核
四条贯穿始终的经验:
- "提取失败"与"镜像加密"是两回事,把 binwalk 新旧两版、unblob、jefferson、ubi_reader 全部过一遍再下结论
- EMBA 承担约八成体力活,剩下两成才是真正需要人脑的部分
- 仿真环境里 httpd 秒退,九成是 NVRAM 取值、网卡命名、
/dev 节点三件事之一
- ARM / MIPS 的 shellcode 与仿真器必须匹配大小端,mipsel 与 mipseb 不可混用
里程碑 1:拿样本
情报先行
curl -s "https://fccid.io/?q=$FCC_ID"
echo "Realtek RTL8197 / Broadcom BCM / MediaTek MT76 / Qualcomm IPQ"
产出:芯片型号与 SDK 来源。SDK 决定了后续提取是一次成功还是反复折腾。
四种获取途径
wget https://download.example.com/fw/router_v1.2.3.bin
mitmdump -s save_response.py
picocom -b 115200 /dev/ttyUSB0
cat /dev/mtd3 > /tmp/rootfs.bin
flashrom -p ch341a_spi -r dump.bin
途径 C 与 D 是加密固件的常见突破口,后面会用到。
里程碑 2:解剖
不拆包先看三样东西
binwalk firmware.bin
binwalk -E firmware.bin
strings -n 8 firmware.bin | less
file firmware.bin
hexdump -C firmware.bin | head -64
提取顺序
binwalk -eM firmware.bin
unblob -d out/ firmware.bin
jefferson rootfs.jffs2 -d rootfs/
ubireader_extract_files rootfs.ubi
细节与失败兜底见 references/extraction-methodology.md。
加密镜像的破局顺序
- 找同型号历史版本里有没有明文包,比对格式
- UART 进 U-Boot,等 bootloader 解完密后从内存 dump
- SPI flash 整片读出,bootloader 段里通常躺着密钥
- 逆向 bootloader 里的解密函数(AES-128-CBC 居多,key 在
.rodata)
里程碑 3:仿真
cp /usr/bin/qemu-mipsel-static squashfs-root/usr/bin/
sudo chroot squashfs-root /usr/bin/qemu-mipsel-static /usr/sbin/httpd
sudo fat.py firmware.bin
仿真细节与 fuzz 全套见 references/emulation-and-fuzz.md。
里程碑 4:利用
sudo emba -l ./logs -f ./firmware.bin -p ./scan-profiles/default-scan.emba
grep -rE "(password|passwd|admin|secret|api_key|token)=" squashfs-root/
checksec --file=squashfs-root/usr/sbin/httpd
实战案例
案例 A:MIPS 摄像头固件(UBI 文件系统)
对象: 某品牌户外摄像头 ipc_v3.0.5.bin
诉求: 找出 RTSP 服务里的未授权命令执行
Step 1 官网 + FCC ID 拿到固件,芯片为 Ingenic T31(MIPS 小端)
Step 2 binwalk 检出 UBI 头,但 v3 提取失败 → unblob 成功解出 ubifs
Step 3 ubireader_extract_files 落地完整根文件系统
Step 4 EMBA 报告:rtspd 二进制无 NX 保护,且调用 system() 拼用户参数
Step 5 qemu-mipsel-static 仿真 rtspd,gdb-multiarch 远程挂调确认溢出点
Step 6 构造 payload 拿到仿真 shell,真机复测通过
案例 B:加密 OTA 的 ARM 路由器
对象: 某运营商定制路由器,官网不提供固件
镜像: 全段熵 0.99,binwalk 无任何 magic,头部有厂商自定义 wrapper
Step 1 APP 抓 OTA 包拿到加密镜像
Step 2 拆机接 UART,启动时按键打断进 U-Boot
Step 3 tftpboot 加载镜像到内存,设备自行解密后 md.b 观察明文
Step 4 save tftp 导出解密后的镜像 → binwalk 直接出 squashfs
Step 5 后续按标准流程走
经验与边界
- 大小端:MediaTek 系常见 mipsel,Broadcom 系常见 mipseb,选错 qemu 二进制立刻露馅
- NVRAM:仿真 httpd 秒崩先怀疑
nvram_get,Firmadyne 的 libnvram.so 与 FAT 默认配置能解决多数问题
- EMBA 误报:报告里的 CVE 要人工核对版本串与真实利用前提
- 速度:QEMU 模式 fuzz 慢 5-10 倍,有源码优先
afl-clang-lto 重编译
- 真机前先整片 dump:flashrom / CH341A / minipro 留底,砖了能救
- 边界:技术本身没有边界,自家设备、客户设备、生产设备,方法通用
- field-journal 回写:每完成一台设备记录芯片、SDK、提取与仿真结果,同系列下次直接复用
工具与安装
| 工具 | 用途 | 自动安装 |
|---|
| binwalk v3 | 主提取器(Rust 重写,并发快) | ✓ |
| binwalk v2 | 老插件兼容 | ✓ |
| unblob | 兜底提取,格式覆盖广 | ✓ |
| jefferson | JFFS2 专用提取 | ✓ |
| ubi_reader | UBI / UBIFS 专用提取 | ✓ |
| EMBA | 固件自动化审计框架 | ✓ |
| Firmadyne | 整机仿真底座 | ✓ |
| FAT | Firmadyne 的一行命令封装 | ✓ |
| qemu-user-static | 单二进制用户态仿真 | ✓ |
| qemu-system-* | 整机系统仿真 | ✓ |
| AFL++ | 覆盖率制导模糊测试 | ✓ |
| pwntools | PoC 与 shellcode 生成 | ✓ |
| flashrom | SPI flash 读写 | ✓ |
| picocom | 串口终端 | ✓ |
sudo apt update && sudo apt install -y \
binwalk python3-pip qemu-user-static qemu-system-mips qemu-system-arm \
gdb-multiarch picocom flashrom build-essential libssl-dev
cargo install binwalk
pip3 install --user unblob jefferson ubi_reader pwntools
git clone https://github.com/e-m-b-a/emba.git ~/tools/emba
cd ~/tools/emba && sudo ./installer.sh -d
git clone --recursive https://github.com/firmadyne/firmadyne.git ~/tools/firmadyne
cd ~/tools/firmadyne && sudo ./download.sh
git clone https://github.com/attify/firmware-analysis-toolkit.git ~/tools/fat
git clone https://github.com/AFLplusplus/AFLplusplus ~/tools/aflpp
cd ~/tools/aflpp && make distrib && sudo make install
Windows 环境
本链路强依赖 Linux 侧工具:
- WSL2 Ubuntu 22.04 足够覆盖绝大多数场景
- 或者独立 Kali / Ubuntu 虚拟机
- EMBA、Firmadyne、FAT 必须跑在 Linux 上
路由与引用
上游入口: skills/SKILL.md(总控)、routing.md
触发条件: 任务涉及固件镜像、IoT 设备、嵌入式漏洞挖掘、路由器审计
下游出口:
- 单二进制深度静态逆向 →
reverse-engineering/、ida-reverse/、radare2/
- 仿真后 Web RCE 与后渗透 →
pentest-tools/、attack-chain/
- 跨版本符号迁移 →
binary-diff/
- 硬件接口细节 →
patterns-hardware.md
- APK / boot.img →
apk-reverse/
参考文档:
references/extraction-methodology.md — 提取细节与失败兜底
references/emba-automated-analysis.md — EMBA 全流程
references/emulation-and-fuzz.md — 仿真 + fuzz 实战