对于“低功耗蓝牙”功能的设备,你可以通过扫描和枚举找到这些“低能耗蓝牙”,并将其列为目标设备。目前,有许多能够发现和列举“低能量蓝牙”设备的工具还不太稳定,也不太可靠,不过,随着“低功耗蓝牙”设备越来越多,这些工具可能会变得越来越稳定,功能越来越丰富。
Android系统下的设备发现
Android版BlueScan软件可以使用“低功耗蓝牙”的接口,能够扫描和识别设备的基本信息。选择“低功耗扫描”(Low Energy Scan)提示条上面的“开始扫描”(Start Scan)按钮,程序就开始扫描,这个按钮也会自动变成“停止扫描”(Stop Scan),扫描的结果会记录到本地的数据库文件中,其界面效果如图8-1所示。
BlueScan软件会记录蓝牙的“设备供应商名称”(这个值是通过MAC地址中的“组织唯一标示符”推算出来的)、“设备类型”(是“双模”类型还是只有“低功耗”类型)、“设备的友好名称”(device-friendly name)和接收到的“信号强度信息”(signal strength information)。在扫描到的结果列表中,单击某个扫描到的设备,可以列出该蓝牙设备的详细信息,包括“设备地址”和“历史扫描结果”(historical scan result),比如观察到的“接收信号强度指示”信息和“全球定位系统”坐标信息,如图8-2所示。
图8-1 BlueScan软件的“低功耗扫描”结果截图
图8-2 BlueScan扫描到设备的详细视图
如果单击图8-1上的“数据库”(Database)按钮,BlueScan程序的显示界面就会由“实况扫描”切换到“历史扫描数据”上。在这个视图中,“数据下载”(Download Data)的按钮变成了可用状态,允许你取得数据库中的内容,并将其上传到其他应用服务中,比如上传给电子邮件的客户端程序,上传给Dropbox程序,上传给“谷歌驱动”程序(Google Drive),或者随便实施其他各种共享的操作。
iOS系统下的设备发现
与Wi-Fi扫描不同,Apple公司允许第三方应用程序开发人员使用蓝牙系统的“应用程序接口”来创建蓝牙设备扫描程序。“基于iOS系统的‘低功耗蓝牙’扫描器”(iOS app BLE Scanner)可以用来扫描“可发现的”模式下的蓝牙低功耗设备,并读取到“设备名称”“接收信号强度指示”和“通用唯一标识符”(Universally Unique Identifier,UUID),这些信息都是从“通用属性协议”服务中获取的,如图8-3所示。
“基于iOS系统的‘低功耗蓝牙’扫描器”可以提供“可发现的”节点的基本信息,但却无法读取到该蓝牙设备上与所提供服务有关的更多信息。一个可选的iOS系统上的app应用程序名叫LightBlue,这款程序是通过“低功耗蓝牙发布的“通告信息”读到“信号强度”信息,并列举了“设备属性”,如图8-4所示。
图8-3 基于iOS系统的“低功耗蓝牙”扫描器的扫描结果
图8-4 通过“通告信息”读取到的结果
虽然这些工具都可以用来发现和列举“低功耗蓝牙”设备,但是它们的能力都很有限。不过,要拿到“可发现的”设备的详细信息,我们可以使用Linux操作系统下包括在BlueZ开发包中的一些工具试试。
Linux系统下的设备发现和枚举
正如在第七章中所看到的,你可以使用BlueZ开发包中的hcitool工具发现处于“可发现的”模式下蓝牙设备的存在状况。在那里,要扫描“基本速率蓝牙”设备和“增强数据速率蓝牙”设备,需要使用一些参数,而在“低功耗蓝牙”的扫描中,你不再需要那些参数,而只需要使用“lescan”参数,就可以扫描到这些低功耗的蓝牙设备。在写本书的时候,这个hcitool工具有个bug,即当你通过使用“lescan”参数使用hcitool命令时,经常会返回一个错误,不用管这些错误,再次重新运行这个命令,有时甚至需要多次重新运行这个命令,才能完成正常的低功耗设备扫描。如下面的例子所示。
与直接使用“hcitool scan”命令不同,当带上“lescan”参数以后,那么hcitool工具就在扫描和识别蓝牙设备,并对每一个“可发现的”蓝牙设备的扫描结果重复显示好几次。如果要将hcitool工具输出的内容重定向到文件中,并且每隔一分钟或几分钟,就中断一下扫描过程,那么就可以通过该文件查看扫描结果,不过,鉴于这个文件里有很多重复的扫描行,所以可以通过排序功能,从扫描结果中对每一种结果中各取一行,最终生成一个没有重复行的扫描结果,如下所示:
在这个输出结果中可以看到有些设备的重复信息,比如说,“蓝牙设备地址”为90:59:AF:28:17:A2的设备共出现了两次,第一次显示设备名称为“活动力监控器”(Activity Monitor),第二次显示的则是一个“(未知)设备”(unknown)。对于这样的扫描结果,你可以通过“可发现的”设备,借助于“蓝牙设备地址”进行服务枚举的扫描,以便获得更详细、更准确的内容。
在hcitool工具,通过“lescan”参数的输出数据中,那个“蓝牙设备地址”为90:59:AF:28:17:A2的设备是一个“iHealth牌活动力监控器”(iHealth Activity Monitor),设备实物图如图8-5所示,主要用于记录佩戴者所走的“步数”、“卡路里的消耗值”(calories burned)、“所走的距离”(distance traveled)和“睡眠的程度”(sleep pattern)。本设备会不停地在“通告信道”中“通告”(advertise)它的“蓝牙设备地址”,即使和某一个目标设备配对成功,该操作也不会停止,这样做显然使该设备很容易被识别和扫描。
图8-5 iHealth牌活动力监控器
对于Linux操作系统最新版本的BlueZ工具包中,包含了一个名为gatttool的工具软件,该软件可以列举一个“低功耗蓝牙”设备上的服务和个性化特点。这款gatttool工具可以在命令行中使用,也可以以交互的模式查询目标设备上的主要服务,其命令行的运行效果如下所示:
注意
如果作为目标的蓝牙设备出于安全考虑,使用了一个随机地址作为自己的“蓝牙设备地址”,那么你需要在上面命令行的最后,加上一个“-t random”的参数告知gatttool程序。
对于gatttool程序来说,命令行版本的输出和交互式版本的输出,其结果和格式都是相同的。两者都可以显示出这个蓝牙设备上四个主要的服务。其中的服务信息,在显示的时候,是以“通用唯一标识符”格式显示的。“通用唯一标识符”格式所表示的是由标准的16位“通用属性协议”服务码组成的,该服务器又是通过“蓝牙技术联盟”定义的。这16位“通用属性协议”服务码定义如下所示。这些服务码中,每一位所代表的具体意义,可以通过“蓝牙技术联盟”的“开发者门户网站”(Developer Portal site)进行查询。“蓝牙技术联盟”开发者门户网站的网页地址是:https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx 。由“iHealth牌活动力监控器”所展示的这四个“主要服务”信息的详细描述见表8-1所示。
表8-1 “iHealth牌活动力监控器”设备主要的服务信息
除了“主要服务”信息,还可以识别目标设备的“服务特性”信息(service characteristic)。命令跟上面的命令一样,不过要获取服务特性,就不能使用“--primary”参数了,因为这个参数是读取服务信息,而要将参数换成“--characteristics”,其格式和效果如下所示:
“通用唯一标识符”信息是从上面带有“--characteristics”参数的“特性扫描”返回的。显示的格式和前面“主要服务”信息格式一样,同样是以16位的值作为“服务分配码”。这个特性模式下的“服务分配码”和“服务描述”显示如表8-2所示。为了格式的紧凑、节省显示的空间,其中“通用唯一标识符”这一列已删除掉了。
表8-2 “特性服务”信息列表
提示
一个关于在“服务分配码”和“服务描述”的列表,包含在一个Linux上的源程序BlueZ的源代码中,该源代码可以从http://git.kernel.org/cgit/bluetooth/bluez.git/tree/uuid.c 下载。
有了“主要服务”信息,你可以继续评估目标设备,通过“--char-read”参数,可以拿到与每一个“通用唯一标识符”关联的信息。其显示效果如下所示:
在这个例子中,我们从“通用唯一标识符”中“服务分配码”为0x2a00的“服务描述”得知这个“服务分配码”的意义是:这是一个“设备名称”(Device Name),然后我们就可以从这个“服务分配码”中读信息了。结果读到的是一串十六进制的数字,这些十六字节的数字代表的是设备名的ASCII码,我们可以通过Python进行解码,可以看到解码后的内容是“Activity Monitor”。当我们评估目标设备时,我们应该测试所有返回的“通用唯一标识符”,这样可以识别潜在的信息泄露威胁。对于这个iHealth设备,一些“通用唯一标识符”返回基本信息,反之就返回其他的错误信息(就像目标设备所需要的认证状态可以获取一些敏感信息),如下所示:
关于“iHealth牌活动力监视器”的一个有趣的属性是,这个在特性列表中的设备使用一个保留的“通用唯一标识符”(“服务分配码”为0x2a30)。从这个“通用唯一标识符”返回的数据是一个ASCII字符串,内容是“com.jiuan.AMV10”。这个域名“jiuan.com”注册于Andon组织,这是一个专业从事共享健康信息的设备开发组织的OEM版 [1] 。很显然,是该公司开发了这个“iHealth牌活动力监视器”。
扫描和侦查的应对措施
扫描和枚举“低功耗蓝牙”设备的信息是许多攻击的前兆,其目标就是利用低功耗蓝牙协议或规范在实现时的不足,将其作为目标实施攻击。从事蓝牙设计、生产的组织应该尽量限制扫描或侦查信息的搜集工具,使其尽可能少地暴露其他蓝牙设备上的信息。
不幸的是,可以用来限制这些信息暴露工具的可用项很少。将“低功耗蓝牙”设备配置为“非可发现的”模式,在一定程度上有助于限制信息暴露,但通过一些更复杂的攻击技术,可以克服这种级别的安全措施。细数这里复杂的攻击技术,有“低功耗蓝牙”的“侦听攻击”(eavesdropping attack),这个内容详见第9章,在可能的情况下,一个单位组织应该配置“低功耗蓝牙”设备限制外界对其服务的访问,并按本章所描述的步骤应用,使对方不能从敏感设备上列举和解压数据,也使对方不能在设备投入生产使用之前查到他们的详细信息。
[1] OEM,英文Original Equipment Manufacturer的缩写,按照字面意思是原始设备制造商,指一家厂家根据另一家厂商的要求,为其生产产品和产品配件,俗称加工贸易。——译者注