mcpField
F
firmware-analysis

firmware-analysis

github.com/wgpsecSecurity1.8k43 installsUpdated 4d ago
Repository

About firmware-analysis

A firmware analysis methodology for device security researchers. It covers acquisition, extraction, static and dynamic analysis, vulnerability research, and repackaging, with tool references and practice targets.

Key features

  1. 01Plan firmware acquisition
  2. 02Extract filesystems from firmware
  3. 03Search for credentials and sensitive data
  4. 04Run dynamic analysis with QEMU
  5. 05Audit vulnerabilities and update mechanisms

Use cases

  1. 01Inspect firmware for hardcoded credentials and keys
  2. 02Analyze device binaries in an emulated environment
  3. 03Test security issues in web services and update mechanisms

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/wgpsec/aboutsecurity --skill firmware-analysis

After installing, type/firmware-analysisin Claude Code to confirm it loaded.

Bundled filesreferences/firmware-analysis-techniques.md

Details

From the project README

固件安全分析方法论

核心流程:获取固件 → 解包提取文件系统 → 静态分析敏感信息 → 动态模拟运行 → 漏洞挖掘 → 固件修改重打包

深入参考


Phase 1: 固件获取

固件获取途径决策树:
├─ 厂商官网下载(支持页/FTP/CDN)
│  └─ Google dork: site:vendor.com filetype:bin OR filetype:img "firmware"
├─ 云存储扫描
│  └─ S3Scanner / GrayhatWarfare 搜索厂商名+firmware
├─ 设备直接提取
│  ├─ UART 串口连接
│  │  ├─ 识别 TX/RX/GND 引脚(万用表/逻辑分析仪)
│  │  └─ picocom -b 115200 /dev/ttyUSB0
│  ├─ JTAG/SWD 调试接口
│  │  └─ OpenOCD 连接读取 flash
│  ├─ SPI Flash 芯片直读
│  │  └─ SOIC-8 夹具 + flashrom
│  └─ eMMC 直读(ISP 焊点)
├─ 中间人截获更新包
│  └─ 设置代理拦截 OTA 更新请求
├─ 移动应用提取
│  └─ apktool d vendor-app.apk → assets/firmware/
└─ 从 bootloader dump
   └─ U-Boot: md.b / nand read / sf read
从 SPI Flash 直接读取
# 使用 CH341A 编程器 + SOIC-8 夹具
flashrom -p ch341a_spi -r flash.bin

# 验证读取一致性(读两次比较)
flashrom -p ch341a_spi -r flash2.bin
md5sum flash.bin flash2.bin
通过 UART 获取 Shell
# 连接 UART(常见波特率: 115200, 9600, 57600)
picocom -b 115200 /dev/ttyUSB0

# 如果 UART 只有日志输出(RX 被忽略),编辑 U-Boot env 强制 shell
# 1. dump flash → 2. 修改 bootargs 加入 init=/bin/sh → 3. 重算 CRC32 → 4. 回写
从移动应用提取固件
apktool d vendor-app.apk -o vendor-app
ls vendor-app/assets/firmware/
# 常见路径: assets/fw/, res/raw/, assets/firmware/

Phase 2: 解包与文件系统提取

固件解包决策树:
├─ binwalk 自动提取(首选)
│  └─ binwalk -ev firmware.bin
├─ binwalk 识别但提取失败
│  ├─ 手动 dd 切割 + 对应工具解压
│  │  ├─ squashfs → unsquashfs
│  │  ├─ jffs2 → jefferson
│  │  ├─ cramfs → cramfsck
│  │  ├─ cpio → cpio -ivd
│  │  ├─ ubifs → ubireader_extract_images
│  │  └─ yaffs2 → unyaffs
│  └─ firmware-mod-kit 辅助
├─ 固件加密
│  ├─ 检查熵值: binwalk -E firmware.bin
│  │  ├─ 高熵 → 可能加密或压缩
│  │  └─ 低熵 → 未加密
│  ├─ 寻找解密密钥(bootloader/旧版本固件/逆向加密逻辑)
│  └─ 某些厂商用 AES-CBC + 硬编码 key/IV
└─ 完全未知格式 → hexdump 分析 magic bytes
binwalk 标准流程
# 初步分析(不提取,仅识别)
binwalk firmware.bin

# 熵分析判断是否加密
binwalk -E firmware.bin

# 自动递归提取
binwalk -ev firmware.bin

# 提取结果通常在 _firmware.bin.extracted/ 目录
ls _firmware.bin.extracted/
手动文件系统提取
# 查找文件系统偏移
binwalk firmware.bin | grep -i "squashfs\|jffs2\|cramfs\|ubifs"

# 用 dd 切割(示例: squashfs 在偏移 0x1A0094)
dd if=firmware.bin bs=1 skip=$((0x1A0094)) of=rootfs.squashfs

# 解压 squashfs
unsquashfs rootfs.squashfs
ls squashfs-root/

# 解压 jffs2
jefferson rootfs.jffs2 -d jffs2-root

# 解压 cpio
cpio -ivd --no-absolute-filenames -F rootfs.cpio

