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安全扫描器,核心逻辑就三步:

  1. 扫描:发现周边BLE设备,提取广播包
  2. 枚举:连接设备,列出所有服务和特征值
  3. 检测:检查安全配置,标记风险项

用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}")
        # 这里可以进一步连接并枚举服务
注意: pybluez在Python3下对BLE支持有限,建议用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攻击的流程:

  1. 攻击者设备伪装成合法BLE外设
  2. Android设备发起配对时,攻击者拦截并转发
  3. 捕获配对过程中的TK(临时密钥)
  4. 如果TK是固定的"000000",直接破解

这个平台的核心价值在于——你能在可控环境中复现攻击,而不是等到上线后被黑客发现。我记得有一次,客户说他们的BLE设备很安全,结果我用这个平台5分钟就找到了配对密钥硬编码的问题。

核心思路: 测试框架不是一次性建成的。我建议你先从BlueZ命令行开始,熟悉BLE协议细节;然后写Python脚本自动化重复操作;最后搭建验证平台,形成闭环。每一步都能挖到漏洞,别想着一步到位。

知识体系总览

下面这张图,是我对本章内容的总结。你可以看到,从底层工具到上层平台,层层递进:

Android BLE安全测试框架知识体系 BlueZ工具层 hcitool/gatttool/hcidump 扫描器开发 Python + bleak/pybluez 自动化脚本 攻击向量自动化 核心安全测试能力 配对劫持检测 | 密钥强度分析 | 服务枚举攻击 | MITM模拟 漏洞验证平台 攻击模拟器 → 数据捕获器 → 报告生成器 闭环 迭代

你看,整个框架是自底向上的。底层工具熟练了,上层平台才能发挥威力。我见过太多人一上来就想写自动化脚本,结果连gatttool怎么用都不知道——嗯,这样很难挖到真正的漏洞。

我的建议: 先花一周时间把BlueZ的命令行工具玩熟。每天抓几个BLE设备的包,分析它们的配对过程。等你对协议细节了如指掌了,再动手写代码。工具是死的,思路是活的。

最后说一句:安全测试不是找茬,而是帮产品变得更强。这套框架我用了三年,挖出过几十个高危漏洞,也帮团队避免了很多线上事故。希望你能从中找到自己的节奏。


公众号:蓝海资料掘金营,微信deep3321