“传统蓝牙”规范在2.4GHz的ISM波段上定义了79个信道,每个信道有1MHz的带宽。设备在这些信道中以每秒1600次的频率进行跳转,换句话说,就是每微秒625次跳转。这项信道跳转技术被称为“跳频扩频”(Frequency HoppingSpread Spectrum,FHSS),这时的蓝牙设备中,用户最大可以达到3Mbps的通信带宽,最大约为100米的传输距离。“跳频扩频”通过在射频(RadioFrequency,RF)频谱中快速地移动,针对噪声信道为通信提供鲁棒性(robustness)。
任何通过蓝牙技术进行无线通信的设备,需要通信双方在同一时刻处于同一信道之内如下图所示。通过协调的方式进行跳频的所有设备可以相互进行通信,它们共同组成了一个蓝牙的“微微网”。“微微网”是两个或者多个蓝牙设备之间使用的基本网络模型。每个“微微网”都有一个“主设备”(master)和一个到七个“从设备”(slave)。“微微网”中的通信是严格在一个“从设备”和一个“主设备”之间进行的。“微微网”中使用的信道跳跃的顺序是伪随机性的(pseudorandom),它只能通过“主设备”的地址和时钟产生
“设备发现”技术
就像所有的无线协议一样,使用蓝牙进行通信时,也同样需要确认在功率覆盖范围内是否有可能的“接入点”(peer),这个似乎并不难,只要大家同一频率,使用相同的通信协议握手即可,而当使用“跳频扩频”技术的时候,这个问题会变得非常复杂。假定在某一段时间内,有两个蓝牙设备已经在“微微网”中开始交互操作,这当然意味着它们两个设备的跳频的序列是一致的。但是每一个设备同样是“可发现的”(discoverable),这意味着这个蓝牙设备会周期性地广播它的“蓝牙设备地址”(BluetoothDeviceAddress,BD ADDR)到其他还没有加入到这个“微微网”的蓝牙设备上,以便这些设备可以通过它的广播找到它。在这种情况下,这个蓝牙设备就必须暂时地停止它在“微微网”中的跳频动作,然后进入“监听”状态,以便监听是否有其他可能的蓝牙设备正在找自己,如果有,则对那些请求做出回应,然后回来找到原来那个跟自己在“微微网”中通信的蓝牙设备,继续之前的通信过程。这种定期检查其他设备是否在找自己的机制,称为“可发现的”。
许多蓝牙设备默认都不是“可发现的”,所以你需要专门开启这项功能,这通常需要一段时间该操作才能生效。在你打开一些以iOS作为系统内核的移动设备的蓝牙配置“设置”(Settings)页面时,系统会默认进入“可发现的”模式。如果某设备无视其他设备的“发现请求”(discoveryrequest,或者也不主动寻找其他设备的“发现请求”,那么这个设备就称为“非可发现的”(non-discoverable)设备。要与这种“非可发现的”设备进行通信,唯一的方法就是通过其他一些手段,在拿到它的“蓝牙设备地址”以后,再通过“蓝牙设备地址”进行通信
协议概述
在一个蓝牙网络中,可能使用着的协议数量足以令人咋舌。这些协议通常可以分成两类:一种是在“蓝牙控制器(Bluetooth controller)之间通信使用的,另一种是在“蓝牙主机”(Bluetooth host)之间通信时选择使用的。因为本书属于无线网络安全的主题,所以上面所说的“蓝牙主机”就是我们从笔记本电脑上运行攻击程序所攻击的对象。“蓝牙控制器”则是内置在笔记本电脑里的USB芯片组(chip),或是USB加密狗(dongle),接受“蓝牙主机”的命令,并解释执行这些命令
如图显示了蓝牙协议栈中各层(layer)的组织结构,以及在每一层中,具体实现了哪些协议。
从图中可以看到,“蓝牙控制器”负责跳频,基带封装(basebandencapsulation)并且将适当的结果返回到“蓝牙主机”。
“蓝牙主机”负责处理更高层的协议,尤其是“主机控制接口”(Host Controller Interface,HCI)连接,它是“蓝牙主机”(你的笔记本电脑)和“蓝牙控制器”(你的蓝牙适配器中的芯片组)之间的通信接口。
在和蓝牙打交道的时候,需要把这个“蓝牙主机”/“蓝牙控制器”的模型放在你的脑海中。
但作为黑客,我们最渴望的是对设备绝对的控制权,以便于可以操纵它的行为。如果将图中的“蓝牙控制器”部分从整个模型中分离出来,那就意味着对于“蓝牙控制器”控制的那部分功能,我们都只能任由摆布而无可奈何。无论我们想让“蓝牙控制器”做什么,比如“始终保持在信道6上,不要再接收后面的包”,除非将这些要求转换为一系列的“主机控制接口”请求,或者通过另一种方式实现这些功能,否则无法达到预期的目的。最终导致我们对于这个无线设备没有那么多的控制能力。
(1)射频通信协议
“射频通信协议”( Radio Frequency Communication,RFCOMM)是蓝牙设备中采用的传输协议,使用该协议的蓝牙设备,一般是那些需要稳定的基于“流”(streams-based)的传输,这点和TCP协议很相似。“射频通信协议”被广泛应用于模拟串口通信,向电话设备发送 AT命令集(又称“Hayes 命令集”),在“对象交换协议”(Object Exchange,OBEX)协议上传输文件。
(2)逻辑链路控制及适配协议·逻辑链路控制及适配协议”(Logical Link Control and Adaptation Protocol,L2CAP)是基于数据报文(datagram-based)的协议,该协议主要用于传输更高层的协议,比如“射频通信协议”和其他上层协议。一个应用层的程序员可以将“逻辑链路控制及适配协议”作为一种传输层协议使用,由于它是基于数据报文的,所以它的运行和UPD协议的运行很相似,是不可靠的连接方式,采用的是基于消息的数据传送机制。
(3)主机控制接口协议
如前面所说,蓝牙标准规定了使用“主机控制接口协议”的接口层来控制蓝牙芯片组这些芯片组就是上面提到的“蓝牙控制器”。对于开发者来说,要访问标准蓝牙硬件的协议栈,远程“友好设备”(device-friendly)名称检索,连接建立以及终止,“主机控制接口协议位于他们所能访问到的协议栈的最底层。
(4)连接管理器协议连接管理器协议”(Link Manager Protocol,LMP)位于“蓝牙控制器”协议堆栈的顶部,通过特定的硬件才能够访问它,换句话说,没有特定的硬件,这个协议是不可访问的因此“连接管理器协议”主要用于处理那些“低层次加密”(1ow-evel encryption)、信息验证(authentication)、数据配对(pairing)等操作。虽然通过控制“蓝牙主机”也可以完成这些功能,并可以明确地请求这些操作,但是“蓝牙控制器”的职责就是决定应该发送哪种类型的数据包,以及如何处理结果。
(5)基带层
和“连接管理器协议”层类似,开发者在没有特定硬件工具的前提下,是无法访问基带(baseband)层的。蓝牙的基带层主要规定了空中传输的参数(比如传输的速率),数据包最终在哪一层是形成帧,以及确定传送和接收的信道
(6)蓝牙设备地址“蓝牙设备地址”是一个48位(共6个字节)的数据,由三部分组成。
非必要地址部分“非必要地址部分”(Nonsignificant Address Part,NAP)有16 位长度位于“蓝牙设备地址”的前16位,是“组织唯一标示符”(Organizationally UniqueIdentifier,OUI)的一部分。这一部分被称为“非必要”的原因是这 16位不会在跳频和其他蓝牙派生函数中使用。(前两个字节)
高位地址部分“高位地址部分”(UpperAddressPart,UAP)有8位,是“组织唯一标示符”的后8位部分。(中间一个字节)
低位地址部分“低位地址部分”(Lower AddressPart,LAP)有 24位,用来标识一个独一无二的蓝牙设备。 (后三个字节)
不像其他的无线协议中地址是公开并广泛使用的参数,在蓝牙网络中,“蓝牙设备地址是作为一个秘密信息,不对外公开的。在以太网以及Wi-Fi无线网中,数据帧中都包含有地址,而在蓝牙通信中,“蓝牙设备地址”并会不包含在数据帧的头部进行传输,从安全的角度,这样就防止了攻击者使用侦听技术轻而易举地发现“蓝牙设备地址”的值。更为巧妙的是,恰恰是没有“蓝牙设备地址”信息,所以攻击者很难发现网络中正在使用的跳频规律从而更增加了数据通信数据包的侦听难度
加密和认证
加密和认证是直接包含在蓝牙标准规范中的,它直接在“蓝牙控制器”的芯片组中实现这对于使用者和开发者来说是一种节约成本的措施。加密和认证使用与否是可选的,协议的开发商可以既不认证,也不加密;或者二者选择其中之一;或者两者皆用。
蓝牙的认证或者使用“传统配对”(traditionalpairing)方式,或者使用在“蓝牙2.1规范(Bluetooth 2.1specification)中新设计的“安全简化配对”(SSP)方式。下面的内容中,我们将会讲解这两种认证机制。
1.传统配对
在当前大多数的蓝牙设备上,尽管“传统配对”认证的交换方式仍然在使用,但在“蓝牙 2.1规范”中,“传统配对”方式被“安全简化配对”方式所取代。在使用“传统配对”方式中,当两个设备第一次相遇的时候,它们会完成一次配对交换,在这个过程中,每个蓝牙设备都从“蓝牙设备地址”中会派生出一个“安全密钥”(securitykey)、一个“个人识别号码”personal identification number,PIN),以及一个随机数,其中的“安全密钥”又称为“连接密钥”(link key)。当交换过程结束的时候,两个设备都会将“连接密钥”信息存储在本地的
'非易失性存储器”(local nonvolatile memory)中,以便在之后的认证交换中使用,以及需要使用的时候,用来派生“加密密钥”如果一个攻击者捕获到用于派生“连接密钥”的“传统配对”方式交换过程,同时也捕获了随后的认证交换过程,那么他随后攻击所选择的“个人识别号码”是完全有可能的。通常来讲,这是通过“个人识别号码”的“暴力攻击”(brute-forcc attack)来实现的,也就是通过猜测的“个人识别号码”计算,生成一个可能使用的“连接密钥”,随后将本地计算的认证结果同合法交换过程中的结果进行比较,最终检验所猜测的“个人识别号码”是否正确详细的计算过程和攻击技术细节,我们会在后面进行讲解。
2.安全简化配对
在我们刚刚介绍的“传统配对”策略中,存在的最大问题就是这个实施被动式攻击的攻击者在捕获配对数以后,能够迅速地还原得到“个人识别号码”和存储的“连接密钥”。如果这个攻击者成功地拿到“连接密钥”,那么他就可以通过蓝牙网络解密所攻击的这一对蓝牙设备上的所有数据包交换,还能伪造合法设备参与其中。“安全简化配对”方式则会阻止这种被动式攻击的攻击者获得“连接密钥”,并且对于不同的蓝牙设备类型,提供多种认证选项。
“安全简化配对”方式通过采用“公钥密码学”(public keycryptography)的策略来改善蓝牙认证交换过程中的安全性,特别是通过“Difie-Hellman“圆曲线密钥”(Elliptic CurveDifie-Hellman,ECDH)算法实现交换机制。一次 Difie-Hellman的密钥交换允许两台对等的蓝牙设备先交换“公钥”(public key),然后从中派生出一个“共享密钥”(shared secret)这个密钥对于捕获者来说是无法再生成的。这个产生出来的密钥被称为DHKey(即DiffieHellman key)。最终“连接密钥”由DHKey派生,并在随后的认证和加密过程中使用。通过 DHKey 交换算法的使用,一个强大的“熵池”°(entropypool)可以用来派生双方设备上的“连接密钥”。这个强大的“熵池”解决了“传统配对”派生中最大的问题,那就是在“熵池”,每一个单一的资源只是一个很小的“个人识别号码”值。在介绍完了蓝牙技术的组成之后,我们就可以以攻击者的视角来讲解蓝牙了。同样我们会讲解各种攻击蓝牙技术的方法,深度挖掘支持这一全球标准的各相关技术和组件。
侦察
在蓝牙攻击的侦查(reconnaissance)阶段,我们可以借助“目视检查”(visualinspection)和“组合发现”(hybrid discovery),通过“主动式发现”(active discovery)和“被动式发现"(passive discovery)方式,在附近区域,检查并确定“要攻击的”蓝牙设备。这里的“发现”进程就是确定存在的蓝牙设备,以及寻找到每个设备的48位“蓝牙设备地址”
一旦你发现了一个蓝牙设备,就可以开始枚举这个设备上所使用的服务,确认可能的攻击目标。还可以采集远端设备的特征值(fingerprint),使用蓝牙嗅探工具(snifingtool)捕获“微微网”中的数据,进而获得访问机会。下面,我们就详细讲解这些步骤。
激活蓝牙
hciconfig
hciconfig hci1 up
主动式扫描
Linux 上使用 hcitool 进行设备发现
Linux的标准命令hcitool可以用来进行“蓝牙发现”和基本的“服务枚举”。与前面各工具相比,该命令具有一定的智能化,即当在扫描的时候,hcitool程序会缓存所有已扫描好的蓝牙设备的相关信息,这意味着,如果有某个蓝牙设备离开了自己信号覆盖的有效范围后,程序仍然能够潜在地告诉你。当然,如果你对这个功能没有兴趣,你只想关注当前自己信号覆盖以内的蓝牙节点,也就是说强制hcitool程序不要对结果进行缓存,那么可以通过“--flush”参数进行指定。另外,默认情况下,hcitool程序只会显示扫描到蓝牙设备的“蓝牙设备地址”和“设备名称”两项信息,如果你想获得更详细的信息,可以通过加上“--all”参数来实现。
hcitool scan --all --flush(执行蓝牙设备的全面扫描,并刷新缓存)
对于每一个蓝牙设备,在接到查询命令时,都会做出回复,而hcitool程序正是从这些回复中提取设备的信息。这些信息可以包含“蓝牙设备地址”、设备名称和设备类型、无线生产商(radio manufacturer)、“连接管理器协议”的版本号,以及详细的枚举信息。
Linux 上使用 BTScanner 进行设备发现(推荐)
- h:帮助 (help)。按下此键可获取 btscanner 的帮助文档和命令列表。
- i:查询扫描 (inquiry scan)。按下此键将在附近的蓝牙设备中执行查询扫描,以获取设备的基本信息。
- b:强制扫描 (brute force scan)。按下此键将执行强制扫描,尝试获取更详细的信息,如服务和特征的列表。
- a:中止扫描 (abort scan)。按下此键将停止当前的扫描操作。
- s:保存摘要 (save summary)。按下此键将保存当前扫描结果的摘要到文件中。
- o:选择排序 (select sort)。按下此键将打开排序菜单,允许你选择按特定字段对扫描结果进行排序。
- Enter:选择 (select)。按下此键将选中当前光标所在的设备进行进一步操作。
- Q:退出 (quit)。按下此键将退出 btscanner。
虽然使用hcitool命令行工具进行快速的蓝牙设备扫描是很方便的,但是这个命令没有持续扫描的能力,这个命令只在发现有蓝牙设备在自己功率覆盖范围之内时更新一下显示结果。要解决这个不足,让对于这种类型的扫描一直处于持续进行中的显示状态,那么Linux上的BTScanner工具则是一个更好的选择,这个工具在持续扫描蓝牙设备的同时,提供一种简单的、基于文本的接口,将每个发现的蓝牙设备,都以一行内容的效果显示出来。虽然只用一行信息显示,但并不意味着这个工具显示的内容少,可以这么说,除了配对(pairing)信息之外,BTScanner 工具会尝试收集尽可能多的信息。如果用户选择显示某个指定的蓝牙设备时,这个工具会提供一个与这个蓝牙设备相关的详细信息视图。
注意:BTScanner 中存在的 bug
bug 像瘟疫一样遍布在许多新的程序中,许多黑客工具也都难于幸免,BTScanner程序也不例外。现在的 BTScanner 程序,其原作者已经多年没有对它进行维护升级了,这导致程序中存在的 bug至今仍然存在着。
消失的设备
在BTScanner程序的显示中,设备列表中正在显示的蓝牙设备,会突然莫名其妙地消失。在遇到这种问题时,要想找回消失的蓝牙设备,一个变通方案是:如果设备从显示列表中突然消失,则按小写字母键“0”打开“选择一种排序方法”(Enter ASort Mcthod)对话框,然后随便按什么排序,以便改变当前的显示顺序,然后再按小写字母键“f”和“回车”键回到上一级显示中,这时消失的设备就会因为重新排序而出现。无法启动 BTScanner程序 在“终端”窗口中,运行BTScanner程序需要终端窗口至少有80个字符的显示宽度。如果你尝试在小于这个宽度的终端窗口中打开BTScanner程序运行的话,你会看见“状态栏”显示“已完成读取 OU】数据库”(Finished reading theOUl database)的状态信息提示,然会返回到Shell 外壳命令行提示状态。所以,在开启BTScanner程序之前,首先确认你的终端窗口至少有80个字符的宽度(最好有24个字符的高度)或者更大
调整尺寸时会崩溃,如果你在BTScanner程序运行的时候,尝试调整“终端”显示窗口的大小,那么BTScanncr程序就会崩溃,并提示“分段的'段地址’访问错误”Segmentation fult)。避免这种情况,需要在开启BTScanner之前,先确认你要使用的窗口大小是否合适,如果不合适,马上调整,直到“终端”窗口的尺寸合适了,再运行程序否则,在退出BTScanner程序之前,不要尝试调整“终端”窗口的大小。
BTScanner程序创建的所有目录和日志数据都只有root用户才能够访问,所以如果在使用cd命令转换到bts目录时遇到了“禁止访问”(Permission denied)的提示信息则需要运行“sudo su”命令切换到root 权限才行
apt-get install btscanner 安装
btscanner 启动
按i开始扫描
得到结果
BTScanner程序最大的特征之一,是程序为每个被发现的蓝牙设备所生成的日志信息当你运行 BTScanner程序时,它会在用户的主目录下创建一个名为bts的目录。在这个目录中,BTScanner程序会根据设备的“蓝牙设备地址”,为每一个被发现的节点再各自创建一个目录,不过,因为冒号不适合做文件名和目录名,所以BTScanner程序会把“蓝牙设备地址”中冒号分隔符替换为下划线分隔符(比如00_02_EE_6E_72_D3)。
在每个设备目录中,BTScanner 程序都会创建两个文件:“时间戳文件”(timestamps file和“信息文件”(info file)。“时间戳文件”中包括 BTScanner 每次收到蓝牙设备回应的时间在跟踪移动蓝牙设备的时候这个记录会非常有用,可以根据时间来判断,在某一段时间里这个蓝牙设备是否在或者不在自己的功率覆盖范围之内。
“信息文件”包括详细的设备信息,包括“蓝牙设备地址”、“设备制造商名称”、“蓝牙设备地址”所关联的“供应商名称”、、“组织唯一标示符”编码,“MAC地址前缀”,以及一份详细的设备所有服务列表。
除了BTScanner程序存在一些bug(详见前面“BTScanner 中存在的 bug”的内容)之外,BTScanner 程序的日志存储和分析功能对于确认“可发现的”蓝牙设备是非常有用的。遗憾的是,BTScanner程序的作者不再进行升级开发这个程序了,因此本程序,将来恐怕也难看到任何bug的解决方案了。
被动式扫描
在蓝牙规范中,并不要求两个需要通信的蓝牙设备之间通过“询呼扫描”(inquiry scan)进行数据的交换。因此,如果你通过一些第三方的外部技术,获得了某个蓝牙设备的地址,比如你是通过阅读文档找到的。那么对方的蓝牙设备,区分不出你现在所发起的连接,是在获得“蓝牙设备地址”后是直接发起的,还是通过主动式的扫描后,从扫描中拿到“蓝牙设备地址”后发起的。无论是哪一种,都会涉及“蓝牙设备地址”,所以这部分的介绍,全都是被动式捕获“蓝牙设备地址”的技术。
目视检查
有时候,要确认一个蓝牙设备,简单的“目视检查”(VisualInspection)足矣!因为前面所谓的蓝牙设备,其实并不存在这样一个叫“蓝牙”的设备,而是说某个设备具有蓝牙功能的通信接口,因此具有蓝牙接口对于许多设备来说是很值得自夸的一个功能,凡是具有此功能的产品,都会在产品上打上“蓝色的LED灯”图案,或者蓝牙的“蓝牙技术联盟”的标志。
举例来说,一个超市的所有收款台都配有手持的条形码扫描仪,与传统有线的条形码扫描仪相比,对于一般小件物品,二者相差不大,但对于扫描大件物品时,由于蓝牙手持的条形码扫描仪不需要连线,可以在一定范围内随便移动,不受连线的限制,因而其优势十分明显。上面的蓝牙标志清楚地标明,这个设备是使用蓝牙技术进行通信的。
在付款台附近进行一次非正式扫描之后,我们发现所有的蓝牙手持条形码扫描仪现在的配置都处于“非可发现的”模式中。
这就意味着,如果我们想对它们实施攻击,那么前面提到的主动式扫描发现是不可行的,这该怎么办呢?仔细地观察这些扫描仪的底座,可以发现每个底座上都有一个条形码,而该条形码正是这台手持条形码扫描仪的“蓝牙设备地址”。
拿到这个条码值,结合前面对“蓝牙设备地址”的介绍,我们知道这个地址的前3个字节是“00:0C:A7”,分别是“非必要地址部分”、“高位地址部分”部分,共同组成了IEEE“组织唯一标示符”的生产商编码。这个生产商编码可以通过 http://standards.ieee.org/regauth/oui/oui.txt 查询所对应的生产厂家。通过查询,我们可以知道该蓝牙手持条形码扫描仪的设备生产商是“码捷(苏州)科技有限公司”(Metro(Suzhou)Technologies Co.,Ltd)。访问“码捷科技”的网站,知道这是“码捷科技”(Mecrologic)的一个子公司,并且这款蓝牙手持条形码扫描仪的型号是MS9535 VoyagerBT。从“码捷科技”公司的公司网站上,我们还可以找到有关这款扫描仪的一份PDF版本的用户指南,在上面描述了这款设备的默认“个人识别号码”信息。
把“蓝牙设备地址”信息印贴在设备外壳上是很普遍的现象。
由于两个蓝牙设备之间,必须共享“蓝牙设备地址”信息才能完成“配对交换”的操作,所以要与某个蓝牙设备进行联系,必须通过某种方式输入对方的“蓝牙设备地址”信息。可以通过蓝牙设备自动完成的“询呼请求”/“询呼应答”过程,也可以通过手动输入操作,还可以通过其他第三方的一些方式来完成。
对于那些结构简单的蓝牙设备,由于缺少“LCD显示屏”,并且没有什么可配置的选项,所以手动输入“蓝牙设备地址”信息的方法并不可行。虽然使用“主动式扫描发现”是可行的,但是当扫描时,同时发现多个蓝牙设备的时候,对这些设备进行区分又变成了麻烦事,因为此时虽然知道在你的功率覆盖范围内有几个蓝牙设备,也知道每一个蓝牙设备的“蓝牙设备地址”信息,但哪一个蓝牙设备对应于哪一个“蓝牙设备地址”呢?或者说你要与哪一个蓝牙设备进行“配对”操作呢?这时,最有效的办法,就是直接将每一个蓝牙设备的“蓝牙设备地址”信息印在或写好贴在设备上。
组合式扫描
在确认识别某个蓝牙设备的时候,如果“主动式扫描发现”和“目视检查”都无法奏效那么不妨试试下面几种组合发现机制