# 解压 ubifs
ubireader_extract_images -u UBI -s <start_offset> firmware.bin
基础文件信息收集
file firmware.bin
strings -n8 firmware.bin
strings -tx firmware.bin | head -50
hexdump -C -n 512 firmware.bin
fdisk -lu firmware.bin

Phase 3: 静态分析

静态分析重点目标:
├─ 硬编码凭据
│  ├─ /etc/shadow, /etc/passwd
│  ├─ grep -r "password\|passwd\|secret\|key" etc/
│  └─ 配置文件中的默认账户密码
├─ 加密材料
│  ├─ SSL 证书与私钥: etc/ssl/, *.pem, *.key
│  ├─ SSH 密钥: etc/ssh/ssh_host_*
│  └─ API 密钥 / Token
├─ 后门与调试接口
│  ├─ telnetd / dropbear 配置
│  ├─ 隐藏的 CGI 端点
│  └─ 调试用 web shell
├─ 网络服务配置
│  ├─ Web 服务器配置(lighttpd/uhttpd/mini_httpd)
│  ├─ MQTT 凭据与 broker 地址
│  └─ 云平台 API endpoint
├─ 启动脚本分析
│  ├─ /etc/init.d/, /etc/rc.d/
│  └─ 服务启动顺序与权限
└─ 二进制安全检查
   └─ checksec --file=<binary>
凭据与敏感信息搜索
# 进入提取的文件系统
cd squashfs-root/

# 检查用户凭据
cat etc/shadow 2>/dev/null
cat etc/passwd

# 搜索硬编码密码
grep -rn "password\|passwd\|secret\|api_key\|token" etc/ --include="*.conf" --include="*.cfg"
grep -rn "password\|passwd" usr/lib/ --include="*.lua" --include="*.sh"

# 搜索 SSL/SSH 密钥
find . -name "*.pem" -o -name "*.key" -o -name "*.crt" -o -name "ssh_host_*"

# 搜索 URL 和 IP 地址
grep -rn "http://\|https://\|ftp://" . --include="*.conf" --include="*.sh" --include="*.lua"
grep -rEn "\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b" etc/

# 搜索 base64 编码内容(可能隐藏凭据)
grep -rn "^[A-Za-z0-9+/=]\{20,\}$" etc/
自动化分析工具
# Firmwalker - 自动搜索敏感信息
./firmwalker.sh squashfs-root/

# EMBA - 综合固件安全分析
sudo ./emba -f firmware.bin -l ./logs

# LinPEAS(在模拟环境中运行)
# 拷贝到模拟的文件系统中执行
二进制保护检查
# 检查所有 ELF 二进制的安全编译选项
find squashfs-root/ -executable -type f -exec file {} \; | grep ELF
checksec --file=squashfs-root/usr/bin/httpd
checksec --file=squashfs-root/usr/sbin/dropbear
云凭据与 MQTT 配置提取
# 搜索 MQTT 配置
grep -rn "mqtt\|broker\|mosquitto" etc/ usr/ --include="*.conf" --include="*.json"

# 搜索云端点 URL 与 token 派生逻辑
grep -rn "/pf/\|deviceId\|STATIC_KEY" usr/bin/ usr/lib/
strings usr/bin/cloud_agent | grep -i "mqtt\|api\|token\|key\|secret"

Phase 4: 动态分析(QEMU 模拟)

动态分析决策树:
├─ 单个二进制模拟
│  ├─ 确认架构: file <binary>
│  ├─ MIPS big-endian → qemu-mips
│  ├─ MIPS little-endian → qemu-mipsel
│  ├─ ARM → qemu-arm
│  ├─ ARM64 → qemu-aarch64
│  └─ 需要 chroot 或 --root 指向文件系统
├─ 全系统模拟
│  ├─ Firmadyne(自动化,推荐)
│  ├─ Firmware Analysis Toolkit(基于 Firmadyne)
│  └─ 手动 QEMU system 模拟
└─ 真实设备动态调试
   ├─ gdbserver 远程调试
   └─ Frida hook
单个二进制模拟
# 安装 QEMU 用户态模拟器
sudo apt-get install qemu-user-static

# 确认目标架构
file squashfs-root/bin/busybox

# MIPS 模拟(以提取的文件系统为根)
sudo chroot squashfs-root /usr/bin/qemu-mips-static /bin/busybox ls

# ARM 模拟
sudo chroot squashfs-root /usr/bin/qemu-arm-static /usr/sbin/httpd

# 带 strace 的模拟(观察系统调用)
qemu-mips-static -strace ./squashfs-root/usr/bin/target_binary
全系统模拟(Firmadyne)
# Firmadyne 流程
# 1. 提取固件文件系统
python3 ./sources/extractor/extractor.py -b <brand> -sql <psql_ip> -np -nk firmware.bin images/

# 2. 识别架构
python3 ./scripts/getArch.sh images/<image_id>.tar.gz

# 3. 创建 QEMU 镜像
python3 ./scripts/makeImage.sh <image_id>

