freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

物联网攻击-攻击低功耗蓝牙设备新手指导
2018-04-24 14:46:07

i春秋作家:浅安


大家好,在这篇文章中,我们将学习怎样利用蓝牙技术攻击来攻击智能蓝牙灯泡。为了轻松一点,我将这篇文章分为两个部分。在第一部分,我们将学习基本的蓝牙理论,在第二部分,我们将实际使用这些理论。

让我们开始吧。


我们的目标—我们想要做什么?

我们有一个可以和智能灯泡交互的移动应用。

我们将使用Bluetooth CSR V4.0 dongle 远程控制灯泡(CSR V4.0 dongle是我们和智能灯泡交流的工具,相当于蓝牙收发器)。总而言之,即使我们不是灯泡的主人我们也能控制它。

蓝牙知识理论--我们都知道,蓝牙是一项历史悠久的技术,但是你可能不知道,蓝牙有两种不同的通信方式。

1) 经典蓝牙,例如 蓝牙 2.0

2) 低功耗蓝牙 例如 低功耗蓝牙 4.0

在蓝牙1.0 中,就介绍了经典蓝牙的规格。这些规格由SIG确定(SIG,蓝牙特别兴趣小组)并且所有的蓝牙制造商和服务提供商都是SIG的会员。

BLE(低功耗蓝牙) 是一种个人无限局域网。它最初由诺基亚在2006年发明并命名为Wibree,在2010年Wibree融入了蓝牙标准化。BLE 被有意设计在低功耗设备上运行。因为很多物联网设备都是低功耗设备,所以他们使用BLE来通信。事实上无线协议有很多,但是BLE是最简单且最容易实现的。


BLE 支持的系统- BLE 几乎被所有的平台支持,主要可分为下面这些:

1)   移动平台类 -Android ,Ios,windows等

2)   桌面类 - windows ,linux ,macos等

工作频率2.4-2.8Ghz


BLE体系结构,下面是BLE 体系结构

image.png

BLE体系结构包含3层

a)   主机层

b)   控制器层

c)   主机控制器接口层(HCI)

主机层和控制层以主机控制器接口 分开。

对于体系结构,我们不需要了解所有层的功能,我们只需要了解我们所需要的(GATT,GAP和ATT),让我们具体看下它们的功能。

a)   GAP—通用访问配置文件(GernericAccess Profile) ,它的作用是发现新的BLE设备.简单一句话,你的新蓝牙设备应该被其它的设备或应用发现,这样才可以连接它。这一部分的工作主要就是由GAP完成。

b)   ATT – 属性协议(AttributeProtocol),总而言之,如果我们想连接web 服务器,我们必须使用HTTP协议,HTTP连接了浏览器和服务器。可以类比,应用和蓝牙智能灯泡的连接就是ATT协议控制。

c)   GATT -通用属性配置文件(GenericAttribute Profile)。类比,我们使用浏览器与服务器交互,因此,浏览器负责交换整个数据。GATT也扮演了同样的角色。它负责在智能蓝牙灯泡和移动应用之间交换和展示整个信息。GATT只会在两个设备连接之后才会起作用。

GATT 主要是利用了服务和特征。 为了更好的理解什么是服务和特征,我们画了下面这张图:

image.png

让我们详细看下这张图,在协议内部是服务,在服务内部是几个特征。

因此

1)  协议—服务的集合

2)  服务—特征的集合

3)  特征—单个数据点

我特意没有写具体的定义,让我们看下下面这个简单的例子—假设你是一名安全顾问,你可以做网络和移动应用渗透测试,下面是你列出的自己的技能:

1) Web应用渗透测试

a). Java  应用渗透测试

b). Net应用渗透测试

c). PHP应用渗透测试

2)  移动应用渗透测试

a). Android应用渗透测试

b). ios应用渗透测试

c). Windows应用渗透测试

在上面的例子中

1) 协议就是安全顾问

2) 服务就是Web应用渗透测试技能和移动应用渗透测试技能

3) 特征就是 java 应用渗透测试技能,.net应用渗透测试技能等。

我希望通过这个例子,你能明白协议、服务、特征都是什么。

在BLE中,事实上并没有什么协议,协议只是服务的集合,你渗透任何BLE设备时也不会使用协议。

蓝牙技术联盟(bluetooth SIG)提供了所有的服务,服务列表可以从https://www.bluetooth.com/specifications/gatt/services获得。如果你打开了这个链接,你可以看到蓝牙技术联盟提供的服务列表。所有的服务都是SIG提供的。现在我们重点关注下“AssignNumber” 这一列,可以看到每一个服务都分配了一些数字,而且所有的数字都以”0x18”开头。

