低功耗蓝牙攻击实用指南

众所周时,蓝牙是当下无线网络技术中最受欢迎和常用一种。伴随着蓝牙技术在物联网中的发展,蓝牙技术联盟以信标、医疗保健、娱乐、健身为核心不断努力提升传输速度。

低功耗功耗蓝牙(BLE)是蓝牙4.0规范的一部份,它还包含传统蓝牙和蓝牙高速传输协议。与传统蓝牙相比,BLE 在保持相同的通信范围的同时,功耗更低。BLE 是一种“总是关闭”的技术,期间只需传输少量的数据。这大大降低了功耗,使其非常适合在需要具有低数据速率的持久长连接的情况下使用。蓝牙非常适合做电视遥控,但是不适合需要传输大量数据的无线流媒体设备。

我们现在使用的很多设备内置有低功耗蓝牙。从智能手机、智能电视、医疗设备等先进技术到咖啡机等基本设备都是用了蓝牙。

BLE 源自于诺基亚一个名为“WIBREE“的内部项目,后期被蓝牙技术联盟(SIG)接管。BLE的设计着重于更好的配对速度和能源效率。

 

什么让BLE如此突出?

  • 支持多平台通信:能够轻松的在 Android、IOS、Linux、Windows Phone、 Windows 8 以及 OS X 等平台的大量设备上通信。
  • 更快的匹配速度
  • 有助于维持较长时间的连接
  • 显著降低实施成本
  • 节能

 

BLE 听起来不错,它真的那么好吗?

从安全的角度来看,这是个很好的问题。事实是——BLE只是一个协议。这取决与制作商在他们设备上安全的实现 BLE。由于随机数生成器不够“随机”,即使是最强的加密协议也会失败。BLE 也同样适用。可以这么说,BLE 的安全掌握在他的实现者手上。

虽然所有的蓝牙低功耗设备都是以增强用户体验为主要目的开发的,在开发过程中,安全是否退居次要地位?

让我们看看 BLE 可能会让用户暴露的三个主要漏洞:

  1. 窃听:顾名思义,窃听是指第三方设备监听两个已配对设备之间的数据交换。两个已经匹配的设备之间的连接建立了信任链。当其中一个设备被移除,信任链就会断开。攻击者可以使用这个设备的单元号取得与另一个蓝牙设备的访问权限。即使此设备的加/解密密钥一倍删除,攻击者仍然可以使用蓝牙嗅探器暴力破解 PIN 码。一旦得到 PIN码,设备极易被劫持。

2.中间人攻击:中间人攻击中第三方设备伪装成合法设备,欺骗两个合法的设备,让它们相信它们之间是相互连接的。事实上,合法的设备被连接到攻击设备上。此中攻击攻击者更够访问正常设备之间的所有交互的数据,以及在数据在到达接收端之前通过删除或者修改方式来伪造数据。

3.拒绝服务&模糊攻击(Fuzzing):由于目前大多数无线设备都使用内置的电池组,这些设备面临着遭受拒绝服务攻击(DoS)的风险。DoS攻击时系统频繁崩溃,从而导致电池完全耗尽。模糊攻击也会导致系统崩溃,因为攻击者发送畸形的数据到设备的蓝牙广播并检查其响应,最终导致系统崩溃。

 

BLE核心概念

BLE 的两个基本概念。

  • GAP 通用访问配置文件(Generic Access Profile)
  • GATT 通用属性配置文件(Generic Attribute Protocol)

通用访问配置文件(GAP)

GAP 用于设备连接和广播通信(advertising)。GAP 负责蓝牙设备对外可见性,并在决定设备如何与其他设备交互时起到重要作用。

以下是 GAP 内部较为重要要两个概念:

外围设备:这些小型低功耗设备可以连接到更为复杂、强大的中心设备。心率检测器就是一个典型的外围设备。

中心设备:此类设备大多是手机或者拥有更大内存、更强处理能力的设备。

广播流程(Advertising process)

下图形象的展示了广播和扫描响应是如何工作的。

外围设备每隔2秒发送一次广播数据。如果中心设备监听到了来自外围设备的广播数据,他将回复扫描响应请求

作为对该请求的响应,外围设备会发送扫描响应数据。至此,外围中心设备与外围设备均取得了广播,并相互建立了连接。

通用属性配置文件(GATT)

GATT 使用一种称为属性协议的通用数据协议,它定义了两个 BLE 设备如何使用服务和属性两个概念进行数据交换。该协议使用蓝牙技术联盟指定的16 位 ID 将所有服务和属性存储在查找表中。需要注意的是,GATT 只有在 GAP 广播流程结束之后才能初始化。

GATT 的两个主要概念:

  • 服务(Services)
  • 属性(Characteristics)

