13.3 ZigBee攻击
当本书的第2版在2010年出版的时候,作者介绍了KillerBee工具,这是第一套专门用来攻击ZigBee网络和IEEE 802.15.4协议的一组攻击工具套件。从那时以后,对于KillerBee项目的升级维护就转到了另外两个人手里,这两个人分别是卓越的天才Ryan Speers和Ricky Melgares,他俩所做的工作,当然就是继续发挥才能,编写极具天赋的ZigBee黑客工具的源代码。
在本节中,我们将从功能的角度来看看的KillerBee框架,然后分别介绍几个可用的黑客工具,包括了本书的第2版出版以来出现的新的功能和攻击技术。
13.3.1 KillerBee的介绍
KillerBee是一个基于Python语言编写的应用程序框架,可以用来操作和攻击ZigBee网络和基于IEEE 802.15.4协议的网络,该软件的下载网址是http://killerbee.googlecode.com 。整个项目是免费并且开源的,程序的编写和测试都需要在Linux操作系统上完成。项目的目的不是要亲自完成某一个具体的攻击,而是提供一个程序的框架,通过这个程序可以简化常见的攻击过程。具体地说,就是在这个框架中可以加载和授权其他的Python工具,使其可以针对某一ZigBee安全漏洞完成具体的攻击操作。作为框架中的具体攻击工具,KillerBee包括一系列以这个框架为基础编写的,具有特定目的的攻击工具,通过以组合方式使用这些工具,我们既可以实施实际的攻击任务,也可以演示一个KillerBee框架的使用方法。
1.创建一个KillerBee工具包
KillerBee在设计上,就将目标定位为可以操作使用各种支持的硬件设备。不幸的是,攻击ZigBee和IEEE 802.15.4协议上的网络,还真不是三拳两脚就能完成的事,这往往需要很多复杂的交换操作,所以也没有哪一个简单的硬件可供选择。我们只能一步一步地通过配置一个USB接口的,基于IEEE 802.15.4无线接口的设备用于配合最新版的KillerBee软件实施攻击任务。不过,我想指出的是,就目前针对ZigBee网络攻击领域发展的势头,很可能在本书出版之后,会有新的、现成的、可借助KillerBee软件使用其他硬件作为新的选择项,供用户选择使用。
要想使用KillerBee工具包的全部功能,有一些组件,需要被通过编译连接,创建到工具包中,其中主要包括下面的硬件和软件:
·Atmel公司的RZ Raven USB接口的记忆棒,简称“RZUSBstick记忆棒”(硬件)。
·Atmel公司的AVR Dragon片上编程器(硬件)。
·Atmel公司100毫米到50毫米“联合测试行动小组”(JTAG)支撑架适配器(硬件)。
·50毫米“公头对公头[1]”的连接头(male-to-male header)(硬件)。
·10针2排5列(2×5)排列100毫米“母头对母头”(female-to-female)带状连接线(ribbon cable),或者采用10针跳线(硬件)。
·免费的AVRDUDE工具(软件)。
·“RZUSBstick记忆棒”的免费的KillerBee固件(软件)。
·一个Windows或Linux主机,用于运行连接和将程序写入到“RZUSBstick记忆棒”中,该操作是一次性操作。
下面我们详细地看一下这些需要中的每一项。
⊗ 注意
即使是有了“RZUSBstick记忆棒”,但如果你的KillerBee软件未使用上述“专门针对‘RZUSBstick记忆棒’的免费的KillerBee固件”对KillerBee软件进行升级,那么该KillerBee软件的功能会受到限制,你将只能使用其中的“只能侦听”(sniffer-only)功能,而不能使用向网络中“注入数据包”的功能,以及冒充一个合法的ZigBee网络诱骗其他ZigBee设备加入本网络等功能。
(1)Atmel公司的RZ Raven USB接口的记忆棒为了同ZigBee网络进行交互操作,你需要一个能够支持IEEE 802.15.4标准的硬件设备。而KillerBee的设计初衷就是支持多个硬件设备能够与工作频率为2.4GHz、915MHz和868MHz的设备同时进行交互,完成这一任务的主要开发硬件设备就是“Atmel公司的RZ Raven USB接口的记忆棒”,简称为“RZUSBstick记忆棒”,该产品的实物图如图13-4所示。这个采用USB 2.0接口的设备能够在2.4GHz频率下支持IEEE 802.15.4协议,同时它拥有一个“板上AVR[2]微处理器”(onboard AVR microprocessor)。Atmel同时开发了设备固件的源代码,只要该程序在RZ Raven硬件上使用,那么如果要修改和重新发布这些代码,需要获得Atmel公司的授权,这样以来,开发者能够可以很轻松地修改“RZUSBstick记忆棒”固件,以便固件中能容纳新的功能。“RZUSBstick记忆棒”硬件可以从大部分电子产品经销商那里购买得到,比如Digi-Key公司和Mouser电子器件公司,其中Digi-Key公司的网址是http://www.digikey.com,Mouser电子器件公司的网址是http://www.mouser.com 。二者的产品中,使用“AVR微处理器”的,产品编号为ATAVRRZUSBSTICK的产品,售价大概是43美元。
♥ 提示
我们建议至少使用两个“RZUSBstick记忆棒”接口,一个接口来发送欺骗对方的帧,而另一个接口用来侦听网络上传输的数据包。
在编写本书时,“RZUSBstick记忆棒”中默认的固件型号是AVR2017。使用默认的固件,“RZUSBstick记忆棒”能够创建一个与“ZigBee-2006”规范兼容(ZigBee-2006–compliant)的网络,或者用来作为一个“被动式数据包嗅探器”(passive packet sniffer)。不幸的是,要完成安全分析功能,需要增加额外的功能模块,比如说需要增加数据包的注入能力,而这些功能在默认的固件都不能使用,需要通过固件升级才行。
(2)Atmel公司的AVR Dragon片上编程器要解决“RZUSBstick记忆棒”默认固件中的限制,作者开发了一个定制的固件升级程序,该程序以源代码和二进制进形式与KillerBee设备捆绑后同时进行发布。不过,由于这属于硬件芯片级的开发,所以对于一个未从事过硬件开发的人来说,这还真不是件容易的事。要想升级“RZUSBstick记忆棒”的固件,除了固件本身之外,还需要另外一个硬件设备,习惯上称为“片上编程器” (on-chip programmer)。一个Atmel公司的AVR Dragon“片上编程器”实物图如图13-5所示。
“AVR Dragon”是一款低成本的编程器,主要用于Atmel的程序员在通过“AVR微处理器”使用“RZUSBstick记忆棒”固件,最常见的“AVR微处理器”如芯片型号AT90USB1287。该编程器使用多种编程接口,包括一个10针硬件接口,该设备能够同“RZUSBstick记忆棒”上的“联合测试行动小组”接口连接,“联合测试行动小组”接口中,由“联合测试行动小组”(Joint Test Action Group,JTAG)所定义的一个同名接口。通过“联合测试行动小组”接口,可以使用升级的固件刷新板载微处理器,这也包含了针对“RZUSBstick记忆棒”固件升级的KillerBee固件。上述所有可用的软硬件都可以从大部分电子产品经销商那里购买得到,比如Digi-Key公司和Mouser电子器件公司。二者的产品中,使用“AVR Dragon”设备的,其产品编号为ATAVRDRAGON的产品,售价大概是50美元。
⊗ 注意
有几个用户反馈,在握着“AVR Dragon”产品插入到一个USB设备的时候,可能会破坏设备。这可能是由于接地不当造成的,同时也是“AVR Dragon”产品的一个硬件设计缺陷。所以在使用“AVR Dragon”产品的时候,需要小心一点,特别是在拔插的时候,最好是在外边套一个防静电袋(ESD bag),或者使用一个卡盒包在芯片或外边,然后再插入,甚至可以考虑使用一块在家装店买的热收缩管覆盖在敏感的集成电路元件外边。总之,就是在使用的时候,要防止静电打坏器件。
(3)Atmel公司100毫米到50毫米JTAG支撑架适配器在“JTAGICE mkII”接口和“RZUSBstick记忆棒”接口之间进行连接,需要一个100毫米间距的“联合测试行动小组”适配器和一个50毫米间距的“联合测试行动小组”适配器之间的转换器。Atmel公司销售一组四种适配器,适合各种情况下的物理连接属性的转换。其中,用于与“Atmel Dragon”接口相连的产品编号是ATAVR-SOAKIT,售价大约是39美元,可以从流行的电子产品经销商处购买。在“AVR Dragon”接口和“RZUSBstick记忆棒”接口之间进行连接,我们使用的“联合测试行动小组”适配器,编号是ATAVR-SOAKIT,该实物图如图13-6所示。
(4)50毫米“公头对公头”的连接头
“AVR Dragon”板上的“联合测试行动小组”连接器是一个50毫米的母头插座,而“RZUSBstick记忆棒”上的“联合测试行动小组”插槽也是一个50毫米的母头插座,要在二者之间进行转换,就需要用于50毫米“公头对公头”的连接头。这个50毫米“公头对公头”的连接头的用法,就是将其插入到一个“联合测试行动小组”的母头插座上,将其转换成公头插头,然后才能插入到“RZUSBstick记忆棒”上的“联合测试行动小组”插槽中。这个小部件通常可以从多个电子网站上买到,包括Digi-Key公司的网站,产品编号是S9015E-05,零售价为1美元,如图13-7所示
(5)10针2排5列(2×5)排列100毫米“母头对母头”带状连接线从“AVR Dragon”出来,你需要连接一个带状连接线,一头套在“联合测试行动小组”接口的引脚上,带状连接线需要10针,头端需要呈2排5列,即“2×5”的连接布局。这种通用部件通常可以从多个电子网站上买到,包括Digi-Key公司的网站,产品编号是H3AAH-1018G-ND,售价为1.5美元一根。
作为替代品,你可以简单地只用一根10针的“母头对母头”的成型跳线,手工将各自十个引脚一一连接起来即可。要确保你所连接的所有连线都要匹配“AVR Dragon”的引脚和“联合测试行动小组”适配器引脚,并且二者在物理特性上“一一对应”[3]。这种成型的母头跳线,一组40根,可以从Adafruit.com 网站上找到,其产品编号为266,必须成组购买,一组售价7美元,其实物图如图13-8所示。虽然有一点贵,但是这些跳线还可以用于其他任务,所以成组购买也不会浪费。
在紧要关头,一个老式的IDE硬盘驱动器电缆的工作也可以拿来使用,使用美工刀将连接器的头端切下来,然后将多余的部分切掉,最后只剩下10针,并且呈2×5排列的头部形状即可。
(6)免费的AVRDUDE工具
AVRDUDE是一个开源的命令行程序,可以运行在Windows操作系统上,也可以运行在Linux操作系统上。该工具可以支持许多不同的“AVR编程器”。Windows用户可以下载一个编译版的AVRDUDE程序,该程序是作为WinAVR软件包中的一个工具存在的,所以可以通过下载整个WinAVR软件包获得,WinAVR软件包的下载网址是http://winavr.sourceforge.net。下载后解压文件WinAVR软件包,并复制avrdude.exe和avrdude.conf文件到你系统中,在系统变量PATH可以找到的位置上,以便在任何目录上通过命令行运行该程序。
Linux用户可以在下载程序包以后安装AVRDUDE程序,下载网址是http://www.nongnu.org/avrdude,或者也可以从Linux发行版提供的软件包中直接安装使用。比如Ubuntu操作系统中就直接包含了AVRDUDE程序,这时,用户只要运行“sudo apt-get install avddude”命令就可以安装avrdude程序了。
(7)“RZUSBstick记忆棒”的免费的KillerBee固件KillerBee项目包含了针对“RZUSBstick记忆棒”的定制固件。该固件在维持其他功能的同时,允许硬件完成任意数据包的注入操作。这里的“其他功能”可以是数据包的嗅探,也可以是ZigBee设备作为一个“个人局域网”协调器时,对ZigBee网络的创建动作。这个同KillerBee工具进行绑定的固件的下载地址是http://killerbee.googlecode.com 。
2.安装AVR Dragon设备
要在Windows操作系统中使用“AVR Dragon”设备,你需要首先下载一个libusb-win32的驱动程序,该驱动程序的下载网址是http://sourceforge.net/projects/libusb-win32。完成下载之后,解压zip文件,然后就可以支持libusb-win32的驱动程序了。运行的方法是执行其中的inf-wizard.exe可执行文件,这时程序会弹出安装向导。通过USB接口将“AVR Dragon”设备插入到Windows上的USB插座中,然后单击inf-wizard.exe程序界面上的“下一步”(Next)按钮,这时这个安装向导Inf-Wizard程序就会检测到“AVR Dragon”设备,并识别出该设备的USB“供应商ID”(即界面中的“Vendor ID”)、“产品ID”(即界面中的“Product ID”)值等值,如图13-9所示。
在列表中,选择AVRDRAGON这一项,然后单击“下一步”(Next)。这时Inf-Wizard工具的安装向导将向你提供一个设备配置窗口,如图13-10所示。单击“下一步”(Next)接受系统默认的十六进制“供应商VID”(即界面中的“Vendor ID(hex format)”)、十六进制“产品PID”(即界面中的“Product ID(hex format)”)和本产品“制造商名称”(即界面中的“Manufacturer Name”)和“设备名称”(即界面中的“Devie Name”)等描述性的值。
在Inf-Wizard工具的安装向导的最后一步,单击“马上安装”(Install Now)按钮,如图13-11所示,向导就会将“AVR Dragon”设备的libusb-win32驱动程序安装好,如果安装途中出现一些提示,就选择“按默认配置强制安装这个驱动程序”(Install This Driver Software Anyway)按钮,直到安装成功。
对Linux用户来说,在安装“AVR Dragon”设备驱动程序的时候,有一个更简单的配置经验。那就是只要你将“AVR Dragon”设备插入到计算机的USB口中,然后就等着运行即可。
当“AVR Dragon”已经配置完毕,剩下要做的就是准备刷新“RZUSBstick记忆棒”上的闪存替代固件。
3.创建一个KillerBee设备上的RZUSBstick记忆棒在获取了所有需要的部件后,通过KillerBee设备升级“RZ Raven USB”硬件就易如反掌了:
1)使用USB线缆连接到“AVR Dragon”设备上。打开设备的电源,在Windows主机上从软件上连上“AVR Dragon”设备的驱动程序。如果可能,建议将“AVR Dragon”设备的USB口直接或通过延长线插到计算机的USB插座上,而尽量不要在“AVR Dragon”设备和电脑主机之间再使用USB集线器进行中转。
2)下载KillerBee的固件。最新版本的KillerBee程序发行版的下载地址是http://killerbee.googlecode.com 。下载成功并解压缩后,在“killerbee/firmware”目录中,你会发现一个名为kb-rzusbstick-001.hex或类似的文件。使用此文件就可以更新“RZUSBstick记忆棒”的固件。
3)准备AVRDUDE程序。打开“命令提示符”,并将目录改变到下载KillerBee固件的目录。输入下面的命令,但不要按回车键!因为这个时候,你只有一只手可以按回车键,另一只手则需要握着“RZUSBstick记忆棒”。
4)打开“RZUSBstick记忆棒”的电源。“RZUSBstick记忆棒”本身是无源的,所用的电是从电脑上机上通过USB线取电。供电以后,微处理器开始运行程序。微处理器会通过USB总线连接到“RZUSBstick记忆棒”上,建议使用USB延长线连接电脑主机,这样的好处是方便后面将“RZUSBstick记忆棒”和“AVR Dragon”设备放在一起。将“RZUSBstick记忆棒”插入到电脑主机以后,“RZUSBstick记忆棒”上的蓝色LED指示灯就会亮起来。使用“联合测试行动小组”支撑架适配器连接到“AVR Dragon”设备上,再将“联合测试行动小组”支撑架适配器连同“公头对公头”的连接头插入到“RZUSBstick记忆棒”顶端的引针插座上,捏着引脚针在一个很小的角度将其引脚与与PCB插座接触,如图13-12所示。在“AVR Dragon”设备接口上,“引脚1”(Pin 1)的位置是“RZUSBstick记忆棒”上距离USB接口最远的那个位置。
5)最后一步,就是对“RZUSBstick记忆棒”进行编程。连接“AVR Dragon”设备和“RZUSBstick记忆棒”上的“联合测试行动小组”插座,按回车键以便开始运行AVRDUDE编程器。在“RZUSBstick记忆棒”显示的编写器提示的状态信息是“编程完成”时,固件的刷新完成。在Windows操作系统,该程序的显示效果和下面的结果类似。如果换成Linux操作系统,AVRDUDE程序也会产生相同的输出。
随着编程过程的进行,“RZUSBstick记忆棒”上亮的将不再是蓝色的LED指示灯,取而代之的是琥珀色的LED指示灯,这预示着这个硬件准备作为一个KillerBee设备。我们将继续有机会利用KillerBee探讨贯穿本章中的所有进攻机会。
KillerBee硬件的替代品
“RZUSBstick记忆棒”硬件用于KillerBee平台上有几个比较麻烦的问题的,比如缺乏一个标准的可复用并行数据包的接收和发送功能的Linux驱动程序。作为一种“RZUSBstick记忆棒”的替代品,还有其他可用的硬件可供选择,或是正在研发过程中。
TelosB Mote记忆棒 “TelosB Mote记忆棒”硬件(见图13-13)以前被“弩系统”(Crossbow System)销售的时候,是作为一个研究和开发IEEE 802.15.4网络的平台。虽然现在它已不再是可供销售的商品,但该硬件在研究性的高校里却非常流行。这款产品也可以应用于KillerBee,要想使其支持KillerBee作为数据源,只需要使用其替代固件就可以了,替代的方式是运行该系统提供的flash_telosb.sh脚本。
Api-Mote记忆棒 “Api-Mote记忆棒”硬件(见图13-14)是一个持续开发的项目,项目的名称是“河水循环的安全系统”(River Loop Security),项目是由Ryan Speers和Ricky Melgares领导的。“Api-Mote记忆棒”硬件集成到KillerBee系统以后,就可以使KillerBee系统使用“Api-Mote记忆棒”发起所有可访问到的进攻方式。控制这个硬件是通过一系列通过USB的接口实现的,这使得该系统从开发的角度来看,系统的可靠性非常强。在写本书的时候,这款“Api-Mote记忆棒”尚未公开出售,但在不久的将来,就可以在普通电子产品经销商那里买到。比如网址为Adafruit.com的经销店。
13.3.2 网络发现
在ZigBee网络的评估中,首要任务是要在自己的功率覆盖范围内先“发现”(discovery)有网络的存在,然后枚举出网络中各设备上采用的配置。收集这些信息的一个简单方法是使用KillerBee模仿ZigBee网络的发现过程。
作为“网络发现”[4](network discovery)过程的一部分,ZigBee设备会在给定的信道内发送“信标请求帧”(beacon request frames)。所有收到该“信标请求帧”的“ZigBee路由器”和“ZigBee协调器”同样会发送一个信标帧作为响应,不要小看这个响应的信标帧,这会暴露“个人局域网”的ID、“ZigBee路由器”或“ZigBee协调器”的“源地址”(“ZigBee路由器”和“ZigBee协调器”)、“堆栈规范”(stack profile)、“堆栈版本”(stack version)和“扩展的IEEE地址信息”(extended IEEE address information)。使用这项技术,我们可以主动扫描到ZigBee网络的存在。
⚡ 使用zbstumbler工具进行ZigBee发现
回想一下Wi-Fi网络的“网络发现”中,使用的工具有好几个,比如NetStumbler程序,而在KillerBee网络的“网络发现”中,所用的技术和Wi-Fi网络的“网络发现”所用的技术很类似。在KillerBee网络中的zbstumbler工具也会在信道中进行跳频,并且在跳频的同时发送信标帧,然后根据回应的信标帧中提取有价值的信息并且显示出来。不带任何参数地运行zbstumbler程序,它会开始在ZigBee信道中进行扫描,每两秒跳频到新的信道中,其输出信息如下所示:
zbstumbler也可以以日志信息的方式显示出所发现的网络信息,如果在命令中使用“-w”参数,那么zbstumbler程序就会将发现的网络信息记录到一个CSV文件中,该文件的特点就是以逗号将一条记录(即,行)中的每个字段(即,列)隔开:
一旦发现了ZigBee网络,并将其作为目标,我们可以根据zbstumbler显示的信道编号,选择ZigBee数据包捕获工具来进行数据通信数据包侦听攻击。
✔ 防御针对ZigBee网络的主动扫描
通过zbstumbler工具发现ZigBee网络,这种相同的技术被直接用于一些ZigBee产品的设备中。当一个新的“ZigBee路由器”或者“ZigBee协调器”建立完毕后,它会发送一个“信标请求帧”来通知其他ZigBee网络,以避免“个人局域网”上的ID冲突。如果真出现冲突,那么这个设备会随机选择其中一个网络进行连接。当“ZigBee终端设备”想要确认“ZigBee路由器”或者“ZigBee协调器”是否加入到当前ZigBee网络中时,它会发送一个“信标请求”数据包,然后根据对方的响应进行评估,选择加入最佳的网络中。
由于“信标请求”机制对于ZigBee来说是不可或缺的,所以这个机制无法被禁用,这样就使攻击者能够任意使用同样的技术进行ZigBee网络发现。因此,最佳的防御措施就是了解攻击可能会造成的影响,评估攻击者通过这种攻击,能够拿到网络中的何种信息。
13.3.3 侦听攻击
由于大部分的ZigBee网络都不使用加密技术,所以对于攻击者来说,侦听攻击是非常有效的。即使ZigBee网络进行了加密,也只是对通信的数据进行加密,所以攻击者仍然可以使用那些未加密的ZigBee帧信息部分,比如“介质访问控制层”头部,来确认ZigBee网络的存在以及其他重要的特性,比如网络的配置、节点地址和“个人局域网”的ID值。
有几种工具提供了捕获ZigBee网络通信数据包的能力,它们的售价从不贵到稍有些贵,所以我们会给出一些帮助,来帮你实现投资收益的最大化,当然这些帮助都是合法的。
⚡ 使用Microchip公司的ZENA网络分析器
Microchip技术公司是著名的PIC微处理器生产商,同样也生产了“ZENA网络分析器”(ZENA Network Analyzer)这样一款产品。ZENA产品配有一块USB 2.0的电路板,包括一个PIC18LF微处理器以及一个MRF24J40型号的IEEE 802.15.4无线接口。该接口配合Windows上的软件对2.4GHz频率上的IEEE802.15.4的数据通信数据包进行捕获和保存,其中包括ZigBee和专有的Microchip协议“Mi-Wi”协议和“Mi-Wi P2P”协议。无线工程师可以使用它对网络活动进行排障,ZENA为捕获和分析ZigBee网络活动提供了便利。
ZENA硬件如图13-15所示,既可以从Microchip技术公司,也可以从大部分电子经销商那里购买到,它的售价是130美元。ZENA设备不需要安装特定的驱动程序,使用USB接线直接将设备插在可用的USB端口上,然后使用配套的CD光盘安装ZENA数据包侦听软件即可。
♥ 提示
⛳网站
你也可以从Microchip的网站上下载到“ZENA网络分析器”。该程序的下载地址是http://bit.ly/9siayC 。一个简单的,通过ZENA工具捕获到的数据包文件可以从本书的配套网站上进行下载,其网址是http://www.hackingexposedwireless.com/files/13/sample-zena-packet-captures.zip。
“ZENA数据包嗅探器”(ZENA Packet Sniffer)软件的功能比较有限。它只能够对无线活动数据进行简略的解码,而不是详细的十六进制数据转储(dump)形式。用户可以选择要进行捕获的信道编号,该值一般是信道11~26,同时选择忽略或者分析“帧校验序列”(Frame Check Sequence,FCS)不正确的帧。它可以对“介质访问控制层”、“网络层”和“应用支撑子层”施加控制,同时以“数字”(numeric)、“摘要”(condensed)、“冗余视图”(verbose views)等多项进行显示。单击“视图(View)|网络信息(Network Messages)”菜单可以显示捕获的数据帧包含的内容,如图13-16所示。
“ZENA网络分析器”软件是一款在Windows操作系统上的运行的软件,作为该软件及运行环境的一个替代品,软件开发人员Emeric Verschuur推出了一个ZenaNG工具来支持Linux操作系统的用户。该软件的下载地址是https://github.com/Mr-TI/ZenaNG。ZenaNG软件的作用就是在特定信道中捕获ZigBee设备和IEEE 802.15.4协议下的活动,然后以十六进制格式显示出所捕获数据包的内容,并将所捕获到的数据包都写入到一个libpcap格式的库文件。要下载并编译连接创建ZenaNG软件,其操作步骤如下所示:
在编译连接创建ZenaNG程序以后,你就可以通过“-h”参数在命令行中检验该程序的运行效果了。例如,运行ZenaNG程序,对信道15进行数据包嗅探(使用“-c”参数),并且以十六进制的输出格式将所接收到的数据包显示出来(使用“-f”参数),其命令格式及运行效果如下所示:
在没有指定捕获数据包的文件保存类型时,ZenaNG程序会将接收并捕获到的数据包以libpcap的格式进行保存,如果用户想将该程序在命令行上的输出保存到一个文件中,那么可以使用“重定向”[5](redirect)命令进行转换,其命令格式及显示效果如下所示:
ZenaNG软件也可以捕获通信数据包,将这些数据包“重定向”后直接转向Wireshark程序,并作为Wireshark程序的输入源,此时数据数据命令格式如下所示。作为数据包捕获行业的专业软件,这时的Wireshark程序将启动一个数据包的捕获线程,并且马上立竿见影,程序立即开始捕获和显示所接收到的数据包,Wireshark程序软件的捕获界面如图13-17所示。
破解Microchip公司的ZENA网络分析器有时Microchip公司的“ZENA网络分析器”设备并不总能让我们满意,所以需要对该设备进行一些改装,这就涉及对该黑客工具进行破解的问题。尽管缺少“ZENA网络分析器”设备的固件、设备电路原理图和必要的技术文档资料,但从硬件和软件角度来看,Microchip公司的“ZENA网络分析器”设备还是一个很明显能够被破解的设备。
在“ZENA网络分析器”设备的原本设计中,在电路板板载天线(circuit-board antenna)的附近还有一个能够安装一个外部天线连接器的接口。利用“印制电路板”(Printed Circuit Board,PCB)上的这个插座接口,你可以使用表面贴装(surface-mount)技术焊接一个的“RP-SMA RF”连接器(该连接器如果购买的话,仍然可以在很多网上零售商店中买到,比如Digi-Key公司网站上,产品编号是CONREVSMA001-SMD-ND,售价是3.18美元)。有了这个连接器,你就可以通过它选择使用外部天线或者PCB天线了。现在,“RP-SMA RF”连接器焊接完毕,然后使用“RP-SMA RF”连接器尾端的“小辫子”连接线连接任何一款2.4GHz的外置天线。这样你就能够在更大的范围内捕获ZigBee网络活动的通信数据包了。
⚡ KillerBee数据包侦听工具zbdump
KillerBee软件的工具套件,提供了用于捕获ZigBee协议和IEEE 802.15.4协议设备通信数据包的几个选项。其中的zbdump工具,就是一款包含在KillerBee工具集中的常用工具,其设计理念和流行的tcpdump数据包捕获工具类似。要使用该工具进行正常的数据包侦听工作,可以使用一个定制的KillerBee固件,或者在使用出厂默认固件情况下,使用“RZUSBstick记忆棒”一起协同工作。完成固件升级或加装“RZUSBstick记忆棒”以后的zbdump工具,就可以捕获ZigBee网络和IEEE 802.15.4协议网络的数据通信数据包,并将捕获到的数据包保存到libpcap文件中。
首先,安装KillerBee设备通信所需要的Python模块,然后下载KillerBee的源程序,下载地址是http://killerbee.googlecode.com 。从这里你可以下载KillerBee的最新版,或者拿到最新版源代码,其操作步骤如下所示。
⊗ 注意
无论使用哪个工具,KillerBee的安装过程都是相同的,所以我们只讲解一次安装步骤。
一旦安装完毕以后,你就可以使用zbdump工具进行数据包的捕获,并将捕获到的通信数据包保存到文件中。使用“-f”参数可以设置“RZUSBstick记忆棒”,以便捕获指定信道的数据包。使用“-w”参数则表示输出文件是libpcap格式。通过Ctrl+C组合键可以中止当前的数据包捕获流程,回到提示符状态。
如果想进行进一步分析libpcap格式的savefile.dump文件,可以使用Wireshark软件打开,这时的程序分析效果如图13-18所示。该格式的保存文件,还可以被KillerBee工具包中和zbdump工具一起的其他几个工具程序所使用。
⊗ 注意
zbdump工具的“-w”参数可以以libpcap的格式创建数据包捕获文件,或者通过“-W”参数以dcf的格式进行捕获数据包的保存,dcf格式是“商业Daintree网络”(commercial Daintree Network)的“传感器网络分析器”(Sensor Network Analyzer,SNA)数据包嗅探文件的格式。不过,需要注意的是,尽管KillerBee网络设备为了与软件保护“向后兼容”(backward compatibility)还在支持这种格式,现在的“商业Daintree网络”反而不再支持Daintree公司的“传感器网络分析器”产品了。
还有一个能使用zbdump工具捕获ZigBee网络通信数据包,并且所保存的文件能在Wireshark程序中打开的工具,那就是Wireshark程序本身了。不过,Wireshark程序并不能直接从KillerBee设备中捕获数据包。
使用KillerBee设备,加上“RZUSBstick记忆棒”硬件,再加上Microchip公司的“ZENA网络分析器”工具,这套组合的一个很重要的不足是它们都只能侦听2.4GHz信道中的无线ZigBee网络通信数据包。如前所述,其实ZigBee的这一频率只是全球通用频率,还有一些频率虽然不太常见,但在一些ZigBee网络和IEEE 802.15.4网络部署中还是会看到有些网络部署是在“低于1GHz频率”sub-1-GHz信道中。要对这些频率进行侦听,上面的组合工具就无能为力了,只能查找其他的嗅探工具,以便适应这个频率范围内的ZigBee网络的侦听。
⚡ 在Sewio网络上使用Open Sniffer软件
Sewio网络生产了一个相对低成本ZigBee网络或IEEE 802.15.4网络的嗅探设备,称为“Open Sniffer”,其网址是http://www.sewio.net/open-sniffer,如图13-19所示。“Open Sniffer”设备是一个“已自足的”(self-contained)的网络节点设备,提供对以太网的支持。该设备不像前面那些设备一样需要将捕获设备与目标的系统通过USB线相连,以至于攻击设备和捕获设备之间的距离因为USB延长线的距离而变的有限,而在“Open Sniffer”中,设备可以部署到一个很远的地方(只要能够通过网络访问到),这样极利于捕获设备捕获对方网络的通信数据包。
“Open Sniffer”设备使用一个默认的IP地址10.10.10.2,所以要连接该设备,你需要先配置你的系统,将IP地址设置为10.10.10.1,然后就可以连接到“Open Sniffer”设备上进行配置了。如果在浏览器里输入这个“Open Sniffer”的IP地址,那么很快就会出现这个设备的配置选项,在“设置”(Settings)页面上包括有IP地址信息,如图13-20所示。将“Open Sniffer”设备默认的IP地址更改成你想用的IP地址,然后放置到你想要进行侦听的网络区域范围内,在下面的配置示例中,我们使用“Open Sniffer”设备默认的IP地址与该设备进行交换操作,直接将设备连接到我们的Linux主机系统上。
♥ 提示
默认情况下,该Sewio公司的“Open Sniffer”设备会传送一个正确的或不正确的“循环冗余校验校验”校验码,如果想限制接口只接收数据包为有效的数据包,那么就导航到“Open Sniffer”设备浏览器界面中的“设置”页面,然后设置“循环冗余校验校验”过滤选项。
“Open Sniffer”设备可作为一个数据包捕获源,向KillerBee设备的zbdump程序输送捕获来的数据。要完成这种数据流的“重新定向”,只需要简单地在zbdump工具的配置界面中指定一个将“Open Sniffer”设备的IP地址作为一个“设备名称”字符串即可。详细的格式如下所示:
Sewio公司的“Open Sniffer”设备是当前目前唯一一个能在“低于1GHz频率”信道上支持KillerBee设备进行侦听操作的设备。随着越来越多的设备拥挤在2.4GHz频段,许多制造商正在寻找可用的频率,比如美洲的900MHz、欧洲的868MHz、中国的780MHz都是可以作为无干扰(interference-free)的频谱。表13-1中列出这些频率的“信道数”、匹配的频率和国际上使用这一频率的地域范围。
⊗ 注意
用在美洲和欧洲的“低于1GHz频率”信道频率数字与中国的“低于1GHz频率”信道频率的数字冲突。所以Sewio公司针对上述区别销售两种型号的“Open Sniffer”设备,其中一个用于调谐美国和欧洲的频率,另一个调谐中国的频率,所以在购买“Open Sniffer”设备的时候,要根据所侦听的频率认准所购买设备的识别范围。
捕获“低于1GHz频率”上的ZigBee网络或IEEE 802.15.4网络活动,只需简单地指定相应的信道即可,命令格式如下所示:
虽然“低于1GHz频率”的ZigBee网络和IEEE 802.15.4网络与2.4GHz的同类网络相比并不太常见,但是我们可能更希望继续看到有新产品切换到这个频率范围。许多行业分析师预测,“低于1GHz频率”将成为“物联网”演变中至关重要的一个环节,另外,在ZigBee网络和IEEE 802.15.4网络的安全评估的部署中,这也是不应忽视的一个环节。
✔ 防御数据侦听
不论攻击者使用Microchip公司的“ZENA网络分析器”、还是Sewio公司的“Open Sniffer”,或者是KillerBee设备上使用zbdump工具,在ZigBee网络中传输的数据都有遭受到侦听攻击的危险。从深层角度来看,我们应该明白攻击者能够对你的无线网络进行侦听,捕获和分析你们所传输的数据包。所以可行的安全措施是尽量减少攻击者在拿到数据以后所能做的事。
在“ZigBee规范”中唯一能够防御这种类型攻击的措施是采用CCM*(即“高级加密标准-计数模式和密码块链消息认证码”协议的修订版)密码套件中可用的加密机制。并且,要确保你选择了高强度的密钥,尽最大的可能保证这些密钥的机密性。
13.3.4 重播攻击
“重播攻击”的概念非常简单:“使用之前观测到的数据重新发送这些数据包,就好像原始的发送者重新发送了一遍一样。”一次“重播攻击”的效果,很大程度上取决于重播时所使用的数据内容,以及所使用的协议本身的自然特点。
举例来说,有一个网络用来支持电子银行,如果攻击者可以实施一次“重播攻击”,重新发送之前向银行发送过的交易数据,这样原来发送的金额可能会翻上两倍、三倍或者四倍,具体的倍数取决于攻击者重新发送重复数据的次数。在ZigBee设备中,重播攻击的手法是类似的,但是效果却并不相同。
根据作者的研究,很多针对ZigBee协议堆栈的操作都没有使用加密算法,所以这个漏洞使得ZigBee很容易遭受到“重播攻击”。在这些情况下,原始的数据帧可以重新发送,这样会将一个给定的动作重复多次。例如,来自“德克萨斯仪器”(Texas Instrument)的一个采样应用程序协议栈可以实现ZigBee网络上的“灯光切换开关”(light-switch)应用。当开关打开或者关闭的时候,一个攻击都可以捕获到这时所生成的通信数据包,那么这个攻击者就可以有选择地“重播”这些数据包,按着自己的意愿打开或关闭开关。如果和物理攻击相结合,比如在视频监控的情况下,要想进入某个大门,只能选择破门而入,这是会被立即发现的;而现在,这种远程操纵开关的能力就会变得十分有用,同样在视频监控的情况下,就可以先控制大门打开,然后大摇大摆地进入而不会被察觉。或者攻击者只是制造一个恶作剧,通过快速不停地打开和关闭操作,让一个灯变成一个不停闪烁的灯,对于被入侵的ZigBee网络的管理者来说,也是件头疼的事。
⚡ KillerBee数据包重播工具zbreplay
可以使用KillerBee中的zbreplay工具进行数据包“重播攻击”,它能够从数据包捕获文件中读取数据,然后按照指定的延时间隔重新发送这些数据包。这里的延时间隔可以是数秒,也可以是短短的一瞬。程序运行的时候,zbreplay会重新发送每个数据包帧,同时会保持整个通信数据包的原始完整性。当然,这些重发的数据帧中并不包括“确认帧”。以上的操作格式和操作效果如下所示:
⊗ 注意
zbreplay不会重新发送“确认帧”,原因也很简单,因为这些帧是在接收方成功接收后自动生成的。也就是说,所谓“重播攻击”不是停掉原来的协议职能,而一味重发,而是重播的过程中,原来的功能还在,并且当被“重播攻击”的对方向你发出“确认请求帧”的时候,你的协议会自动向对方发送“确认帧”,所以你就不需要再重播“确认帧”了。
在本例中,zbreplay重新发送了libpcap捕获文件中的内容。这个捕获文件所捕获的也正是“灯光切换开关”的动作,保存的文件名是lightswitch-onoff.pcap。ZigBee运行的信道是20信道,这个是通过参数“-f 20”指定的,延时为十分之一秒,这是通过参数“-s.1”体现的。在重播完捕获的数据包内容后,zbreplay显示总共发送了4个数据帧。另外,作为可选的参数,你可以使用“-n”参数来限制需要重播的数据帧的数量,比如你只想重播数据包捕获文件中的前两个帧,那么只需指定“-n 2”参数即可。
⊗ 注意
在同一个接口上,既使用zbdump工具捕获数据帧又使用zbreplay工具重新发送这些数据帧是行不通的,所以如果想在zbdump工具记录数据的同时,也能查看通过zbreplay工具生成的ZigBee设备的活动,你需要有两根“RZUSBstick记忆棒”。
因为zbreplay会重播所捕获数据包的内容,所以有时需要你在发起“重播攻击”之前先对所捕获的文件进行一番“整理”,使得文件中只保存要发送的数据帧,这样重播工具就只需要发送这些需要重播的帧了。这个操作非常容易,只要使用Wireshark软件所提供的功能即可完成。
首先,在Wireshark程序中打开捕获的数据包文件。右键单击选中一个你想要提取或解包的数据帧,然后选择“标记数据包”(Mark Packet),这是一个“反转”(toggle)操作模式,所以如果你发现你误标了某个数据包,只需要按这个过程再操作一遍即可。被标记选中的数据包,Wireshark会以黑色背景高亮显示该数据包所在行。一旦“高量标记”完所有在数据包捕获压缩文件中所需的数据包项以后,选择“文件(File)|导出所选数据包(Export Specified Packets)”菜单,然后输入一个新的文件名。在“数据包范围”(Packet Range)分组框中,选择“只保存已标记的数据包”(Marked Packets Only)单选项,这时的界面截图如图13-21所示。
一个“重播攻击”的有效性,在很大程度上取决于作为目标的那个ZigBee设备在软硬件设计时采用的实现方式,也就是说,只能具体问题具体分析,必须是在具体必须在逐项(case-by-case)分析的基础,再进行总的评价。通常情况下,“重播攻击”所针对的是未加密的网络,或者是那些我们已经知道“加密密钥”(encryption key)的网络。幸运的是,对于一个攻击者来说,如果遇到一个加密的ZigBee网络,攻击者仍然也还是有专门针对加密网络的攻击选项。
✔ 防御重播攻击
要弱化“重播攻击”,ZigBee协议堆栈中应该在接收数据包中配置一个“序列码”(sequence number),以便验证数据的有效性。在每次新的数据包中,这个“序列码”都至少比上一次成功地接收到的数据包中的“序列码”大1[6]。不过,不幸的是,“ZigBee规范”并不要求这点,并且虽然ZigBee“网络层”中也有一个“序列号”的字段是可以用来当此用途的,但是这里的“序列号”字段,它的“熵”(entropy)也只有8位,也就是说它总共可以表示的有效数据量只有28=256种可能,明显偏少。举例来说,假设ZigBee的“网络层”采用了这一机制,一个攻击者可以捕获到一个数据包,如果现在发送这个数据包,就会因为“序列码”不满足“大于1”的要求而失效,但这个问题不大,因为发送程序只要再等待255个帧之后,再次发送这个捕获的数据包时就能够匹配到正确的“序列号”了。
在高层应用中,一些安全防御的方法也可以作为一种额外的方法用于防御“重播攻击”,比如可以应用上面提到过的“序列号”机制,设计一套“高级序列号强化机制”(high-level sequence number enforcement mechanism)来防御“重播攻击”。就目前来说,这些机制应该从单独使用的基础上进行评估,然后根据具体的应用决定所使用的“序列号”的有效位数(也就是上面提供的“熵”)是否够用。
13.3.5 针对加密的攻击
加密密钥的生成、更新、撤销以及管理对于ZigBee网络来说是一个很难安全处理的挑战性问题。几乎所有的ZigBee设备都没有“人机接口”(Man-Machine Interface,MMI),所以即使是管理员用户在将设备用于实际使用之前,也很少有机会买到一个能在本地配置密钥的产品。在其他情况下,比如在“家域网”(Home Area Networking,HAN)中,一个智能温控计和一个智能电表之间进行通信,由于加入这个ZigBee网络中的多个设备之间,每个ZigBee设备的责任都是分离的,所以不存在管理上的关系,因而这就使它们的密钥管理成为了一个复杂的问题。
在“ZigBee-2012网络”、“ZigBee-2007网络”,以及更早的使用“标准安全模式”的网络中,如果设备还不知道自己的特定密钥,那么它可以通过向“应用支撑子层”发送一个“请求密钥”(Request-Key)命令的方式,请求“ZigBee信任中心”分配给它一个密钥即可。如果“ZigBee信任中心”的配置策略允许新设备请求密钥,那么“ZigBee信任中心”就通过“应用支撑子层”向发出请求的设备回送一个“传输密钥”(Key-Transport)命令。
知道了“网络密钥”后,其他的密钥都可以通过这个“网络密钥”进行派生,比如“链路密钥”。可见,“链路密钥”交换的安全性取决于前面“网络密钥”的完整性,但是,这里的“网络密钥”是以明文的方式发送的,所以隐患极大。不过,尽管这是一个很大的威胁,但是许多ZigBee网络中,也都只能依靠这一个可用的传输机制来动态分配密钥和实现密钥的更新[7],并将这一机制作为网络所要求的安全模型,所以这是一种无奈之举。
⚡ KillerBee密钥侦听工具zbdsniff
KillerBee工具集中的zbdsniff工具,在设计的时候,就考虑到用该工具可以对数据包捕获文件的内容进行处理,无论文件的格式是libpcap格式,还是“传感器网络分析器”保存的格式。所处理的数据包内容不是所有内容,而是只关注其中的“应用支撑子层”的数据帧,并且只关注其中的“传输密钥”命令,在命令行中可以同时指定多个捕获文件。每当有一个捕获文件中包含有“传输密钥”命令,同时命令中存在泄露的网络密钥,那么zbdsniff工具会显示密钥的内容、相关ZigBee设备的源地址和目标地址,其命令格式及破解示例如下所示:
一旦获取了“网络密钥”之后,你就可以使用Wireshark工具解密数据包捕获文件的内容了。操作步骤是先打开Wireshark程序的“用户图形界面”,首先选择一个密钥加密方式(即图中左边列表中的“ZigBee网络层”(ZigBee NWK)),然后通过选择“编辑(Edit)|偏好(Preferences)|协议(Protocols)|ZigBee网络层(ZigBee NWK)”菜单打开“ZigBee网络层”(ZigBee Network Layer)对话框,并且在对话框指定位置输入密钥,如图13-22所示。同时,还必须指定“信息完整检查码”的长度(即图13-22中“安全级别”(Security Level)),该长度通常都是32位的密钥长度,这同时也是Wireshark软件的默认值。密钥输入完毕后,Wireshark程序就会在数据包捕获文件解密数据包中的每个帧,这样就能看到每个帧解密后的内容了。
✔ 防御密钥传输攻击
“ZigBee规范”也支持提供加密密钥的其他机制,其中包括“预配置密钥”机制和“密钥协商”。其中的“预配置密钥”就是当设备在工厂制造阶段就预先设置好密钥;“密钥协商”就是使用“对称密钥建立”(Symmetric Key-Key Establishment,SKKE)协议,动态地交换密钥。
“预配置密钥”机制的优势在于,在工厂的生产阶段就配置好了密钥,所以就缓解了密钥在传送过程中遭受攻击的威胁,因为ZigBee网络上的设备在传输以前就已经知道网络上其他设备的密钥,所以可以直接用来保护要发送的数据。不过,“预配置密钥”机制的劣势也很明显,那就是密钥的更新(rotating)和撤销(revoking)变得非常困难,一旦遇到这两种操作,就不得不需要管理员手工依次处理ZigBee网络中的每个设备了。
“ZigBee Pro规范”支持“对称密钥建立”协议,通过该协议的派生功能可以派生出密钥,“ZigBee信任中心”可以将这个派生的密钥作为一个“群组密钥”(group key),然后在ZigBee设备进入网络要求认证的时候,使用这一“群组密钥”进行通信。然而,要想使用“对称密钥建立”协议,通信双方的设备都必须配置一个“主密钥”(master key)。“主密钥”的分配有两种方式,一种是通过空中在没有保护的无线传输,另一种是在设备上“预配置密钥”的方式。无论采用哪种方式,都存在前面作为密钥建立过程中已讨论过的风险和劣势。
13.3.6 伪造数据包攻击
KillerBee的设计对于软硬件开发者来说是很友好的,该设备使用Python编程语言实现了所有的非固件代码。除了支持Python语言的开发者,KillerBee还集成了由Philippe Biondi开发的数据包嗅探和一个制作开发的“框架类”的程序,名叫Scapy。
不过,Scapy框架本身既不支持IEEE 802.15.4协议或ZigBee协议,也不能与像“RZUSBstick记忆棒”这样KillerBee所支持的硬件设备进行交互操作。为此,在KillerBee项目中,Ricky Melgares和Spencer McIntyre为了将KillerBee设备和Scapy框架集成到一起做出了重大贡献。通过这些工作,KillerBee也提供了个zbscapy工具,该工具允许用户嗅探和伪造ZigBee协议和IEEE 802.15.4协议的数据包,并且使用了与Scapy框架相似的语法。
♥ 提示
这本书的目的并不是要作为一本资料大全,让读者详细了解Scapy框架的每一句语法和每一个功能点,我们只会从中挑选出该框架中,使用IEEE 802.15.4网络和ZigBee网络相关的协议,与数据包嗅探和制作相关的那部分zbscapy功能和Scapy语法的使用方法。如果用户对Scapy框架是个新手,那么应该先读一下Scapy教程的文档,该文档的网址是http://www.secdev.org/projects/scapy/doc/usage.html。
1.设置zbscapy程序
要想zbscapy工具正常使用,需要首先安装Scapy项目中一款名叫scapy-com软件的修改版本。scapy-com是Scapy框架的“社区版本”[8](Community Edition),由众多用户参与了开发上的贡献和功能增强。在你的Linux主机上,可以通过Mercurial项目中的hg工具自动下载scapy-com项目所提供的该程序的源代码,下载成功以后,就可以安装了,其安装命令的格式及效果如下。
随着scapy-com软件的安装,你可以调用zbscapy工具访问交互式shell环境,如下所示:
2.通过zbscapy伪造数据包
当你以root用户调用zbscapy命令的时候,如果系统中有多个KillerBee设备,那么你可以通过参数决定使用哪一个设备,否则系统就默认使用第一个设备。与Scapy程序相似,比如“ls()”命令会显示所支持的,可以通过手工方式伪造的数据包类型,其中很多“介质访问控制层”的附加函数都是以Dot15d4()作为前缀,几个新的“逻辑链路控制”(Logical Link Control,LLC)层函数因为和ZigBee相关,所以都是以ZCL作为前缀,这些功能都属于“ZigBee协议簇库文件”(ZigBee Cluster Library)开发包中。具体的示例如下所示(注意,为了本书格式上的简洁,在下面输出内容中,我们对不是很关键的内容进行了裁剪,所以下面的函数也不是“ls()”命令输出的全部函数)。
zbscapy工具引入了一个名为killerbee_channel的配置项,目的是用于指定发送数据包时要使用的信道号码。在设置此值之后,你就可以通过KillerBee对象的killerBee()方法完成对KillerBee对象的初始化工作[9],并且手工伪造一个数据包,并将其发送出去。下面的例子演示了zbstumbler工具中的一些功能,即从信道15上发送一个单一的IEEE 802.15.4协议信标请求数据帧。
在这个例子中,我们通过Dot15d4Cmd()函数进行数据包内容的填充,手工创建了一个基本的IEEE 802.15.4数据帧,将该数据帧指定为信标请求命令类型以后,就可以通过调用kbsendp()函数发送这个数据包的数据了。作为可选项,你可以在调用kbsendp()函数的时候,将其参数设置为mypkt,除此之外通过在命令中增加“loop=1”和“inter=1”参数设定发送的动作不停地重复,并且每个数据包之间的间隔是1秒。由于程序会无限地循环下去,所以如果要中止这个发送过程,可以通过组合键Ctrl+C中断传输:
通过使用zbscapy工具,使得伪造任意格式的数据包的操作变得简单且直观,也让我们可以以非常灵活的方式,通过各种类型的数据包数据对目标设备进行各种测试。例如,我们可以把类似的信标请求帧,通过遍历的方式把所有可能的命令类型的值测试一遍,甚至可以生成包括无效命令类型和不支持的命令类型,对对方ZigBee设备的鲁棒性进行测试。其具体的做法也不难,就是插入一段Python语言的代码,在代码中通过一个while形式的循环[10]命令,周期性调用kbsendp()函数。其过程和效果如下所示:
除了伪造数据包,zbscapy也可以让接收数据包变得简单,接收到的数据包同样可以用于后续的处理。具体参见后面的内容。
3.通过zbscapy嗅探数据包
在前面的例子中,我们发送了各式各样,或有效,或无效的IEEE 802.15.4数据帧,包括信标请求数据包。默认情况下,通过发送信标请求数据帧,我们可以复制一些zbstumbler工具曾经做过的动作,但对接收到的数据包并不会显示任何信息。不过,这没关系,因为我们可以通过修改这个脚本来让zbscapy工具既可以发送数据包,也可以同时接收数据包。对如何接收数据包,一个简单的小结如下:
在这个例子中,我们伪造了一个有效的IEEE 802.15.4协议数据帧,所用的类型就是“信标请求”,指定“目的地址”是广播地址0xffff。发送数据帧的命令不是用kbsendp()函数,因为这个命令发送完一帧数据以后就会立即返回,至于是否收到对方的回复并不知道。为了避免这种效果,我们改用kbsrp1()函数进行发送,这种发送方式会在发送该数据帧后进入等待状态,直到等到一个来自网络的响应数据包才返回。这样做的好处是我们可以很容易在一个单一的流程(a single line)中,通过show()函数将接收到的数据包进行汇总分析并显示出来。同时,如果想显示“响应列表”(resp list)中接收到的数据帧的附加信息,还可以使用show2()函数。
♥ 提示
通过kbsrp1()函数发送数据包的时候,会让脚本进入“阻塞”(block)状态,直到收到一个数据包后才会返回。如果对方ZigBee设备根本就不存在,那么当前这个函数就会进入“死等”状态。为了避免这种情况发生,可以在调用kbsrp1()函数时,指定一个以秒为单位的时间值,即在该指定的秒数内,如果收到对方回复的数据包,则立即返回;如果在到达该秒后,仍然没有接收到数据包,则函数同样返回,同时会报一个“超时值”(timeout)错误,也就是说,要避免程序死等,只要在调用脚本前设置这个“超时值”作为参数即可。
zbscapy工具除了数据包注入任务之外,还可以通过调用kbsniff()函数使其单独作为一个嗅探器。与Scapy框架非常相似的是,kbsniff()函数会返回一个接收到的数据包的列表,至于这个列表中捕获到数据包的个数,则取决于kbsniff()函数什么时候停止运行了。kbsniff()函数停止运行有三种可能:一种是在kbsniff()函数运行的时候,人为的中断(比如用户按了Ctrl+C组合键);第二种可能就是用户在调用kbsniff()函数的时候,设置了一个数量参数,那么当该函数捕获的数据包数量达到这个数量时,就会主动退出来;还有一种可能就是用户在调用kbsniff()函数的时候,设置了一个以秒为单位的时间参数,那么当该函数运行的累计秒数达到这个时间参数时,也会主动退出来。在下面的例子中,我们也可以“重载”[11](override)函数中的conf.killerbee_channel参数,以便在调用kbsniff()函数的时候,设置一个可以作为变量的信道序号:
在这个例子中,函数kbsniff()在信道20上嗅探了30秒的时间,一共捕获到4个数据包。我们可以通过每一个数据包前面的索引序号[12],汇总显示这个数据包的详细内容,或者与例子中一样,通过调用packets.show()函数显示出一行一总结式的效果。
像Scapy框架中的sniff()函数一样,kbsniff()函数还提供了以“回调函数”[13](callback function)的方式进行调用的能力。这样每次接收到一个数据包,系统就会主动调用“回调函数”完成指定的功能,具体是什么功能,则取决于我们如何编写“回调函数”,比如我们可在“回调函数”中编写定制的代码,当有数据包捕获的时候,可以处理这些数据包。本例就是在接到数据包的时候,将该数据包填充给一个“列表对象”(list object):
⊗ 注意
在上面例子的输出内容中,有些内容已被修改,以便在不影响理解的同时,保持格式上的简洁。
在这个例子中,我们定义了一个processpkt函数,每当有一个数据包被捕获到的时候,processpkt函数就会被kbsniff函数所调用。这时,processpkt函数会检查是否这个捕获到的数据包是否有“ZigBee的安全头部数据”(ZigBeeSecurityHeader)这一层数据,如果有,processpkt函数会继续检查这个头部中的“帧类型”(frametype)字段是否为0,根据“ZigBee规范”中约定,如果该字段为0,就表示这是一个“数据的数据帧”(data frame)。还有一个代表当前数据包中“ZigBee安全状态”字段是否已设置的数据“位”,如果没有设置,那就表示这是一个“数据没有加密的数据帧”(unencrypted data frame)。如果这些条件都满足,那就意味着,当前所捕获到的这个数据包是一个没有加密的明文数据包。那么processpkt函数就会调用hexdump函数,将数据包内有效载荷直接以十六进制的方式全部打印出来。
因为接收和发送数据包的这一基本功能很容易做到,所以我们可以简单地部署一个新的ZigBee或IEEE 802.15.4的攻击工具。接下来,我们看一个开发某攻击工具的例子,该例子使用zbscapy工具,利用加密的IEEE 802.15.4网络中一个已公开已发表的“拒绝服务”(Denial of Service,DoS)漏洞,采用一种非公开的攻击方式进行攻击,这种攻击方式目前仍然是有效的。
⚡ 通过zbscapy攻击IEEE 802.15.4网络
IEEE 802.15.4协议支持“介质访问控制”层加密和数据帧验证功能,这是通过AES-CTR(即“演进的分组系统加密算法第2版”的别称)加密算法和一个“信息完整性检查”(MIC)函数。这个安全控制在IEEE 802.15.4设备的部署中虽然不是强制性的,但是从使用用例中可以发现,IEEE 802.15.4协议很需要有这种很强的保密性强和真实性。
不幸的是,在这些安全的IEEE 802.15.4网络部署中,对数据帧处理的设计暴露了系统很容易遭到一个持续的“拒绝服务”攻击。首先,在2006年,由Rui Silva和Serafim Nunes在论文“IEEE 802.15.4标准的安全”(“Security in IEEE 802.15.4 Standard”)中指出一种以二者姓名命名的“Silva/Nunes”攻击,在这种攻击中,攻击者可以操纵目标设备,使这些ZigBee设备拒绝对所有“进接口”(inbound)数据的后续处理。并且这种攻击所造成的“拒绝服务”攻击效果是:管理员必须手动刷新组织内所有ZigBee设备,然后才能使ZigBee设备恢复对“进接口”数据的处理。
针对IEEE 802.15.4标准的“Silva/Nunes拒绝服务” DoS攻击所利用的攻击漏洞,是ZigBee设备通过“进接口”处理数据的时候,会参照一个IEEE 802.15.4标准的“数据帧计数器”(Frame Counter,FC)。每当设备的节点发送一个安全的数据包,这个数据包就会包括一个连续的数据帧控制值。这个数据帧控制值就是“数据帧计数器”,存在于每一个数据帧中,它的范围是0~4294967294,换算成十六进制就是0到0xffffffff-1。“数据帧计数器”值本身是不加密的,但是该值参与了数据包中“信息完整检查码”的运算。
接收节点需要记住来自网络上所有其他节点发送来的最后一个观察到的“数据帧计数器”值,这样做的目的也是很明确的,作为其通信安全的一种机制,避免对方欺骗自己,发起“重播攻击”,从而不需要对对方重复发送的数据包进行多次处理。这样一来,接收节点只接收来自对方的数据包中,“数据帧计数器”值比上一次来自同一对方设备中至少大1的那些数据包。这种数据包有效性的通用检验机制被应用于许多协议中,对协议进一步的解释,详见图13-23。
对于接收节点,另外一个要考虑的地方是IEEE 802.15.4规范将“数据帧计数器”值作为一个输入参数,用来加密和解密处理,也就是在“每一个数据包生成”(per-packet key-generation)机制中,IEEE 802.15.4规范都要求“数据帧计数器”的值作为该机制的一部分参与运算。“数据帧计数器”的生成一般是使用一个nonce类型的值。该值所处的结构如下所示。
“数据帧计数器”是特定的节点在发送每一数据帧的时候,用来标识和区分每一个数据包的一个独一无二的值。如“WPA的预共享密钥模式”中的注解所述,这个值是一个与时间有关的随机数。对于IEEE 802.15.4规范来说,要使用AES-CTR机制在“‘高级加密标准-计数模式和密码块链消息认证码’(AES-CCM)协议的修订版”CCM*中进行加密,那么这是一个重要组成部分:重复的nonce值会导致“初始化向量的碰撞攻击”(initialization vector collision attack),让攻击者通过已知密文/明文数据解密未知密文。由于缺乏密钥的更新机制的支持,所以“IEEE 802.15.4规范”进一步明确:当“数据帧计数器”的值等于0xffffffff时,接收节点必须立即确定发送这一值的节点,停止与该节点所有进一步的数据处理,并将该发送设备添加到“黑名单”里,之后也不再与该设备进行任何处理,这个规定详见《IEEE标准802.15.4-2006》7.5.8.2.3小节中的“步骤j”和“步骤o”。要想从黑名单中删除这个设备,需要管理员通过修改所有设备的“网络密钥”而使黑名单失效,确切地说就是得一个设备,一个设备地重新刷新修改后的固件才行,可见这是一个复杂的操作流程。
在IEEE 802.15.4规范的预期使用情况中,设备是不可能达到这个最大的“数据帧计数器”值的[14]。因为我们假设,某一个ZigBee设备每秒钟发送一个数据包,那么即使是用这么一个不太可能的数据包持续发送速率,一个ZigBee设备节点要想达到这个最大的“数据帧计数器”值,也需要136年[15]之久。我们总不会希望到了下个世纪还依赖于IEEE 802.15.4规范进行ZigBee设备的安全控制吧。
在Silva和Nunes对IEEE 802.15.4规范的安全组成部分所做的分析中,他们发现了一个漏洞,那就是规范规定处理“进接口”数据包的时候,需要参考“数据帧计数器”的值。如图13-23中的流程图所示,当“数据帧计数器”的值为0xffffffff时,节点就停止处理该数据包。然而对于任何小于最大“数据帧计数器”值的值,接收节点会查看这个“数据帧计数器”,看值是否比最后一次记录的“数据帧计数器”至少大1。如果某个数据包通过“进接口”时,符合这个小于最大“数据帧计数器”的条件,那么这个数据包将通过检查,接收节点同时会使用接收到的这个值作为下一个“数据帧计数器”值,然后开始解密当前接收到的这个数据包。这就产生了严重的缺陷,问题就出在“当该值为0xffffffff时就停止处理”、“每接到的值必须比上一次的值大”和“每接收到一个值,就将该值作为一个用于下一次接收时判断的新的值”这三点规定之间的矛盾上。攻击者在IEEE 802.15.4网络上,通过伪造数据包冒充一个合法节点,向要攻击的节点设备上发送一个“数据帧计数器”值为0xffffffff-1的数据包。对于接收节点来说,通常情况下,这个数据包总是符合“每接到的值必须比上一次的值大”,因而是合法的,并且在接收以后会按“每接收到一个值,就将该值作为一个用于下一次接收时判断的新的值”的规定将0xffffffff-1作为新的“数据帧计数器”值。这样一来,问题就出现了,如果一个合法的设备使用小于或等于0xffffffff-1的“数据帧计数器”FC值向该被攻击的节点发送数据,那么会因所发数据不符合“每接到的值必须比上一次的值大”而被拒绝;如果所发数据的“数据帧计数器”值为0xffffffff,虽然符合了“每接到的值必须比上一次的值大”,但是也会因符合“当该值为0xffffffff时就停止处理”而被拒绝处理,甚至被直接加入到“黑名单”中。
在写这篇文章的时候,还没有公开可用的工具来实现和验证“Silva/Nunes攻击”。然而,我们利用zbscapy工具的特点,可以快速地开发出一个类似的攻击工具。
攻击IEEE 802.15.4规范中“数据帧计数器”有效性验证机制 最有效的“拒绝服务”攻击条件下,一个攻击工具可以按如下几个步骤进行操作:
·自动通过数据包嗅探的方式,确定对方的网络是一个IEEE 802.15.4网络。
·从观察到的数据包中提取所需的字段:“数据帧控制”(frame control)、“源地址”(source address)、“源‘个人局域网’的ID”(source PAN ID)字段、“目的地址”(destination address)字段,“目的‘个人局域网’的ID”(destination PAN ID)字段、“安全控制”(security control)字段。
·使用上述字段,再将“数据帧计数器”值设定为0xfffffffe(即0xffffffff-1),一起伪造一个数据包,并发送出去[16]。
·还有一个可选的步骤:周期性的跳频,以最大化地攻击分布于各个频率点的所有潜在的ZigBee设备。
使用zbscapy工具,我们可以调用kbsniff()和kbsendp()函数查看IEEE 802.15.4的数据帧,主要关注与漏洞相关的必要的安全元素,然后选定一个以前捕获到的数据帧,修改其版本,将其中的“数据帧计数器”值设置为会触发“拒绝服务”的条件,然后通过注入(injecting)的方式发送出去。
在这个例子中,“while(1)”命令的意义是,后面的命令将是一个循环,该循环会无限地运行下去,那么这个命令的作用就是让攻击永远不停地进行下去。在循环的内部,信道变量是用来覆盖每一个2.4GHz频率的IEEE 802.15.4通道的,程序会在每一个信道嗅探10秒钟,然后移到下一个信道中继续嗅探。在这里的进攻中,嗅探不是目的,嗅探只是为了接收一个数据包,然后提取必要的参数,所以每次kbsniff()函数一接收到一个数据包,程序就会调用attack()函数。
attack()函数会检查所捕获的数据包的内容,先确定这个数据包是否具有“辅助安全头信息”(auxiliary security header information)和“数据帧计数器”字段。如果这些字段存在,那么这个数据包就会被修改,其中的“数据帧计数器”值会被设置成最大允许值0xfffffffe。修改后的数据包以“注入”的方式连续三次发送到对方被攻击的ZigBee设备上,每次发送有一个1秒的延迟间隔。发送的信道当然就是接收到该数据包的信道。发送结束后,就可以结束该函数的功能了。
⚠ 警告
在生产环境中运行这个脚本是不可取的,因为它会盲目地停止所有的IEEE 802.15.4设备的通信。从这一攻击的结果中进行正常状态的恢复,将会是代价昂贵,甚至是不可能的,因为有些ZigBee产品根本就不向管理员提供密钥修改的功能。
除了KillerBee工具套件之外,zbscapy工具就是一个最强大的工具了,它最大的特点莫过于允许用户使用脚本进行开发,这样的优势就是用户可以对设备的各种攻击方式,通过脚本快速地实现并投入实验。不过,具体到攻击,虽然有很多ZigBee和IEEE 802.15.4产品已经部署,但每个产品都有自己独特的细微差别,所以要想完成对其成功地攻击,需要额外的实验。从安全的角度来看,多花一些时间来研究和试验zbscapy的功能,你会发现这是一个物有所值的投资。
- 硬件接口上的术语,公头(male)指外形是针形的一头;母头(female)是外形是针孔插座的一头。——译者注
- AVR的体系结构是由“挪威技术学院”(Norwegian Institute of Technology,NTH)两名学生Alf-Egil Bogen和Vegard Wollan最先提出的,由于系统采用了增强型内置Flash的“精简指令集”(Reduced Instruction Set CPU,RISC),所以用两名学生名字的首字母“A”和“V”,再加上RISC的首字母“R”共同组成了“AVR”。——译者注
- 需要注意的是,这里的“一一对应”不是按各引脚在针座上排列的顺序一一连接,也不是作用相同的信号连在一起,而是“AVR Dragon”的引脚定义,和JTAG的引脚定义。在连线的时候,要按作用匹配的方式进行相连,比如两边的地线要相连,而一方的发送连另一方的接收。——译者注
- “网络发现”属于“服务发现”的一个分支,该技术本身并不简单,但该技术是现代操作系统中的标准配置,而不是黑客专用的程序。任何普通人都可以实施该操作,可见其攻击极具普及性和普遍性,所以称为“简单的”网络发现。本书中多处出现的“发现”一词都是这个意思。——译者注
- 任何一个命令行程序都有默认的输入和输出,并且默认的输出大多数都是键盘(cin),默认的输入都是屏幕(con)。所谓“重定向”就是改变默认的输入为指定的输入,或改变默认的输出为指定的输出。重定向的命令是“>”、“>>”或“<”,比如上面“sudo zenang -c 15 >zena.pcap”就表示将“sudo zenang -c 15”本应输出到屏幕的内容,输出到“zena.pcap”的文件中(如果是“>>”则保留原来的内容,在文件的尾部进行追加),而后面的“sudo wireshark -k -i <(zenang -c 15)”命令表示“sudo wireshark -k -i”命令的默认输入本应该是键盘,但现在换成“zenang -c 15”命令输出的内容作为其输入。实际上,本书其他部分,特别是第5章中很多“重定向”并不是这个意义上的重定向,而只是指将某个数据流“重新指定一个流向”的意思。——译者注
- 这种机制在很多协议中使用,比如在TCP/IP协议中广泛使用,只不过TCP/IP协议中是双向的,发送方先产生一个随机数,然后双方按顺序依次加1。这里需要说明的有两个地方。一个这里的加1,具有“循环”的意思,比如下面的例子中,255加1,就变成了0,所以0反而比255“大”1。第二个地方就是这里的“至少”是一个模棱两可的说法,因为只是比一个数大,就很容易做到,比如你一直发送一个最大的值即可实现。所以这里的“至少”的本意就是“每次都大于,但不能大得太多”。至于不强制要求每次只能大于1是因为有丢包的可能,如果强制该要求,则一旦丢包就会导致联系中断。——译者注
- 在信息安全领域,只要是不能防止侦听的环境,如果必须传密钥,都建议使用另一种方式传送密钥。比如你用邮件传送了一个带有密码的RAR文件压缩包,那么这个密码就可以通过手机短信的方式告诉对方,而不要在邮件中告诉对方,即使使用不同的邮件,甚至是不同的邮箱。——译者注
- 在英美国家的一些社区(相当于中国的住宅小区)中,有些人会将家里不再使用,但还不至于扔掉的东西拿出来低价出售。所以这里的“社区版本”也就是指该软件的版本属于低价甩卖性质的,通常有较大的功能限制。——译者注
- 这一句里的“对象”、“方法”是面向对象编程中的术语,转化成面向过程编程的术语,这两个概念和“属性”一起,大致相当于“模块”、“模块中的函数”和“模块中的变量”。——译者注
- 高级语言中的编程,一般循环语句大同小异,一般有三种:for循环(事先知道循环次数时用)、while(事先不知道循环次数,且可能一次也不执行时用)、do…while(事先不知道循环次数,但至少执行一次时用)。在Python语言中,只有for循环和while循环两种。值得一提的是,本处虽然说是while循环,但下面的例子使用的却是for循环。——译者注
- 重载是面向对象开发语言中的一个术语,指从一个基类中继续新类的时候,新的类中的“方法”可以与所继承类的“方法”重名,这时新的“方法”就称为重载。对于新类来说,父类的“方法”相当于被自己重写并在支持的时候载入。——译者注
- 有相当多的编程语言,在使用序号的时候,习惯从0开始,比如上面例子中,4个数据包的序号是0~3,而不是1~4。——译者注
- “回调函数”,是由已方提供的供对方调用的函数。以数据包嗅探为例,这属于不定时的、突发性的事件,如果不停地查询有没有接收到数据包,在数据量小的时候会浪费很多查询的资源,如果换成对方在接收到一个数据包后,就主动调用我们提供的“回调函数”,那就会节省很多资源。——译者注
- “数据帧计数器”FC值的最大值0xffffffff-1,所以确切地说,这个最大的值不是“数据帧计数器”值的最大值,而是一个4字节无符号整数所能表示的最大值。——译者注
- 4294967295(即0xffffffff)/(60×60×24×365)≈136.2年。不过,客观地讲,ZigBee设备的发送速率和串口差不多,1秒钟发送十几个小包还是有可能的,所以上面说“不可能的速率”并不准确。不过,总的来说,这种说法对于结论并没有影响。——译者注
- 这个描述,个人觉得有不科学的地方,发送“数据帧计数器”值为0xfffffffe的数据包,第一次会使被攻击的ZigBee设备将其期望的“数据帧计数器”也改为0xfffffffe,如果之后攻击者仍旧发送“数据帧计数器”值为0xfffffffe的数据包,则后续的这些数据包将会被被攻击的ZigBee设备扔掉,这样做只能让合法的(被攻击者冒充的)节点无法正常通信。由于合法的节点是不会发送“数据帧计数器”值为0xffffffff的数据包的,因此要想让被攻击设备进入到“黑名单”中,攻击者至少还要再发一个“数据帧计数器”值为0xffffffff的数据包。所以“数据帧计数器”FC值为0xfffffffe的数据包导致合法节点无法正常通信,为0xffffffff的数据包将合法节点加入到“黑名单”。——译者注
本书评论