21、Android BLE安全测试框架:BlueZ测试工具、BLE安全扫描器开发、自动化测试脚本(Python)、漏洞验证平台
做BLE安全测试这些年,我最大的感触是:工具链的成熟度,直接决定了你能挖多深的洞。Android的BLE安全测试,说白了就是三件事——扫描、配对、通信。每一环都可能被攻击者利用,而我们要做的,就是提前把这些漏洞揪出来。
这一章,我会带你搭建一套完整的BLE安全测试框架。从Linux底层的BlueZ工具,到自研的BLE安全扫描器,再到Python自动化脚本和漏洞验证平台。嗯,都是我在项目中反复打磨过的套路。
一、BlueZ测试工具:Linux下的BLE调试利器
BlueZ是Linux官方蓝牙协议栈,也是我测试Android BLE安全的首选搭档。为什么?因为它提供了最底层的HCI接口,能让你看到蓝牙通信的原始数据包。
我个人习惯在Ubuntu 20.04上搭建测试环境。安装很简单:
sudo apt-get install bluez bluez-tools bluez-hcidump
常用的几个工具,我列个表给你看:
| 工具名 | 功能 | 我常用的场景 |
|---|---|---|
hcitool |
扫描、连接、查询 | 快速发现周边BLE设备 |
gatttool |
GATT协议交互 | 读写特征值、枚举服务 |
bluetoothctl |
交互式控制台 | 配对、绑定、信任管理 |
hcidump |
HCI数据包抓取 | 分析配对过程的数据流 |
举个例子,用hcitool扫描BLE设备:
sudo hcitool lescan
LE Scan ...
00:11:22:33:44:55 (unknown)
00:11:22:33:44:55 MyBLEDevice
拿到MAC地址后,用gatttool连接上去看看:
sudo gatttool -b 00:11:22:33:44:55 -I
[00:11:22:33:44:55][LE]> connect
[00:11:22:33:44:55][LE]> primary
attr handle: 0x0001, end grp handle: 0x0005 uuid: 00001800-0000-1000-8000-00805f9b34fb
这里有个坑——很多BLE设备不会广播完整的服务UUID。我曾经遇到一个智能门锁,只广播了部分信息,用primary命令才把隐藏的服务全挖出来。嗯,这就是BlueZ的威力。
hcidump -X可以显示十六进制和ASCII双视图,方便分析TK(临时密钥)的交换过程。
二、BLE安全扫描器开发:从零开始造轮子
BlueZ虽然强大,但毕竟是通用工具。针对Android BLE的安全测试,我更喜欢自己写扫描器。为什么?因为可以定制化检测逻辑,比如自动识别弱配对模式、检测未加密的服务特征值。
我开发过一个轻量级的BLE安全扫描器,核心逻辑就三步:
- 扫描:发现周边BLE设备,提取广播包
- 枚举:连接设备,列出所有服务和特征值
- 检测:检查安全配置,标记风险项
用Python调用BlueZ的DBus接口,代码大概长这样:
import dbus
import dbus.mainloop.glib
def scan_ble_devices():
bus = dbus.SystemBus()
adapter = bus.get_object('org.bluez', '/org/bluez/hci0')
adapter_props = dbus.Interface(adapter, 'org.freedesktop.DBus.Properties')
# 启动扫描
adapter_props.Set('org.bluez.Adapter1', 'Powered', dbus.Boolean(1))
adapter_props.Set('org.bluez.Adapter1', 'Discoverable', dbus.Boolean(1))
# 这里省略事件循环,实际项目中用GLib.MainLoop
print("扫描中...")
说实话,直接用DBus有点繁琐。我后来封装了一个更简洁的版本,用pybluez库:
import bluetooth
def scan_ble():
devices = bluetooth.discover_devices(duration=8, lookup_names=True, flush_cache=True)
for addr, name in devices:
print(f"发现设备: {addr} - {name}")
# 这里可以进一步连接并枚举服务
bleak库替代。我踩过这个坑,pybluez扫描经典蓝牙没问题,但BLE设备经常漏掉。
三、自动化测试脚本(Python):让漏洞挖掘自动化
手动测试效率太低。我习惯写一套自动化脚本,把常见的攻击向量都跑一遍。比如:
- 配对劫持测试:模拟中间人,拦截配对请求
- 密钥强度检测:检查是否使用了6位数字PIN(太弱了)
- 服务枚举攻击:尝试读写所有特征值,看哪些没有权限控制
下面是一个自动化测试脚本的骨架:
import asyncio
from bleak import BleakScanner, BleakClient
async def test_device(address):
print(f"开始测试 {address}")
# 1. 扫描并连接
device = await BleakScanner.find_device_by_address(address)
async with BleakClient(device) as client:
# 2. 枚举所有服务
services = await client.get_services()
for service in services:
print(f"服务: {service.uuid}")
for char in service.characteristics:
# 3. 尝试读取特征值
try:
value = await client.read_gatt_char(char.uuid)
print(f" 特征值 {char.uuid}: {value.hex()}")
except Exception as e:
print(f" 读取失败: {e}")
# 4. 检查安全属性
props = char.properties
if 'write-without-response' in props:
print(f" [高危] 可无响应写入!")
asyncio.run(test_device("00:11:22:33:44:55"))
这个脚本虽然简单,但能快速发现未授权访问的问题。我曾经用它测试一款智能手环,发现心率数据竟然可以任意读取——没有任何加密或认证。嗯,这就是典型的特征值暴露漏洞。
四、漏洞验证平台:把理论变成实战
光有扫描器还不够,你得有个平台来复现和验证漏洞。我搭建的验证平台包含三个模块:
| 模块 | 功能 | 技术栈 |
|---|---|---|
| 攻击模拟器 | 模拟MITM、重放攻击 | Python + Scapy + BlueZ |
| 数据捕获器 | 抓取BLE通信数据包 | hcidump + Wireshark |
| 报告生成器 | 输出漏洞详情和修复建议 | Python + Jinja2模板 |
举个例子,验证MITM攻击的流程:
- 攻击者设备伪装成合法BLE外设
- Android设备发起配对时,攻击者拦截并转发
- 捕获配对过程中的TK(临时密钥)
- 如果TK是固定的"000000",直接破解
这个平台的核心价值在于——你能在可控环境中复现攻击,而不是等到上线后被黑客发现。我记得有一次,客户说他们的BLE设备很安全,结果我用这个平台5分钟就找到了配对密钥硬编码的问题。
知识体系总览
下面这张图,是我对本章内容的总结。你可以看到,从底层工具到上层平台,层层递进:
你看,整个框架是自底向上的。底层工具熟练了,上层平台才能发挥威力。我见过太多人一上来就想写自动化脚本,结果连gatttool怎么用都不知道——嗯,这样很难挖到真正的漏洞。
最后说一句:安全测试不是找茬,而是帮产品变得更强。这套框架我用了三年,挖出过几十个高危漏洞,也帮团队避免了很多线上事故。希望你能从中找到自己的节奏。
公众号:蓝海资料掘金营,微信deep3321