服务

服务被简单地定义为一个可以容纳许多抽屉的柜子,这些抽屉又被称为属性。一个服务可以有多个属性。每个服务可以使用官方16位的通用唯一识别码(UUID)或128位自定义的通用唯一识别码(UUID)。

属性

属性是 GATT 事务中最基本的概念。属性包含单个数据点,与服务类似,每个属性都有一个用于与其他属性相区别的 ID 或 UUID。例如,健康手环的心率传感器。

这里是BLE设备属性服务的 SIG 规范。SIG 正式采用的 UUID 在任何一个 BLE 设备中都必须在应用程序中使用他们指定的 ID。

例如,SIG 规定的官方的TX Power 的 UUID 是0x1804

nRF Connect应用扫描的信标(稍后将详细介绍)必须与 SIG 规范中的TX power 的 UUID 保持一致。

BLE 利用工具

Linux 对 BLE 提供了很好支持。为了使用 BLE,我们需要安装蓝牙栈(blueZ)。使用以下命令安装BlueZ。

sudo apt-get install bluez

我们将使用已安装有 bluez 的台式/笔记本电脑。它将作为中心网关与其他外围设备之间通信。BlueZ 的目标是编写和实现蓝牙无线标准规范。在安装好 BlueZ 之后,我么需要两个工具去扫描、连接以及读写数据。

  1. hcitool
  2. gattool

在开始之前,我们需要周围的 BLE 设备。如果我们需要搞清楚怎么连接 BLE 设备、如何读取数据以及发现设备的漏洞,那么hcitool 必不可少。

hcitool

它利用笔记本电脑的主机控制器接口与BLE设备进行通信和读写更改。因此,hcitool在发现可用的广播受害者BLE设备,并在连接后更改值时非常有用。

gattool

如上一段所述,gatttool主要用来帮助发现可用 BLE 设备的服务和属性,以便根据攻击者读取/写入受害者的数据。

命令手册

常用指令

命令 功能
hciconfig 用于配置蓝牙设备。我们可以运行这个命令来列出连接到我们计算机的 BLE 适配器以及它们的基本信息。
hciconfig hciX up 启用名为 hciX 的蓝牙设备

Hcitool 命令

hcitool 用于配置蓝牙连接,并向蓝牙设备发送一些特殊命令。

命令 功能
hcitool -i hciX 使用 hciX 接口,如果不指定,默认使用第一个可用接口。
hcitool -i hciX 扫描处于发现模式的传统蓝牙设备。
hcitool lescan 扫描 BLE 设备。

更多命令:https://helpmanual.io/man1/hcitool/

Gattool 命令

GATT 代表通用属性,定义了用于组织特征和属性的数据结构。

命令 功能
gatttool -I 以交互模式启动 gatttool。
gatttool -t random -b [adr] -I 使用随机 LE 地址在交互模式下启动 gattool。连接到地址为 adr 的远程蓝牙设备。
primary 检查已连接 BLE 设备的可用服务。
characteristic 检查已连接 BLE 设备的可用属性,以便从中读取数据。
char-desc 特征描述符的发现。检查 n 个 handle。
char-read-hnd 使用 handle 读取属性 。
char-write-req 向 handle 写入值。

更多命令:https://helpmanual.io/man1/gatttool/

使用示例

hciconfig: 用于列出所有连接的 BLE 适配器。

hciconfig hicX up: 启用名为 hciX 的 BLE 适配器。

hciconfig hciX down: 禁用名为 hciX 的 BLE 适配器

hcitool lescan: 扫描附近的 BLE 设备。

在获得 BLE 设备的地址后,我们需要连接它。这就是我们使用 gattool 的时候。

gatttool -I: 以类似 REPL 的交互模式启动 gatttool,用户可以按照下列的方式执行各种命令。

connect <addr>:使用给定的地址连接 BLE 设备。

如果设备只与手机相连而不能与电脑相连,上述步骤可能无效。为了连接这样的设备,我们需要使用随机的地址。

gatttool -t random -b <addr> -I: 使用随机地址连接设备。

在成功连接后,我们可用使用以下命令查看设备的服务和属性。

Primary

Characteristics

在找到服务和属性后,我们需要知道读/写数据的 handle。这可以使用char-desc命令得到。

我们可以使用形如char-desc 01 05(该显示从1 到 5 的5 个 handle)的命令过滤特定范围的 handle 并显示。

在找到 handle 后,我们使用命令char-read-hnd <handle>从 handle 中读取数据。

为了能够写入特定的 handle,我们需要知道哪个是可写 handle。为此,我们可以选择一个 hit 和 try 方法,然后逐个读取所有 handle,直到遇到读取错误为止。读取错误意味着这是一个写 handle(写 handle 不能被读取)。或者,类似 nRF Connect 的应用可以自动计算出写 handle。

