Bluetooth Low Energy 嗅探

简介: 0x00 前言 如果你打开这篇文章时期望看到一些新的东西,那么很抱歉这篇文章不是你在找的那篇文章。因为严格的来说这只是一篇整理文。里面没有任何我的发现,也没有我的实际案例。因为我手头上暂时还没有一个有趣的蓝牙低功耗设备。

0x00 前言

如果你打开这篇文章时期望看到一些新的东西,那么很抱歉这篇文章不是你在找的那篇文章。因为严格的来说这只是一篇整理文。里面没有任何我的发现,也没有我的实际案例。因为我手头上暂时还没有一个有趣的蓝牙低功耗设备。整篇文章的基础都建立在mike ryan这几年公布的演讲内容之上。

0x01 BLE

BLE是什么?BLE全称bluetooth low energy中文又称蓝牙低功耗。最早被人们所知道是在2010年的时候出现在了bluetooth4的spec当中。由于它比传统的蓝牙更能控制功耗和成本,所以在公布之后开始被广泛地应用了起来。

比如:运动手表,蓝牙智能鼠标,一些超昂贵的智能滑板又或者是一些医疗器材上。bluetooth smart的字样几乎随处可见。由于用户喜欢低功耗,厂家喜欢低成本它便成为了很受欢迎的一样东西。

BLE和传统的蓝牙有着许多不同之处。它们使用不同的modulation参数,使用不同的频道(但仍然是2.4GHz),使用不同的频率跳变,使用不同的包格式,即使是数据白化方面也有着诸多不同。当然了,它们也存在一些共同之处。它们还是会使用传统的主控设备-从属设备模式。虽然它的ph层 link layer 层和传统的蓝牙不相同但l2cap层att层还是相同的。

0x02 环境搭建

因为它是无线通讯,所以这很容易让我们联想到我们可以实施的一些攻击手段。如果可能的话,我们想去嗅探,想去进行包注入,在有必要的时候进行jamming来完成我们余下的攻击。听上去好像没有那么难,也没有那么新鲜。但实际上蓝牙嗅探实现起来却并没有想象的那么简单。对于wifi我们可以购买一张支持监听模式的网卡。但对于蓝牙根本就存在这么欢快的模式。这意味着我们需要一个这样的设备。两个选择,造一个或买一个。幸运的是已经有人做出来了,虽然在功能上还有许多问题(多在于控制成本,我觉得mike应该不会遇到技术上的困难。。),但对于ble嗅探来说还是可以胜任的。so 它就是ubertooth one。

对于ubertooth one的环境搭建,我认为已经有了一个很友好的文章。所以,如果你在看完这篇文章后想买一个或者买了一个不知道怎么去配置你可以参考这篇文章

如果上面的文章被一股神秘的力量拦截了,你可以直接参照下面的内容。

首先,你需要拥有一个ubertooth one。从某宝入手又或者是从乌云集市购入。为了方便测试还需准备一个buletooth dongle。你的操作系统可以是win,linux或者是mac。本文将以kali linux为例进行安装步骤的讲述。

先安装这些

sudo apt-get install cmake libusb-1.0-0-dev make gcc g++ libbluetooth-dev \
pkg-config libpcap-dev python-numpy python-pyside python-qt4

完成之安装libbtbb

wget https://github.com/greatscottgadgets/libbtbb/archive/2015-09-R2.tar.gz -O libbtbb-2015-09-R2.tar.gz
tar xf libbtbb-2015-09-R2.tar.gz
cd libbtbb-2015-09-R2
mkdir build
cd build
cmake ..
make
sudo make install

安装ubertooth工具(kali自带的最好remove掉,因为版本太旧)

wget https://github.com/greatscottgadgets/ubertooth/releases/download/2015-09-R2/ubertooth-2015-09-R2.tar.xz -O ubertooth-2015-09-R2.tar.xz
tar xf ubertooth-2015-09-R2.tar.xz
cd ubertooth-2015-09-R2/host
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig

