许多有关蓝牙设备在软硬件实现中的漏洞识别和报告,其成因实际上都是蓝牙规范本身在设计实现上存在的漏洞。比如,在第7章中,我们曾看到有各种各样蓝牙“服务发现”类的工具。通过这些工具,可以读取蓝牙设备上的所有服务,以及指定服务以后,可以读取该服务的详细信息。以其中BlueZ开发包中的sdptool程序为例,该工具可以浏览目标蓝牙设备上的服务,也可以在明确地指明某个服务后,向目标蓝牙设备发出请求服务信息,然后借助于读取到的目标蓝牙设备服务信息,我们可以发现,这些服务都是各自为政,独立地使用系统的安全控制参数,而这些服务中,经常会有某个服务会为攻击者提供未授权的访问权限。
在蓝牙设备上,有些服务通常会要求身份认证或者数据加密,比如耳机规范,或者蓝牙免提规范中要求用户的通信必须进行数据加密,并且通信前必须经过认证,这本身当然是好事。但是蓝牙设备的开发者除了遵守上面的约定之外,为了自己的需要,会加入一些其他的规范,这些新增的规范却需要更低的安全性要求。比如,如果要通过“对象交换规范”(Object Exchange Profile,OBEX)接收一个由远端蓝牙设备上以“推送”(Push)的方式发来的名片(business card),这看起来应该是一个在安全方面平淡无奇的服务。这个服务不需要远端蓝牙设备在本地进行的认证,所以使用凡是能最大程度地保证了信息共享的简便性的协议就可以。这时,设计者往往会从其他服务中进行选择,比如“文件传输规范”(File Transfer Profile,FTP)成为首选,并且为了简易性,蓝牙的设计者在使用这个协议的时候可能也不要求简单验证,并且在蓝牙接收方发现并扫描文件内容之前,还会选择将所有要传输的文件暂时存放在一个他自己认为是已“隔离”的目录中。
针对上述情况,一旦用户通过工具发现这些“虽然不是蓝牙规范设计上,而是蓝牙规范使用上”的漏洞,攻击者就可以绕过那些在蓝牙设备上精心配制的安全措施,在目标设备设置触发“拒绝服务”(Denial of Service,DoS)的条件,然后在要攻击的目标系统上执行任意命令。尽管历史上,蓝牙规范中存在着不少漏洞,但是由于移动手机的快速发展,这些漏洞的寿命越来越短暂,因此,在下面的内容中,我们不会讲解那些已经被修补的漏洞,因为它们在最新的设备中几乎已经不存在了,相反,在接下来的内容中,我们会将关注点转向利用已知或者从前没有公开的漏洞,配合以恰当的工具对重要数据进行枚举(enumeration data)的方式,对目标蓝牙设备实施入侵。
要想进入某个蓝牙系统,并对其进行评估,我们面临的第一个障碍是判断是否可以在“逻辑链路控制及适配协议”层上同远程蓝牙设备建立一个连接。如果在“逻辑链路控制及适配协议”的访问被对方所拒绝,那么你就不要想获得更高一层的协议上的各项功能了。
对于一个给定的目标,创建一个到远程系统的连接,就可以通过“主机控制接口协议”层的嗅探工具hcidump命令查看一个连接状态。hcidump工具通常是一个对Linux操作系统发行单独的工具包,但是,它也是Linux操作系统上BlueZ开发包的一个组件。在基于Debian的系统中,可以安装hcidump工具,其命令格式如下所示:
一旦hcidump程序安装完毕,我们就可以检查在本地蓝牙接口和远程蓝牙设备之间,“主机控制接口协议”层以及更高层之间的连接性。运行不使用任何参数的hcidump命令,工具就开始收集和显示hci0接口上的信息。hci0接口是该命令在默认情况下的选择,如果你想改变这个默认值,让命令检测其他hci端口上的值,则需要使用“-i”参数,并在后面跟上要改变的端口值,就可以指定显示其他的接口上的信息。另外,如果再在命令行后附加上“-t”参数,我们还能够在结果中增加显示读取时的“时间戳”(timestamp)信息,命令的格式及实例效果如下所示:
再打开一个窗口,并在新的这个窗口中运行hcitool命令,并附带一个“cc”参数。该参数的作用是指定的是远端设备的“蓝牙设备地址”。这是创建一个与所指定这个目标蓝牙设备之间的连接。
回到前面的hcidump命令所在的窗口中,你会看到程序尝试连接的状态。在这个例子中,通过hcitool命令所建立的连接是成功的,因为本地设备执行了“主机控制接口协议”的“Create Connection”命令,这表示这两个蓝牙设备之间的连接会话支持这两个蓝牙设备之间建立这个层次的连接特性。另外,这里的改变后的“传送时隙”(transmission slot)的个数也可以设置为默认值,以便将来使用,通过该值可以查询远端设备的“友好名称”(friendly name)信息。在整个命令序列的最后,程序终止了会话。
提示
在hcidump命令的结果中,“小于号”和“大于号”表示的是“主机控制接口协议”层数据通信数据包的流向。从“高堆栈层”(upper-stack layer)流向低堆栈层(lower-stack layer)的时候,就用“小于号”(即实例中的“<”);从“低堆栈层”流向高堆栈层的时候,就用“大于号”(即实例中的“>”)。另外,这些符号除了表明数据在本地设备上协议栈之间的流向之外,也同时表明了数据在本地蓝牙设备和远端蓝牙设备之间的流向,通常情况下,“小于号”表示数据通信数据包从本地蓝牙设备流向远端蓝牙设备,“大于号”表示从远端蓝牙设备返回到本地蓝牙设备。不过,在某些情况下也有例如,比如“命令”状态(即实例中部分“Commmand”)中,数据是直接由“主机控制接口协议”层本身而来,而不是从远程蓝牙设备发送而来的。
下面显示的是一个在连接尝试中失败的例子。由于在命令行中添加了显示详细信息的“-V”参数,所以该命令在之后返回的结果中,以尽可能详细的格式显示所接收命令的状态。
在上面的例子中,你可以看到远端蓝牙设备拒绝了我们尝试连接的请求,返回的原因代码是“无法接受的‘蓝牙设备地址’所导致的拒绝连接。”(即实例中最后一行的“Error:Connection Rejected due to Unacceptable BD_ADDR”)。这样的结果表明远端蓝牙设备使用了“蓝牙设备地址”过滤措施,这为攻击者同远端蓝牙设备进行连接多设置了一道障碍。
注意
如果我们知道拒绝连接设备所在“微微网”的“主设备”蓝牙地址,那么可以使用BlueZ测试工具集中的bdaddr工具来伪装成授权设备,从而绕过这个限制。
一旦同目标蓝牙设备建立了一个基本的“逻辑链路控制及适配协议”连接,我们就可以继续攻击远端设备上可用的服务了。
蓝牙“个人局域网”(Personal Area Networking,PAN)的规范被设计为一个或多个设备之间创建ad-hoc网络连接 [1] 。如果再与“蓝牙网络封装规范”(Bluetooth Network Encapsulation Profile,BNEP [2] )组合,那么使用蓝牙通信的设备可以通过蓝牙接口模拟出一个以太网络,无缝地(seamlessly)通过蓝牙的网络介质传输以太网格式的数据帧。通过“个人局域网”和“蓝牙网络封装规范”,两个设备可以使用任何上层协议交换数据,就像IP堆栈的分层结构一样,只是将IP堆栈的最低层换成了蓝牙“个人局域网”。“个人局域网”的规范会在以下两种情况下用到。
对于蓝牙“个人局域网”来说,第一种部署是在“网络接入点”(Network Access Point,NAP)服务中,在这种情况下,既然是作为接入点服务,那么这时的蓝牙设备所担当的角色往往是负责访问授权控制的设备形式,桥接器(bridge)、路由器(router)或者代理服务器(proxy),蓝牙设备传输的一端是蓝牙“微微网”,另一端是一个上游网络(upstream network),如一个以太网的局域网LAN。在这种情况下,蓝牙“个人局域网”规范的外在表现形式,就不一定非得是我们想象的蓝牙设备的模样了。比如这时的这个蓝牙设备从外表看上去,完全可以是一个Wi-Fi的AP接入点装置,但其内部运行的仍然是蓝牙“个人局域网”的规范,只是将蓝牙作为了无线通信的介质而已。
对于蓝牙“个人局域网”的第二种部署是在“组间ad-hoc无线自组网络”(Group Ad-hoc Network,GN)服务中,用于“微微网”中两个或者多个无线蓝牙设备之间创建“点对点”(point-to-point)的连接。这种使用案例和IEEE 802.11 ad-hoc网络配置很相似。“组间ad-hoc无线自组网络”服务和“网络接入点”在部署时的选项上有很大的差别,“组间ad-hoc无线自组网络”服务允许“微微网”中横向的“主设备”参与到与其他设备的数据交换中,而“网络接入点”服务只是负责在纵向的“上游设备”(upstream device)和“下游设备”(downstream device)之间转发数据帧。
许多蓝牙设备都支持通过“网络接入点”和“组间ad-hoc无线自组网络”这两个协议来使用蓝牙介质为上层的协议堆栈服务。其中,“网络接入点”服务通常用在向上游网络提供授权和提供资源,比如我们通过笔记本电脑上的蓝牙接口与手机的蓝牙接口连接后,就可以借助于手机建立“全球移动通信系统”模式的网络连接,使得笔记本电脑达到上网的目的。由于“组间ad-hoc无线自组网络”服务和“网络接入点”服务很相似,所以“组间ad-hoc无线自组网络”服务也支持ad-hoc文件共享,或者其他“短时网络服务”(short-term networking service)。尽管默认情况下这两种服务都处于关闭状态,但是在OS X操作系统的10.4版本和之后版本的设备中都提供这两种服务,一旦开启之后,我们就可以通过标准“服务发现协议”扫描发现它们,其格式和效果如下所示,不过,由于篇幅考虑,所以对本例中一些紧密度不大的内容进行了删减:
从攻击者角度来说,“网络接入点”服务为攻击者提供了一个机会,通过这个机会攻击者可以跨越目标蓝牙设备访问在蓝牙设备另一侧的网络资源。由于另一侧的网络资源可以是蓝牙资源,也可以不是蓝牙资源,所以这意味着,攻击者还可能利用蓝牙连接通过以太网或者IP网络攻击其他主机。对于“组间ad-hoc无线自组网络”协议,攻击者的兴趣就相对弱一些了。因为尽管这时攻击者发现某个蓝牙设备上也存在漏洞的话,也可以对这个目标设备可以枚举出它的服务,以及使用这个蓝牙设备,但归根结点,这时的攻击者也只能攻击目标设备本身而已。
“蓝牙技术联盟”的规范文档中,对于“个人局域网”规定了一个高强度的安全措施,那就是在“个人局域网”中应该应用“网络接入点”服务和“组间ad-hoc无线自组网络”服务,并且还要包括“连接管理器协议”认证和加密。同时还包括高层的认证选项,比如IEEE 802.1X也不例外。不过,尽管有这些建议,最终并不是所有的“个人局域网”都实现了这些所需要的认证方式,也不是所有的“个人局域网”都在访问的时候建立了加密的密钥值。
Blekin F8T030是一个使用蓝牙作为其无线传输介质的“网络接入点”,当然也是遵照“网络接入点”服务规范运行的。默认情况下,F8T030设备并不会尝试认证或对连接进行加密,而只是“桥接”到一个本地的以太网接口上。同时,它也会在设备的“友好名称”中泄露网络IP地址信息,如下所示:
我们可以使用BlueZ开发包中的pand工具,将Linux操作系统的蓝牙接口连接到蓝牙AP接入点上:
在这个例子中,我们通过“modprobe bnep”命令,装载了基于“蓝牙网络封装协议”的Linux内核模块,然后我们又运行了pand命令,并通过“-c”参数指定目标蓝牙的“蓝牙设备地址”,然后通过“-n”参数在进程中延时(delay)等待一会儿,直到连接建立成功后将其变成后台守护进程。pand进程对自身进行通告广播,并在数秒后识别出一个新的接口bnep0已经被创建好。这时我们使用ifconfig命令将这个接口设置为“开放”(up)状态。
注意
作为一个可以取代bnep命令的命令行工具,Blueman程序可以提供一个图形界面。通过Blueman程序,可以建立“个人局域网”连接。如果你对该工具感兴趣,可以检查一下你的Linux发行包,看该版Linux操作系统是否提供了安装Blueman的程序包,如果没有,可以从网站https://github.ocm/blueman-project/blueman Blueman获取(这是Blueman开发网站的网址)。
一旦我们创建好bnep0接口,下面就可以通过Belkin F8T030拥有一个以太网网桥,通过这个网桥可以连接到位于Belkin F8T030后面的有线网络。在本例中,我们可以运行tcpdump工具,跟踪IPv6和IPv4在网络中的广播通信数据包在网络上的传送。或者,我们也可以在局域网上,为bnep0接口手工配置一个IP地址,或者使用“动态主机配置协议”客户端自动请求一个动态的IP地址,其步骤如下所示:
当你想要关闭pand命令所创建的接口时,可以在再次运行pand工具时,指定“-K”参数来结束所有的pand连接:
注意
关于使用pand工具,获得更多的调试信息,你可以通过“/var/log/syslog file:tail–f/var/log/syslog”命令进行查看。
一旦我们通过个“个人局域网”规范获得对局域网LAN的访问,那么就可以访问那些存在漏洞的网络设备,尽管数据传送的速率很低,就好像不存在蓝牙设备,而是直接与那个局域网建立了物理连接一样。
恶意的蓝牙网络
Belkin F8T030蓝牙AP接入点不太可能成为目标网络中的“弱点短板”(stumble)。依作者的经验来看,比起蓝牙接入点来说,笔记本、台式电脑和手机等蓝牙设备,更有可能被黑客发现正在运行“个人局域网”服务而视为弱点攻击对象。然而,类似Blekin接入点这样的设备,虽然不会成为“弱点短板”,但却完全有可能会出现在另一种无线攻击手段中:恶意的“骗子”接入点。
恶意的“骗子”接入点其实就是一个“骗子”无线设备,它被“放置”到要攻击的某个目标机构的网络中,其目的就是借助于这个“骗子”接入点,使攻击者能够从“安全的距离” [3] 访问该网络。上面所说的“放置”接入点,对于攻击者来说,可以有多种途径:突破对方物理安全设备的保护,然后安装一个接入点,比如将接入点偷偷部署在大厅的某个隐蔽的角落中;欺骗业务不精的员工(less tech-savvy staff)让他们在不知情或被误解的情况下帮你部署接入点;或者买通那些意在报复雇主的内鬼,让他们操刀完成部署。
越来越多的机构开始使用“无线入侵检测系统”(Wireless Intrusion Detection System,WIDS),其目的就是在他们的设备中监控无线设备的活动。对于黑客来说,要逃避对方的检测,在对方的目标网络中部署一个属于自己的恶意的“骗子”接入点,变得比以前更加困难了。然而幸运的是,对于黑客来说,现在基于IEEE 802.11的“无线入侵检测系统”目前并不太适合鉴别蓝牙无线设备的本质特点。因而如果能成功部署一个基于蓝牙的“骗子”接入点到目标网络中,相对于基于Wi-Fi的“骗子”接入点要容易很多。
如果攻击者想要在一个使用了“无线入侵检测系统”的目标机构中部署一个恶意的“骗子”接入点,那么他只需要简单地将蓝牙代替Wi-Fi作为传输机制就可以了。只是通过微小的硬件改动,或者商用适配器,Belkin的接入点就可以转变成一个恶意的“骗子”接入点,甚至,这款设备可以通过“以太网加电”(Power over Ethernet,PoE)端口通过网络远程开机。更进一步来讲,F8T030的电路板非常小,它足以隐藏在任何“看似无害”(innocuous-looking)的设备中,比如烟雾探测器(smoke detector),或者其他环境监测设备,增加了攻击者躲避检测的可能性。
另一种蓝牙设备通信中常见的服务,是向远端蓝牙设备传输文件。有两种蓝牙规范支持文件传输功能,可以在多种使用场合。
第一种支持文件传输功能的蓝牙规范,叫作“对象推送规范”(Objecc Push Profile,OPP),“对象推送规范”使用“对象交换”(Object Exchange,OBEX)协议进行有限的文件传输操作。“对象交换”为“对象推送规范”所用,主要用于在“对象交换”客户端和服务端之间建立和中止会话。同时也会保存和读取文件,中止进程中的文件传输。“对象推送规范”并没有实现列出远端蓝牙设备上的文件系统的功能,所以要想获取一个文件,必须是基于事先就知道要获取的文件名,而获取文件名又只能借助于其他第三方的协议,因此客户端通过“对象推送规范”读取服务端上的文件这一应用使用不多。相反,使用这个规范实现的简单的文件交换方式是客户端主动通过“推送”(push)的方式将一个本地文件传送到蓝牙通信远端的服务端,或者通过“电子名片”(VCards [4] )规范进行单向(unidireccional)或者双向(bidirectional)的联系信息的交换。
第二种支持文件传输功能的蓝牙规范就是“文件传输规范”(File Transfer Profile,FTP [5] )了。与“对象推送规范”简单地交换模式相反,“文件传输规范”具有更多访问远端文件系统的功能,比如允许用户浏览、传送和修改远端文件系统上的文件。它还允许用户在远端文件系统上导航式浏览,以及创建新目录,尽管这些功能在“文件传输规范”中并没有明确地要求做到,但这些功能在实现蓝牙文件传输的时候通常都会实现。“文件传输规范”同样允许用户在远端蓝牙设备上创建一个新的空文件,或者将一个已经存在的文件由一个蓝牙系统传送到另一个系统上,删除任意的文件或者目录。同时,“文件传输规范”也实现了通过蓝牙网络实现“远程文件系统管理”(remote filesystem management)的功能,如果再与一个具有导航的用户界面(User Interface,UI)组合使用,那么用户就能够在远程蓝牙系统上(当然也包括在本地蓝牙系统上)识别已存在的文件和目录,快速地浏览和导航了。
可以通过“服务发现协议”中服务枚举的方式,确认在某个远端蓝牙设备上,“对象推送规范”或“文件传输规范”这两个服务是否存在,操作步骤和显示实例如下所示(同样由于篇幅原因,对实例结果进行了删减)。
在这次输出结果中,有三个文件传输服务得到确认。第一个是“文件传输规范”的服务(即实例中的“FTP”),之后是两个“文件推送规范”服务。第一个“文件推送规范”(即实例中的“Phonebook Access PSE”)用于指定电话簿的访问权限,通过“文件推送规范”可以授权或拒绝用户访问目标设备上的电话簿记录。第二个“文件推送规范”服务(即实例中的“OBEX Object Push”)用来授权对远端目标蓝牙设备上文件系统的普通访问权限。
从安全角度来说,“文件推送规范”服务通常会由多个子服务组成,而每一个子服务又都有独立的安全等级。比如,在上面通过“服务发现协议”的服务枚举扫描结果中,这里的“文件推送规范”服务就是由“Phonebook Access PSE”和“OBEX Object Push”两个子服务组成,并且这两个服务具有不同的安全策略。第一个“Phonebook Access PSE”服务用来接收新的电话簿记录,或者允许远端设备下载现在已有记录,所以安全级别较高,而第二个“OBEX Object Push”服务的用途是实现标准的文件系统访问,所以安全级别相对较低。另外,蓝牙设备也会使用“文件推送规范”服务实现名片的传送,并且为了简化信息交换的过程,蓝牙系统会设定这个服务为不需要进行验证的权限。通常情况下,一旦这些协议可以在不需要进行认证的条件下使用的时候,这些存在规范或服务中因访问权限而出现的漏洞被黑客所攻击的重要性和可能性也加强了。
无论是在“文件推送规范”中,还是在“文件传输规范”中,还有另一层安全措施可以用来限制远端设备能够访问的本地文件系统的位置。比如,对于“文件推送规范”,每个服务都在目标文件系统上配置了一个独立的目录,这个目录主要用于存储传入的文件,并在接到文件请求的时候,将这个文件输出。有时,我们会看到一个名为“蓝牙文件目录”(Bluetooth Files Folder),这个目录就是为了和其他文件系统目录区分开来,告诉用户这个目录中的文件都是服务所创建和自用的。对于“文件传输规范”,管理员会指定一份目录列表,列表之中的目录都可以被远程FTP客户端进行访问,但是不在列表中的目录则会拒绝FTP远程客户端的访问。
在过去的几年时间里,大量的漏洞被黑客识别和使用,有很多都是“文件推送规范”和“文件传输规范”这两个服务在实现时,因为权限问题而导致的,这使得黑客从远端设备上访问要攻击的这个设备时,不需要访问权限,因而就可以无限制地访问本地文件系统。这些被黑客发现和执行的漏洞技术,对于理解现代蓝牙技术,实现现代蓝牙服务是很有价值的。
文件传输目录的遍历漏洞
迄今为止,多种蓝牙协议栈都被爆出会遭受“目录递归攻击”(directory recursion attack)。在“目录递归攻击”中,黑客会在目标设备系统的文件名前加上“目录递归字符” [6] (“..\”)。如果目标蓝牙协议栈对传输的文件名中目录部分的权限不进行验证的话,那么通过“目录递归字符”的多重组合,攻击者就可以通过多级组合,在目标文件系统的任意目录中存储文件。举例来说,假设某蓝牙设备的存在目录是“C:\My Documents\Bluetooth Files”,在这个目录下,蓝牙设备可以将所有的文件合法地存储在这个目录,以及这个目录下的子目录中,而一旦攻击者指定要保存的文件名是“..\..\Windows\Startup\Pwned.exe”,那么存在漏洞的蓝牙协议栈就会不经路径审核地将Pwned.exe文件写入到“C:\Windows\Startup”目录下,后者目录很显然不在“C:\My Documents\Bluetooth Files”目录中,因而跳出了受限制的蓝牙文件目录,对于该用户来说,这很显然是非法操作。
“目录递归攻击”曾经出现在Widcomm、Toshiba、Bluesoleil、Affix和多种移动设备的蓝牙接口上。它们之间的漏洞细节都很类似,基本都出现在“文件推送规范”和“文件传输规范”中。
我们可以使用ussp-push工具,使用“目录递归漏洞”攻击“文件推送规范”。第一步,我们需要选择要上传到目标系统上的黑客工具。比如最常用的rootkit后门程序,或其他系统的后门程序,还可以是用来修改系统获取访问权限的shell执行脚本。下一步,我们指定要使用文件的名称,确定它的执行目录,将文件传输到目标系统上,这个文件必须是个可执行文件,并且是原有蓝牙系统中存在的可执行文件,这样做的原因是,上述操作会将我们自己的黑客工具以文件覆盖的方式取代该蓝牙原有的可执行文件,并且为了避免蓝牙系统瘫痪或崩溃,该文件应该是系统启动时,肯定会用到但不是蓝牙系统是最重要,最常用的文件。在下例中,文件名是acrd32up.exe。比较常见的攻击方法是将上述黑客工具上传到C:\Windows\Startup目录下,这样当系统启动时,我们的代码就会得到执行,如下所示:
尽管没有执行成功的回显,ussp-push程序已经成功地把pwned.exe文件传送到了目标系统上,将它写入“C:\windows\startup”目录中,新的文件名是acrd32up.exe(起这样一个中性无害的名字,很显然是伪装文件原来的企图)。需要额外说明的是,“反斜杠”(即字符“\”)在UNIX/Linux操作系统的shell中表示“转义字符”(meta-character),也就是说在一个命令串中遇到“反斜杠”时,并不将其作为一个单独的单符,而要与后面的字符一起当成一个特殊的字符,比如“\n”表示回车,但如果确实要表示“反斜杠”本身时,则要用两个“反斜杠”,也就是说字符串中每一个“\\”表示一个字符“\”,其中前一个“\”是转义字符,后一个是要转义的字符,所以在上面表示路径的地方,我们需要输入每连续的一组“\\”,表示一个“\”,以避免Linux操作系统的shell误将“\”以其后面的字符相结合,产生不是我们想要的结果。
提示
如果你不知道当前目录所在层次,怎么办?其实,任何一个操作系统在目录切换的过程中都有“容错”机制,比如当你已经处于根目录下,再要“退出该目录,返回到上一级目录”的时候,系统仍然还是回到根目录。鉴于此,如果你不知道当前需要从多少层的子目录中退到根目录,可以在上面“目录递归”攻击命令中,任意指定要返回的层数,这并不会产生什么负面结果。也就是说,如果你不知道需要递归的路径的具体层数,可以指定一个大于或等于实际层数的适当数量值,就可以确保在构造文件目录时到达整个文件目录的根目录处。体现在shell的命令中,就是上面命令中“\\windows”之前,加足够多的“..\\”,总能找到根目录。
尽管在“文件推送规范”中,“目录递归”漏洞是一个巨大的威胁,然而在“文件传输规范”中,问题更严重,因为这里的“目录递归”漏洞会暴露目标文件系统的内容。在“文件推送规范”中,“目录递归”漏洞允许攻击者向目标系统的任意目录上传文件。而在“文件传输规范”中,攻击者可以利用这个漏洞列出目标文件系统上的所有目录和文件,上传任意文件并且能够获取任意的文件内容。总之,无论是“文件推送规范”服务,还是“文件传输规范”服务,二者中存在的“目录递归”漏洞最终都会被用来攻击蓝牙设备主机,只是对于攻击者来说,要想获取目标设备上敏感资源,“文件传输规范”中的漏洞更容易利用。
在Linux操作系统上,我们可以使用obexftp工具攻击有漏洞的“文件传输规范”服务,其操作步骤及效果如下所示:
然后使用“-g”参数,我们可以通过指定文件名的方式获取到该文件。
最后,我们还可以使用“-p”参数将我们文件上传到目标设备上,以及通过“-c”参数指定将这个文件复制到的目标目录路径,如下所示:
文件传输规范中目录递归攻击的缓解措施
要想成功地运行文件传输“目录递归”攻击,攻击者首先要知道目标设备的“蓝牙设备地址”,并且,如果目标设备使用认证时,他必须对该蓝牙设备具有对应服务的访问权限。当然,最重要的是,目标设备上还必须存在“目录递归”漏洞。要对抗这种攻击,我们可以采取的最佳措施就是将设备配置在“非可发现的”模式,这可以作为初级防御的措施。如果设备要求所有的输入连接都需要进行认证的话,提醒你的用户拒绝接受不请自来的蓝牙连接,留心之前没有见到过的系统提示信息,这可以作为中级防御的措施。最后,如果可能的话,及时给蓝牙协议栈打上最新的补丁,通过开发商来积极修补漏洞。
[1] ad-hoc的解释详见“1.1.1节”。──译者注
[2] BNEP同时是两个协议的简称,一个是“蓝牙网络交换协议”(Bluetooth Necwork Exchange Protocol),主要集中在本书的9.1.2节的内容中,另一个是本处“蓝牙网络封装规范”(Bluetooth Network Encapsulation Prof ile),遍布全书多处。——译者注
[3] 从信号的角度来说,距离目的网络越近,信号越稳定,越安全,但这里的“安全的距离”很显然指的不是这个意思,反而是指能够进行正常通信的范围内,距离目标网络越远,或越隐蔽,对于黑客来说越安全。——译者注
[4] vCard即“电子名片规范”,主要用于公开的个人数据交换。规范主要定义电子名片的格式。该格式即可以直接用于数据交换的格式,也可以作为电子邮件的附件方式进行数据交换。——译者注
[5] 看到蓝牙“文件传输规范”,很容易想像到互联网上的“文件传输协议”,二者名称近似,功能也近似,并且同样都既是协议名称,也是服务名称。不过“文件传输协议”只进行文件传输;而“文件传输规范”除进行文件传输之外,还具有远程修改等功能。——译者注
[6] 在很多操作系统中,约定“\”表示根目录,“.\”表示当前目录,“..\”表示当前目录的上一级目录,并且“..\”可以组合使用,如“..\..\”表示当前目录的上两级目录。另外,由于网络上分隔目录的符号是“/”,所以有些系统除了支持上面格式名,还兼容地用“/”表示根目录,“./”表示当前目录,“../”表示当前目录的上一级目录。——译者注