同样的,特征列表也是由SIG提供,你也可以打开https://www.bluetooth.com/specifications/gatt/characteristics来查看。如果你打开了这个链接,你将看到一个特征列表,所有的特征都是SIG提供的,下面我们看下“AssignedNumber”这一列,我们可以看到所有的特征都是以”0x2A” 开头,所有的“0x2A’都被保留并用于特征。


工具  有很多工具可以重放蓝牙数据包,像Ubertooth,Bluefruit和Bluetooth CSR v4.0 dongle都可以。Ubertooth使用最广泛但也最贵,因此我们使用最便宜的dongle。


关于 BluetoothCDR V4.0 Dongle – 首先看下dongle 长什么样子

image.png

上面展示是usb dongle , 它只要插入计算机就可以使用了。

准备: 首先我们得有一个智能灯泡和一个安卓应用,我们使用安卓应用控制灯泡。

详细步骤:

1) 抓取灯泡和移动设备之间的通信。Dongle 不能抓取移动设备和灯泡之间的通信,但是我们可以直接查看手机上的HCI日志。在手机上它是这样显示的

image.png

这样就可以了,我们就可以得到手机上蓝牙的传输数据了。

2) 将日志拷到电脑上。

3) 分析流量

4) 使用Bluettot CSR 重发包

过程: 我正使用Bluetooth CSR v4.0。我可以截取灯泡和智能应用间所有的通信,并用wireshark分析日志,分析完日志之后,我们可以使用CSR重放它。

这就是第一部分要讲的。在下一部分,我们将学习怎么利用CSR 进行BLE通信。

物联网攻击-攻击低功耗蓝牙新手指导

大家好。这是攻击低功耗蓝牙的第二部分。我希望在阅读这一部分之前你已经认真阅读了第一部分。如果你还没有阅读第一部分,那还是先看第一部分吧。

让我们开始第二部分吧。

简单介绍CSR(ShortPrimer On CSR。CSR即蓝牙收发器)   在这一节,我们要简单学习一下关于CSR的知识,这样我们才可以理解CSR和智能蓝牙灯泡到底是怎样交互的。正如我们在第一部分所说的,CSR就像一个普通的USB设备,我们可以把它插在电脑上。首先,我们必须检查CSR设备能不能被我们的电脑检测到?我们可以

使用hciconfig这个命令来检验。就像下面我们所操作的一样。

image.png

上图展示的是我们还没有插入CSR设备时,键入hciconfig的结果。hci0 是电脑自带的蓝牙的接口。

image.png

这张图才是CSR被电脑检测到后键入hciconfig的结果。hci1是我们将CSR设备连接到电脑后新生成的接口。正如上图所显示的,我们的CSR设备已经被电脑正常的检测到了。

第二步– 连接灯泡(Next Step – connecting to the bulb)


不管什么时候,通过蓝牙连接任何设备的第一步都是打开设备的蓝牙。我们已经打开了我们电脑上的蓝牙(即CSR蓝牙设备)。

现在我们可以扫描附近有哪些可以连接的蓝牙设备了。在我们的例子中,我们使用电脑上的CSR设备扫描智能蓝牙灯泡。为了搜索周围的设备,我们可以使用sudo hcitool lescan这个命令。lescan 这个命令可以扫描附近可用的蓝牙设备,正如下图展示的:

image.png

正如上面显示的,我们可以看到智能蓝牙灯泡的MAC地址为F4:B8:5E:E2:BA:E9.

现在我们可以使用 sudo gatttool -I -b device_mac_address 这个命令来连接灯泡了。

解释下这个命令:

-I          连接接口

-b         识别具体的mac地址

下面就是执行了这个命令的截图:

image.png

如果你仔细看了上面的截图,你就会发现在第二行我开始连接灯泡。最后一行(蓝色的一行)显示我们已经成功连上了灯泡。

现在让我们看下智能蓝牙灯泡的服务和特征。我们可以使用primary 和characteristics 命令来分别展示灯泡的服务和特征。

image.png

正如我们所看到的,这个灯泡有4个服务和21个特征。我们可以看到,第一个服务从句柄(属性句柄)0x0001 开始到句柄(结束组句柄)0x000b结束。你肯定在想,开始值是0x0001,结束值是0x000b,那这两个值之间是什么昵?对吧!

如果你还记得我们在第一部分谈论服务和特征的内容,那你一定记得我说过服务之间是几个特征。所以,0x0001至0x000b 之间的值当然是灯泡提供的几个服务。你可以通过characteristics 命令的输出结果来验证。仔细看一下,我们可以看到0x0002,0x0004,直到0x000a。在0x000a后照理应该是0x000b,但是实际上我们可以看到是0x000d。那0x000b和0x000c哪去了?

仔细看下primary命令的输出,可以看到0x000b(组结束句柄)和0x000c(属性句柄)。事实上,0x000b是第一个服务的结束句柄值而0x000c是第二个服务的开始句柄值。由此我们可以推断出第一个服务从0x0001开始到0x000b结束并且有5个特征值,特征从0x0002开始到0x000a结束。同样的,我们可以确定其它的服务,并且可以确定智能蓝牙灯泡使用了哪些特征。

