0x01.BLE协议
在蓝牙 4.0 标准中,引入了一种称为 Low energy 的技术,专门针对在内存和功率受限的设备上运行的物联网和智能设备,可与传统蓝牙保持同等通信范围的同时,显著降低功耗和成本,蓝牙4.0被引入,也被称为Bluetooth Smart。
BLE协议栈如下:
各层的功能描述为:
-
PHY层(Physical layer物理层):PHY层用来指定BLE所用的无线频段,调制解调方式和方法等
-
LL层(Link Layer链路层):LL层是整个BLE协议栈的核心,也是BLE协议栈的难点和重点
-
GAP层(Generic access profile):GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种
-
L2CAP层(Logic link control and adaptation protocol):L2CAP对LL进行了一次简单封装
-
SM(Secure manager protocol):定义了BLE通信两端设备的配对方法和密钥分发的工作模式,提供了一系列加密算法,为BLE通信提供了加密、认证等安全保障
-
ATT(Attribute protocol):简单来说,ATT层用来定义用户命令及命令操作的数据,比如读取某个数据或者写某个数据
-
GATT(Generic attribute profile ):GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理
在BLE协议栈中,开发者接触最多的就是ATT。 GATT(通用属性)的具体格式如下: -
Profile(配置文件):由一个或多个Service 组成,每个Service 可以看作是完成特定功能或特性的数据和相关行为的集合,由一个或多个Characteristic 构成。每个Characteristic 一般都包含一个数据或者一个公开行为,以及该数据的单位或者公开行为的单位
-
Serivice(服务):完成特定功能或特性的数据和相关行为的集合,由一个或多个Characteristic 构成。可分为Primary Service 和Secondary Service 两种类型:Primary Service 是公开此设备主要可用功能的服务;Secondary Service 是为设备提供额外辅助信息
-
Characteristic(特征):包含服务中使用的数据信息,包括如何访问该数据的属性方法、如何表示或显示该数据的格式信息等
这里使用一个BLE的实例,可以看到这里对应了两个Service,都是Unkown Service,并且第二个Unkown Service有两个Unkown Characteristic,可以看到第一个Unkown Characteristic的UUID和NOTIFY,READ,WRITE No RESPONSE的特征功能值。在BluetoothGatt类的函数中,可以找到对应相关的service和characteristic,所有的通信都是基于service和characteristic实现。
0x02.BLE协议监听
设备名称:智能灯泡
硬件设备:NRF52832
软件:Wireshark & LightBlue
基于NRF52823的使用说明安装,BLE相关的驱动及nRF Sniffer COM6通信接口
安装完成即可使用Wireshark通过nRF Sniffer COM6接口监听到附近所有的BLE通信
这里可以监听到有四个BLE设备,并且有一个是public的设备地址,另外三个是random的设备地址。对于如何确定这四个地址哪个是灯泡的设备地址,这里使用LightBlue的信号强度来进行判定
通过移动手机,可以看到随着距离的增加,BULE-F045DAF413E4的强度也在逐渐变低,通过这种方式简单的进行了判定,接下来通过wireshark进行监听,查看具体的BLE通信数据来进一步确认监听的目标是否正确。
这里可以通过wireshark的btatt过滤规则,查看ATT层传输的数据。
这里抓取到APP和灯泡建立连接的相关请求。接下来是我们关注的重点,也就是对应的APP具有的功能,例如开关等操作。接下来我们抓取灯泡开启的通信请求
当点击开启功能时,抓到上述通信数据,
可以看到写入的Handle是0x0012,
写入的值是0e000000000000000000000403020181
接下来抓取灯泡关闭的通信请求
点击关闭功能时,抓到上述通信数据,可以看到写入的Handle还是0x0012,写入的值是0e000000000000000000000404020180
0x03.BLE协议重放
设备名称:智能灯泡
硬件设备:SENA UD100
软件:gattool
将UD100连接到Ubuntu虚拟机中,可以查看连接的设备及设备对应的BD Address等信息
使用如下命令与灯泡建立连接
$ gatttool -b f0:45:da:f4:13:e4 -I
$ [f0:45:da:f4:13:e4][LE]> connect
连接建立成功,则设备地址的颜色则变为蓝色,这时可以查看对应service和characteristics等相关的内容
这里可以看到对应的service,这里使用NRF Connect APP也可看到一样的内容,服务内容一致
通过之前的wireshark抓包分析可以猜测0x0012的句柄与灯泡开关有关,这里使用characteristics查看相关的所有描述符
[f0:45:da:f4:13:e4][LE]> characteristics
这里就是我们重点进行关注的,也是尝试进行重放的句柄。
通过 char-write-req 重放对应句柄的值
[f0:45:da:f4:13:e4][LE]> char-write-req 0x0012 0e000000000000000000000404020181
可以看到灯泡成功被点亮
0x04.BLE Fuzzing
设备名称:智能灯泡
硬件设备:SENA UD100
软件:expliot-framwork(https://expliot.io/pages/expliot-framework)
通过gatttool,可以拿到所有的service和characteristics,对于不同的功能,发送对应句柄的对应值,即可重放对应的功能。通过BLE协议栈的分析,可以知道不同characteristics接受的值可以是任意数据,只要符合对应的值,即可启动对应的功能,例如灯泡的开关,那么如果传递的值不在其预期的处理范围是否能触发一些异常呢?
针对这种情况,可以使用expliot-framwork框架,对不同的句柄,随机生成大量的数据进行fuzzing测试,看看是否能触发异常。
通过expliot启动框架
可以看到其支持的功能包括扫描,写入,读取,通知,fuzzchar等功能,这里我们重点使用的是fuzzchar,其他的功能使用也十分简单
针对对应的句柄生成大量随机的char进行测试,这里使用如下命令:
ef> run ble.generic.fuzzchar -a f0:45:da:f4:13:e4 -n 0x0012 -w 0e00000000000000000000040402xxxx
在fuzzing过程中,当发送值 0e000000000000000000000404020181 时,触发灯泡发生点亮
可以看到随机生成字符串。针对不同的目标,可能触发不同的异常,这里对于灯泡,通过fuzzing,测试到了关闭和开启的值,对于一些复杂的设备,甚至能触发crash,功能失效等效果。
官网
www.xinruisec.com
社区
www.iotsec-zone.com
原文始发于微信公众号(IOTsec Zone):BLE监听与重放