安装kismet(安装前同样remove掉系统自带的)

sudo apt-get install libpcap0.8-dev libcap-dev pkg-config build-essential libnl-dev libncurses-dev libpcre3-dev libpcap-dev libcap-dev
wget https://kismetwireless.net/code/kismet-2013-03-R1b.tar.xz
tar xf kismet-2013-03-R1b.tar.xz
cd kismet-2013-03-R1b
ln -s ../ubertooth-2015-09-R2/host/kismet/plugin-ubertooth .
./configure
make && make plugins
sudo make suidinstall
sudo make plugins-install

将"pcapbtbb"加入到kismet.conf的logtypes= 当中。

安装wireshark

sudo apt-get install wireshark wireshark-dev libwireshark-dev cmake
cd libbtbb-2015-09-R2/wireshark/plugins/btbb
mkdir build
cd build
cmake -DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu/wireshark/libwireshark3/plugins ..
make
sudo make install

安装BR/EDR插件

sudo apt-get install wireshark wireshark-dev libwireshark-dev cmake
cd libbtbb-2015-09-R2/wireshark/plugins/btbredr
mkdir build
cd build
cmake -DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu/wireshark/libwireshark3/plugins ..
make
sudo make install

最后千万不要忘记更新你的firmware

跳到刚才解压过的 ubertooth-2015-09-R2目录。

Cd ubertooth-one-firmware-bin
$ ubertooth-dfu -d bluetooth_rxtx.dfu -r
Checking firmware signature
No DFU devices found - attempting to find Ubertooth devices    

1) Found 'Ubertooth One' with address 0x1d50 0x6002    

Select a device to flash (default:1, exit:0):

按下回车。完成firmware的更新。如果失败了或出现了莫名其妙的usb错误。不要慌张。试试

ubertooth-util -v

如果出现

Firmware revision: 2014-02-R1
$ ubertooth-util -V
ubertooth 2014-02-R1 (dominicgs@mercury) Wed Jan 29 23:10:46 GMT 2014

就意味着应该没有什么太大的问题。折腾到这里你的环境搭建问题就差不多都解决了。

0x03 嗅探的基础理论概念

让我们继续回到技术之上。我们想要的应该不是坐享其成。所以让我们试着了解一下ble,先看看ble栈长什么模样(如图1 所示)。

图1 BLE栈

ble栈应该和你看过的ip包很像。最上面绿色的部分是应用层,主要是gatt和att我们可以把它看作是同一层。sm是安全管理层,负责管理安全。最下面link layer层和phy层基本上就是一些rf的处理。因为这次的内容主要是集中在sm,link layer和phy层上,所以对于应用层不会有相关的叙述和解释。让我们试着从下往上看起。

phy layer使用gfsk进行modulation如果你是rf hacking的爱好者,你应该对这个东西不陌生。和传统的蓝牙不同在ble的世界里只有40个频道,也就是传统蓝牙的一半。其中有37个频道用于数据传输,不被用到的频道都会被gap所替代。然后就是hopping 也就是所谓的频率跳变。和wifi或zigbee等不同。蓝牙喜欢打一枪换一个地方。每一个频道上都只会发生一次数据传输。一个request和一个response。在完成之后根据hope increment会跳到下一个频道。

幸运的是ubertooth one内置的 cc2400可以帮助我们完成这些操作。我们不用去编写什么程序,我们不用去造一个轮子,我们只需要去配置一下相关的设定。设置完毕后我们就可以借助ubertooth one来获取我们想要的bits。

让我们继续往上看,来看看 link layer。通过查阅ble的spec我们可以获知link layer的包格式看上去是这样:

看上去link layer的格式并不复杂。它包含前导码,访问地址,PDU和CRC校验码。不过似乎有点问题。因为我们前面所提到的都是bits我们需要的是bits,而这里说的都是octets。如何获取我们想要的bits?首先通过ubertooth one我们可以截获海量的数据。所以我们有很多数据。但是我们需要区分开什么是什么。怎么做到呢?我们需要的就是等待我们的已知量access address的出现。根据spec加上小学数学功底,推出前后的数据都是什么。这样一来我们就拥有了整个link later的bits数据。 拥有了这两层之后我们就可以将RF转换成数据包了。