句柄 每一个服务和特征都有一个独一无二的部分叫做句柄。句柄是确认一个服务或特征的基本标识。因此,每个服务与特征都必须使用句柄。同时,如果我们想改变任何一个特征的值,我们必须首先确定它的句柄。

最重要的一点 一些服务和特征的句柄是被BluetoothSIG预定义的,并且使用蓝牙的IOT的设备必须使用这些预定义的服务或特征。同时,还有一部分服务或特征是制造商在制造他们的设备时使用的。现在,我们的面临的问题是当我们渗透一个IoT设备时,我们是利用SIG已经预定义的服务或特征还是使用制造商定义的呢?

如果我们利用SIG预定义的服务,设备制造商是不使用这一部分的,他只能向SIG反映这个问题,但他无法对预定义的服务做任何修改当然更不可能修复它。所以我们必须利用制造商自定义的服务。

现在问题变成了另外一个: 我们怎样区分一个服务是SIG预定义的还是制造商定义的?让我们看下characteristics 命令输出的截图,在uuid这个区域有些值是0000fff1,0000fff2…0000fff6。规则是制造商定义的特征是都是以‘f’开头的,例如000f****。因此,当一个值是以’f’开头,你应该意识到,这个是开发商自定义的特征,我们也只能利用这些特征来渗透。我希望现在你能对哪些是开发商自定义的特征,哪些是SIG预定义的特征有一个清晰的认识了。


关于灯泡


我们使用的灯泡是Reos制造的智能灯泡。我们可以使用一款名为”ReosLite”的APP来控制这个智能灯泡。我们可以通过这个APP改变灯的颜色,接受发来的警报并且将灯切换为不同的模式。智能灯泡和相应的APP 如下图所示:

image.png

image.png

现在我将使用APP中的蓝牙来控制灯泡。同时,APP和智能灯泡之间所有的连接信息都将被记录下来并自动保存在手机中。

第一步是连接灯泡。首先我们应该打开手机的蓝牙并且打开APP,通过APP来连接灯泡,

连接过程如下图所示:

image.png

正如显示的那样,我们连上了灯泡并且将他命名为”Lite-1”。

现在,我将改变灯泡的颜色,具体的过程如下图所示:

image.png

image.pngimage.pngimage.png

这就是智能灯泡和APP交互的一个简单的全过程。


利用 这一部分我们将真正开始攻击

截止到目前,我们改变了灯的颜色,并且将所有的蓝牙包都抓取了并传到电脑。显示,我们使用wireshark打开日志:

image.png

这里打开有650-700个包。分析所有的包并不是一项简单的工作。事实上,我们只需要寻找那些写数据的特殊包,即那些在我们的例子中,改变了灯颜色的那些数据。

我是这样做的,我首先看了协议(protocol)这一列,这一共有三个协议:HCI_EVT,HCI_CMD和ATT。我googled(谷歌一下或百度一下)它们都有哪些功能。正如我得到的信息,只有ATT协议被用了写数据给灯泡而其它两个协议被用于主机控制器接口(HCI)。这就是我需要了解的唯一信息,所以我快速的只检查ATT包。

ATT包如下图所示:

image.png

在上如中,我加亮了几行。在最开始,第一个加亮的部分是从本地向别的地方写数据(即从手机向灯泡写数据)。仔细看这一行,可以看到句柄(handle)并且句柄(handle)的值为0x002b。这意味着APP通过值为0x002b的句柄(handle)写数据。在上一节,我们通过APP改变了灯的颜色,因此,我们改变颜色是通过值为0x002b的句柄。

现在来看第三个加亮的部分—我们看到名为Value的区域。并且Value的值类似0f0d03。。。

现在我们需要明白,0f0d03….这些字符串其实就是被值为0x002b的句柄拿来改变灯的颜色的。同样的,我们通过分析ATT包,我们可以得到很多这样的值,如下图所示:

image.png

现在我们拥有这些Value对应的值及相应的句柄。我们要做的就是—简单的重发这些包。为了重发这些包,我们需要借助一些工具,在这里,我们使用的就是上文介绍的CSR(蓝牙收发器)。同时我们也需要上文的值为0x002b的句柄对应的值。现在,我将CSR连上了电脑,通过使用char-write-req handle_value value这个命令来改变灯的颜色。

命令的解释

handle_value  句柄(handle)的值

value         灯的颜色的值

同样,这个命令的截图如下图所示:

image.png

正如上图所示: 我们只是确定了句柄的值(例如0x002b)和其对应Valuefield 的值,这样,我们就能改变灯的颜色,如下图所示:

image.png

综上所述,这个就是我们远程控制灯泡并且改变灯的颜色,即使我不是灯的主人。


本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者