0x01 基础知识
从无线耳机到汽车音响,计算机键盘和鼠标以及其他日常生活用品,我们的日常生活中几乎每个人都会使用低功耗蓝牙(BLE)。
尽管该标准很受欢迎,但似乎普遍缺乏对它的工作原理以及某些术语的含义的理解,我将在本文分析一些基本概念和关键术语。
BLE在外围配置中使用无线电波在短范围内工作,这意味着一个中央设备(电话)将向外围设备(无线耳机)发送数据。
为此,设备需要连接在一起,这是通过设备在三个不同的通道上进行广播来实现的,该通道由连接设备定期扫描,BLE中有几种主要的连接类型,分别是连接,配对和绑定,它们的含义略有不同:
连接
已连接是未加密的一次性连接,这提供了没有任何安全功能的简单连接。
配对
配对是一次性连接,在配对过程中,交换包括临时安全密钥在内的安全功能,以便在两个设备之间确保数据的安全。但是,这只是临时连接,因此一旦蓝牙关闭或超出范围,该设备便可以自由连接到任何其他设备。
绑定
绑定是一种更永久的解决方案,因此一旦完成配对,设备便会存储安全密钥并将其用于以后的所有通信,这意味着对于初始配对之后的每个后续连接,不会在设备之间传输密钥。
在查看BLE时,可以使用几种不同的工具进行枚举,其中最受欢迎的工具是:
· Hciconfig –配置蓝牙接口
· Hcitool –用于扫描和发现
· Bleah –可用于枚举蓝牙设备
· Gatttool –与蓝牙设备交互
· Bettercap –与蓝牙设备交互
· Bluepy –用于直接与BLE通信的python库
要进行蓝牙攻击,只需要一个USB软件狗或带有蓝牙模块的树莓派。
枚举设备时,通常会出现一些不同的标题:
句柄:句柄是内存中存储数据的位置。
特征:特征是UUID,它在内存中与句柄引用相同的位置。
权限:这是有关每个句柄权限信息,这些主要是:
· 读
· 写
· 通知
· 广播
数据:这是存储在该内存地址位置的数据,可以是一条消息或一段代码。
为了展示一些蓝牙术语的实际用途,我写了一个BLE CTF题目,研究了BLE蓝牙的一些关键功能以及如何使用它们。
0x02 实战解题
题目地址:https://github.com/hackgnar/ble_ctf ,https://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/如若转载,请注明原文地址: