13.4 攻击演练

下面,我们会讲解和检验一种“端到端”的ZigBee攻击方法,这种攻击方法所针对的目标是专门针对某种特定自定义ZigBee设备上的实现方式的。这种攻击方式已经被作者组合出几种现实世界中实施攻击的实现方式上的实例。通过这一攻击方式所实施的渗透测试和组装测试中,我们可以将原来无法识别的网络识别出来。

在这种攻击方法中,我们利用了ZigBee技术的另一个公共的漏洞:设备上物理特性的安全。由于ZigBee技术具有天然的分散性地理位置特点,以及作为外设,尺寸相对较小的特点,所以设备的盗取也成了攻击者绝佳的攻击机会。对于像黑客这样性格的人物,盗取一个ZigBee设备很显然不是为了这个设备本身,而是要对这个物理设备进行逆向工程,随后在了解了其原理、获得一些原始参数和发现攻击漏洞以后,进而攻击其他设备。这种看似荒唐的想法是完全可行的,同时所面临的风险也是最小的。

由于ZigBee设备的成本都很低,所以每个ZigBee设备的节点都不可能采用“防篡改的硬件解决方案”(tamper-proof hardware solution)。这一漏洞所带来的结果就是:攻击者一旦盗取了物理设备,就能够利用这个设备打开ZigBee无线接口,然后与同网其他的ZigBee设备或外部设备进行通信(比如微处理器,或者加密加速器)。对于许多最新的ZigBee无线接口,如果攻击者能够物理接触到该设备的话,那么他们就可以通过调试或者开发者使用的配置接口来获取加密的原始密钥,下面你就会看到这种攻击手法。

13.4.1 网络发现和定位

攻击的第一步,是对ZigBee设备的物理位置进行定位。我们假设攻击者针对于本次攻击流程已经选定了准备攻击的一个特定网络或者机构。这里的攻击流程可以是一次渗透测试,也可以是攻击者从攻击中获得收益的过程。首先要做的是通过无线信号分析先找到一个处于“可被发现的”模式的设备。完成这一任务,攻击者所用的攻击工具,可以使用笔记本电脑、上网本(netbook)或者小型手持设备(handheld),具体操作是查找附近ZigBee发送的数据源,实施这个操作的硬件是ZigBee的无线接口,而软件则是ZigBee工具包中的zbfind程序。

KillerBee设备位置分析工具zbfind

zbfind工具是包含在KillerBee工具套件中的一个程序,通过该工具,入侵者可以识别出IEEE 802.15.4设备,只要这些设备都在自己的功能覆盖范围内向外发送信息。zbfind是图形化的程序,所以提供了一个简单的设备视图,用户只要从这个设备列表中选择一个设备,那么程序就会进一步显示有关这个设备更详细的信息内容。比如所选目标设备所使用的数据帧类型,以及观察该设备活动时第一次和最后一次捕获到该设备数据包的时间。

对于已选择的设备,zbfind会以两种方式显示数据包接收端的信号强度(signal strength)。第一种显示方式会以“速度仪表盘”(speedometer widget)的方式,以图形化的效果来表示最后一次接收到数据包时自己接收到的对方发送信号的信号强度。指针的指向越远离右边,就表示对方的发送信号越强,也就表示攻击者所选择的设备越靠近 [1] 。第二种显示方式就是以一个“信号历史图”(signal history graph)的方式显示,其中包括了信号强度跟随时间的变化情况,如图13-24所示。

图13-24 信号历史图

安装好KillerBee设备之后,从命令行运行zbfind命令,格式如下所示:

为了跟踪设备的位置,攻击者需要向信号逐渐变强的方向移动,直到信号的强度最大为止。一旦达到信号最大强度的地方后,攻击者可以通过“目视检查”(visual inspection)的方式对区域内的目标设备进行寻找。

随时关注目标设备信号强度的变化,只要目标设备需要与其他设备进行通信,那么它发出的数据包就会不停地被侦听到,其信号强调也会随之变化。但在实际侦测中,由于ZigBee设备通常自身几乎不会产生什么流量,所以靠等着对方的设备发送的数据包的方式来更新信号强度,有一定的操作难度,对于攻击者来说,想要收集足够的信息来进行信号分析就变得十分困难。要解决这个难题,最好的办法就是主动出击,变被动为主动。zbfind工具每5秒就会向目标设备发送ping信息,这种办法还是很奏效的,因为数据包到达目标设备之后,只要对方有回复,就不需要考虑对方是同意还是拒绝,都可以从目标设备的每次响应中测得对方的信号强度。有了新的信号强度,就可以刷新“速度仪表盘”的指针显示,同时在“信号历史图”中生成新的数据点。

通过使用zbfind工具,以及信号强度分析,你可以侦测到周边存在的一个ZigBee发送器设备,并且通过对“速度仪表盘”和“信号历史图”的分析,越来越靠近这个发射源。如果目标设备没有采取保护措施,那么对于黑客来说,盗取到这个设备就是一件非常容易做到的事情了。

13.4.2 分析ZigBee硬件

盗取了ZigBee设备后,攻击者可以打开设备的外壳,或者是连接到实验盒中核查该设备所用的线路图外的那些外围设备接口,识别其中的ZigBee设备的无线接口和微处理器。在一些新的无线接口设计中,为了更好地节能,这些组件都会被集成到“片上系统”(System-on-Chip,SoC)中,比如像来自“德克萨斯仪器”(Texas Instrument)公司生产的“Chipcon CC2540”芯片。这个芯片集成了Intel公司的8051微处理器 [2] ,它能够支持128KB的永久闪存以及8KB的RAM内存。

要对“Chipcon CC2540”实施芯片级的攻击,一个方法就是通过串行接口,以调试(debugging)的模式将芯片直接插到某个外设上。借助于这根连接线,我们可以通过芯片接口向芯片发送调试命令,并收集芯片所响应的数据,以及芯片提取后载入到RAM内存中的数据。有了上面的准备,再通过盗窃来的ZigBee设备给该“Chipcon CC2540”芯片加电,该微处理器芯片就会运行保存在闪存中的指令。芯片首先准备的是初始化流程,以便将芯片运行到可以使用的状态,这个初始化过程包括了将“公共变量”(common variable)加载到内存中。即使芯片中采取了安全措施,可以防止攻击者访问“Chipcon CC2540”芯片中的闪存,但是RAM内存仍然是不受到保护的,所以攻击者仍然能够很容易地读到并在几秒钟的时间内转储(dump)芯片RAM内存的内容到外围设备的RAM内存或硬盘中。这样,我们就可以在Linux或者OS X主机上,通过GoodFET工具,提取这段RAM内存的内容,并写入到外围设备的一个本地文件中。

通过GoodFET工具连接CC2540芯片

GoodFET工具是由Travis Goodspeed公司生产的硬件设备,这个硬件设备使用“联合测试行动小组”协议作为其接口的通信协议,通过该“联合测试行动小组”接口,可以直接连接到目标芯片上,然后就可以进行接口调试,配置固件升级,以及使用软件工具。这套系统既可以用在Linux操作系统上,也可以用在OS X操作系统上。GoodFET的硬件和软件组件,都是以开源的方式发布的,包括一份“材料清单”和“Eagle CAD电路设计图”,对于已创建好的GoodFET设备,可以从一些在线零售商那里买到,比如在Adafruit的售价为50美元,其在线网址是http://www.adafruit.com/products/1279 ,一个完整的GoodFET 4.2版本的电路板实物图,如图13-25所示。

图13-25 GoodFET 4.2版本的电路板实物图

GoodFET配套软件的网址就是该项目的主页,其网址是http://goodfet.sf.net 。可以使用Subversion工具下载最新的源代码,然后安装Debian风格的附属插件:

注意

在编写本书时,连接Chipcon芯片的GoodFET客户端并不支持向Chipcon设备的RAM内存写入代码或数据,而只能从中读取数据。这一功能可能会在以后的版本中得以实现。

GoodFET工具通过ChipCon芯片的调试接口连接到“ChipCon CC2540”芯片上。这个接口同“串行周边设备总线”(Serial Peripheral Bus,SPI)类似,都是用于电路板上的“集成电路”(Integrated Circuit,IC)这一级别互联互通的主要接口类型,但是它使用单条双向数据线而不是“主输出从输入”(Master-Out Slave-In,MOSI)和“主输入从输出”(Master-In Slave-Out,MISO)数据线。

在GoodFET工具和“ChipCon CC2540”芯片之间有4条连接线。“ChipCon CC2540”芯片上的“调试”引脚(debug pin)可以从下面的“‘ChipCon CC2540’芯片调试引脚”列表中查到,这个总结性的表格如表13-2所示。

表13-2 GoodFET工具和CC2540引脚说明

