蓝牙 BLE 安全测试工具与方法
BLE vs 经典蓝牙
| 维度 | 经典蓝牙 | BLE |
|---|---|---|
| 功耗 | 高(持续连接) | 低(广播模式) |
| 场景 | 耳机、音箱 | IoT、智能手环、门禁 |
| 协议 | BR/EDR | 4.x 起(GATT 架构) |
| 安全特性 | 配对加密 | 配对模式更多、可选 |
| 典型设备 | AirPods、蓝牙键盘 | 小米手环、智能门锁、BLE Beacon |
大部分 IoT 设备用 BLE,所以 BLE 是硬件安全测试的重点。
Kali BLE 工具一览
| 工具 | 功能 |
|---|---|
| hcitool | 基础蓝牙命令(扫描、连接) |
| hciconfig | 蓝牙适配器配置 |
| bluez | 底层蓝牙协议栈 |
| GATTtool | 连接 BLE 设备并读写特征 |
| Bettercap | 完整蓝牙审计框架(GUI) |
| Wireshark + BT | 蓝牙抓包分析 |
| btlejack | BLE 嗅探和 MITM |
基础扫描
hcitool 扫描附近设备
# 查看蓝牙适配器
hciconfig
# 启动扫描
hcitool lescan
# 扫描结果输出格式:
# LE Scan ...
# AA:BB:CC:DD:EE:FF (unknown)
# AA:BB:CC:DD:EE:FF TestLock ← 这是目标
Bettercap 扫描(推荐)
bettercap -eval "ble.recon on"
# 实时显示新发现的 BLE 设备
# 输入 devices 查看完整列表
# 输入 ble.enum <MAC> 枚举某个设备的 GATT 服务
GATT 服务枚举
BLE 设备使用 GATT(Generic Attribute Profile)架构,结构:
Device
└─ Service (UUID)
└─ Characteristic (UUID)
└─ Descriptor (UUID)
GATTtool 枚举
# 连接目标设备
gatttool -b AA:BB:CC:DD:EE:FF -I
# 连接后
> primary # 列出所有 Service
> characteristics # 列出所有 Characteristic
> handle 0x0028 # 读取某个 handle 的值
> desc 0x0028 # 读取 descriptor
> char-read-uuid <UUID> # 按 UUID 读取
Bettercap 枚举
bettercap -eval "ble.recon on; ble.enum AA:BB:CC:DD:EE:FF"
BLE 攻击面
未加密的特征值读写
很多 BLE 设备的特征值是未加密的:
读取:可能拿到传感器数据、固件版本
写入:可能触发设备动作(开门、关灯、发送指令)
实战案例:智能门锁有一个未加密的特征,写入 0x01 就能开门。
MITM 攻击(btlejack)
- 攻击者设备比合法设备和目标设备更靠近
- btlejack 同时连接两边
- 拦截并修改通信内容
# btlejack 需要特定蓝牙适配器(如 u-blox)
sudo btlejack -d AA:BB:CC:DD:EE:FF -w capture.pcap
重放攻击
很多 BLE 设备的认证方式简单——截获一次合法请求,重放即可。用 Wireshark 抓包后用 hciconfig 重放。
Beacon 欺骗
iBeacon、Eddystone 等 BLE Beacon 广播固定的 UUID + Major + Minor + TX Power。修改这些值可以:
- 在错误位置伪造 Beacon
- 误导位置追踪
- 诱导附近设备触发特定逻辑
蓝牙抓包
Kali 内置了蓝牙接口的抓包驱动:
# 确认蓝牙抓包可用
hciconfig hci0 up
hcitool -i hci0 cmd 0x03 0x004b 0x01 # 开启 HCI 日志
# Wireshark 捕获 HCI 日志
# interface → Bluetooth HCI snoop log
或者用 btsnoop(更稳定):
# 读取 HCI 日志
btmon | tee capture.log
硬件要求
大部分内置蓝牙适配器不支持嗅探和注入——它们是"只会说话不会偷听"的普通蓝牙芯片。要完整审计:
- 扫描和 GATT 枚举:任何蓝牙适配器都可以
- 嗅探:需要支持 HCI snoop 的适配器(如 Panda u-blox、Bus Pirate v3)
- MITM 注入:需要 btlejack 兼容的设备(如 CSR 芯片 + btlejack 固件)