handle 0x000b 的UUID 下图所示。

使用 nRF Connect,我们得到了以下的输出,确认 0x000b 确实是写 handle。上图中 0x000b的 UUID 和下图中 nRF Connect 的相匹配。

在连接到灯泡后,我们可以向不用同的属性写入随机值。在大多数情况下,写入随机值不会像预期的那样工作。在 handle 中写入正确的值,我们需要解密数据协议,我们可用使用嗅探工具来解密,如 wireshark 和 ubertooth。

在解密数据协议后,我们可以命令char-write-req <handle> <value> 向 handle 中写入值。

如果char-write-req报错,可以使用char-write-cmd替换。

蓝牙数据包日志(Bluetooth HCI snoop log)

Android 4.4 及以上有一个选项,可以记录设备所有进出的蓝牙数据包。要捕获蓝牙通信,请遵循以下步骤。确保安装了Android 应用程序。

第一步: 进入设置中的开发者选项。

第二步: 在开发者选项中启用“打开蓝牙数据包日志”。

第三步: 运行 Android 程序(magic blue),并发送一些改变灯泡颜色的命令。重复发送几次。

第四步:对应于我们的命令,我们可以在sdcard/btsnoop_hci.log 或者/internal Storage/btsnoop_hci.log中找到捕获的蓝牙流量文件。

注意 – 在部分设备上, btsnoop_hci.log 被创建在不同的位置,例如/sdcard/Android/data/btsnoop_hci.log

使用Emal 、 Google Drive 或者 USB 数据线将捕获的日志文件传输到台式/笔记本电脑上。

第四步: 在 Wireshark 中分析流量,Wireshark 是一个免费开源的数据包分析工具,使用以下命令安装。

sudo apt install wireshark-qt

更多关于如何使用 Wireshark 说明见我们的博客:https://blog.attify.com/exploiting-iot-enabled-ble-smart-bulb-security/

或者,使用文本编辑器打开捕获的文件,如nano。

使用 nRF Connect

Nordic 半导体的nRF Connect 可以用与 BLE hacking。它可以嗅探和写入数据,就像gatttool 一样。

第五步: 打开 nRF Connect 应用并连接 BLE 灯泡。

第六步: 一旦连接,写入 payload 值56b0306000f0aa,点击发送。灯泡的颜色会变成紫红色。

这是因为颜色使用了RGB 值 176, 48, 96 或者十六进制值 B03060。此条命令发送非灯泡的值是 56 b0 30 60 00 f0 aa。注意,第二字节、第三字节、第四字节分别对应十六进制中的 RGB 值。

我们可以通过人工分析流量并试图从中找到协议中的模式。

使用 Blash 进行 BLE 攻击

Blash 是一个 BLE 扫描工具,它基于 python库 bluepy。在此节中,我们将了解如何使用Bleah 黑掉 BLE设备。

在开始之前,我们需要

硬件

  • 做好是运行 Ubuntu 的笔记本
  • 一个智能 BLE 灯泡或者其他蓝牙智能设备
  • 一个蓝牙适配器

软件

  • Python 2.7 (Ubuntu中默认已安装)
  • Bluepy 库
  • Bleah

首先确保,Bluepy 如预期一样工作。

前往 bluepy 目录,打开终端,然后输入`sudo ./bluepy-helper 0然后输入le on,如下所示。

(注意:可用使用命令which bluepy-helper找到 Bluepy 的安装路径)

success 消息表明 Bluepy 运行正常。现在,让我们看看如何使用 Bleah 进行 BLE 攻击。

第一步: 在同一终端中输入 scan扫描附近的 BLE 设备。

我们的 BLE 设备的地址是 F81D78607184

第二步: 开一个新终端并运行sudo bleah -t0t0表示连续扫描。

第三步: 我们可以连接指定的设备并枚举所有的服务和属性,使用以下命令。

sudo bleah -b "aa:bb:cc:dd:ee:ff" -e

aa:bb:cc:dd:ee:ff 代表设备地址

-b 表示按照设备地址过滤

-e 代表连接设备并执行枚举操作

第四步:向特定的属性中写入数据运行。

sudo bleah -b "aa:bb:cc:dd:ee:ff" -u "0000ffe9-0000-1000-8000-00805f9b34fb" -d "data"


正如我们看到的,Blash 是一个实施 BLE 设备攻击的强大工具。它自动化实现了许多步骤,否则我们需要手工完成。

在这篇博文中,我们学习了对蓝牙低功耗设备进行攻击的各种工具和技术。希望你从此文中受益。

(完)