# 4. 推断网络配置
python3 ./scripts/inferNetwork.sh <image_id>

# 5. 启动模拟
python3 ./scratch/<image_id>/run.sh
远程调试
# 在设备/模拟环境中启动 gdbserver
gdbserver :1234 /usr/bin/target_daemon

# 在主机上连接
gdb-multiarch /path/to/target_daemon
# (gdb) target remote <device-ip>:1234
# (gdb) set architecture mips
# (gdb) continue

Phase 5: 漏洞挖掘

常见固件漏洞类型:
├─ 命令注入
│  ├─ Web CGI 参数未过滤
│  ├─ 系统调用拼接用户输入
│  └─ grep -rn "system\|popen\|exec\|eval" --include="*.c" --include="*.lua"
├─ 缓冲区溢出
│  ├─ strcpy/sprintf/gets 等不安全函数
│  ├─ 嵌入式系统通常缺少保护(no ASLR/NX/Canary)
│  └─ checksec 确认保护状态
├─ 认证绕过
│  ├─ 硬编码凭据
│  ├─ 后门账户
│  └─ session 管理缺陷
├─ 信息泄露
│  ├─ 未授权 API 端点
│  ├─ 调试信息暴露
│  └─ 配置文件可访问
├─ 降级攻击
│  ├─ 无版本号校验的签名更新机制
│  ├─ 旧版签名固件仍可刷入
│  └─ 绕过安全补丁
├─ MQTT/云凭据泄露
│  ├─ 硬编码 STATIC_KEY 派生 token
│  ├─ 明文 MQTT 凭据
│  └─ 弱 topic ACL 允许跨设备访问
└─ uClibc 堆利用(嵌入式 Linux 特有)
   ├─ fastbin 合并时的 fake chunk
   ├─ non-PIE 下 .data/.bss 地址稳定
   └─ /proc/self/mem 写入 shellcode
Web 服务漏洞测试
# 识别 Web 服务
nmap -sV -p 80,443,8080,8443 <device-ip>

# 抓取所有 CGI 端点
curl -s http://<device-ip>/ | grep -oP 'action="[^"]*"|href="[^"]*"'
find squashfs-root/www/ -name "*.cgi" -o -name "*.asp" -o -name "*.lua"

# 命令注入测试(静态分析后定向测试)
# 分析 CGI 二进制中 system() 调用的参数来源
strings squashfs-root/usr/bin/httpd | grep "system\|popen\|/bin/sh"
更新机制审计
# 检查更新逻辑:是否验证版本号?
strings squashfs-root/usr/bin/upgrade_manager | grep -i "version\|rollback\|verify\|sign"

# 是否存在反降级计数器?
grep -rn "anti.rollback\|version.check\|monotonic" squashfs-root/etc/ squashfs-root/usr/

Phase 6: 固件修改与重打包

固件修改流程:
├─ 修改文件系统内容
│  ├─ 添加 SSH 公钥到 /root/.ssh/authorized_keys
│  ├─ 修改 /etc/shadow(添加已知密码的用户)
│  ├─ 植入 reverse shell 或 busybox
│  └─ 修改启动脚本添加持久化后门
├─ 重打包文件系统
│  ├─ squashfs: mksquashfs <dir> rootfs.squashfs -comp xz
│  ├─ jffs2: mkfs.jffs2 -d <dir> -o rootfs.jffs2
│  └─ cramfs: mkcramfs <dir> rootfs.cramfs
├─ 重组固件镜像
│  ├─ dd 拼接各分区
│  ├─ firmware-mod-kit 自动重打包
│  └─ 更新 CRC/校验和(如果有)
└─ 刷入设备
   ├─ Web UI 上传
   ├─ TFTP/串口刷入
   └─ flashrom 直接写入 SPI
重打包示例
# 修改文件系统后重打包 squashfs
# 注意匹配原始压缩算法和块大小
mksquashfs squashfs-root/ new_rootfs.squashfs -comp xz -b 131072

# 用 firmware-mod-kit 重打包
./build-firmware.sh <extraction_dir>

# 手动拼接固件
dd if=header.bin of=modified_firmware.bin bs=1
dd if=new_rootfs.squashfs of=modified_firmware.bin bs=1 seek=<offset> conv=notrunc

# 重算 CRC(如果固件头包含校验和)
# 需要逆向分析固件头格式确定 CRC 算法和位置

工具速查

工具用途
binwalk固件识别与提取
firmware-mod-kit解包/重打包
flashromSPI Flash 读写
OpenOCDJTAG 调试
QEMU二进制/系统模拟
Firmadyne自动化全系统模拟
Ghidra / radare2二进制逆向分析
gdbserver + gdb-multiarch远程调试
checksec二进制保护检查
EMBA综合固件安全分析
Firmwalker敏感信息搜索
picocom / minicom串口通信

练习靶场

项目说明
OWASP IoTGoatIoT 固件漏洞练习
DVRFDamn Vulnerable Router Firmware
DVARDamn Vulnerable ARM Router
ARM-XARM 固件模拟框架
DVIDDamn Vulnerable IoT Device

Comments

Markdown supported