10.2 伪造设备的身份
蓝牙设备采用多种身份机制向外界传达本设备的各项信息,比如“设备功能”(capability)、“服务分类”(service classification)、“设备地址”(address)以及“友好名称”(friendly name)。根据想要攻击设备所处的目标环境,你可能会发现修改攻击系统的身份对于攻击目标是非常有帮助的。
10.2.1 蓝牙服务类别和设备类别
每个蓝牙接口都是用一个“服务类别标识符”(service class identifier)和“设备类别标识符”(device class identifier)来表示,分别被称为“服务类型”(Class of Service)字段和“设备类型”(Class of Device)字段,二者总共有24位,如图10-2所示。“服务类型”信息是一个11位的字段,它通常表示蓝牙设备上运行的服务,可以分成多种类别,包括定位设备(位置识别)、渲染设备(打印机、扬声器)、采集设备(光学扫描仪、麦克风)等。
“设备类”信息又可以分为两个子字段,它们分别是“主要设备类型”(major class)和“次要设备类型”(minor class)。“主要类型”字段定义了10种不同的设备类型,如表10-1所示。
“次要设备类型”字段表示是给定的“主要设备类型”设备之下,再进行的二级细分。比如说,当主要类是“电话类型”(“主要设备类型”的值为0x02)时,根据“次要设备类型”字段就可以区分到底是移动电话(“次要设备类型”的值为0x01)、无绳电话(“次要设备类型”的值为0x02)、智能电话(“次要设备类型”的值为0x03)或者是有线调制解调器(“次要设备类型”的值为0x04)。
通常情况下,“服务类型”、“主要设备类型”和“次要设备类型”字段对于一个具体的设备来说都是一成不变,但是一个例外的设备类型,就是“网络接入点”(即“主要设备类型”是0x03),当“主要设备类型”是0x03时,“次要设备类型”经常会动态地变化,变化的原因是因为其使用率的变化。比如,现在“次要设备类型”为蓝牙网络链接的,有1%~17%的使用率将“次要设备类型”归为0x01,而另外83%~99%的“次要设备类型”使用0x06。
有关蓝牙的“服务类型”、“主要设备类型”、“次要设备类型”的完整列表都有文档化的资料。可以在“蓝牙技术联盟”SIG公布的《蓝牙编号分配-基带》(Bluetooth Assigned Numbers-Baseband)文档中查到。这份文档原本形成于蓝牙的早期版本的规范中,但是为方便能更频繁地维护升级,这份技术文档被移动到了bluetooth.org网站上。现在的网址是http://www.bluetooth.com/en-us/specification/assigned-numbers/baseband 。
在“服务类型”字段和“设备类型”字段的最后两位是“格式类型”(format type)字段,主要用于表示版本标识符。当前这个数值都为“00”,但是“蓝牙技术联盟”需要其他字段来区分更多的设备,就会在重新定义以后,修改这里的版本标识符,所以这个字段在未来也可能是其他的值。
第7章中,我们介绍并通过实例检验了许多蓝牙侦听类的扫描器,通过这些扫描工具,对每一个扫描到的设备,都可以获得设备的“服务类型”和“设备类型”信息。在Linux操作系统的命令行下,我们可以扫描“可发现的”模式下的“基本速率蓝牙”和“增强数据速率蓝牙”蓝牙设备,并且读取它们的“服务类型”和“设备类型”信息。完成读取命令,是通过hcitool命令完成的,命令格式如下:
在上面输出的结果中,这个设备的“蓝牙设备地址”为00:1B:63:5D:56:6C,并且它的“服务类型”和“设备类型”字段是0x3a010c。我们可以将这个值转换成二进制形式,然后依次检查每个独立的字段,从而获取“服务类型”和“设备类型”信息,对应的信息如下所示:
0x3a010c=001110100000000100001100服务类型 00111010000 设置了音频,对象传输,采集和网络主要设备类型 00001(0x01) 主要类型是电脑次要设备类型 000011(0x03) 次要类别是笔记本电脑格式类型 00 目前一直为00
我们可以通过使用btclassify工具自动对类型信息进行解码,该程序由Mike Ryan编写。该命令的使用格式如下所示:
一旦知道了“设备类别”和“服务类型”字段的意义,就可以识别对方是什么设备,也可以使用这样的信息来伪装作为攻击者的“设备类型”,以便迷惑被攻击者。
⚡ 修改服务类型和设备类型信息
正如在本章的前面部分所看到的,许多设备使用“服务类型”和“设备类别”信息来区分蓝牙设备的功能。许多蓝牙设备对与自己连接的蓝牙设备类型还是比较“挑剔”的,如果对方的“服务类型”和“设备类型”信息与自己所要求的类型不匹配的话,这些蓝牙设备会拒绝远端设备的连接请求,或者会显示本地设备不存在的信息给对方。
举例来说,iPhone手机的蓝牙功能非常“挑剔”,除了蓝牙音频设备或蓝牙耳机之外,其他的外围蓝牙设备统统不予支持。也就是说,iPhone手机的蓝牙模块通常会忽略那些“设备类型”和“服务类型”的设定与“音频类型”和“耳机类型”不匹配的外围蓝牙设备的连接,而只会支持那些“设备类型”和“服务类型”的设定与“音频类型”和“耳机类型”相匹配的外围蓝牙设备的连接。
在Linux操作系统上,我们可以使用hciconfig命令检查本地的蓝牙设备的类型信息,如下所示:
幸运的是,hciconfig也同样能够对“服务类型”和“设备类型”信息进行解码,在上面的例子中,我们可以看到这个蓝牙设备的配置的“服务类型”是“网络服务”(即上面的输出结果中的“Networking”),它的“主要设备类型”是“计算机”(即上面的输出结果中的“Computer”),“次要设备类型”是“笔记本电脑”(即上面的输出结果中的“Laptop”)。
在root权限下,我们可以修改“服务类型”和“设备类型”信息,然后伪装系统的身份,变成我们想要的效果。举例来说,我们将“服务类型”和“设备类型”信息修改为Oxf00704,根据上面的定义,这时我们的系统的“主要设备类型”为“可穿戴的设备”(wearable device),“次要设备类型”为“腕表”(wristwatch)。
通过修改“服务类型”和“设备类型”信息,当该设备出现在iPhone的蓝牙设备扫描结果的时候,其扫描实例如图10-3所示。从中可以看到,设备的名称“NotReallyAWatch”是在上一步操作中定义的。由于该设备的类型不是iPhone设备的蓝牙能接受的类型,所以iPhone拒绝了该设备的连接。
✔ 对修改服务类型和设备类型信息攻击的防御措施不幸的是,对任何一个特定的蓝牙设备,在蓝牙规范中并没有使用任何机制来约束“服务类型”和“设备类型”信息要怎么写,必须怎么写。这就意味着攻击者只要将设备类型设置为“其他任何蓝牙设备类型”,就可以任意配置或修改自己系统中的蓝牙设备信息。正常情况下,这个缺点并不一定代表是个多大的问题,最多只能算是个bug,因为“设备类型”的值本身也只是仅供参考。不过,如果你的系统涉及安全类的信息,比如设备远程类信息验证,那么,你应该认识到,攻击者可以冒充任何装置,规避过滤机制,对你发出连接的请求,所以一个较为安全的办法就是向iPhone手机学习,在设计蓝牙连接的时候,只接受特定“设备类型”的连接。
本书评论