So ubertooth负责这两层我们都搞定了,其它层都可以交给pc去处理,所以问题解决了么?

还没有。因为btle喜欢打一枪换一个地方。所以我们还需要考虑如何去跟踪connection(配对的时候会在37,38,39个三个频道随机跳,起点位置未知。由于ubertooth one 一次只能监听一个频道,所以实战时可能需要多测试几次才能抓到我们需要的6个包来破解tk)。跟踪connection需要知道4样东西。

Access address
crcinit
time slot length
hop increment

但如何才能获取这些数据呢?对于aa我们可以坐等数据的流过,重点检查空数据包,因为我们知道空数据包的结构是什么样的,所以我们只需要在截获的数据包中往会跳32bit来获取我们的access address。使用lfsr来还原crcinit.坐等在某个频道等待两个连续包的出现来计算time slot length = Δt / 37,最后再通过我们的高中数学功底来计算出hop increment.(原作者怕观众无聊就一笔带过了太过于数学话的部分)。

anyway,经过这一系列的折腾我们现在具备了跟踪connection的条件。这也就意味着我们可以嗅探ble了。

0x04 BLE通讯的加密

but wait,难道ble就没有加密么?答案是有,它使用了著名的aes-ccm(不过还是有很多设备的通讯是不加密的 。我不是蓝牙开发者,但这应该和采用的security model有关吧。看了下spec里头说model0和model1没有加密)也许这让你想起了wpa-aes因为它们是一样的加密方式。所以写了这么多,这是在逗我么?答案是,no。因为俏皮的ble使用了自定义的密钥交换协议。它的自定义密钥交换协议又怎么了?让我们先看看它是怎么匹配的,又或者是它有几种匹配模式。

Just works
6 digit pin
OOB

其中的just works 用起来也就是just works。怎么说?因为它永远用0作为tk来进行配对。6 digit pin。名字和内容差不多,使用0-999999之间的数字来当tk来使用。对于爆破来说,实在是太脆弱。实际测试当中爆破6 digit pin都用不到1s。OOB全称out off band,会使用很麻烦的方式进行匹配,暂时没有什么设备在用这种模式。拥有了tk能做什么呢?让我们看看一个例子。

小明新买了个酷炫狂拽的ble设备。开始和自己的其它设备进行配对。黑客配备好自己的ubertooth观察整个配对过程。如果配对使用了just works 或 6 digit pin 黑客通过暴力破解秒获tk。根据tk和配对数据包还原出stk,根据stk和密钥交换获得ltk。

但是需要注意的是为了拥有tk,你起码要在配对进行时抓到下面的6个包:

pairing request
pairing response
pairing confirm
pairing confirm
pairing random
pairing random

由于配对会在37,38,39三个频道进行,外加ubertooth one一次只能监听一个频道,所以最幸运的情况是配对从ubertooth-btle 默认频道37开始进行,随后的部分由ubertooth帮你完成余下的connection跟踪,来完成整个6个包的抓包。如果抓不到你就需要多试几次。。(便宜货嘛,将就点啦 )

凑够了6个包后将你抓到的包交给神器crackle ,crackle将会为你破解tk和我们的日思夜想的ltk。拥有了ltk我们就可以解密我们嗅探的所有的包!那有了ltk我们是不是就可以直接取代原来的从属设备了呢?还做不到。因为connection还包含一个随机量。。这就没得玩了?也不是,我们需要做的就是jam掉已经有的connection拿着我们的ltk和主控设备去做一些羞羞的事情。

0x05 测试

测试设备是否可以在当前环境下正常运作,可以先试试wifi

root@kali:~/Desktop# ubertooth-specan-ui

手头上没有bluetooth smart设备?那咱就模拟一个。分别在ios设备1和ios设备2上从appstore下载并安装lightblue。设备A模拟主控设备,设备B模拟从属设备

