基于 nRF Sniffer 的 BLE 智能灯泡协议逆向与重放攻击

本文涉及的技术仅供安全研究与学习参考,请勿用于非授权的真实环境攻击。

一、攻击环境

  1. 目标设备:LIfeSmart 的某款智能灯泡
  2. 手机端 LifeSmart App
  3. 抓包工具:Wireshark 4.6.5 + nRF52832 Dongle
  4. 发包工具:Android nRF Connect

二、BLE 协议

1. BLE 通信流程

什么是BLE?

BLE是蓝牙低功耗的缩写,是一种专为低功耗应用设计的蓝牙技术标准,与传统蓝牙相比具有更低的功耗、较短的时间和简化的通信协议等

BLE工作过程如下:

1、角色
BLE设备角色主要分为两种角色,主机(Central)和从机(Peripheral),当主机和从机建立连接之后才能相互收发数据
2、广播
在BLE技术中,广播用于设备之间的发现和连接。当BLE设备处于广播模式时,它会周期性地发送广播包(Advertising Packets)来向周围的其他设备宣告自己的存在和提供的服务信息。广播数据包最多能携带31个字节的数据,广播包中通常包含设备的唯一标识符、设备类型、支持的服务等信息。

以下是广播在使用过程中的几个重要作用:

  1. 设备发现:通过广播,其他设备可以扫描周围的信道,检测到广播的设备并获取其信息,从而实现设备之间的发现和识别。
  2. 建立连接:当设备发送广播包时,其他设备可以解析其中的信息,确定是否与该设备建立连接。广播可以帮助设备快速建立连接,实现数据交换和通信。
  3. 节省能量:相比于主动扫描或保持持续连接,使用广播可以有效地节省设备的电量。设备只需要定期发送广播包,而无需保持长时间的连接状态。
  4. 提供服务信息:广播包中可以包含设备支持的服务、特征值等信息,帮助其他设备了解该设备的功能和可用服务,从而实现更加智能化的连接和交互。
    3、扫描
    扫描是主机监听从机广播数据包和发送扫描请求的过程,主机通过扫描,可以获取到从机的广播包以及扫描回应数据包,主机可以对已扫描到的从机设备发起连接请求,从而连接从机设备并通信。

4、连接

image.png
(图文部分参考自:https://zhuanlan.zhihu.com/p/687355390)

2. ATT/GATT协议

4. 蓝牙协议ATT、GATT层介绍 — bluetoothlover_wiki 0.0.1 documentation

在这个蓝牙灯泡中,ATT/GATT交互流程

手机 App
↓ Write Request (0x0012)
灯泡
↓ Write Response
灯泡
↓ Notification (0x0016)
手机 App
↓ Read Request (0x0014)
灯泡
↓ Read Response

三、nRF52832 BLE 抓包sniffer

为什么需要NRF Sniffer区抓包?

普通windows电脑并不能抓取大部分的BLE通信包,有如下原因:

  1. WIndows蓝牙适配器看不到空中的BLE数据包,而只能看到自己配对,自己参与的通信,例如手机与智能手环通信过程中,电脑只是旁观者,普通的蓝牙网卡看不到完整的通信过程,看不到连接建立后的数据
  2. 由于BLE工作在2.4GHz频段,共有3个广播信道(37、38、39)和37个数据信道(0-36)。当配对连接建立后双方会按照算法不断地切换频道,每秒可切换数百次,普通的蓝牙适配器不知道当前在哪个信道也无法同步调频跟踪,所以无法完整监听
    而nRF Sniffrer可以捕获广播包监听连接建立,同时跟踪调频将数据实时发送给wireshark

nRF Sniffer如何配置?

首先安装wireshark,注意安装时候需要勾选Npcap和USBPcap
image.png

全部勾选即可

image.png

image.png

其他位置默认即可

注意wireshark最好以管理员模式启动,否则每个抓包节点会一直请求管理员权限

安装CP2102驱动

image.png

驱动下载链接:『来自123云盘用户15982553848的分享』CP210x_Universal_Windows_Driver.zip
链接:https://1836347495.share.123865.com/123pan/ji9fTd-5mRm3?pwd=V5AK#
提取码:V5AK

image.png

点击选择解压的文件夹安装即可

Wireshark设置nRF52832 Sniffer插件

打开wireshark:帮助 - 关于

image.png

把解压内容文件夹extcap中的内容复制到步骤 的路径中。注意这个插件在网上流传版本似乎已经很是古老了,特别是对于与wireshark的插件竟然还在Python 2.7,并且与当前新版本的Wireshark并不能使用,所以我自行对插件进行了一些调整,在现版本下可以完美运行

下载链接:https://github.com/vstralcn/nRF52832_WireShark_cap-

image.png

在菜单栏中勾选插件:

image.png

然后就可以抓包了

image.png

四、攻击过程

1.启用Wireshark开启抓包

需要在建立连接前提前开启

image.png

2.锁定灯泡设备

image.png

image.png

BLE 建立连接后,应用层数据主要通过 ATT(Attribute Protocol)承载,因此使用:btatt 过滤ATT数据包,重点观察Write Request、Handle Value Notification、Read Response等GATT交互行为

3.追踪数据包

断开app与灯泡连接,然后重新启动

抓到来自灯泡和手机app的大量蓝牙数据包

image.png

等待指示灯信号稳定

0143e50de1f9ead1d74faa94a3779719_720.jpg

4.测试定位信号

重复开关灯捕获信号

关灯信号:
image.png

开灯信号:
image.png

可以得出

关灯:0e000000000000000000000405020180
开灯:0e000000000000000000000406020181

根据GATT数据包分析,可以得出Handle映射:

Handle 作用
0x0012 Write
0x0014 Read
0x0016 Notify

Characteristic UUID:

项目 UUID
Service UUID 9fdc…
Write Characteristic ac7b…

5.多次对比验证分析

第一次开灯:0e000000000000000000000404020181
第一次关灯:0e000000000000000000000405020180
第二次开灯:0e000000000000000000000406020181
第二次关灯:0e000000000000000000000407020180
第三次开灯:0e000000000000000000000408020181
第三次关灯:0e000000000000000000000409020180

断开设备重新连接配对,然后开灯:
1开:0e000000000000000000000403020181
1关:0e000000000000000000000404020180

然而数据包中并没有0e000000000000000000000401020181和0e000000000000000000000402020180

再次重新配对:

1关:0e000000000000000000000403020180
根据对比分析发现其实第七个数字并没有校验,只是app端发送时做了每一次递增,实则每次发送同样的也并没有影响,关键只在于最后一个字符为0 或者 1,为0则关灯,为1则点亮

6.重放

使用nRF Connect App,发送0e000000000000000000000405020180

2e4e48753cbc18c49fadd9b6c595c4d4_720.jpg

image.png

在未使用原厂 App 的情况下,仅通过重放捕获到的 ATT Write Request,即可直接控制目标灯泡状态,说明该设备控制协议缺乏有效的重放防护机制。

五、技术点分析

1. Follow Device 机制

由于 BLE 连接建立后会进行信道跳频,因此 Nordic Sniffer 必须提前锁定目标设备并捕获 CONNECT_IND,才能持续跟踪后续 ATT 数据流。

2. 安全性修复分析

1. Replay Attack 防护

当前 ATT Write Request可以直接重放,而没有任何保护措施,可以增加以下保护措施:

1.增加随机数 Nonce

当前协议中没有增加随机数或动态字段,攻击者可以直接重放历史 ATT Request即可控制设备,如果在控制指令中加入随机数、时间戳、会话表示,并在设备端校验有效性,从而避免重放攻击

2.Challenge-Response机制

在车机ECU,通过Challenge-Response机制进行验证UDS检测来源合法性,当设备在建立连接后,可先下发随机 challenge,由客户端基于 challenge 和共享密钥生成响应值,设备仅接受合法 challenge-response 计算结果,从而避免攻击者直接重放固定控制命令。

3. 加密保护

启用 BLE Link Layer Encryption,并强制设备在配对完成后才能执行敏感控制操作。当前设备协议Characteristic 权限过宽。可以通过增加会话绑定限制