14.2 攻击Z-Wave网络
接下来,我们对Z-Wave网络的技术实现实施多种攻击,借此发现和检验漏洞。作为一个专有的和介绍资料少得可怜的技术(除了不必与“西格玛设计”公司签署“保密协议”的技术),能够用于攻击Z-Wave网络的工具也显得尴尬和相对不成熟。在接下来的内容里,我们会对所使用的工具在用法上提供简明的指导,虽然这样做会导致攻击平台的成长和成熟,但这也会帮助该领域内获得持续的发展。
14.2.1 对Z-Wave网络的侦听攻击
对任何无线网络,最常见的攻击技术就是窃听网络上通信的数据包,以观察其中以明文方式传送的敏感数据。在对Z-Wave攻击技术的覆盖范围内,我们将通过多种技术利用三个主要工具,开始我们的侦听攻击。
⚡ Z-Force侦听工具
Z-Force是一款Windows操作系统上的工具,是由Behrang Fouladi和Sahand Ghanoun共同开发的,这是二人研究Z-Wave网络漏洞的一部分。Z-Force工具作为一款基本的数据包嗅探器,还有对Z-Wave网络攻击的附加功能,这一点我们会在本章后面进行介绍。
对于嗅探器的硬件,Behrang Fouladi和Sahand Ghanoun为德克萨斯仪器公司的“CC1110芯片的迷你开发套件”(CC1110 Mini Development kit)开发了一个定制的固件程序。该固件程序的产品编号是CC1110DK-MINI-868。该套件包括两块“CC1110开发板”和用于对CC1110芯片进行编程的德克萨斯仪器公司的“CC Debugger”调试器。这两个开发板和“CC Debugger”调试器的实物图如图14-9所示。
“CC1110芯片”是一个“片上系统”设备,包括一个8位8051微处理器,有一个支持868MHz和915MHz频段的无线接口。由于Z-Wave开发板没有与“Z-Wave联盟”签署“保密协议”就不能使用,所以“CC1110芯片的迷你开发套件”是在一个合理的价位上的不错的选择,其单价是75美元。
作为一个开发套件工具,该CC1110DK芯片是为开发人员设计的,目的是向使用Z-Force技术的开发人员提供一些一些额外的组件:
·基本通孔焊接工具,包括烙铁(iron)、焊锡丝(solder wire)、助焊台(helping hand)、老虎钳(vise)。
·双面0.1厘米间距2排7列(2×7)“公头对公头”的连接头,外形如Adafruit.com网站上产品编号为1539的产品(该产品是2×36的连接头,由于没有2×7的连接头,所以只能用这种2×36的连接头手工切成5个2×7排列的连接头)。
·6根“母头对母头”成型跳线,外形如Adafruit.com网站上产品编号为266的产品。
·1根“USB转串口”桥接转接头,主要用于串行访问,如Adafruit.com上名称为“飞特帝亚公司之友”(FTDI Friend)的产品,产品编号是284。
♥ 提示
我们列出了部分商品在在线电子商店Adafruit.com上的产品编号,但这些商品都是通用产品,所以这些或类似的产品也可以通过别的渠道购买得到,例如digikey.com 、mouser.com 或ebay.com 。
首先,你需要使用Z-Force固件程序刷新CC1110DK芯片的接口,然后你需要将CC1110DK接口连接到“USB转串口”的转接头上,通过笔记本电脑的USB接口连接到你的Windows操作系统上,接下来,我们来看看这些步骤。
(1)刷新CC1110DK接口的固件程序CC1110DK在出厂时就预装了基本的“主/从”模式固件,可以通过发送或接收功能来估计测试距离。为了通过CC1110DK接口使用Z-Force工具,你必须在双方的接口中刷上新的固件程序。
Z-Force的设计可以同时容纳两个CC1110DK接口,通过“USB转串口”的适配器进行连接,连接的原则就是:每一头的“发送引脚”(TX)连接另一头的“接收引脚”(RX)。你需要将两头的固件文件都刷上最新的固件程序,每一个不同的CC1110DK芯片都要使用Z-Force固件程序的全部功能。
Z-Force的作者提供的固件程序只能使用欧洲的Z-Wave频率进行无线程序的发送和接收。在向Z-Force的作者提出索要项目源代码以便修改频率的时候,遭到了作者的拒绝,对方指出是因为“保密协议”的原因。幸运的是,使用欧洲频率的Z-Force固件二进制补丁程序还是可以直接使用北美洲频率的,所以,下面我们就可以直接将内容跳转到欧洲和北美洲相应的章节中,然后根据你所处的无线监管区域,查看相应章节的内容。
支持欧洲Z-Force频率的固件文件
默认的固件文件主要就是向Z-Force提供对868.4MHz频率的支持,所遵从的规范是“Z-Wave无线规范”的R2配置版本,传输速率是40 Kbps(详见表14-2)。发送TX和接收RX的固件文件可以从Z-Force工具的SVN[1]仓库处下载,其网址是https://code.google.com/p/z-force/source/browse(在该网页上查找“trunk/firmware”(中继线/固件)相关的内容)。
Z-Force固件文件是以二进制格式发布的,但是我们需要将它们转换为Intel公司十六进制格式,然后才能刷新到“CC1110DK记忆棒”的内存中。要完成这种固件文件内部格式的转换,需要下载一个SRecord-Win32转换工具,该软件的下载网址是http://sourceforge.net/projects/srecord/files/srecord-win32。下载成功后,解压缩所下载的srecord-X.YY-win32.zip文件(X.YY表示的是SRecord-Win32软件的最新版本号),然后将解压后的srec_cat.exe二进制文件复制到Z-Force固件文件所保存的目录中。打开命令shell外壳程序,由于是Windows操作系统,所以也就是打开“命令提示符”,然后在命令提示符中切换到上述Z-Force固件文件所保存的目录,这样就可以在命令行中将二进制文件转换为Intel公司的Hex格式文件了。其操作系统的格式及运行效果如下所示:
接下来,我们可以将这两个固件文件刷新到CC1110DK的电路板上芯片中了。
支持北美洲Z-Force频率的固件文件
为适应在北美洲使用Z-Force工具,作者创建了一个Z-Force固件的修订版本,新版本的下载地址为http://www.willhackforsushi.com/code/z-force-northamerica.zip。下载并解压z-force-northamerica.zip,可以得到两个固件文件,分别是Z-Force_Firmware_RX-US和Z-Force_Firmware_TX-US。
同时,下载得到的Z-Force北美洲版工具解压缩后的文件中,既有二进制格式的固件文件,也有Intel公司的十六进制格式的固件文件,以及针对本次支持北美洲Z-Wave频率的修订版所做出的详细修改注释。
(2)CC1110DK固件的刷新
无论你使用支持哪个洲Z-Force频率的固件文件,在CC1110DK硬件上刷新固件文件的过程都是一样的。首先,通过DBG_CONNECTOR板,将CC1110DK与“CC Debugger”调试器连接起来,如图14-10所示。在连接硬件的逻辑上,跳线桥的第3、第4引脚应该连接在CC1110芯片的下面;“CC Debugger”调试器的USB接口应该连接到计算机主机系统上,然后在计算机主机上运行“SmartRF固件烧录程序”(SmartRF Flash Programmer)。
“SmartRF固件烧录程序”允许你直接与得克萨斯仪器公司的CC1110芯片以交互的方式完成读取和写入固件文件的刷新操作,“SmartRF固件烧录程序”工具可以从得克萨斯仪器公司的官网上下载,网址是http://www.ti.com/tool/flash-programmer。下载并解压所下的压缩文件,然后运行其中的安装程序(installer)完成安装过程。下一步,运行“SmartRF固件烧录程序”软件。
⊗ 注意
在写本书的时候,得克萨斯仪器公司推出了“SmartRF固件烧录程序版本2”(SmartRF Flash Programmer 2),“版本2”下载的网址和“版本1”的下载网址相同,所不同的是“版本2”(即标为“v2”的这一版)的软件并不能与使用CC1110芯片的“CC Debugger”调试器保持兼容,取而代之的是使用CC1110DK芯片的“CC Debugger”调试器。既然前面的例子都是使用CC1110芯片的“CC Debugger”调试器,所以我们现在运行“SmartRF固件烧录程序”(注意不是“版本2”),继续看下面的步骤。
当启动“SmartRF固件烧录程序”工具以后,会出现通过“CC Debugger”调试器升级固件之类的提示信息,按照提示就可以完成固件的更新。
随着“SmartRF固件烧录程序”工具的打开,你可以选择或输入要刷新的Z-Force固件文件,然后在“动作”(actions)分组框中选择“擦除、写入并验证”(Erase,Program And Verify)单选框。再在所选接设备的列表中选择“CC Debugger”调试器接口,并且查看一下使用的芯片是CC1110,然后单击“动作完成”(Perform Actions)按钮,其效果如图14-11所示。在上述过程中,如果“SmartRF固件烧录程序”没有在所连接设备的列表中列出要刷新固件程序的CC1110芯片,那就先检查确认你的DBG_CONNECTOR连接器的连接线连接是否正确,该连接图如图14-10所示,以及跳线的位置是不是在第3和第4引脚上。
CC1110DK固件的刷新操作与CC1110固件的刷新操作一样,故不再重复,并且下面改用CC1110DK进行介绍。
♥ 提示
在成功地使用CC1110DK芯片完成对Z-Force固件的刷新工作之后,该设备上的红色和绿色的LED指示灯都会被点亮。
重复上面为电路板上CC1110DK芯片的刷新过程,每个电路板所对应的设备功能不一样,所以刷的内容也不一样。一边接收方要刷的是接收固件RX,另一边发送方要刷的是发送固件TX。因为两者之间没有视觉上的差异,为了防止混淆,我们建议直接在板子上贴上一个标签,明确标明这个电路板是刷新了发送固件TX的电路板,还是刷新了接收固件RX的电路板。
下一步就是在CC1110DK接口中刷新欧洲Z-Force固件,或者刷新北美洲Z-Force固件,你可以从电路板上断开“CC Debugger”调试器接口,然后将“USB转串口”的桥接转接头连接到电路板上,对使用Z-Wave协议的设备进行处理。
(3)连线CC1110DK接口
要使用CC1110DK接口,首先要将双面“公头对公头”的连接头焊接到CC1110DK主板上标有INTIO的socket引脚插座上,主板上的插座是2×7引脚布局。现实中很难找到这种引脚排列的连接头,一个简单的办法就是买一个其他布局的,比如本节一开始提到的2×36排列的连接头,然后手工切割[2]一个2×7的连接头使用。接下来,使用成型跳线连接CC1110DK公头引脚的“USB转串口”桥接连接线上,连接示意图如图14-12所示,引脚的连线对照表详见表14-5[3]。
⊗ 注意
我们在这里详细地介绍了“飞特帝亚公司之友”(FTDI)的“USB转串口”桥接转接头连线方式,只要连接正确,那么从电脑主机向“USB转串口”桥接转接头发送的数据都会导致该设备上的LED灯闪烁。比如,你从终端仿真器上按下一个回车键,由于有数据传输,所以设备LED灯就闪烁一下后灭掉。间接地,使用这个方法你也可以知道当前数据是否通信。如果你使用的是另外一个不同型号的“USB转串口”的适配器,你要查阅该产品的文档来确定正确的引脚,特别是其中的地线GND、发送线TX和接收线RX。
要在两个设备上分别应用正确的固件程序,我们需要使用两节AAA电池为CC1110DK主板供电。将主板上P1插线排上的引脚1和引脚2通过跳线连接到电池的两端,使其向主板提供电源。再将刷新过接收固件RX的CC1110DK板上的“USB转串口”桥接转接头连接到计算机主机上,通过Windows的“即插即用”功能自动安装所需要的驱动程序。关注这里用于接收RX接口的串口的端口号。重复上述步骤,再将刷新过发送固件TX的CC1110DK板上的“USB转串口”桥接转接头连接到计算机主机上,自动安装所需要的驱动程序。并同样关注一下这个用于发送RX接口的串口的端口号。
注:这里的“USB转串口”其实只是一种接口转换线,就是外形是USB口的线,但实际上运行的是串口的协议。对于操作系统来说,看到的是一个串口,而不是一个USB口,从软件的角度来看,这个串口与实际的物理串口并没有什么区别。这里所说的“关注串口的端口值”,在Windows操作系统上,是依次打开“开始/控制面板/设备管理器”,然后查找其中的“端口(COM和LPT)”(如果没有此项,则表示你的计算机中没有任何串口),然后就会列出该主机上所有的串口,其中名字的最后通常都是“(COMn )”结尾,其中的n就是上面要关注的串口端口值,以后所有对该串口的操作也都要使用该值。即使同样多个的“USB转串口”,插入顺序不同,各连接线的串口值也不一样,所以需要“关注”并记下来。——译者注
♥ 提示
对于CC1110DK设备,你还可以不使用电池供电,而改由“飞特帝亚公司之友”的“USB转串口”桥接转接头供电。要这样做,需要进行一些改装。首先,将板上的5伏电源(即标有“5V VCC”的位置)连线剪断然后连到“飞特帝亚公司之友”板背面的3V跳线焊点处将其焊上,然后将四个跳线针中的引脚1连接到“飞特帝亚公司之友”电源VCC引脚上,这样CC1110DK的供电将通过USB由主机电源供电。主机电源给USB口供电,USB口再通过“飞特帝亚公司之友”板给CC1110DK设备供电,但注意不要将第2根电源线连接到CC1110DK设备上。
所有的工作完成以后,你就可以开始运行Z-Force应用程序了。单击“选项(Options)|射频板(RF Boards)”菜单,分别选择和设置前面发送固件TX所对应的COM串口端口值和接收固件RX所对应的COM串口端口值。然后程序就做好了开始捕获Z-Wave网络上的通信数据包的准备,这时选择“工具(Tools)|开始捕获(Start Capture)”菜单。Z-Force程序就会显示所捕获到的数据包,其效果类似图14-13所示。单击“工具(Tools)|停止捕获(Stop Capture)”菜单就会停止当前的数据包捕获过程。
遗憾的是,作为一个嗅探工具,Z-Force程序只是做到了最基本的数据包捕获功能,对于常见数据包捕获工具上的通用型功能,Z-Force程序并没有提供。可以说,Z-Force程序只是完成了嗅探类工具中最小的数据包的解码能力,所完成的功能只是做到了提取HomeID、源节点ID、目的节点ID等寥寥几个字段,这也是在识别数据包中Z-Wave电子束控制和其他部分的时候得到的。同时,由于Z-Force工具缺少以任何格式保存所捕获的数据包到文件的能力,因此即使该工具捕获到一些数据包,也无法通过其他工具进行进一步的分析。还有,因为Z-Force的固件只支持“Z-Wave规范”中的R2配置版本,所以Z-Force工具也只支持“Z-Wave规范”中的R2配置版本,而不支持R1配置版本、R3配置版本,以及“Z-Wave Plus规范”。最后,作为一个“闭源项目”(closed source project),自2013版的Z-Force工具推出以来,就再也没有进行后继的开发,所以添加新功能也是不可能的。为了解决这些限制,本书的作者在写这一章的过程中启动了一个新的Z-Wave嗅探项目,名为:KillerZee。
基于CC1110DK芯片攻击Z-Wave网络的开源工具作为一种Z-Force工具的替代品,研究人员Jean-Louis Bourdon开启了ZTsunami项目,其设计目标是打造一个只需要使用一个CC1110DK接口,既能进行Z-Wave嗅探,又能实施数据包注入的工具。为了使ZTsunami成为一个强有力的工具,Jean-Louis Bourdon对“Z-Wave规范”进行了更深入的分析和剖析。作为一个开源项目,ZTsunami已在多个方面优于Z-Force工具,包括日益增长的社会支持和越来越多的项目志愿者积极参与开发。
虽然对于Z-Wave网络在欧洲和北美洲使用频率上,ZTsunami工具已经能够捕获Z-Wave通信数据包,并将捕获的数据包写入到文件中了,但在本书的写作过程中,作为一个新的工具,ZTsunami仍然还只能提供有限的功能。同时,如果对你来说,如果无论是固件,还是Windows下嗅探软件源代码,都愿意接受“GPLv2许可[4]”,那么可以使用CC1110DK硬件平台进行Z-Wave网络嗅探开发的开源项目就多了,这些项目也都是直接将其项目开发目标定位于取代Z-Force工具。
ZTsunami的资料可以从https://code.google.com/p/ztsunami网址上查到或下载。一个较早捕获到数据包的实例结果显示如下:
⚡ KillerZee设备的侦听
KillerZee项目是出于简化Z-Wave嗅探开发、扩展数据包嗅探的功能,以及利用开源项目的优势这几个目标而创立的。项目通过加入各网络嗅探功能中公共的功能实现,而开源项目最大的优势就是可以遇到全世界范围内的针对Z-Wave攻击平台上频繁的要求。就在本书写作的时候,虽然现有的功能已经满足这些目标的要求,但针对KillerZee的发展仍然处于进行中。
KillerZee工具既是一个Z-Wave网络安全评估的工具集,又是一个新的Z-Wave工具的开发框架。使用KillerZee工具,你可以侦听到Z-Wave网络上的一举一动,列举出连接到Z-Wave网络上的外围设备,利用Z-Wave技术使用上的漏洞,操纵Z-Wave网络的活动,最终识别出一个可以使用的新的攻击漏洞。
KillerZee工具并没有使用CC1110DK的硬件,而是使用了CC1111芯片,结合“得克萨斯仪器”公司USB接口的“评估模块集”(Evaluation Module Kit,EMK)作为其攻击硬件,该设备的实物图如图14-14所示。CC1111EMK设备使用一个类似于CC1110DK芯片的芯片,但是增加了USB功能,另有一些引脚的针用于程序的烧录。有一个灵活的按钮可以用于自定义功能。不幸的是,这款CC1111EMK芯片相比于CC1110DK芯片少了一些功能,但对于执行一些Z-Wave网络上数据包的捕获操作,已有的功能绰绰有余。
有一个名为RfCat的,同时使用了CC1111EMK设备和KillerZee工具的项目,它利用了二者的固件以及Python开发框架,也在做类似的Z-Wave网络侦听工具的制作。作者的网名叫“@tlas 0f d00m”[5],其项目名RfCat的绰号是“低于1GHz频率无线攻击的瑞士军刀[6]”(the Swiss army knife of sub-GHz radio)。作为一个研究和攻击“低于1GHz频率”网络的开发框架,RfCat采用Chipcon公司的CC1111芯片,包括CC1111EMK芯片。项目的固件程序开源,这是一款用“小设备C语言编译器”(Small Device C Compiler,SDCC)结合Python编程框架,通过与CC1111芯片进行交换操作设计而成,负责交互的程序名叫rflib。RfCat项目既可以作为一个平台对“低于1GHz频率”网络进行攻击实验,也可以提供一套“应用程序接口”,使第三方可以拿来用于开发定制的工具。
RfCat项目需要一些初始化设置,然后才能将RfCat固件程序刷入到CC1111芯片中。在刷入RfCat固件程序以后(系统加载程序bootloader和固件程序都是为CC1111EMK所提供,按着RfCat项目的说法,这个程序叫“DonsDongle”[7]),还有做一些维护工作,然后才能跳转到Z-Wave嗅探的攻击之中。要将RfCat固件刷新到CC1111EMK芯片中,你还需要下面的组件。
·1个或多个CC1111EMK接口,可以从http://www.digikey.com或其他受欢迎的在线电子网站购到。
·1个GoodFET接口,主要用于刷新CC1111EMK芯片的固件,可以从Adafruit.com 上找到,产品编号是1279。在本书13.4节中有GoodFET接口其他方面的资料介绍。
·5根“母头对母头”的成型跳线,可以从Adafruit.com 网站上查到,产品编号是266。
·1台至少有一个空闲USB接口的Linux主机。
首先,我们看一下如何安装RfCat工具和GoodFET工具,然后我们再了解连线过程以及刷新CC1111EMK芯片固件程序的过程,通过将RfCat刷新到CC1111EMK设备中,我们会专注于使用KillerZee,结合硬件对Z-Wave网络进行攻击。
(1)安装RfCat工具
RfCat项目的源代码是使用Mercurial这样的“版本控制系统”(version control system)进行管理的。所以,要使用这套源代码,还需要安装Mercurial程序。在Linux主机使用由Linux提供商发布的“程序包管理工具”(package management tool)来安装Mercurial程序,下面的命令是假设读者使用的是基于Debian,或基于Ubuntu的Linux操作系统上,通过“程序包管理工具”来安装Mercurial程序命令格式。
下一步,使用Mercurial工具中的hg程序,从RfCat项目中下载源代码,下载成功以后,从命令行切换到rfcat目录中,其操作步骤和命令效果如下所示:
接下来,构建和安装Python的rfcat工具,以及rflib开发库:
在没有root权限的前提下使用RfCat,然后在bootloader模式下设置正确的设备访问链接,并且你还需要在udev目录下修改Linux“设备管理配置”(device management configuration)。结束以后,复制RfCat提供的配置文件到Linux的udev规则目录,然后重装udev目录下的配置内容,如下所示:
最后,复制RfCat工具生成的bootloader.py脚本到系统PATH路径可以找到的一个目录中,比如复制到“/usr/local/bin”目录中,则命令格式为:
现在,你已经完成了RfCat工具安装,下面就可以继续安装GoodFET软件了。
(2)安装GoodFET工具
我们用GoodFET来刷新初始的引导程序bootloader代码到CC1111EMK设备的硬件上。首先,安装git的“版本管理工具”(version management tool),因为这是GoodFET程序开发包所需要的,然后下载最新版的GoodFET源代码,其操作命令格式如下。
下一步,切换到GoodFET客户端的目录,创建一个到GoodFET客户端的“符号链接”[8](symbolic link),其命令格式及运行效果如下。
最后,添加你的用户账户到dialout组,这样就可以在没有root权限的情况下使用GoodFET工具了。
⊗ 注意
因为组成员发生了变化,为了使新的组成员关系生效,你将不得不注销系统,并再次登录。这样就可以正常使用了。
在完成RfCat工具和GoodFET工具的安装后,你就可以通过连线将CC1111EMK设备与GoodFET设备连接起来。
(3)连线CC1111EMK接口
接下来,我们使用GoodFET工具向CC1111EMK设备载入RfCat项目的CCBootloader代码。这是一次性的操作,一旦完成,那么以后你如果要更新RfCat固件,就不需要再通过连接线接入GoodFET设备了。
CC1111EMK设备有两组连接头,一组用于测试(test),一组用于调试(debug)。其中调试用的连接头是必须要与GoodFET设备相连的,二者之间的连接方式是“母头对母头”的跳线连接器。连接示意图如图14-15所示,引脚的连线对照表详见表14-6。
因为GoodFET设备为CC1111EMK设备提供电源,所以你不需要为CC1111EMK提供电源就可以完成芯片固件的刷新。只要简单地将GoodFET设备插入到Linux操作系统主机的USB口上,很快就可以从CC1111芯片上获得该设备的基本信息,其命令格式及效果如下所示:
如果goodfet.cc工具运行后报告一个芯片ID值为0x0000,那就说明读取失败,这时,你需要检查你的接线,以确保连接方式与图14-15是匹配的。
(4)刷新CC1111EMK芯片
现在,GoodFET就可以与CC1111芯片进行通信了。下一步,将CCBootloader代码刷到芯片上,该步骤的运行结果如下所示:
通过上面的操作,GoodFET已经将CCBootloader的代码刷入到CC1111EMK芯片中,下面你可以从CC1111EMK设备上将GoodFET的连线断开了。之后的CCBootloader程序,允许你刷新(flash)或再刷新(reflash)CC1111EMK设备,如果需要,你甚至可以用不同的固件文件进行刷新。
下一步,将CC1111EMK设备设置为bootloader模式,设置的方式是按住设备面板上的按钮,然后将设备插入到计算机上一个可用的USB端口,一旦插好,就可以放开按钮。这时,你会看到CC1111EMK设备外壳上绿色的LED类就会亮起来,这时查看Linux操作系统上的内核日志,你会看到有一个新的串口设备在系统中注册,其效果如下所示:
接下来将CC1111EMK设备也设置为bootloader模式,不过,这个设备设置为bootloader模式不需要按按钮,而是运行bootloader.py脚本。运行后,该程序会从可访问的闪存区域删除其中原有的所有内容:
随后,从https://bitbucket.org/atlas0fd00m/rfcat/downloads 网站上下载RfCat项目中最新版本的CC1111EMK固件程序。选择文件名以“RfCatDonsCCBootloader-”作前缀,后面跟着版本号,并以“.hex”结束的文件。在这个例子中,我们使用版本号为140904的文件进行创建,其命令格式如下:
下一步,使用bootload.py脚本程序刷新RfCat的固件。
使用bootload.py脚本运行RfCat的固件程序,其命令格式如下所示,或者干脆拔掉RfCat接口,然后重插一下,利用系统自动运行的功能运行固件程序:
使用CC1111EMK接口上的RfCat固件,现在,你可以开始使用KillerZee工具对Z-Wave网络进行窃听了。
(5)安装KillerZee工具
最后,下载并安装最新版本的KillerZee软件。这是一个简单的过程,只要按如下所示的格式操作即可:
使用固件已经刷新过的CC1111EMK接口与已经安装好的KillerZee程序,你就可以开始对Z-Wave网络进行窃听了。
(6)KillerZee的嗅探操作
KillerZee工具中的zwdump程序很像Linux系统中的tcpdump程序。不同的只是zwdump程序用于Z-Wave网络中的侦听,而tcpdump程序则是对以太网(不分有线无线的)进行侦听。如果只是想捕获和显示Z-Wave网络的基本信息,那么在运行zwdump程序的时候,就不需要带任何参数,其效果如下所示:
如果你希望以类似于tcpdump的方式显示捕获到的数据包格式,zwdump程序也可以将写到文件中的数据包以libpcap文件格式进行保存,并且zwdump程序还可以从保存数据包的文件中将捕获的数据包读取出来,并以tcpdump格式进行显示:
♥ 提示
如果在zwdump命令的后面加上一个“-v”参数,那么当zwdump程序在写入到libpcap文件所捕获的数据包时,zwdump程序还会对数据包进行解码,并且将解码结果以及接收数据包的内容都显示出来。
KillerZee工具包以及该工具包下所包含的各个工具,虽然都是专为Z-Wave网络而做的,但是在设计的时候,都考虑到了全球范围使用的兼容性。比如说,这里的每个工具都支持“Z-Wave规范”中“R1配置”和“R2配置”的版本规范。默认情况下,对于北美洲的用户,zwdump以及其他的工具都会默认地应用“R2配置版本”,以便适用北美洲的频率,不过,你可以在命令行中改变这种默认的配置。下面的示例就是使用“R1配置”版本在美国捕获Z-Wave设备的网络活动。
使用KillerZee工具,比如其中的zwdump程序,如果是到了除北美洲之外的其他无线管理域该怎么办呢?其实,只要在命令行中使用“-c”参数,并在该参数后面跟上两个字母的国家和地区代码[9]就可以了。其示例及运行效果如下所示。
⊗ 注意
在本书写作的时候,KillerZee支持射频管理域已达60多个国家和地区,范围从加拿大(Canada)到新西兰(New Zealand)。
不幸的是,尽管对于KillerZee项目的路线图(roadmap)来说,早已将Z-Wave网络数据包的解码列为一项紧迫任务,但对于Wireshark的项目,则仍然未将Z-Wave网络数据包的解码集成到其程序中。如果想检测KillerZee系统的最新版本,可以到其网站上查找,网址是http://killerzee.willhackforsushi.com 。
3.对Z-Wave侦听攻击的防御措施
就像任何其他无线技术一样,Z-Wave网络的用户应该牢记:攻击者可以通过捕获网络通信数据包来实施“侦听攻击”。在这些例子中,网络活动并没有通过加密程序的保护来保证数据的机密性和完整性。在可能的情况下,用户应该利用内置Z-Wave加密功能,或第三方加密程序来防止敏感信息的泄露。
不幸的是,“Z-Wave联盟”并没有强制要求Z-Wave产品必须应用加密技术,这使得许多消费者很容易受到“侦听攻击”。在多数情况下,防止敏感信息泄露的唯一的防御措施是让供应商提供网络的保密性和完整性控制。
14.2.2 对Z-Wave网络的注入攻击
尽管没有参照“Z-Wave规范”,但我们还是可以推断出对产品供应商来说,他们并没有要求必须支持加密技术。事实上,许多Z-Wave产品厂商销售智能家居产品,从温控计到遥控电源插座,都无一例外地缺乏基本的加密技术和对完整性保护的支持。在这些网络中,攻击者可以“注入”(inject)任意数据包内容,或“重播”(replay)之前捕获的数据包来操纵Z-Wave网络中的任意一个Z-Wave设备节点。
⊗ 注意
在一个网络中不使用加密技术,那么Z-Wave的“纳入”处理(inclusion process)就相当于加载(amount)了一个无连接(connectionless)的“基于地址的过滤”机制(address-based filtering)。就像其他网络中无连接的“基于地址的过滤”机制一样,攻击者可以通过“源地址欺骗”(spoof the source address)的方式达到冒充Z-Wave网络上合法节点的目的,并且以被冒充节点的名义,即使明确没有在某个网络中,仍然可以“注入”任意内容的数据包。
⚡ 通过未加密数据发起重播攻击
在“重播攻击”中,攻击者“重复发送”(retransmit)以前捕获并保存的数据包,借助于不需要认证的网络“再现”(reproduce)网络事件。执行一次“重播攻击”非常简单:重新播放存储的数据包捕获文件的内容即可。这种攻击产生的影响差异显著。
我们考虑一种实例,在一个未加密的Z-Wave网络中有一个Z-Wave温控计和一个Z-Wave“控制设备”。有一个攻击者捕获并保存了一个“温度增加一度”的数据包,并且“重播”了这个数据包多次,这样就可能将温度增加到一个不舒适的程度。另一个攻击的实例是针对Z-Wave门锁的:捕获和重新播放以前车门开锁的数据包,可能会产生未经授权的访问,导致车门在车主不知情的情况下打开。
(1)使用Z-Force工具进行重播攻击Z-Force工具包括数据包的发送功能,要进行“重播攻击”的时候,在该软件的“工具(Tools)|发送数据包(Send Packet)”菜单选项里,输入目标网络的“HomeID”(即界面上的“Home ID”)、“源节点ID”(即界面上的“src Node”)、“目标节点ID”(即界面上的“Dst Node”)、“帧控制”(frame control)的值(就是Z-Wave数据包头中的“有效载荷头部”Header字段,也是界面上的同名项),上述各值都是以十六进制格式表示,接下来输入你要发送数据包的有效载荷的内容(即界面上的“Payload”),输入发送重复次数,然后单击“发送”按钮,程序的界面如图14-16所示。
⊗ 注意
在“注入数据包”的尾部,不需要包括“帧校验序列”。这是因为Z-Force工具会在发送前计算数据包的“帧校验序列”,并将计算的结果填在相应的位置处。
除了“重播”以前观察到的数据包的能力之外,Z-Force工具还能够“注入”修改过的数据包的内容。这时的Z-Force工具就会变成简单的数据包“Fuzzing测试工具”[10],通过“重用”(reuse)以前捕获和保存过的数据包有效载荷数据,针对新的目标“节点ID”只是简单地改变其“目的节点ID”的值以达到“重播”的功能。
(2)使用KillerZee工具进行重播攻击KillerZee使用一个短的Python脚本,同样可以像Z-Force工具一样发送任意内容的数据包,使用Z-Force工具发送数据包的程序主界面如图14-16所示,使用KillerZee同样可以发送相似效果的数据包,如下所示:
⊗ 注意
在这个例子中,字节0c是长度字节,表示数据包的长度为0x0c,或十进制的12个字节。使用Z-Wave的“消息认证码”是单播形式,如图14-2所示,在创建和解码数据包的时候使用。
使用一个脚本发送Z-Wave数据包时,如果你的心中有一个特定的数据包格式,那么发送会变得得心应手,然而,如果使用KillerZee工具集中的zwreplay工具,那么这种使用Z-Wave数据包发起“重播攻击”的体验就更容易了。
Zwreplay工具接受将一个libpcap数据包捕获文件作为输入参数,然后Zwreplay工具会重新发送数据包中的每一个数据类数据包中的有效载荷内容。这种技术在Z-Wave网络中主要用于实验,或是实验随后的数据包捕获能力,或是作为一个自动重复发起攻击状态的机制。
在这个例子中,我们从Z-Wave网络中捕获到10个数据包,并将捕获到的这些数据包保存到experiment.pcap文件中。接下来,我们使用zwreplay工具,转发每个数据包中的有效载荷的内容,在每两个相邻数据包的发送之间有一个1秒的时间间隔。
要评价这种类型的攻击所造成的影响,你需要捕获一些数据包并“重播”一下,然后观察目标Z-Wave设备的行为。例如,把温度计设置为恒温,向其发送“降低1度”的指令,然后观察随着每个重播数据包的发送,该温度计的设定温度是不是持续降下来了。如果你从捕获数据包的文件中找到一个特定的数据包,然后你想将这个数据与其他剩余的数据包隔离开,那么你只需要使用Wireshark工具集中的tshark工具就可以将所选的这一个或几个特定的数据包单独再生成一个新的数据包捕获文件。在下面的示例中,我们就从原始捕获的数据包文件中提取出帧顺序号为5的那个数据包帧,并将该数据包保存到一个单独的数据包捕获文件中。其操作命令格式的效果如下:
使用KillerZee工具可以完成注入任意数据包的能力,攻击者就有机会采取特定的数据帧来完成一个想要的行动,并由简单的工具自动化完成。接下来,我们看两个例子,这两个例子所用的工具都是KillerZee项目中所使用的工具。
⚡ 通过注入控制Z-Wave电灯开关
通过前面Z-Wave数据包捕获和重播攻击的试验,我们可以识别和评估Z-Wave攻击所造成的影响。攻击的适用性可能会因不同生产厂家的产品不同,而差异巨大。比如,对一个供应商未使用加密的产品的攻击,并不能用于另一个供应商使用加密了的产品,但在很多情况下,对前一种产品的攻击,总还是能用在对其他产品的攻击上。
Z-Wave产品中一个常见的应用就是远程打开和关闭电源插座,其实物如图14-17所示。
这些设备实现COMMAND_CLASS_SWITCH_ALL的功能,使用一个单一的Z-Wave数据包就可以打开插座开关,或关闭插座开关。只要知道这个插座所在网络中的HomeID,那么使用KillerZee工具集中的kzpowerdown工具就可以产生强制关闭电源的事件,其操作流程及效果如下所示:
在这个例子中,当有用户通过合法的Z-Wave设备“打开”这个插座的命令时,我们使用zwdump工具捕获和保存到这个命令的数据包。我们可以从中获取到这个Z-Wave网络的HomeID,随后攻击者可以使用这个HomeID值,向广播地址发送“关闭”的命令。由于命令是广播地址,所以会使这个Z-Wave网络上所有的Z-Wave开关统统断电。上例中的zwpoweroff脚本会不断发送“关闭”信息,所以这时,即使合法用户再使用“打开”命令发送到这些Z-Wave开关上,在“打开”这些开关的时候,攻击脚本仍然会因为继续发送“关闭”命令而使这些电源开关再次“关闭”电源,最终完成实质性攻击。
♥ 提示
除了上面的广播方式,你也可以针对某个Z-Wave网络中的特定设备,通过zwpoweroff命令的“-d”参数,指定“目标节点ID”以及目标网络的“HomeID”。
⚡ 操纵温控计
智能温控计是“智能能源系统”(smart energy system)的一个重要组成器件。通过使用智能温控计,在一些基于电力和其他自然资源的动态定价环境中,这种智能温控计可以根据需要自动地加热或冷却,从而使消费者的能源消耗达到优化。也正是因为这个因素,基于Z-Wave技术的温控计在全球范围内都很流行。
根据测试,我发现许多Z-Wave温控计并不使用Z-Wave的加密或认证机制。这意味着使用这款温控计的Z-Wave设备容易遭受数据包的“注入”攻击,最终让攻击者通过远程操纵该温控计。KillerZee工具集中包含两个工具,可以用于发起针对这个漏洞的攻击。
这款Z-Wave温控计实现COMMAND_CLASS_THERMOSTAT_MODE功能,该功能用来设置温控计的操作模式。一个“控制设备”可以通过发送命令来控制温控计,改变预设将要达到的温度,所改变的值可以是一个或多个数值,例如加热、冷却、只通风、空气干燥,节省加热或冷却,以及更多功能的值。要完成上述操作,攻击者可以使用zwdump工具来捕获和保存这些行为的通信数据包,该命令的格式和执行效果如下所示:
在这个输出中,攻击者可以通过捕获发现一个THERMOSTAT_MODE命令发送到“节点ID”为0x02的设备上,将这个温控计设备设置为“制冷”模式(cooling mode)。攻击者也可以使用KillerZee工具集中的zwthermostatctrl工具将这个温控计的模式设置为“制热”模式(heating mode),其命令格式和执行效果如下所示:
同样的方法,Z-Wave温控计通过COMMAND_CLASS_THERMOSTAT_SETPOINT命令实现控制温控计的温度的功能。在这款温控计上,设定温度是用华氏温度[11]表示的(这是作者测试后得出的结论),其分辨级别用0~255来表示。在通过zwthermostatctrl工具设定温控计为“加热”模式以后,攻击者就可以通过zwthermostattemp工具,改变温度到该设备任意支持的数值上。
当温控计接收由攻击者发送来的数据包时,它就会按数据包中的要求调整目标温度,如图14-18所示。通过不停地继续发送该设置数据包,攻击者可以保持对这一指定的温度的设定操作,即使有其他Z-Wave设备,或者是这个设备的主人试图降低所设定的温度,也无法奏效,最终同样可以完成实质性的攻击效果。
对Z-Wave注入攻击的防御措施
就像Z-Wave侦听所带来的威胁一样,Z-Wave的部署中,如果不使用可选的Z-Wave数据加密和完整性保护机制,那么Z-Wave网络和Z-Wave设备也容易受到“注入”攻击。为了减轻“注入”攻击所带来的威胁,那么只要加密方法可用,就务必要使用加密。然而,事实上,很多产品缺乏安全控制机制,这样它们就难免会遭受到攻击了。
- SVN:即subversion的缩写形式,是近年来崛起的版本管理工具。目前,很多开源软件都使用SVN作为代码版本管理软件。——译者注
- 中间绝缘橡胶体内部没有任何线路,各引脚也都是完全独立且绝缘的,所以这种直接的物理切割不会有任何电器特性上的影响——译者注
- 串口根据其连线方式和电气特性,又可以分为RS232、RS422、RS485三种,这里很显然使用的是RS232的方式,共使用三根线,分别是地线(GND)、发送线(TX)、接收线(RX)。与对方对接的时候,RS232的地线连接对方的地线,RS232的发送线要连对方的接收线,RS232的接收线连接对方的发送线。——译者注
- “通用公开授权协议”(General Public License,GPL)是众多软件开放协议中的一种。简单地说,就是符合“GPL许可”的软件都是开源且免费的,只要你的某个软件中使用到了符合“GPL许可”的软件源代码或类库,那么你的软件就必须也开源且免费。GPLv2是其第2版,是在GPL的基础上,在开源且免费的基础上不得加上自己对自己所开发那部分软件进行限制;GPLv3是其第3版,加上了并且参与的硬件也必须公布。——译者注
- 根据网络常用的俏皮语(有点像中国的“火星文”)分析,应该是“altas of doom”,意为“死亡之神”。——译者注
- 瑞士军刀不同于我们理解的战争中用于拼杀的砍刀,而是一种组合刀具,由于其功能强、质量好而闻名。现在的“瑞士军刀”常指这是一件质量非常好的工具。——译者注
- 根据名字猜测,应该是属于加密狗性质的软件。——译者注
- 符号链接(symbolic link),又叫“软链接”,是UNIX/Linux上为了克服硬链接的局限性而使用的一种软件方式的逻接,类似于Windows操作系统中的“快捷方式”。——译者注
- 本程序所用的两字母国家和地区代码编码规则尚不得而知,不过,可以将ISO国际标准作为一个参考。国际标准的网址是http://userpage.chemie.fu-berlin.de/diverse/doc/ISO_639.html。——译者注
- Fuzzing是介于测试工具和黑客工具之间的一种软件自动测试技术。其原理就是通过穷举或随机数的方式,在不断调整各字段数值的前提下,测试系统的稳定性或抗攻击能力。——译者注
- 华氏温度即“Fahrenheit temperature scale”,表示符号为℉,是由德国人华伦海特制定的,规定为一定浓度的盐水凝固时的温度定为0℉,把纯水的冰点定为32℉,把标准大气压下水的沸点温度定为212℉,中间分为180等份,每一等份代表1度。华氏温度向摄氏温度转换的公式为℃=(°F-32)/1.8,根据这一公式,本例中温控计华氏[0~255]对应的摄氏温度范围是[-17.8~123.9],下面例子中所要设置的华氏95度,对应的摄氏温度是35度,而图14-18中的华氏76度,对应的摄氏温度是24.4度。——译者注
本书评论