9.2 低功耗蓝牙的侦听技术
从复杂性的角度来看,“低功耗蓝牙”的侦听比Wi-Fi无线网络上的嗅探难,比“传统蓝牙”网络上的侦听容易,正好介于二者之间。在低层技术上,“低功耗蓝牙”和“传统蓝牙”一样,都使用“跳频扩频”技术。在这一技术下,发送方和接收方都按照一组共同的信道序列在各个信道之间跳转。要想捕获这些通信过程中的数据包,进而侦听“低功耗蓝牙”网络,攻击者就必须事先识别出这两个蓝牙设备在各个信道之间跳转的信号序列,以及发射方在一个单一信道上停留多长时间,又叫“跳转间隔”(hop interval)。
不同于“传统蓝牙”的方面就是,“低功耗蓝牙”网络中的频率跳转远没有“传统蓝牙”中的那么复杂、并且要使用的信道数少了很多。在2.4GHz带宽中,“低功耗蓝牙”网络总共使用了40个信道,并且在这40个信道中,还保留了3个信道用于网络通告,剩下的37个信道才用于数据的传送,如表9-1所示。同时,另一个和“传统蓝牙”不同的方面是,“低功耗蓝牙”网络使用了一个更简单的频率跳转序列,这个顺序的生成由一个开始的“通告信道索引”(advertising channel index),一个“跳转间隔”(hop interval)和一个“跳转增量”(hop increment)值共同组成。
当一个“低功耗蓝牙”网络建立成功,“主设备”会发送一个“连接请求数据包”(connection request packet)到“从设备”所在的一个“通告信道”上。这里透露蓝牙“微微网”的几个重要的网络特性:
·访问地址 (access address) 这是一个4字节的整数值,由“发起方”蓝牙设备在初始化的时候随机生成,其作用是唯一地识别一个连接。
·连接事件间隔 (connection event interval) 这就是上面所说的“跳转间隔”,这个时间值,是发送方和接收方从变到某个信道上,到开始跳到下一个信道之前,在这个信道上所停留的总时间。
·跳转增量 (hop increment) 两个信道之间的“距离”,主要用于判断在下一跳的时候,是跳转到哪一个信道中。
·循环冗余校验校验初始化种子[1](CRC initial seed) 一个3字节的随机数,被“发起方”(initiator)生成,用于初始化数据包的CRC校验计算功能。
这个连接请求数据包的例子,是通过Ellisys公司的“蓝牙资源管理器400”设备捕获并发现的。程序界面如图9-11所示。通过这些信息,“主设备”和“从设备”就可以发送和接收数据包了。无论是“主设备”,还是“从设备”,要想将与自己正建立连接并实施通信的另一方,和其他与自己连接的“低功耗蓝牙”设备区分开来,需要使用“访问地址”(access address)。该地址位于每一个“低功耗蓝牙”数据包结构中的开始部位。从侦听的视角,更重要的因素是设备在某一个信道上停留的“跳转间隔”,和设备在37个信道中选择哪一个作为下一个信道的“跳转增量”的定义。
“低功耗蓝牙”使用一个简单的信道选择机制,紧跟着就是“连接请求交换”(connection request exchange)。从信道0开始,“跳频增量”的值主要用于增加当前信道的序号,然后将“和”对37做“求模”运算[2]。例如,在Python系统中,我们可以快速地计算出一系列信道序列的号码,而该序列号码与“低功耗蓝牙”求跳频序列号的方法近似,如下所示:
每一次发送方和接收方在信道间跳来跳去的时候,它们都会在继续跳向下一个信道之前,在当前的信道上停留一定的时间间隔。因此,想要借机得到“访问地址”、“跳转间隔”、“跳转增量”、“循环冗余校验校验初始化值”的侦听者,可以在“低功耗蓝牙”网络进行侦听,并且验证所接收数据包的内容。
⊗ 注意
有一些蓝牙规格的属性增加了信道跳频过程的复杂度。例如,并不是所有的设备使用了所有37个数据信道,取而代之的方法是事先定义一个“使用信道的列表图”(channel map),这个“使用信道的列表图”是由所有“使用的”信道组成的一个列表,即所有信道列表的一个子列表,然后设备在跳转期间,只会在这个列表中存在的信道之间跳来跳去,而不会跳转到这个列表之外。即使这样,算法还有改进,那就是“从设备”也不需要完全按照“主设备”的每一次信道的跳频事件进行跟随,只要按照共同的算法约定,在指定必要的几个信道中,同样可以收到数据。这样做很显然是为了节约电源,同时也是参考了蓝牙规范中有关“从设备不工作则潜伏”(slave latency)这一特性要求而实现的。有关这方面的更多信息,请参见《蓝牙核心规范4.1》第6卷B部分,第3.3.2节和第4.5.1节的内容。网址是:https://www.bluetooth.org/en-us/specification/adopted-spcifications。
9.2.1 捕获低功耗蓝牙的“连接建立”过程
一种“低功耗蓝牙”设备对基带通信的嗅探能力,那就是一次可以监控三个“通告信道”中的一个,进而从这一个“通告信道”中获得请求数据包,然后计算出“访问地址”、“跳转间隔”、“跳转增量”、“循环冗余校验校验初始化值”,不过,这需要一个前提,那就是必须事先嗅探到这个“低功耗蓝牙”设备之前已经完成的“连接建立”(connection establishment)过程。
要想嗅探“低功耗蓝牙”通信中,能够捕获“连接建立”过程,我们至少有三个选择。第一个选择,可以通过Ellisys公司的“蓝牙资源管理器400”设备进行嗅探,这个设备可以用来捕获“连接建立”的过程数据包,并帮助我们对捕获到的数据包进行解码。不过,需要说明的是,后一步对捕获到的数据包进行解码的操作并不是必须的,在后面的内容会涉及。第二个选择,就是“前线蓝牙协议分析器600通信探测”的产品,用户只需要在“数据源选择”窗口(参见前面“9.1.2节)中选择“只对低功耗蓝牙进行嗅探”(LE Only)单选项,作为数据包的捕获类型,然后就可以“坐等渔利”,等待设备捕获“连接请求”的数据包。还有一个选择就是超牙设备,如前所述,超牙设备针对不同的蓝牙规范,具有不同的应对工具,所以如果我们要使用超牙设备,就需要换成一个不同的,专门针对“低功耗蓝牙”网络的工具,这个工具毫无疑问,也包含在整个超牙工具包中,要通过超牙完成对连接建立的捕获,请看下面的内容。
⚡ 超牙工具
由于“低功耗蓝牙”采用“高斯频移键控”的调制方式,“传统蓝牙”也采用这一种调制方式,所以我们可以使用相同的超牙硬件,即能捕获“传统蓝牙”的数据包,也能捕获“低功耗蓝牙”的数据包。要捕获和跟踪“低功耗蓝牙”的连接请求,我们需要使用其配套的ubertooth-btle工具。
ubertooth-btle工具由Mike Ryan开发,使用一个超牙在三个“低功耗蓝牙”通告信道中的一个信道中进行侦听,看看是否有连接请求数据包出现。默认情况下,ubertooth-btle工具侦听的通告信道是第37信道。一旦有一个连接请求被侦听到,ubertooth-btle工具就会立即分析该连接的参数,然后开始跟着被侦听的“低功耗蓝牙”设备的信道跳转而进行信道跳转。步骤如下所示。
⊗ 注意
由于上面ubertooth-btle工具的实例输出内容较多,考虑到显示上的空间限制,凡是与本主题关系不大的内容都删除了。
在这个例子中,ubertooth-btle将捕获到的数据包都保存到一个pcap文件中,也就是命令中的“-c btle.pcap”参数所要求的,并且只捕获连接请求,就是后面“-f”参数。随后,ubertooth-btle工具识别出一个CONNECT_REQ类型的数据包,从这个数据包中,得到了好几个重要的参数,比如“跳频增量”是“9”。在侦听到这个数据包之后,ubertooth-btle工具立即就开始随着这个“低功耗蓝牙”的连接开始同步跳频。所有“低功耗蓝牙”设备的开始信道序号都是0,这意味着下一个数据包将出现在信道9上,随后的信道序号将依次为18、27…。
ubertooth-btle工具会从每一个报告的数据包中,解码出一些数据,这些数据包包括“逻辑链路控制及适配协议”数据包的开始帧中数据包有效载荷的内容。不过,如果没有一些辅助解码的内容,单单从字节本身上来看,这些数据并没有多大意义。幸运的是,Wireshark工具在1.12及之后的版本中,开始对“低功耗蓝牙”数据包进行解码,这无疑是让上面的工作峰回路转。
在“连接建立”之后的数据包捕获技术,主要是用来捕获在一个“安卓Nexus 4”(Android Nexus 4)设备和“Polar FT-7健身心率监测器”(Polar FT-7 fitness heart rate monitor)之间的活动。“Polar FT-7健身心率监测器”设备实物如图9-12所示(由Mike Ryan提供)。我们打开Wireshark程序,将之前捕获到的数据包读入程序,然后设置关键字“btatt.handle==0x0011”进行过滤显示,程序马上搜索到所对应的20个数据包,其内容是都是在“安卓Nexus 4”和“Polar FT-7健身心率监测器”之间来往通信的,用于读取心率数据的事件记录。该程序的界面如图9-13所示。有关使用“蓝牙心率测量特征”(Bluetooth Heart Rate Measurement characteristics)的个人配置文件,可以从蓝牙开发的网站上下载(https://developer.bluetooth.org/gatt/characteristics/Page/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml )。在这个示例中,我们可以解码值为“16:54:cb:02:dc:02”的设备,其结果如表9-2所示,其中显示了很多心率测量信息。而且,这些信息可以通过简单的命令行工具进行收集和长时间进行解码,如下所示。
在这个例子中,tshark命令读取一个ubertooth-btle工具所捕获的数据包,通过“btatt.handle==0x0011”参数设置,可以通过过滤显示出与这个指定的“心率报告句柄”(heart-rate reporting handle)相关的数据包。默认情况下,tshark程序并不会在tshark输出中打印出心率信息的有效载荷数据,所以我们特定添加“-z”参数用于指定这个字段。将这个输出结果发送到UNIX操作系统中的awk工具就可以得到心率数据字节,并将其中的十六进制格式转换为十进制格式。
在蓝牙硬件上使用ubertooth-btle软件,使得在“低功耗蓝牙”BLE连接上进行侦听的可能。另外一个低成本的选项对于本次任务也有作用。对于Windows用户,如果想要一个对“低功耗蓝牙”数据包捕获和分析的简单界面,那么选择一个得克萨斯仪器(Texas Instruments)公司的“SmartRF数据包嗅探工具”(SmartRF Packet Sniffer tool)是个不错的选择。
⚡ 得克萨斯仪器公司的SmartRF工具
得克萨斯仪器公司是一个著名的芯片制造商,生产的许多商业产品,包括“低功耗蓝牙”嗅探器。作为一种帮助软硬件开发人员的机制,该公司创造出“得克萨斯仪器芯片”产品,同时还提供了几个基于SmartRF平台原型的故障排查(troubleshooting)工具。
SmartRF是一个开发者通过使用得克萨斯仪器,在设计、创建和故障排查射频集成电路方面进行软硬件开发的平台。在硬件和软件的解决方案方面,“低功耗蓝牙”网络中SmartRF设备还提供排除故障的功能,包括一个非常有能力的“低功耗蓝牙数据包嗅探器”和低成本的USB加密狗。
得克萨斯仪器公司的“CC2540 USB接口评估模块”(CC2540 USB Evaluation Module)套件,其实物如图9-14所示。这是一款价格为50美元的可编程的“片上系统”(System-on-Chip,SoC)产品,支持2.4GHz无线接口和一个集成了的8051微处理器。这款“CC2540 USB评估模块”是可编程的,包括一个“联合测试行动小组”接口和两个按键,按键可用于任何自定义应用程序的需要,但是在出厂时,固件默认的配置是能够捕获“低功耗蓝牙”的通信数据。使用附带的“得克萨斯仪器SmartRF数据包嗅探器”软件,我们可以使用“CC2540 USB评估模块”在捕获到连接请求数据包以后,随着蓝牙设备之间的通信而同步跳频。
♥ 提示
“CC2540 USB评估模块”可以从很多热卖的在线电子商品零售商那里买到,这些零售商的网址有:http://www.digikey.com,http://www.mouser.com ,http://www.newark.com ,和http://uk.farnell.com ,在这些网址中,该产品准确的产品型号是CC2540EMK-USB。
购买了产品以后,就是安装。首先,从得克萨斯仪表公司的网站上下载“SmartRF数据包嗅探器”(SmartRF Packet Sniffer)软件,网址为http://www.ti.com/tool/packet-sniffer。然后,在你的Windows操作系统上通过安装向导来完成软件的安装。下一步,将“CC2540 USB评估模块”硬件插入到可用的USB口中,启动数据包嗅探软件。在整个过程中,你要做的工作就是选择一个可用的硬件接口,如图9-15所示。单击“开始”(start)按钮就可以启动数据包嗅探器的安装过程了。
在“SmartRF数据包嗅探器”的窗口中,允许你通过配置定制捕获流程。在窗口的底部有几组设置,选择不同的设置,意味着不同的捕获流程。下面的配置中,有开始监听的信道序号,该值默认为37信道,设置好以后,该设备只在此信道是侦听“连接请求”的数据包。另一个重要的配置项就是指定要侦听的蓝牙设备的“发起方地址”(initiator address)。还有一个配置项是是否解密已侦听到的通信数据包。在本书第10章中,我们会通过此项检验“蓝牙加密攻击”(Bluetooth encryption attack)技术。你可以修改上述这些配置,也可以不加考虑地单击“开始”(Start)按钮,通过当前的配置项开始数据包的捕获。
当“CC2540 USB评估模块”在通告信道中捕获到通告数据包时,“SmartRF数据包嗅探器”就会滚动显示出所选择的通告信道中新捕获到的活动数据包。一旦发现有“连接请求”数据包出现,“CC2540 USB评估模块”就会自动开始计算其信道跳转值,并跟着“微微网”中通信的这两个蓝牙设备的跳频一起在各个信道间跳转,更重要的是,在跳转期间侦听二者之间的数据通信,解码并显示所侦听到的数据,程序界面如第9-16所示。
⊗ 注意
⛳网站
一个被称为“Fitbit一号”(Fitbit One)的设备,也可以对数据包进行捕获,然后使用“SmartRF数据包嗅探器”软件的界面对其捕获的文件内容进行显示,这时就不再需要“CC2540 USB评估模块”设备。在本书的配套网站上,有一个通过“Fitbit一号”设备捕获的文件可以作为读者的研究样例。其下载网址是http://www.hackingexposedwireless.com/files/09/fitbit-smartrf.psd。
“SmartRF数据包嗅探器”软件还包括一些可以改变数据包内容显示效果的功能,比如隐藏或显示所选的字段,以及通过过滤器显示指定类数据包的功能,这样可以让我们集中精力到我们所关注的数据包类型上,而不必浪费多余的时间忙于查找想要的数据包。然而,“SmartRF数据包嗅探器”软件还是缺少一些功能,另外在使用方便性方面还是不如Wireshark软件。幸运的是,你可以将“SmartRF数据包嗅探器”在捕获“低功耗蓝牙”设备通信数据包之后,将生成的文件由“SmartRF数据包嗅探器”的文件格式转换成Wireshark软件软件支持的libpcap文件格式。
要完成上面的转换操作,其实并不需要复杂的编程,只需要一个脚本足矣。tibtle2pcap.py工具,就是这样一个基于Python语言的脚本程序,该程序可以读取“SmartRF数据包嗅探器”软件生成的Sniffer.psd文件,然后将其转换成libpcap格式的文件,后者是和Wireshark兼容的,同时也和本章前面描述的btle插件兼容。要下载tibtle2pcap工具,可以从网站http://www.willhackforsushi.com/code/tibtle2pcap.zip处下载。你也可以在Windows操作系统或Linux操作系统中使用tibde2pcap.py脚本完成上述转换功能,不过这个脚本需要在Windows上安装一个Python的解释器。如果你采用后一种办法,那么需要完成如下操作:
输出文件fitbit-smartrf.pcap,就可以被Wireshark软件和btle插件所识别。其中Wireshark软件的显示界面如图9-17所示。
⊗ 注意
smartRFtoPcap程序是一个和“SmartRF数据包嗅探器”程序功能相似的工具类软件,该软件所属的项目是由Geoffrey Kruse使用C语言编写而成,相关资料可从网站https://github.com/doggkruse/smartrftopcap上查到。
廉价的“CC2540 USB评估模块”设备,配上“SmartRF数据包嗅探器”软件,再加上tibtle2pcap.py脚本的“三英组合”,还是很有吸引力的,这其实就是“低功耗蓝牙”网络数据包嗅探的一种低成本的上佳组合。不幸的是,“CC2540 USB评估模块”设备的固件并不支持对已建立连接情况下捕获蓝牙通信数据包的能力。这对于当黑客意识到有蓝牙设备在通过“微微网”已经进行通信的前提下,再打开上面软硬件组合,开始侦听来说,似乎太迟了,而这一限制,对之后的侦听攻击、数据解码等工作也成为不可能。幸运的是,这正是ubertooth-btle的亮点。
9.2.2 低功耗蓝牙的混杂模式跟踪
当对“低功耗蓝牙”进行攻击时,必须在“低功耗蓝牙”还没有建立连接之前进入侦听状态。这种限制条件对黑客来说是不现实的。比如,假设我们要开发一个手持的“个人识别码输入设备”(Personal Identification Number Entry Device,PED),该设备使用“低功耗蓝牙”传送信用卡(credit card)信息到一个接收器上,接收器再将数据回传到一个有效的认证系统上。“个人识别码输入设备”在电源接通,设备打开后,就会和接收器之间建立一个连接,并且在此后的使用中,这个建立好的连接也会持续相当长的一段时间。还记得吗?“前线蓝牙协议分析器600通信探测”设备和得克萨斯仪器公司的“SmartRF数据包嗅探器”都得通过嗅探到“连接请求”数据包,然后才能识别出“访问地址”“跳转间隔”“跳转增量”“循环冗余校验校验初始化种子”等值,并推算出蓝牙设备的跳频序列数组,然后才能按照和“低功耗蓝牙”相同的跳频顺序进行同步。回顾这个流程,如果嗅探不到“连接请求”数据包,就得不到后面的这些值,也就谈不上在后面加入到跳频的交换了。
相比之下,Ellisys公司的“蓝牙资源管理器400”设备分析产品可以同时侦听所有蓝牙信道,因为该设备不依靠信道间的跳频,所以“蓝牙资源管理器400”设备也不需要通过追踪某个“微微网”上通信的蓝牙设备的跳频序列去捕获分布在不同信道中的数据包。不幸的是,像“蓝牙资源管理器400”设备这种绝好的黑客利器,却因为其超常的价格而将许多爱好者拒之门外,迫使我们去寻找另一种解决方案,使之能在连接建立以后,仍然能捕获“低功耗蓝牙”网络上的通信数据包。
进入超牙系统,换一种使用ubertooth-bde功能的操作方式,这次我们使用“-f”参数,以便超牙可以在“低功耗蓝牙”网络中,捕获“连接请求”的消息,如果我们处在“混杂模式”(promiscuous mode),那么对于“低功耗蓝牙”的侦听来说,导出的信息就显得十分必要了。现在的问题就是,如何让超牙进入“混杂模式”,这需要使用“-p”捕获参数。这时的超牙会组合使用几种技术来获得“低功耗蓝牙”网络中,对于“信道跳转”和解码来说十分必要的信息。
1)ubertooth-btle程序开始运行,就意味着,这之后捕获到的数据是充满着数据包和干扰噪声(noise)的比特流(bitstream)数据。要想确定一个数据包的开始,ubertooth-btle程序需要首先识别“空数据包”(empty packet)的“公共头部”的值(common header values),“公共头部”后面的4个字节数据,就可能是“访问地址”。照这样的过程重复几次,ubertooth-btle程序就能够通过计数和匹配操作,推算出一个有效的“访问地址”。
2)利用还原好的“访问地址”,就可以识别一个数据包,通过观察常见的数据包类型和反向使用“线性反馈移位寄存器”(Linear Feedback Shift Register,LFSR)算法,可以计算出“循环冗余校验校验”的初始化值:先用数据包的数据和“循环冗余校验校验”值进行运算,可以反向还原“循环冗余校验校验”的初始值,一旦“这些”“循环冗余校验校验”的初始值被救还原,就可以在“混杂模式”下嗅探进程中,检验后续数据包的有效性。
3)下一步,“跳转间隔”的还原,是通过听同一个信道和观察连续两个回收数据包。利用这两个数据包接收的时间差(也就是Delta值)除以37,就可以得出“跳转间隔”。
4)最后,“跳转增量”的还原。ubertooth-btle工具在数据信道上侦听数据包,很快它就能如愿捕获到一个数据包,并且该蓝牙设备会跳到下一个信道上,假设该蓝牙设备开始于信道1,马上要跳到信道2,因为“跳转间隔”已经在上一步中还原出来,所以当我们看到一个数据包到达下一个信道中的时候,我们就可以根据检查两次读到的数据包的时间上的不同,计算出“跳转增量”值。
还原了上面几个重要的参数值,下一步就是对这些值进行处理,然后得到这两个“低功耗蓝牙”设备的跳频序列,并跟随着一起边跳边侦听,这个过程听起来很复杂,但如果通过ubertooth-btle工具实现起来却很简单。只要通过“-p”参数简单地运行即可。作为可选项,如果还想将数据包中的数据也保存起来,可以再带上“-c”参数,剩下的就是等待ubertooth-btle工具根据上面还原出来的必要信息,计算这个“微微网”的跳转步数,该过程如下所示:
在上面的例子中,ubertooth-btle在“混杂模式”时,将在信道17上开始捕获数据包。信道17的频率是2.440 GHz,当从空的“逻辑链路控制及适配协议”数据中确定了“访问地址”是“AA”以后,一旦“AA”被还原,ubertooth-btle就继续还原“循环冗余校验校验”的初始值、“跳转间隔”、“跳转增量”。最终,跟随这个“低功耗蓝牙”网络的跳频,ubertooth-btle工具就可以还原数据包的值。这些步骤正如这个例子所示。
现在我们已经研究了几种在“低功耗蓝牙”网络中进行侦听的技术,下面我们通过一些实例,了解究竟哪种侦听攻击最适合黑客。
- 在一个“确定系统”中是无法产生随机数的,计算机就属于“确定系统”,但是如果能引入一个随机数,就可以产生一个随机序列,那么引入的这个随机数,称为“种子”(seed),同时这种通过引入随机数后,再生成的随机数序列,称为伪随机数。——译者注
- 如果你对“求模”运算不太了解,那么你可以简单地理解为这是“求余数”的运算。——译者注
本书评论