对于一个使用“ChipCon CC2540”芯片的ZigBee设备,要将GoodFET工具连接到这个指定的设备上,其详细的步骤会因设备型号的不同而有所不同。尽管通常的处理步骤都是先通过“通断测试器”(continuity tester)识别出“ChipCon CC2540”芯片,然后将一个“好点”(fine-point)连接到目标“ChipCon CC2540”芯片的引脚上。比如连接到DEBUG_DATA引脚上,也就是“ChipCon CC2540”芯片的第46引脚上,然后依次测试其他的“阻焊层” [3] (solder mask)、通孔(复杂的电路板内部的线路一般都是分层的,通孔就是从顶部一直贯穿到底部的孔)和分支引脚来测试导通性。在最糟糕的情况下,可以使用类似医用注射管这样的工具来探测“ChipCon CC2540”芯片的引脚,相比之下,确认在开发调试过程中使用的焊点或者分支引脚会相对容易一些。一旦确认了第一个目标引脚同电路板的连通性后,对其余的引脚重复这些步骤。确认完每个引脚后,根据前面表13-2中的描述使用小的跳线将GoodFET同引脚连接起来。图13-26是一张GoodFET工具同“ChipCon CC2540”芯片的连接图,其中通过连通性测试确认了两个分支引脚。

图13-26 GoodFET工具与ChipCon CC2540芯片的连接图

一旦已经完成了GoodFET的硬件接口的配置,并通过该接口与目标“ChipCon CC2540”芯片连接起来,你就可以使用goodfet.cc命令信息验证连接的有效性。第一,你导出GOODFET变量,该变量指向一个USB串口设备(该串口是当你插入GoodFET设备的时候自动在系统中注册的串口),在Linux下,该设备通常注册的串口名称是“/dev/ttyUSB0”,除非你的主机上事先已经有另外一个USB转串口的设备或连接线的驱动程序,比如,你在插入这个串口设备之前,已先插入过一个USB转RS232口的GPS设备。那么这时注册的串口会依次顺沿为“/dev/ttyUSB1”。然后你就可以通过芯片调试接口上读取的数据识别目标设备。

在确认了从芯片上读到的数据以后,就可以将目标设备上的所有内存中的内容,转储到外设上硬盘的一个dump文件中,其操作格式和命令效果如下所示:

一旦你已经完成了对“ChipCon CC2540”芯片中RAM内存数据包的提取,就可以从目标设备上复制出来,生成到一个文件中,继续从设备中提取感兴趣的敏感信息了。

13.4.3 设备RAM数据分析

在最近几年公开发表的论文中,讨论的都是如何使用取证分析的方法从设备的RAM内在中获取敏感的信息。在微处理器的世界里,它们的理论是相同的,包括搜索数据模式、使用“熵分析技术”(entropy analysis technique)测量数据的随机性。此外,由于可用于处理的数据量只有8K,而不是好几GB的内存,所以使用暴力破解的方式也未尝不可。

通过Intel公司的8051微处理器,访问RAM内存的速度比访问闪存(flash)的速度快,所以经常看到有人为了提高效率而将频繁使用的变量放入到RAM内存中进行处理。对于ZigBee设备,其中一个经常使用的变量是“群组密钥”(group key),它的作用是加密和解密通信数据包,所以能从设备RAM内存中提取的这个值,也是黑客们最想要的值。不过现在面临的问题是,RAM内存中的数据是加密的,虽然加密算法是公开的,内存中的所有数据也被转储出来,并且这8K数据的数据结构也知道,但内存加密的密钥值却不知道。事实上,破解这个问题并不难:要从内存转储文件中提取这个变量,我们可以使用转储文件中任何可能的数据来解密捕获到的数据。如果数据的解密结果不正确,那么我们继续进行猜解,直到获得了正确的密钥或者尝试完了所有可能的数值。因为密钥的长度是16个字节(128位),所以在8K大小的RAM中我们在最差的情况下,也最多只需要进行8177 [4] 次猜解就可以获得密钥,这个猜测量可以在数秒甚至更短的时间内完成。

KillerBee密钥还原工具zbgoodfind

KillerBee工具套件中,zbgoodfind工具的设计目的就是协助GoodFET工具,针对由GoodFET工具转储的内存数据文件,完成对该文件的攻击。zbgoodfind工具共可以接收两种输入文件:一种是加了密的数据包捕获文件,另一种是二进制内存转储文件(以前通过渗透式攻击入侵成功了的ZigBee网络中,一个加密后的ZigBee设备内存文件)。首先,zbgoodfind工具会解析数据包捕获文件中的数据包,通过特征值来判断这是不是一个加密后的数据包。一旦确认完毕后,zbgoodfind工具会使用内存转储文件中连续的128位数值作为可能的“高级加密标准”密钥来解密数据包。这个过程会一直持续到数据包被正确解密,或者zbgoodfind工具尝试完了内存转储文件中所有可能的密钥,最终以破解失败告终。在这两种情况下,zbgoodfind工具都会继续下一个数据包如法炮制地解密这个新的数据包,直到全部的数据包读取完毕后自动退出程序。

