对低功耗蓝牙(BLE)的简要学习分析
2020-05-24 13:20:00 Author: www.4hou.com(查看原文) 阅读量:481 收藏

0x01  基础知识

从无线耳机到汽车音响,计算机键盘和鼠标以及其他日常生活用品,我们的日常生活中几乎每个人都会使用低功耗蓝牙(BLE)。

尽管该标准很受欢迎,但似乎普遍缺乏对它的工作原理以及某些术语的含义的理解,我将在本文分析一些基本概念和关键术语。

BLE在外围配置中使用无线电波在短范围内工作,这意味着一个中央设备(电话)将向外围设备(无线耳机)发送数据。

为此,设备需要连接在一起,这是通过设备在三个不同的通道上进行广播来实现的,该通道由连接设备定期扫描,BLE中有几种主要的连接类型,分别是连接,配对和绑定,它们的含义略有不同:

连接

已连接是未加密的一次性连接,这提供了没有任何安全功能的简单连接。

配对

配对是一次性连接,在配对过程中,交换包括临时安全密钥在内的安全功能,以便在两个设备之间确保数据的安全。但是,这只是临时连接,因此一旦蓝牙关闭或超出范围,该设备便可以自由连接到任何其他设备。

绑定

绑定是一种更永久的解决方案,因此一旦完成配对,设备便会存储安全密钥并将其用于以后的所有通信,这意味着对于初始配对之后的每个后续连接,不会在设备之间传输密钥。

在查看BLE时,可以使用几种不同的工具进行枚举,其中最受欢迎的工具是:

· Hciconfig –配置蓝牙接口

· Hcitool –用于扫描和发现

· Bleah –可用于枚举蓝牙设备

· Gatttool –与蓝牙设备交互

· Bettercap –与蓝牙设备交互

· Bluepy –用于直接与BLE通信的python库

要进行蓝牙攻击,只需要一个USB软件狗或带有蓝牙模块的树莓派。

枚举设备时,通常会出现一些不同的标题:

句柄:句柄是内存中存储数据的位置。

特征:特征是UUID,它在内存中与句柄引用相同的位置。

权限:这是有关每个句柄权限信息,这些主要是:

· 

· 

· 通知

· 广播

数据:这是存储在该内存地址位置的数据,可以是一条消息或一段代码。

为了展示一些蓝牙术语的实际用途,我写了一个BLE CTF题目,研究了BLE蓝牙的一些关键功能以及如何使用它们。

0x02  实战解题

题目地址:https://github.com/hackgnar/ble_ctfhttps://blog.yekki.co.uk/ble-hacking/

https://drive.google.com/open?id=1GsmSUYrEYa-dqCzcnEC4vBBolis90kh-

为了巩固之前学习过的一些BLE知识,我将通过解这道CTF题目来分析。

要运行这道CTF题目,需要将其写入SD卡,然后插入具有蓝牙模块的树莓派中。

pi启动运行,连接到raspbian上,然后检查蓝牙模块是否正在运行。

 sudo hciconfig

确认运行正常就可以扫描所有BLE设备。

 sudo hcitools lescan

找到了BSidesLDN CTF。

由此,我们有了设备的MAC地址:

 B8:27:EB:4E:8B:2F

使用bleah,可以枚举设备并查看其中的内容。

 sudo bleah -b“ B8:27:EB:4E:8B:2F” -e

我们有一些具有数据的句柄,我的理解是这些flag是“ Digit:Code”,所以我们已经有了第二个flag

 B8:27:EB:4E:8B:2F

但是第一个flag在哪里呢?

我们可以通过读取0x000c句柄来仔细检查

句柄值增加1,而当它们为十六进制时,其值升至8,然后升至f,因此,看起来没有隐藏标记1的句柄上没有间隙。

由于它具有write属性,因此让我们向其中写入一些数据,然后查看是否可以将其读回。

 gatttool -b b8:27:eb:4e:8b:2f --char-write-req -a 0x000f -n $(echo -n“ test” | xxd -ps)

编写成功,因此,如果我们写回去,那么我们就会得到flag!

如果我们使用–listenflag写入一些数据,则应该读出一些数据!

但是,事实并非如此!

没有做出任何回应,尝试更改输入类型:

 gatttool -b b8:27:eb:4e:8b:2f --char-write-req -a 0x0012 -n $(echo -n“ test” | xxd -ps)--listen

仍然没有得到回应。

多读一些关于BLE的通知,有一个CCCD,它代表客户端特征配置描述符,首先要获取通知,我们需要将此CCCD设置为要获取通知,为此,需要将正确的代码0100写入CCCD处理程序,在这种情况下为0x0013。

为此,我进入了交互式gatttools:

 gatttool -I

然后连接到设备:

 connect b8:27:eb:4e:8b:2f

连接成功后,我用0100的代码写到CCCD。

 char-write-req 0x0013 0100

在交互模式下,它只有“操作”,“处理程序”,“数据”,然后,当写入0x0012时,就会得到答案!

使用cyberchef对此进行解码,我们得到第四个flag!

查看flag5,它仅具有读权限,读到0x0016将读出已知句柄,一直到0x0017。

 gatttool -b b8:27:eb:4e:8b:2f --char-read -a 0x0017 | awk -F':''{print $ 2}'| tr -d''| xxd -r -p; printf' \ n'

flag6也只有读权限,这里我们得到Owt的读取答复,我们有了新的线索!

读0x3000

 gatttool -b b8:27:eb:4e:8b:2f --char-read -a 0x3000 | awk -F':''{print $ 2}'| tr -d''| xxd -r -p; printf' \ n'

成功了!

flag6完成了!

因此,现在我们必须找到flag1,由于处理程序中的设备上没有明显的间隙,因此无法将其存储在其中。考虑蓝牙的工作原理,在建立连接之前,设备必须自己做广播,这就是我们在一开始就在lescan上看到的,但是,除了设备的MAC地址和名称之外,还有其他数据吗?

就像扫描网络流量一样,可以在扫描时拦截流量,因此可以使用Wireshark或本例中的tcpdump。

使用蓝牙接口运行tcpdump:

 sudo tcpdump -i bluetooth1 -s 0

然后,我们运行另一个lescan,观察数据!

因此,我们有了第一个和最后一个flag,解这种CTF题目有助于巩固知识并进一步了解BLE的工作原理!

本文翻译自:https://www.pentestpartners.com/security-blog/introduction-to-bluetooth-low-energy/如若转载,请注明原文地址:


文章来源: https://www.4hou.com/posts/7Wgy
如有侵权请联系:admin#unsafe.sh