在这里我们装扮成了一个心率计算设备。试图进行匹配。在这个时候攻击者需要提前准备。你可以选择使用pipe来实现实施监听。

root@kali:~# mkfifo /tmp/pipe

打开wireshark

Capture -> Options -> Manage Interfaces -> New

输入 /tmp/pipe

点击start开始监听。

然后千万别忘了把ubertooth抓到的内容输出到pipe

root@kali:~# ubertooth-btle -f -c /tmp/pipe

最最后,不要忘了这一步。不然你抓到的包根本看不成

Edit → Preferences → Protocols → DLT_USER → Edit → New

在payload protocol中输入btle

ok → ok

如果你想把抓好的包带回家慢慢整,你可以简单的包抓取的内容输出到某个目录下

ubertooth-util -r ; ubertooth-btle -f -c /output.pcap

抓到包之后我们最关心的问题是我们有没有抓到的足够的包来破解tk。所以在wireshark中你可以在filter处加上btsmp,确保抓到了我们需要的6个包。

确定抓到了包之后我们去下载神器crackle。

Git clone https://github.com/mikeryan/crackle.git
cd crackle
make
make install

安装完成后,开始借助cracle和我们抓到的包依次破解tk和ltk

从上图中我们可以看到我们不但破解了tk,还利用利用tk和其它一些数据成功的还原出了ltk。

接下来我们再来试试利用获取的ltk来破解其他的加密包。假设我们在配对过程中已经拿到了

ltk=7f62c053f104a5bbe68b1d896a2ed49c

crackle -l 7f62c053f104a5bbe68b1d896a2ed49c -i test44.pcap -o test66.pcap

可以看到我们成功地破解了7个包。

0x06 解决方案

使用OOB

root@kali:~/Desktop# crackle -i heart.pcap 
Warning: No output file specified. Won't decrypt any packets.
Warning: found multiple connects, only using the latest one
Warning: found multiple LL_ENC_REQ, only using latest one
Warning: found multiple connects, only using the latest one
Warning: found multiple pairing requests, only using the latest one
Warning: found multiple connects, only using the latest one
Warning: found multiple pairing requests, only using the latest one
Warning: already saw two random values, skipping
Warning: found multiple LL_ENC_REQ, only using latest one
TK not found, the connection is probably using OOB pairing
Sorry d00d :(

等待支持bluetooth4.2的设备的出现(通过ECDH解决)

0x07 总结

其实第一次发现通过这个设备加上一些软件可以破解btle嗅探到的包时,我是很兴奋的。因为我之前一直都没有见过这样的文章。不过后来和小伙伴们聊了一下,才意识到这一切的前提条件是你得在第一次匹配的时候抓到所有的关键包(如果你只有1个ubertooth意味着你只有1/3的机会)。不过遗憾的是很多设备在完成第一次的匹配之后就会记忆彼此。下次通讯时不会再重新进行匹配。所以为了让这种攻击更现实一些,也许研究如何unpairing会是一个方向。最后感谢索马里的海贼赞助的Ubertooth One。

参考:

相关文章
|
存储 安全 算法
【BLE】 BLE配对绑定保姆级介绍
实现蓝牙通信安全,除了paring/bonding这种底层方式,用户也可以在应用层去实现相同功能,两者从功能上和安全性上没有本质区别,只不过应用层自己实现的话,需要自己选择密码算法,密钥生成,密钥交换等,如果你不是这方面的专家,你的应用就有可能会存在安全漏洞。设备跟手机绑定成功后,手机再次重连这个设备时,就会自动跳过service discovery过程,换句话说,配对的时候手机会把设备所有服务和characteristic的handle保存下来,二次重连的时候,直接用以前保存的handle值去操作设备。
6006 1
【BLE】 BLE配对绑定保姆级介绍
|
人工智能 编解码
ReCamMaster:视频运镜AI革命!单镜头秒变多机位,AI重渲染颠覆创作
ReCamMaster 是由浙江大学与快手科技联合推出的视频重渲染框架,能够根据用户指定的相机轨迹重新生成视频内容,广泛应用于视频创作、后期制作、教育等领域,提升创作自由度和质量。
1054 0
|
12月前
|
人工智能 安全 Apache
Unity Catalog 三大升级:Data+AI 时代的统一治理再进化
在刚刚落幕的 2025 Databricks Data + AI Summit 上,Databricks 重磅发布了多项 Lakehouse 相关功能更新。其中,面向数据湖治理场景的统一数据访问与管理方案 —— Unity Catalog,迎来了三大关键升级:全面支持 Apache Iceberg、面向业务用户的全新使用体验,以及数据治理与安全能力的持续增强。
|
Kubernetes 监控 Docker
Docker Compose与Kubernetes的比较
【6月更文挑战第11天】本文探讨了Docker Compose与Kubernetes在容器编排中的角色。Docker Compose适合简单部署和开发环境,提供一键启动多容器的便利;而Kubernetes则适用于大规模生产环境,具备自动化运维、集群管理和负载均衡等功能。Python在容器编排中扮演重要角色,示例代码展示了如何使用Python的Docker SDK和Kubernetes客户端进行部署、扩展和日志管理。通过Python,开发者可以实现自定义监控、自动水平扩展和实时日志监控等高级功能,增强了容器编排的灵活性和自动化。
Docker Compose与Kubernetes的比较
|
测试技术 持续交付 开发工具
吞噬混沌:CodeBuddy与流程利刃,斩破游戏开发的蛮荒时代(二)
本文参加CodeBuddy「首席试玩官」大赛,探讨游戏开发流程规范与智能工具赋能。文章涵盖质量保障体系(每日构建、代码审查、测试会议)、开发工具链、紧急情况处理(热修复与回滚机制)及代码风格指南。重点介绍CodeBuddy在各环节的作用:优化构建、智能评审、加速修复、保障风格一致等。作为贯穿生命周期的智能助手,CodeBuddy连接工具链、提升效率、沉淀经验,助力团队实现高质量开发目标。未来游戏开发需结合规范与技术,CodeBuddy将成为不可或缺的智能向导。
583 7
|
JavaScript
HarmonyOS NEXT鸿蒙实现自定义组件插槽
在HarmonyOS NEXT中,通过`@BuilderParam`装饰器实现类似Vue-Slot或React-RenderProps的功能,允许将UI结构的函数作为参数传递给组件并在指定位置渲染。具体步骤如下:
283 5
HarmonyOS NEXT鸿蒙实现自定义组件插槽
|
Ubuntu 数据可视化 Linux
Ubuntu下载、安装QGIS软件的方法
Ubuntu下载、安装QGIS软件的方法
861 2
|
存储 安全 物联网
浅析Kismet:无线网络监测与分析工具
Kismet是一款开源的无线网络监测和入侵检测系统(IDS),支持Wi-Fi、Bluetooth、ZigBee等协议,具备被动监听、实时数据分析、地理定位等功能。广泛应用于安全审计、网络优化和频谱管理。本文介绍其安装配置、基本操作及高级应用技巧,帮助用户掌握这一强大的无线网络安全工具。
1847 9
浅析Kismet:无线网络监测与分析工具
|
人工智能 安全 数据安全/隐私保护
HarmonyOS应用开发实战:基于ArkTS的开箱即用登录页面实现【样式方式实现①】【HarmonyOS 5.0(Next)】
本文介绍了基于HarmonyOS 5.0(Next)和ArkTS实现的开箱即用登录页面。HarmonyOS 5.0是华为于2024年10月22日发布的第三代移动操作系统,具备原生智能、互联、安全及流畅特性。文章详细解析了使用ArkTS开发登录页面的代码,涵盖组件定义、界面布局、事件处理、样式设置及异步操作等内容,展示了清晰的组件结构、响应式设计与模块化编程的优势。通过这段代码,开发者可以快速上手并构建高效、美观的应用界面。