首先,我们需要安装binutils工具包,以便从中解压出objdump工具,其操作命令如下所示:

接下来,我们将GoodFET工具转储输出的内容,由十六进制文件转换为二进制文件:

最后,我们在内存转储文件中查找存在的密钥,该文件是使用zbgoodfind工具捕获到的数据包转储文件,文件名为encdata.dcf,其操作命令及输出样例如下所示:

提示

zbgoodfind工具既可以读取libpcap格式文件,也可以读取Daintree网络中“传感器网络分析器”所保存的格式。如果是读取前者格式,则使用“-r”参数;如果是读取后者格式,则使用“-R”参数。

在本例中,我们发现在6379次猜解后,最终成功破解了用来解密数据的“网络密钥”。一旦密钥值被还原,攻击者既可以破解所有加密的内容,也可以亲自完成对数据的加密,所以,这时的攻击者可以返回到目标网络中,在通信数据包都被加密的情况下进行侦听,或者伪造一个合法设备,加入到要攻击的ZigBee网络中。

防御硬件攻击

在这种攻击中,我们高调地突出了实物盗取ZigBee设备,以及通过还原加密的密钥原材料的方式来攻击硬件的所有步骤。那么对于这种方式的防御也只能对症下药,从物理安全的角度来看,你可以通过传统的视频监控和防盗技术防止ZigBee设备的盗窃,这包括视频监控、保安看守、硬件上锁,以及设备栓绑等生活中的非技术手段。然而这些措施通常不能很好地与ZigBee技术相融合,在很多情况下,这些设备暴露在一个未受保护的物理区域内,或者在另一些情况下,因为消费者需要使用这些系统,而使得这些设备干脆就在消费者的手中。比如,在一个零售商店里,可以刷卡的自动结账和付款设备(俗称“POS机”)就属于这种情况。由此可见,设备的实物盗取方式是完全可能的。

这里我们重点讲解了“德克萨斯仪器”公司生产的“Chipcon CC2540”芯片。该产品上的漏洞,同样也存在于其他同类设备中,包括“Chipcon CC2530”芯片和“Chipcon CC2531”芯片,还有其他一些ZigBee芯片制造商的产品,比如Ember公司的同类产品。传统的芯片都采用了外部微处理器,比如“Chipcon CC2420”芯片,也同样包含有类似的漏洞。所以攻击者可以在系统启动时侦听微处理器和无线接口之间传输的配置数据,所用的方法,就是在“串行周边设备总线”上通过加装接口,然后在侦听到配置数据后,提取其中的密钥信息,最后再使用zbgoodfind工具对密钥进行破解。

针对上述破解攻击,可以考虑引入“防篡改检测系统”(Tamper-proof detection system),比如只要ZigBee设备被打开,那么系统自动销毁无线芯片。尽管这些“防篡改检测系统”的成本对于ZigBee设备来说都是无法接受的,但这样做无疑会增加入侵者实施攻击的难度。同样还可以采取物理防护措施,比如使用黑色的绝缘环形树脂将电路板包裹起来,但是这些措施都不是万无一失的,因为有许多方法可以在不破坏电路板的情况下去除环形树脂胶带。

[1] 实际中的测试效果取决于多种因素,首先所有设备都必须是同一发射功率,这一条不难做到,其次就是各设备与自己之间没有干扰源,比如一堵墙、周边的电子设备,甚至是天气原因都会对信号强度产生较大的干扰,这一条就很难保证了。所以上述方法只能粗略地测试,无法用于准确的定位。——译者注

[2] 这里提到的“芯片”,由于是片上系统,所以我们完全可以将其理解为就是一个“设备”,只不过这个设备被集成到一个芯片中了,所以这个设备即有内存,也有CPU,甚至还有接口,可以进行数据通信。——译者注

[3] 简单地说,阻焊层就是指印制电路板上要上绿油的部分。——译者注

[4] 8K内存共8×1024=8192个字节,从中取连读的16个字节,共有8192-16+1=8177种可能。——译者注