ZigBee 网络安全攻防

2019 年 4 月 15 日 计算机与网络安全

一次性进群,长期免费索取教程,没有付费教程。

教程列表见微信公众号底部菜单

进微信群回复公众号:微信群;QQ群:460500587



微信公众号:计算机与网络安全

ID:Computer-network

ZigBee是一项已经建立,然而仍在不停增长的无线技术,为多种工业领域所采纳。这些领域都希望使用一款有简单的协议堆栈、小规格、低数据速率,以及较长的电池寿命的电子产品,于是大家选择了ZigBee技术。ZigBee技术由“ZigBee联盟”(ZigBee Alliance)开发,它作为一项集成组件,在工业生产和家庭应用中首先被发现,然后迅速扩散到广大的技术领域,从家庭影院的遥控,到医院的患者监护系统。


一、ZigBee简介


ZigBee技术为低功耗无线网络定义了一系列的标准,许多设备的电池寿命都能够达到5年之久。这些可观的节能特性都很大程度上来源于ZigBee设计中的一些让步,比如“较低的数据传输速率”、“相对近距离的传输”、“持续供电网络协调器和路由器”,以及一个简单的协议堆栈,这个协议堆栈由多种“片上系统”(System-on-Chip,SoC)实现的。所谓的“片上系统”,就是将整个ZigBee协议堆栈(stack)、“无线传输器”(wireless transceiver)和“微处理器”(microprocessor)都集中在一个“集成电路”(Integrated Circuit,IC)上。


1、ZigBee在无线标准中的地位


一个最普遍的,也是最重要的问题是,当人们听到ZigBee的时候,他们常常会问“为什么说ZigBee是必不可少的?”。在一个拥有Wi-Fi、蓝牙,以及其他专有的解决方案的世界里,为什么我们还需要使用ZigBee呢?


同蓝牙和Wi-Fi相比,ZigBee是一个相对简单得多的协议,它全部的功能堆栈都在120KB的“非易失性随机访问存储器”(NVRAM)内实现了,一些生产商甚至声称他们研制出了精简版本的功能堆栈(reduced-functionality stack),它的大小只有区区40KB。现在,大部分Wi-Fi网络的传输速率是54Mbps(不包括IEEE 802.11n网络和IEEE 802.11ac网络),就连蓝牙的传输速率也在3Mbps,然而ZigBee的数据传输速率只有20~250Kbps。许多用户都表示Wi-Fi设备的“电池待机时间”(battery life)相对较短,比如像Wi-Fi VoIP电话这样的嵌入式设备,它充满电后的“电池待机时间”大概是8~12小时,“低功耗蓝牙”可以达到不错的“电池待机时间”,但是“低功耗蓝牙”只是提供了很有限的功率范围,因此只能把目标定位于“个人局域网络”(Personal Area Network,PAN)市场。相比之下,采用ZigBee技术“电池待机时间”能够延长到数月或者数年,对于一些高端(high-end)的服务对象来说,“电池待机时间”可以达到5年之久,并且再次充电后仍然可以继续使用。另外,即使在这种超长待机时间下,在这种低成本的接口上,其传输距离也在10~100米,甚至更长的传输距离。最后值得一提的是,ZigBee使用最简单的通信协议,简单到其协议可以少到只有三个就足够了。


2、ZigBee的部署


有一个市场的ZigBee技术已经蓄势待发,那就是“家庭自动化市场”(home automation market)。在这里,ZigBee会与“家庭控制系统”(home control system)进行连接,所连接的设备中,当然就是可以被控制的设备了,比如“电子应用类设备”、“照明控制”、“家庭安全系统”、“暖通空调”,以及其他更多的设备。除此之外,还有一些中间连接控制设备,如作为加工商生产的CentraLite产品“ZigBee供能照明开关”(ZigBee-powered light switch)和调光器(dimmer),以及用于“家庭照明自动控制智能插座”的需求。其他家庭自动化技术是用于安全目的的;Black&Decker公司(中文名“百得”)是“Kwikset SmartCode”道栓的制造商,该公司生产的“无线键盘输入系统”(wireless keypad entry system),名叫“家的连接”(Home Connect),利用ZigBee无线技术的地方包括从门把手和锁,到与后台服务器进行认证“个人身份码”值的通信,以及当有不速之客入室后,会通过“手机短信服务”短信的方式发给户主的报警机制。


对ZigBee来说,另一个有影响力的市场是“智能电网”(smart-grid)技术,包括“先进的计量基础设施”(Advanced Metering Infrastructure,AMI)。许多国家会在智能电网技术上进行投资,本地的公共事业部门也会使用覆盖小区的无线网络同用户家中的家庭智能电表进行交互。消费者可以在他们的ZigBee温控计上通过一些智能测试仪器实时获得电价信息,例如“Google的Nest的智能恒温调节器”,其实物图如图1所示。

图1  Nest智能恒温调节器

“ZigBee联盟”(ZigBee Alliance)负责维护一个产品列表,所列的产品都是已被认证为“ZigBee兼容”(ZigBee compliant)的产品。


除了商业ZigBee产品之外,许多组织开发他们自己的软件来使用ZigBee传输技术,可以使用的ZigBee无线芯片有“德克萨斯仪器”(Texas Instrument)、Ember、Microchip,以及Atmel等诸多芯片。这些项目中的许多产品都在积极使用,支持生产运营、环境监测,甚至在零售业务上也可以将信用卡号码通过ZigBee无线技术进行传输。


3、ZigBee协议层次结构


有一个机制被“ZigBee联盟”用来保持ZigBee的简单化设计,那就是使用一个结构化的协议栈来定义各个协议层,以及每个协议层上要做的事情。这个协议栈共由四层组成,分别是“物理层”(Physical layer,PHY)、“介质访问控制层”(MAC layer,MAC),“网络层”(Network layer,NWK),“应用层”(Application layer,APL),如图2所示。ZigBee协议所使用的“物理层”和“介质访问层”都是在“IEEE 802.15.4规范”中进行定义的,然后以这个成熟的规范为基础来定义ZigBee协议。

图2  ZigBee协议栈的层次结构图

(1)ZigBee的物理层


ZigBee的物理层由IEEE 802.15.4规范进行定义。该层所使用的频率波段在欧洲使用的是868MHz,在北美洲或南美洲使用的是915MHz,在全世界除了上述地区之外使用的都是2.4GHz。所有这些频率波段一共占用了27个信道,每个波段使用了不同的数据传输速率,如下所示:

IEEE 802.15.4协议与IEEE 802.11协议很类似,都是无线网络协议,只是IEEE 802.15.4采用“直接序列扩频”(Direct Sequence Spread Spectrum,DSSS)技术。可选的物理层还包括有“并行扩频序列的能力”(Parallel Sequence Spread Spectrum,PSSS)技术,虽然这一技术远没有“直接序列扩频”技术那样流行。


同Wi-Fi无线网络中的射频信号使用同一频率一样,在ZigBee无线网络中,其通信也是单个频率中进行,除非通过网络管理员对它进行重新配置,而在蓝牙无线网络中,通信的频率则是一直跳频变化的。因此,要在ZigBee网络进行数据包的嗅探将非常简单,因为负责侦听的程序只需要在一个频率上进行侦听即可,而不需要像蓝牙网络中,还需要不停地同步跳变。


(2)ZigBee的介质访问控制层


ZigBee的介质访问控制层也是由IEEE 802.15.4规范进行定义的。这一层包含了构建扩展ZigBee网络的各项功能,包括设备互连的拓扑结构、“设备的角色”(device role)、数据包的帧结构设计,以及网络上的“建立关联”(association)与“解除关联”(disassociation)的操作。


ZigBee网络采用“设备角色”的概念,即对于每个设备,根据自己的可参与操作的角色,都有一组不同的功能。常见的“设备角色”有以下几种:


ZigBee信任中心(ZigBee Trust Center,TC)这是个“全功能的ZigBee设备”(Fully Functional ZigBee Device,FFD)负责对加入ZigBee网络中的其他ZigBee设备进行认证。当一个ZigBee设备试图连接到ZigBee网络的时候,距离该设备最近的“ZigBee路由器”通知“ZigBee信任中心”有一个设备加入到当前的网络中了。“ZigBee信任中心”指示“ZigBee路由器”对那个ZigBee设备进行身份验证,或终止这个新节点的连接请求。


ZigBee协调器(ZigBee Coordinator,ZC)这是一个“全功能的ZigBee设备”,负责控制“个人局域网”(PAN),代表其他设备完成其信息的中继转发。“ZigBee协调器”允许其他ZigBee设备加入到“ZigBee协调器”的队伍中参与协调,或加入到ZigBee网络中参与其他各项活动。


ZigBee路由器(ZigBee Router,ZR)这是一个“全功能的ZigBee设备”,可以完成转发。“ZigBee路由”的功能通常和“ZigBee协调器”相同,只是“ZigBee路由器”是从硬件角度上来看的;而“ZigBee协调器”则是通过软件角度来看的。在软件更改时会将网络管理任务交给“ZigBee协调器”来处理。“ZigBee路由器”允许其他ZigBee设备加入到“ZigBee路由器”的队伍中参与协调,或加入到ZigBee网络中参与其他各项活动。


ZigBee终端设备(ZigBee End Device,ZED)这是一个“半功能ZigBee设备”(Reduced-Functionality ZigBee Device,RFD),该设备可以加入ZigBee网络中,但不能为其他设备转发帧。没有设备可以连接到“ZigBee终端设备”上,不过“ZigBee终端设备”可以连接其他特定的设备,这些设备就是“ZigBee路由器”和“ZigBee协调器”。


每个ZigBee网络都有一个协调器设备,网络的结构会决定是否需要额外的ZigBee路由设备。ZigBee网络可以被部署成星形或者网状拓扑结构,如下所示。“ZigBee路由器”为下游节点建立“通信数据包桥接”连接,比如“ZigBee路由器”在接到一个数据包后,发现这个数据包是发向某ZigBee设备或者其他“ZigBee路由器”的,那么这个“ZigBee路由器”就会将该数据包向这两种设备上转发该数据包,或者接收到这两种设备发出的数据包经由自己的路由规则转发出去,这个“ZigBee路由器”也会根据该数据包所要发送的目录节点,对该数据包进行转发,“ZigBee协调器”负责管理整个网络运行。

星形拓扑网络

Mesh网格网络

ZigBee设备能维持如此长的“电池待机时间”得益于它所采用的一种机制,那就是ZigBee设备具有一种进入持续的静止状态的能力,这种状态称为“睡眠模式”(sleep mode)。当一个ZigBee设备进入到“睡眠模式”,它会将所有的传输功能关闭一段时间,这个时间可以是数微秒到数小时不等。同时,在任何时候,ZigBee设备都能从“睡眠模式”中唤醒回来,开始同网络中的“ZigBee协调器”、“ZigBee路由器”或者是网络上的路由节点进行通信,一旦数据交换完毕则再次进入“睡眠模式”。由于随时要准备从ZigBee设备接收数据,所以“ZigBee协调器”和“ZigBee路由器”都不会进入“待机模式”,因此它们通常都会部署稳定持久的电源。


同Wi-Fi和蓝牙无线网络不同的地方是,ZigBee无线网络中,在“ZigBee介质访问控制层”上,有一些帧的类型是用于装载ZigBee的通信数据的。


信标帧(Beacon frame)“信标”的作用是扫描网络,寻找可能存在的“ZigBee路由器”或“ZigBee协调器”。


数据帧(Data frame)“数据帧”的作用是用来在设备之间交换任意数据,所交换数据包的大小是一个变化量,最高可以达到114字节。具体使用多少,要看“ZigBee介质访问控制层”头部的选项。


确认帧(Acknowledgement frame)如果需要的话,发送方的ZigBee设备可以主动要求接收方ZigBee设备发送一个“确认帧”来进行回应。“确认帧”的作用就是用来表示接收方已经成功地接收到发送方所发送的请求。


命令帧(Command frame)ZigBee协议中的“命令帧”同802.11的“管理帧”(management frame)十分类似,负责控制网络运作,比如“建立关联”(association)、“解除关联”(disassociation)、“个人局域网ID冲突解决方案”(PAN ID conflict resolution),以及“等待处理的数据发送请求”(pending data delivery request)。


ZigBee协议使用的IEEE 802.15.4“介质访问控制层”数据帧的格式如图3所示。“介质访问控制层”数据帧头部的格式是可变的,这取决于其中“帧控制”字段的设置,“介质访问控制层”数据帧头部包括的字段共有“源地址”(source address)、“目标地址”(destination address)、“源个人局域网ID”(source PAN ID)、“目标个人局域网ID”(destination PAN ID),还有代表安全属性字段,这些都在“辅助安全标头”(auxiliary security header)的字段。

图3  IEEE 802.15.4“介质访问控制层”的帧格式

(3)ZigBee的网络层


ZigBee协议的网络层被单独定义在ZigBee规范中,它负责实现高层的功能,比如“网络成形”(network formation)、“设备发现”(device discovery)、“地址分配”(address allocation)和“数据路由”(routing)。


“网络成形”是指一个处理过程,在该过程中,一个“全功能的ZigBee设备”会首先将自身转变为一个当前网络的“ZigBee协调器”。然后通过“设备发现”,这个“ZigBee协调器”必须选择一个合适的信道(通常情况下,设备会选择当前可用的ZigBee网络信道中编号最小的那个),然后通过随机数产生一个“个人局域网”上的ID值。该值不能与现有正在使用的,其他“个人局域网”上的ID值冲突。“ZigBee协调器”建立完毕以后,周边的其他ZigBee设备和路由器若想加入到这个ZigBee网络的设备,就可以向该网络中的“ZigBee协调器”发送“关联请求”(association request),而此时的这个“ZigBee协调器”就可以对该请求进行响应。一旦某个ZigBee设备加入到这个ZigBee网络以后,该“ZigBee协调器”就会为这个设备节点分配一个16位的网络层地址。


(4)ZigBee的应用层


ZigBee的应用层是ZigBee规范中定义的最高层,规定了“应用对象”(application object)的操作和接口,而这里的“应用对象”定义了一个ZigBee设备的功能。“应用对象”是由“ZigBee联盟”参照标准功能规范开发的。还有一种可能,就是制造商为了专有的功能,也会在“应用层”开发一些“应用对象”,其目的是作为一种与ZigBee协议栈的下一层进行数据通信时所用的机制。一个简单的ZigBee设备可以支持的“应用对象”上限可以达到240个。


“ZigBee设备对象”(ZigBee Device Object,ZDO)层存在于所有的ZigBee设备中,负责提供所有ZigBee设备所需的功能接口,包括设置ZigBee“设备角色”,如前所述的“ZigBee协调器”、“ZigBee路由器”、“ZigBee终端设备”等角色;设置“安全服务”,比如设置和删除加密密钥;还有就是设置“网络管理服务”、“建立关联”和“解除关联”。总的来说,“ZigBee设备对象”层定义了一些特定的规范,一般可以称为“ZigBee设备规范”(ZigBee Device Profile,ZDP),这个规范使用保留的ZigBee应用“端点”(endpoint)0。


“应用支撑子层”(Application Support Sublayer,APS)为ZigBee上的应用规范提供最基本的功能。通过“应用支撑子层”,ZigBee应用规范可以请求发送和接收无线传输系统上的数据,包括指定可选的“可靠数据传输”(reliable data delivery)方式。从“应用支撑子层”的角度来说,“可靠数据传输”不仅要求发送方在发送一个数据包后,需要接收到针对这个数据包的响应数据包,并且从该数据包中看到有“确认”(acknowledgment)的字段信息,而且还包括了在源设备和目标设备之间存在一个路由,以及包括低层ZigBee的功能可以成功地处理和传送这些帧。


4、ZigBee规范


除了“ZigBee规范”本身,“ZigBee联盟”同样联合了其他工作组作为“ZigBee联盟”的成员来共同开发“ZigBee规范”。“ZigBee规范”定义了ZigBee设备的实际功能,包括“互通性(interoperability)测试计划”,这一功能可以用于验证设备对一个特定的“ZigBee规范”的吻合度。


完整的或者正在研发中的“ZigBee规范”示例包括下面这些:


ZigBee网络的建筑自动化(ZigBee Building Automation,ZBA)它提供以下功能:测量和管理照明镇流器、照明管理系统、传感器占用情况,以及其他商业建筑中常见的设备。


ZigBee家居自动化(ZigBee Home Automation,AHA)实现家居的自动管理,包括照明自动控制、暖通空调控制、遮阳防晒和家庭安全报警系统。


健康护理规范(Health Care Profile,HCP)支持非侵入性医疗操作,包括血压计、脉搏监视器,以及心电图。规范所关注的是连接这些设备、数据上传、远程监控等传统的网络接口。


ZigBee光连接(ZigBee Light Link,ZLL)实现了一个简单的LED灯具控制的规范。通过该规范可以控制灯泡、定时器、遥控器,并在“部署形式工厂”中进行远程切换。这里的部署形式工厂是作为“易于使用的是一种常见的调光开关”。


ZigBee互联网协议(ZigBee Internet Protocol,ZIP)该协议基于ZigBee网络实现了IPv6的附加功能。其方式是增加基于“安全传输层协议”(Transport Layer Security,TLS)1.2的网络安全,将通信数据压缩,提供“自愈网mesh网络的支持“(self-healing mesh network),并与全球IPv6网络标准提供互连互通。


智能能源规范(Smart Energy Profile,SEP)实现“家域网”(Home Area Networking,HAN),使其能通过接口提供一个“智能温控计”和“智能家电组合”,从而实现实时电费查询,以及远端设备管理和关闭功能(又称“负载控制”)。


随着越来越多的公共“ZigBee规范”推出,以及大量为满足专有技术而开发的私有规范的不断出现,使得ZigBee技术在功能和应用范围上变得日益成熟。纵观ZigBee的功能和使用目的,很显然伴随所提供的功能以外,它还需要一个安全的协议堆栈。


二、ZigBee安全


“ZigBee规范”包含了很多新设计,使用“高级加密标准”加密算法来加密保护无线通信的机密性和完整性,通过使用一个网络密钥进行设备和数据的认证。为了满足ZigBee设备不同的安全需求,“ZigBee规范”定义了两种安全模式:


“标准安全”模式(standard security mode)“标准安全”模式之前的名称是“住宅安全”模式(residential security mode)。“标准安全”模式使用单个共享密钥向ZigBee节点提供认证,“ZigBee信任中心”使用“访问控制列表”(Access Control List,ACL)对设备进行认证。这个模式对于设备来说并不占用太多的资源,因为网络中的每个设备都不需要维护一份设备认证证书列表。


“高安全”模式(high security mode)“高安全”模式之前的名称是“商业安全”模式(commercial security mode)。“高安全”模式要求ZigBee网络中的一个设备作为“ZigBee信任中心”,来跟踪网络中使用的所有加密算法和认证密钥,并且强制执行网络认证和密钥升级策略。“ZigBee信任中心”设备需要有足够的资源来保持跟踪网络中使用的认证证书,表示该设备也代表了整个ZigBee网络的一个“失败入口点”(point of failure),言下之意,就是如果这个“ZigBee信任中心”出现问题,导致功能失败,那么当前ZigBee仍然有效,但是不允许任何新设备加入到该ZigBee网络中,直到该点恢复正常工作。


1、ZigBee的安全设计规则


“ZigBee规范”定义了多条会影响ZigBee通信安全的原则:


每个负责发送帧的层都要负责保护它。如果“应用层”要求数据必须是安全的,那么“应用层”就会对数据进行保护。“应用层”和“网络层”可以分别独立地使用加密和认证校验对每一个数据进行保护。


如果要求非认证访问的保护,那么在关联和密钥派生后,“网络层”的安全机制会使用在所有的帧上。“网络层”的安全对它的上层紧挨着它的应用层协议,提供了机密性和完整性控制。


在单个设备上使用开放信任模型,这就表示允许在各层之间重用密钥,比如“网络层”和“应用层”之间可以使用同一个“高级加密标准”密钥。


使用“端到端”(end-to-end)的安全机制,这样只有通信双方的源和目标设备能够对对方的信息进行解密。


为了保持规范的简洁性,网络中所有的设备以及每个设备的所有层都必须采用同一种安全等级。


在知道了上述这些设计理念后,我们就可以开始检验ZigBee设备中所用的加密算法和认证机制了。


2、ZigBee的加密


ZigBee使用128位“高级加密标准”加密算法来保护数据的机密性和完整性。许多公开发表的出版材料中都声称ZigBee使用了“高级加密标准”作为系统中统一使用的加密算法,因为ZigBee在安全评价上,获得到安全评级都是“高安全”的评价,但是围绕着ZigBee是怎么使用“高级加密标准”加密算法的细节几乎都缄口不言或寥寥的三言两语带过。就ZigBee本身而言,简单地使用“高级加密标准”加密算法,尽管可以算是一个良好的开始,但还远远不能够称为“高安全”,因为在很多情况下,还是有大量的机会以一种不安全的方式使用“高级加密标准”加密算法的。鉴于此,我们会在下面的内容中探索这些话题,主要围绕“高级加密标准”加密算法的使用方法,讨论“ZigBee联盟”在实现这一算法时,所采用的技术是怎么样的。


(1)ZigBee的密钥类型


“ZigBee规范”提供了3种类型的密钥来管理ZigBee网络安全


主密钥(Master key)“主密钥”除了在“ZigBee Pro”这一最新版的规范中的协议栈中是必选的之外,在其他各版本规范中都是可选项,“主密钥”的主要作用是联合ZigBee“对称密钥的密钥建立”(Symmetric-Key Key Establishment,SKKE)进程一起来派生其他的密钥。


网络密钥(Network key)“网络密钥”的作用是保护“广播”和“组播”(broadcast and group)通信数据包的机密性和完整性,同时也为网络的认证提供保护。“网络密钥”通常保存在网络上的所有节点中。当一个新的ZigBee设备加入该网络的时候,或者当密钥在标准安全环境下在各个ZigBee设备之间进行更新的时候,“网络密钥”都会以明文的形式分配给这个新加入的ZigBee设备,或新更新的ZigBee设备上。这本身就与“高安全”模式是背道而驰的,因为“高安全”模式下,跨越空气这种传输介质,通过无线传输明文的密钥素材很显然是禁止的。


链路密钥(Link key)“链路密钥”用来保护两个设备之间“单播”(unicast)通信数据包的机密性和完整性。同“网络密钥”类似,在“标准安全”模式下链路密钥是以明文形式分配的。


为了进行加密以及保护ZigBee帧的完整性,所有的节点都需要“网络密钥”,而“链路密钥”只是两个通信设备之间用来保护这两个通信设备“端到端”的会话。对于某一个具体的设备来说,它的每一个会话都需要有一个“链路密钥”,所以它需要多个“链路密钥”来保护每个“端到端”会话。


(2)ZigBee密钥的提供方式


在ZigBee网络的安全部署中,一个意义重大的挑战,就是设备上密钥的提供(provisioning)、更新(rotating)和撤销(revoking)过程,在“ZigBee Pro”中,一个管理员可以使用ZigBee“对称密钥的密钥建立”算法去派生“网络密钥”和“链路密钥”,但是这要求设备已经拥有了一个从“ZigBee信任中心”生成的“主密钥”,同时要求设备已经加入到了该网络中。有两种密钥生成方法可供选择:


密钥传输(key transport)在这种生成方法中,“网络密钥”和“链路密钥”通过无线网络以明文形式发送到加入网络的设备中。因为密钥是以明文显示的,所以攻击者能够对网络进行侦听,从而直接捕获到“链路密钥”,进而使用“链路密钥”来解密被侦听设备之后所有的通信数据,或者冒充一个合法ZigBee设备去做其他的事情。


预安装(pre-installation)管理员提前在所有的设备上预配好所需的加密密钥,就像工厂内产品出厂前的“出厂默认参数”那样。这个过程非常具有挑战性,因为要协调密钥撤销和更新的方法颇有难度,并且当网络或者链路密钥更改时,需要对每个ZigBee设备进行手动更新。


3、ZigBee的可靠性


在采用修订版本的“高级加密标准-计数模式和密码块链消息认证码”(Counter Mode with Cipher Block Chaining Message Authentication Code,AES-CCM)协议进行认证以后,ZigBee能够对每个帧进行可靠性控制。“高级加密标准-计数模式和密码块链消息认证码”协议,又可以简称为“CCM*”协议。作为修订版的CCM协议,CCM*和传统的AES-CCM协议相比,CCM*协议只用于提供“只加密”控制、“只完整性”控制,或者既提供加密,也提供完整性控制。


完整性控制能够在接收方认证帧的内容是否完整,它被称为“信息完整性检查码”(Message Integrity Check,MIC)。根据网络的安全性要求,较长的“信息完整检查码”可用于防范暴力攻击。其原因不难理解,在这种攻击中,攻击者以帧的长度和CPU周期为代价,不断地修改一个帧的内容,然后不停地重新发送这个数据帧,直到找到一个合法的“信息完整性检查码”。对于短的“信息完整检查码”,就意味着总的尝试次数,同时也是尝试时间很短;而长的“信息完整检查码”则需要总的破解次数和破解时间都很长。值得一提的是:完整性保护是ZigBee网络中的一个可选项目,这是因为在一些情况下,根本就不需要采用“信息完整检查码”进行完整性的检测。


4、ZigBee的认证


有三种方法可以对刚加入ZigBee网络的设备进行身份认证:一种是通过“访问控制列表”(Access Control List,ACL)模式进行“介质访问控制层”地址有效性的验证,这种方式又称“ACL模式”,还有两种“信任中心”(Trust Center)认证,主要用于“标准安全模式”和“高安全模式”。


在ACL模式下,一个节点想要识别某个他想进行通信的其他某个设备,这个节点就会根据那个设备的“介质访问控制层”地址进行区分。但这也意味着每个节点都要维护一份授权设备列表来实现这种安全模型。因为攻击者需要知道“网络密钥”或者“链路密钥”才能够冒充一个ZigBee设备,所以如果我们将这个列表的安全性与“CCM*”协议本身特有的完整性保护机制配合使用时,ACL模式就能够提供相当可靠的设备身份认证等级了。尽管ACL模式有时并不需要使用CCM*完整性进行保护,但上面的说法仍然不失为一种好办法,因为ACL模式的重点在于需要在每个设备上维护一份“介质访问控制层”地址列表,这对网络运行带来了一定的难度。比如当有一个新的设备加入网络时,每次都需要所有的设备更新自己的设备列表,同时也需要额外的“非易失性随机访问存储器”内存和常规内存RAM来保存和处理这个列表。


在“标准安全模式”下的网络中,当一个节点被允许加入到一个网络之前,“信任中心”必须明确地授权一个节点具有访问权限,授权方式就是给这个节点指定一个密钥。当一个“ZigBee路由器”节点和一个“ZigBee终端设备”节点开始网络加入的过程时,这个ZigBee设备在与其他ZigBee设备通信之前,将会等待接收来自于“信息中心”发过来的一个密钥确认信息。如果在这个ZigBee设备上已经生成了一个“网络密钥”,比如这个网络采用的是密钥“预安装”机制,那么“信任中心”会向节点发送一个全0的“网络密钥”。这个全0的密钥类似于摆设,是个临时性的密钥,但至少表示这个ZigBee设备可以在网络中与其他设备进行通信了。如果节点没有创建“网络密钥”,“信任中心”会采用密钥“传输机制”模式,以明文形式为它分配一个密钥。在接收到密钥后,这个新加入的ZigBee设备节点就能够自由地同网络中的其他ZigBee设备进行通信了。如果节点没有通过“信任中心”的认证,比如它的“介质访问控制层”地址不满足“信任中心”的“访问控制列表”中对“介质访问控制层”地址的要求,那么“信任中心”就会向这个ZigBee设备节点发送一条断开信息。


在“标准安全模式”下,ZigBee设备是不会相互进行身份认证。需要认证的ZigBee设备节点只会接受“信任中心”的身份认证,认证的方式就是“信息中心”向它发送“网络密钥”,而这个ZigBee设备则不会通过针对网络的身份进行任何合法性检查。所以,如果一个ZigBee设备,只要使用相同的“个人局域网”的ID来冒充一个合法的网络,那么就很容易吸引其他被攻击的ZigBee设备加入到这个网络中。


在“高安全模式”下的ZigBee网络中,“网络密钥”不能够以明文方式发送。当一个ZigBee设备节点要进行认证时,“信任中心”和这个ZigBee设备节点会使用“主密钥”,然后通过“对称密钥的密钥建立”算法来派生“网络密钥”。如果这个ZigBee设备节点不知道“主密钥”的话,“信任中心”会通过明文方式给这个ZigBee设备节点发送“主密钥”,这就在ZigBee网络中为黑客创造了一个可以侦听的漏洞


“对称密钥的密钥建立”算法的建立过程共需要四个步骤,其主要目的就是要在发起方(initiator)和回应方(responder)之间使用一种标准的“质疑-响应”机制,然后在两个设备上相互验证“主密钥”的知识是否正确,而不会泄露“主密钥”本身。在“对称密钥的密钥建立”算法的“四次握手”的操作完成之后,节点和“信任中心”就能够派生出“链路密钥”,通过“链路密钥”可以用来保护之后由“信息中心”向这个节点传送“网络密钥”时,二者之间的通信安全了。


至此,我们检验了ZigBee的运作方式和功能,并且详细地围绕协议的操作,介绍了一些使用的安全和识别细节。下面我们来看一些有用的网络工具,这些工具基本上都是专为攻击ZigBee网络而设计的。


三、ZigBee攻击


我们将从功能的角度来看看KillerBee框架,然后分别介绍几个可用的黑客工具。


1、KillerBee的介绍


KillerBee是一个基于Python语言编写的应用程序框架,可以用来操作和攻击ZigBee网络和基于IEEE 802.15.4协议的网络。整个项目是免费并且开源的,程序的编写和测试都需要在Linux操作系统上完成。项目的目的不是要亲自完成某一个具体的攻击,而是提供一个程序的框架,通过这个程序可以简化常见的攻击过程。具体地说,就是在这个框架中可以加载和授权其他的Python工具,使其可以针对某一ZigBee安全漏洞完成具体的攻击操作。作为框架中的具体攻击工具,KillerBee包括一系列以这个框架为基础编写的,具有特定目的的攻击工具,通过以组合方式使用这些工具,我们既可以实施实际的攻击任务,也可以演示一个KillerBee框架的使用方法。


(1)创建一个KillerBee工具包


KillerBee在设计上,就将目标定位为可以操作使用各种支持的硬件设备。不幸的是,攻击ZigBee和IEEE 802.15.4协议上的网络,还真不是三拳两脚就能完成的事,这往往需要很多复杂的交换操作,所以也没有哪一个简单的硬件可供选择。我们只能一步一步地通过配置一个USB接口的,基于IEEE 802.15.4无线接口的设备用于配合最新版的KillerBee软件实施攻击任务。


要想使用KillerBee工具包的全部功能,有一些组件,需要被通过编译连接,创建到工具包中,其中主要包括下面的硬件和软件:


Atmel公司的RZ Raven USB接口的记忆棒,简称“RZUSBstick记忆棒”(硬件)。

Atmel公司的AVR Dragon片上编程器(硬件)。

Atmel公司100毫米到50毫米“联合测试行动小组”(JTAG)支撑架适配器(硬件)。

50毫米“公头对公头”的连接头(male-to-male header)(硬件)。

10针2排5列(2×5)排列100毫米“母头对母头”(female-to-female)带状连接线(ribbon cable),或者采用10针跳线(硬件)。

免费的AVRDUDE工具(软件)。

“RZUSBstick记忆棒”的免费的KillerBee固件(软件)。

一个WindowsLinux主机,用于运行连接和将程序写入到“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记忆棒”,该产品的实物图如图4所示。这个采用USB 2.0接口的设备能够在2.4GHz频率下支持IEEE 802.15.4协议,同时它拥有一个“板上AVR微处理器”(onboard AVR microprocessor)。Atmel同时开发了设备固件的源代码,只要该程序在RZ Raven硬件上使用,那么如果要修改和重新发布这些代码,需要获得Atmel公司的授权,这样以来,开发者能够可以很轻松地修改“RZUSBstick记忆棒”固件,以便固件中能容纳新的功能。“RZUSBstick记忆棒”硬件可以从大部分电子产品经销商那里购买得到,比如Digi-Key公司和Mouser电子器件公司,二者的产品中,使用“AVR微处理器”的,产品编号为ATAVRRZUSBSTICK的产品,售价大概是43美元。

图4  RZUSBstick记忆棒

我们建议至少使用两个“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“片上编程器”实物图如图5所示。

图5  AVR Dragon片上编程器

“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,该实物图如图6所示。

图6  ATAVR-SOAKIT适配器

4)50毫米“公头对公头”的连接头


“AVR Dragon”板上的“联合测试行动小组”连接器是一个50毫米的母头插座,而“RZUSBstick记忆棒”上的“联合测试行动小组”插槽也是一个50毫米的母头插座,要在二者之间进行转换,就需要用于50毫米“公头对公头”的连接头。这个50毫米“公头对公头”的连接头的用法,就是将其插入到一个“联合测试行动小组”的母头插座上,将其转换成公头插头,然后才能插入到“RZUSBstick记忆棒”上的“联合测试行动小组”插槽中。这个小部件通常可以从多个电子网站上买到,包括Digi-Key公司的网站,产品编号是S9015E-05,零售价为1美元,如图7所示。

图7  50毫米“公头对公头”的连接头

5)10针2排5列(2×5)排列100毫米“母头对母头”带状连接线


从“AVR Dragon”出来,需要连接一个带状连接线,一头套在“联合测试行动小组”接口的引脚上,带状连接线需要10针,头端需要呈2排5列,即“2×5”的连接布局。这种通用部件通常可以从多个电子网站上买到,包括Digi-Key公司的网站,产品编号是H3AAH-1018G-ND,售价为1.5美元一根。


作为替代品,可以简单地只用一根10针的“母头对母头”的成型跳线,手工将各自十个引脚一一连接起来即可。要确保所连接的所有连线都要匹配“AVR Dragon”的引脚和“联合测试行动小组”适配器引脚,并且二者在物理特性上“一一对应”。这种成型的母头跳线,一组40根,其产品编号为266,必须成组购买,一组售价7美元,其实物图如图8所示。

图8  成型的母头跳线

在紧要关头,一个老式的IDE硬盘驱动器电缆的工作也可以拿来使用,使用美工刀将连接器的头端切下来,然后将多余的部分切掉,最后只剩下10针,并且呈2×5排列的头部形状即可。


6)免费的AVRDUDE工具


AVRDUDE是一个开源的命令行程序,可以运行在Windows操作系统上,也可以运行在Linux操作系统上。该工具可以支持许多不同的“AVR编程器”。Windows用户可以下载一个编译版的AVRDUDE程序,该程序是作为WinAVR软件包中的一个工具存在的,所以可以通过下载整个WinAVR软件包获得,下载后解压文件WinAVR软件包,并复制avrdude.exe和avrdude.conf文件到系统中,在系统变量PATH可以找到的位置上,以便在任何目录上通过命令行运行该程序。


Linux用户可以在下载程序包以后安装AVRDUDE程序,或者也可以从Linux发行版提供的软件包中直接安装使用。比如Ubuntu操作系统中就直接包含了AVRDUDE程序,这时,用户只要运行“sudo apt-get install avddude”命令就可以安装avrdude程序了。


7)“RZUSBstick记忆棒”的免费的KillerBee固件


KillerBee项目包含了针对“RZUSBstick记忆棒”的定制固件。该固件在维持其他功能的同时,允许硬件完成任意数据包的注入操作。这里的“其他功能”可以是数据包的嗅探,也可以是ZigBee设备作为一个“个人局域网”协调器时,对ZigBee网络的创建动作。


(2)安装AVR Dragon设备


要在Windows操作系统中使用“AVR Dragon”设备,需要首先下载一个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”)值等值,如图9所示。

图9  检测到AVR Dragon设备

在列表中,选择AVRDRAGON这一项,然后单击“下一步”(Next)。这时Inf-Wizard工具的安装向导提供一个设备配置窗口,如图10所示。单击“下一步”(Next)接受系统默认的十六进制“供应商VID”(即界面中的“Vendor ID(hex format)”)、十六进制“产品PID”(即界面中的“Product ID(hex format)”)和本产品“制造商名称”(即界面中的“Manufacturer Name”)和“设备名称”(即界面中的“Devie Name”)等描述性的值。

图10  设备配置窗口

在Inf-Wizard工具的安装向导的最后一步,单击“马上安装”(Install Now)按钮,如图11所示,向导就会将“AVR Dragon”设备的libusb-win32驱动程序安装好,如果安装途中出现一些提示,就选择“按默认配置强制安装这个驱动程序”(Install This Driver Software Anyway)按钮,直到安装成功。

图11  安装驱动程序

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/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插座接触,如图12所示。在“AVR Dragon”设备接口上,“引脚1”(Pin 1)的位置是“RZUSBstick记忆棒”上距离USB接口最远的那个位置。

图12  将“联合测试行动小组”编程器插入到“RZUSBstick记忆棒”上

5)最后一步,就是对“RZUSBstick记忆棒”进行编程。连接“AVR Dragon”设备和“RZUSBstick记忆棒”上的“联合测试行动小组”插座,按回车键以便开始运行AVRDUDE编程器。在“RZUSBstick记忆棒”显示的编写器提示的状态信息是“编程完成”时,固件的刷新完成。在Windows操作系统,该程序的显示效果和下面的结果类似。如果换成Linux操作系统,AVRDUDE程序也会产生相同的输出。

随着编程过程的进行,“RZUSBstick记忆棒”上亮的将不再是蓝色的LED指示灯,取而代之的是琥珀色的LED指示灯,这预示着这个硬件准备作为一个KillerBee设备。


KillerBee硬件的替代品


“RZUSBstick记忆棒”硬件用于KillerBee平台上有几个比较麻烦的问题的,比如缺乏一个标准的可复用并行数据包的接收和发送功能的Linux驱动程序。


TelosB Mote记忆棒“TelosB Mote记忆棒”硬件(见图13)以前被“弩系统”(Crossbow System)销售的时候,是作为一个研究和开发IEEE 802.15.4网络的平台。虽然现在它已不再是可供销售的商品,但该硬件在研究性的高校里却非常流行。这款产品也可以应用于KillerBee,要想使其支持KillerBee作为数据源,只需要使用其替代固件就可以了,替代的方式是运行该系统提供的flash_telosb.sh脚本。

图13  TelosB Mote记忆棒

Api-Mote记忆棒“Api-Mote记忆棒”硬件(见图14)是一个持续开发的项目,项目的名称是“河水循环的安全系统”(River Loop Security),项目是由Ryan Speers和Ricky Melgares领导的。“Api-Mote记忆棒”硬件集成到KillerBee系统以后,就可以使KillerBee系统使用“Api-Mote记忆棒”发起所有可访问到的进攻方式。控制这个硬件是通过一系列通过USB的接口实现的,这使得该系统从开发的角度来看,系统的可靠性非常强。

图14  Api-Mote记忆棒

2、网络发现


在ZigBee网络的评估中,首要任务是要在自己的功率覆盖范围内先“发现”(discovery)有网络的存在,然后枚举出网络中各设备上采用的配置。收集这些信息的一个简单方法是使用KillerBee模仿ZigBee网络的发现过程。


作为“网络发现”(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网络发现。因此,最佳的防御措施就是了解攻击可能会造成的影响,评估攻击者通过这种攻击,能够拿到网络中的何种信息。


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硬件如图15所示,既可以从Microchip技术公司,也可以从大部分电子经销商那里购买到,它的售价是130美元。ZENA设备不需要安装特定的驱动程序,使用USB接线直接将设备插在可用的USB端口上,然后使用配套的CD光盘安装ZENA数据包侦听软件即可。

图15  ZENA硬件

“ZENA数据包嗅探器”(ZENA Packet Sniffer)软件的功能比较有限。它只能够对无线活动数据进行简略的解码,而不是详细的十六进制数据转储(dump)形式。用户可以选择要进行捕获的信道编号,该值一般是信道11~26,同时选择忽略或者分析“帧校验序列”(Frame Check Sequence,FCS)不正确的帧。它可以对“介质访问控制层”、“网络层”和“应用支撑子层”施加控制,同时以“数字”(numeric)、“摘要”(condensed)、“冗余视图”(verbose views)等多项进行显示。单击“视图(View)|网络信息(Network Messages)”菜单可以显示捕获的数据帧包含的内容,如图16所示。

图16  捕获的数据帧包含的内容

“ZENA网络分析器”软件是一款在Windows操作系统上的运行的软件,作为该软件及运行环境的一个替代品,软件开发人员Emeric Verschuur推出了一个ZenaNG工具来支持Linux操作系统的用户。ZenaNG软件的作用就是在特定信道中捕获ZigBee设备和IEEE 802.15.4协议下的活动,然后以十六进制格式显示出所捕获数据包的内容,并将所捕获到的数据包都写入到一个libpcap格式的库文件。要下载并编译连接创建ZenaNG软件,其操作步骤如下所示:

在编译连接创建ZenaNG程序以后,就可以通过“-h”参数在命令行中检验该程序的运行效果了。例如,运行ZenaNG程序,对信道15进行数据包嗅探(使用“-c”参数),并且以十六进制的输出格式将所接收到的数据包显示出来(使用“-f”参数),其命令格式及运行效果如下所示:

在没有指定捕获数据包的文件保存类型时,ZenaNG程序会将接收并捕获到的数据包以libpcap的格式进行保存,如果用户想将该程序在命令行上的输出保存到一个文件中,那么可以使用“重定向”(redirect)命令进行转换,其命令格式及显示效果如下所示:

ZenaNG软件也可以捕获通信数据包,将这些数据包“重定向”后直接转向Wireshark程序,并作为Wireshark程序的输入源,此时数据数据命令格式如下所示。作为数据包捕获行业的专业软件,这时的Wireshark程序将启动一个数据包的捕获线程,并且马上立竿见影,程序立即开始捕获和显示所接收到的数据包,Wireshark程序软件的捕获界面如图17所示。

图17  Wireshark捕获由ZenaNG软件重定向过来的数据包

破解Microchip公司的ZENA网络分析器


有时Microchip公司的“ZENA网络分析器”设备并不总能让我们满意,所以需要对该设备进行一些改装,这就涉及对该黑客工具进行破解的问题。尽管缺少“ZENA网络分析器”设备的固件、设备电路原理图和必要的技术文档资料,但从硬件和软件角度来看,Microchip公司的“ZENA网络分析器”设备还是一个很明显能够被破解的设备。


在“ZENA网络分析器”设备的原本设计中,在电路板板载天线(circuit-board antenna)的附近还有一个能够安装一个外部天线连接器的接口。利用“印制电路板”(Printed Circuit Board,PCB)上的这个插座接口,可以使用表面贴装(surface-mount)技术焊接一个的“RP-SMA RF”连接器。有了这个连接器,就可以通过它选择使用外部天线或者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的源程序。从这里可以下载KillerBee的最新版,或者拿到最新版源代码,其操作步骤如下所示。

一旦安装完毕以后,就可以使用zbdump工具进行数据包的捕获,并将捕获到的通信数据包保存到文件中。使用“-f”参数可以设置“RZUSBstick记忆棒”,以便捕获指定信道的数据包。使用“-w”参数则表示输出文件是libpcap格式。通过Ctrl+C组合键可以中止当前的数据包捕获流程,回到提示符状态。

如果想进行进一步分析libpcap格式的savefile.dump文件,可以使用Wireshark软件打开,这时的程序分析效果如图18所示。该格式的保存文件,还可以被KillerBee工具包中和zbdump工具一起的其他几个工具程序所使用。

图18  savefile.dump文件分析效果

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”,如图19所示。“Open Sniffer”设备是一个“已自足的”(self-contained)的网络节点设备,提供对以太网的支持。该设备不像前面那些设备一样需要将捕获设备与目标的系统通过USB线相连,以至于攻击设备和捕获设备之间的距离因为USB延长线的距离而变的有限,而在“Open Sniffer”中,设备可以部署到一个很远的地方(只要能够通过网络访问到),这样极利于捕获设备捕获对方网络的通信数据包。

图19  Sewio公司的“Open Sniffer”产品

“Open Sniffer”设备使用一个默认的IP地址10.10.10.2,所以要连接该设备,需要先配置您的系统,将IP地址设置为10.10.10.1,然后就可以连接到“Open Sniffer”设备上进行配置了。如果在浏览器里输入这个“Open Sniffer”的IP地址,那么很快就会出现这个设备的配置选项,在“设置”(Settings)页面上包括有IP地址信息,如图20所示。将“Open Sniffer”设备默认的IP地址更改成想用的IP地址,然后放置到想要进行侦听的网络区域范围内,在下面的配置示例中,我们使用“Open Sniffer”设备默认的IP地址与该设备进行交换操作,直接将设备连接到我们的Linux主机系统上。

图20  Sewio公司“Open Sniffer”设备IP地址的配置页面

默认情况下,该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)的频谱。表1中列出这些频率的“信道数”、匹配的频率和国际上使用这一频率的地域范围。

表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*(即“高级加密标准-计数模式和密码块链消息认证码”协议的修订版)密码套件中可用的加密机制。并且,要确保选择了高强度的密钥,尽最大的可能保证这些密钥的机密性。


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)单选项,这时的界面截图如图21所示。

图21  标记数据包

一个“重播攻击”的有效性,在很大程度上取决于作为目标的那个ZigBee设备在软硬件设计时采用的实现方式,也就是说,只能具体问题具体分析,必须是在具体必须在逐项(case-by-case)分析的基础,再进行总的评价。通常情况下,“重播攻击”所针对的是未加密的网络,或者是那些我们已经知道“加密密钥”(encryption key)的网络。幸运的是,对于一个攻击者来说,如果遇到一个加密的ZigBee网络,攻击者仍然也还是有专门针对加密网络的攻击选项。


 防御重播攻击 


要弱化“重播攻击”,ZigBee协议堆栈中应该在接收数据包中配置一个“序列码”(sequence number),以便验证数据的有效性。在每次新的数据包中,这个“序列码”都至少比上一次成功地接收到的数据包中的“序列码”大1。不过,不幸的是,“ZigBee规范”并不要求这点,并且虽然ZigBee“网络层”中也有一个“序列号”的字段是可以用来当此用途的,但是这里的“序列号”字段,它的“熵”(entropy)也只有8位,也就是说它总共可以表示的有效数据量只有28=256种可能,明显偏少。举例来说,假设ZigBee的“网络层”采用了这一机制,一个攻击者可以捕获到一个数据包,如果现在发送这个数据包,就会因为“序列码”不满足“大于1”的要求而失效,但这个问题不大,因为发送程序只要再等待255个帧之后,再次发送这个捕获的数据包时就能够匹配到正确的“序列号”了。


在高层应用中,一些安全防御的方法也可以作为一种额外的方法用于防御“重播攻击”,比如可以应用上面提到过的“序列号”机制,设计一套“高级序列号强化机制”(high-level sequence number enforcement mechanism)来防御“重播攻击”。就目前来说,这些机制应该从单独使用的基础上进行评估,然后根据具体的应用决定所使用的“序列号”的有效位数(也就是上面提供的“熵”)是否够用。


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网络中,也都只能依靠这一个可用的传输机制来动态分配密钥和实现密钥的更新,并将这一机制作为网络所要求的安全模型,所以这是一种无奈之举。


 KillerBee密钥侦听工具zbdsniff 


KillerBee工具集中的zbdsniff工具,在设计的时候,就考虑到用该工具可以对数据包捕获文件的内容进行处理,无论文件的格式是libpcap格式,还是“传感器网络分析器”保存的格式。所处理的数据包内容不是所有内容,而是只关注其中的“应用支撑子层”的数据帧,并且只关注其中的“传输密钥”命令,在命令行中可以同时指定多个捕获文件。每当有一个捕获文件中包含有“传输密钥”命令,同时命令中存在泄露的网络密钥,那么zbdsniff工具会显示密钥的内容、相关ZigBee设备的源地址和目标地址,其命令格式及破解示例如下所示:

一旦获取了“网络密钥”之后,就可以使用Wireshark工具解密数据包捕获文件的内容了。操作步骤是先打开Wireshark程序的“用户图形界面”,首先选择一个密钥加密方式(即图中左边列表中的“ZigBee网络层”(ZigBee NWK)),然后通过选择“编辑(Edit)|偏好(Preferences)|协议(Protocols)|ZigBee网络层(ZigBee NWK)”菜单打开“ZigBee网络层”(ZigBee Network Layer)对话框,并且在对话框指定位置输入密钥,如图22所示。同时,还必须指定“信息完整检查码”的长度(即图22中“安全级别”(Security Level)),该长度通常都是32位的密钥长度,这同时也是Wireshark软件的默认值。密钥输入完毕后,Wireshark程序就会在数据包捕获文件解密数据包中的每个帧,这样就能看到每个帧解密后的内容了。

图22  输入网络密钥

 防御密钥传输攻击 


“ZigBee规范”也支持提供加密密钥的其他机制,其中包括“预配置密钥”机制和“密钥协商”。其中的“预配置密钥”就是当设备在工厂制造阶段就预先设置好密钥;“密钥协商”就是使用“对称密钥建立”(Symmetric Key-Key Establishment,SKKE)协议,动态地交换密钥。


“预配置密钥”机制的优势在于,在工厂的生产阶段就配置好了密钥,所以就缓解了密钥在传送过程中遭受攻击的威胁,因为ZigBee网络上的设备在传输以前就已经知道网络上其他设备的密钥,所以可以直接用来保护要发送的数据。不过,“预配置密钥”机制的劣势也很明显,那就是密钥的更新(rotating)和撤销(revoking)变得非常困难,一旦遇到这两种操作,就不得不需要管理员手工依次处理ZigBee网络中的每个设备了。


“ZigBee Pro规范”支持“对称密钥建立”协议,通过该协议的派生功能可以派生出密钥,“ZigBee信任中心”可以将这个派生的密钥作为一个“群组密钥”(group key),然后在ZigBee设备进入网络要求认证的时候,使用这一“群组密钥”进行通信。然而,要想使用“对称密钥建立”协议,通信双方的设备都必须配置一个“主密钥”(master key)。“主密钥”的分配有两种方式,一种是通过空中在没有保护的无线传输,另一种是在设备上“预配置密钥”的方式。无论采用哪种方式,都存在前面作为密钥建立过程中已讨论过的风险和劣势。


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框架相似的语法。


(1)设置zbscapy程序


要想zbscapy工具正常使用,需要首先安装Scapy项目中一款名叫scapy-com软件的修改版本。scapy-com是Scapy框架的“社区版本”(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对象的初始化工作,并且手工伪造一个数据包,并将其发送出去。下面的例子演示了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形式的循环命令,周期性调用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()函数的时候,设置了一个以秒为单位的时间参数,那么当该函数运行的累计秒数达到这个时间参数时,也会主动退出来。在下面的例子中,我们也可以“重载”(override)函数中的conf.killerbee_channel参数,以便在调用kbsniff()函数的时候,设置一个可以作为变量的信道序号:

在这个例子中,函数kbsniff()在信道20上嗅探了30秒的时间,一共捕获到4个数据包。我们可以通过每一个数据包前面的索引序号,汇总显示这个数据包的详细内容,或者与例子中一样,通过调用packets.show()函数显示出一行一总结式的效果。


像Scapy框架中的sniff()函数一样,kbsniff()函数还提供了以“回调函数”(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的那些数据包。这种数据包有效性的通用检验机制被应用于许多协议中,对协议进一步的解释,详见图23。

图23  IEEE 802.15.4协议中,处理数据包的步骤

对于接收节点,另外一个要考虑的地方是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规范的预期使用情况中,设备是不可能达到这个最大的“数据帧计数器”值的。因为我们假设,某一个ZigBee设备每秒钟发送一个数据包,那么即使是用这么一个不太可能的数据包持续发送速率,一个ZigBee设备节点要想达到这个最大的“数据帧计数器”值,也需要136年之久。我们总不会希望到了下个世纪还依赖于IEEE 802.15.4规范进行ZigBee设备的安全控制吧。


在Silva和Nunes对IEEE 802.15.4规范的安全组成部分所做的分析中,他们发现了一个漏洞,那就是规范规定处理“进接口”数据包的时候,需要参考“数据帧计数器”的值。如图23中的流程图所示,当“数据帧计数器”的值为0xffffffff时,节点就停止处理该数据包。然而对于任何小于最大“数据帧计数器”值的值,接收节点会查看这个“数据帧计数器”,看值是否比最后一次记录的“数据帧计数器”至少大1。如果某个数据包通过“进接口”时,符合这个小于最大“数据帧计数器”的条件,那么这个数据包将通过检查,接收节点同时会使用接收到的这个值作为下一个“数据帧计数器”值,然后开始解密当前接收到的这个数据包。这就产生了严重的缺陷,问题就出在“当该值为0xffffffff时就停止处理”、“每接到的值必须比上一次的值大”和“每接收到一个值,就将该值作为一个用于下一次接收时判断的新的值”这三点规定之间的矛盾上。攻击者在IEEE 802.15.4网络上,通过伪造数据包冒充一个合法节点,向要攻击的节点设备上发送一个“数据帧计数器”值为0xffffffff-1的数据包。对于接收节点来说,通常情况下,这个数据包总是符合“每接到的值必须比上一次的值大”,因而是合法的,并且在接收以后会按“每接收到一个值,就将该值作为一个用于下一次接收时判断的新的值”的规定将0xffffffff-1作为新的“数据帧计数器”值。这样一来,问题就出现了,如果一个合法的设备使用小于或等于0xffffffff-1的“数据帧计数器”FC值向该被攻击的节点发送数据,那么会因所发数据不符合“每接到的值必须比上一次的值大”而被拒绝;如果所发数据的“数据帧计数器”值为0xffffffff,虽然符合了“每接到的值必须比上一次的值大”,但是也会因符合“当该值为0xffffffff时就停止处理”而被拒绝处理,甚至被直接加入到“黑名单”中。


攻击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),一起伪造一个数据包,并发送出去。


还有一个可选的步骤:周期性的跳频,以最大化地攻击分布于各个频率点的所有潜在的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的功能,您会发现这是一个物有所值的投资。


四、攻击演练


下面,介绍一种“端到端”的ZigBee攻击方法,这种攻击方法所针对的目标是某种特定自定义ZigBee设备。通过这一攻击方式所实施的渗透测试和组装测试中,我们可以将原来无法识别的网络识别出来。


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


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


1、网络发现和定位


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


 KillerBee设备位置分析工具zbfind 


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


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

图24  信号历史图

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

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


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


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


2、分析ZigBee硬件


盗取了ZigBee设备后,攻击者可以打开设备的外壳,或者是连接到实验盒中核查该设备所用的线路图外的那些外围设备接口,识别其中的ZigBee设备的无线接口和微处理器。在一些新的无线接口设计中,为了更好地节能,这些组件都会被集成到“片上系统”(System-on-Chip,SoC)中,比如像来自“德克萨斯仪器”(Texas Instrument)公司生产的“Chipcon CC2540”芯片。这个芯片集成了Intel公司的8051微处理器,它能够支持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设备,可以从一些在线零售商那里买到。一个完整的GoodFET 4.2版本的电路板实物图,如图25所示。

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

可以使用Subversion工具下载最新的源代码,然后安装Debian风格的附属插件:

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’芯片调试引脚”列表中查到,这个总结性的表格如表2所示。

表2  GoodFET工具和CC2540引脚说明

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

图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内存数据包的提取,就可以从目标设备上复制出来,生成到一个文件中,继续从设备中提取感兴趣的敏感信息了。


3、设备RAM数据分析


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


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


 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机”)就属于这种情况。由此可见,设备的实物盗取方式是完全可能的。


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

微信公众号:计算机与网络安全

ID:Computer-network

【推荐书籍】
登录查看更多
13

相关内容

电气与电子工程师协会(Institute of Electrical and Electronics Engineers),简称IEEE,总部位于美国纽约,是一个国际性的电子技术与信息科学工程师的协会,也是全球最大的非营利性专业技术学会。
FPGA加速系统开发工具设计:综述与实践
专知会员服务
62+阅读 · 2020年6月24日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
229+阅读 · 2020年5月21日
【新书】Python中的经典计算机科学问题,224页PDF
专知会员服务
51+阅读 · 2019年12月31日
智能交通大数据最新论文综述-附PDF下载
专知会员服务
103+阅读 · 2019年12月25日
专知会员服务
35+阅读 · 2019年12月13日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
83+阅读 · 2019年11月25日
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
Kali Linux 渗透测试:密码攻击
计算机与网络安全
15+阅读 · 2019年5月13日
大数据安全技术浅析
计算机与网络安全
14+阅读 · 2019年4月24日
网络舆情分析
计算机与网络安全
18+阅读 · 2018年10月18日
网络安全态势感知
计算机与网络安全
25+阅读 · 2018年10月14日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
【区块链】区块链是什么?20问:读懂区块链
产业智能官
8+阅读 · 2018年1月10日
干细胞外泌体的市场分析
外泌体之家
8+阅读 · 2017年12月19日
Arxiv
23+阅读 · 2018年10月24日
Arxiv
4+阅读 · 2018年10月5日
Relational recurrent neural networks
Arxiv
8+阅读 · 2018年6月28日
Arxiv
9+阅读 · 2018年2月4日
Arxiv
3+阅读 · 2017年12月14日
VIP会员
相关VIP内容
FPGA加速系统开发工具设计:综述与实践
专知会员服务
62+阅读 · 2020年6月24日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
229+阅读 · 2020年5月21日
【新书】Python中的经典计算机科学问题,224页PDF
专知会员服务
51+阅读 · 2019年12月31日
智能交通大数据最新论文综述-附PDF下载
专知会员服务
103+阅读 · 2019年12月25日
专知会员服务
35+阅读 · 2019年12月13日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
83+阅读 · 2019年11月25日
相关资讯
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
Kali Linux 渗透测试:密码攻击
计算机与网络安全
15+阅读 · 2019年5月13日
大数据安全技术浅析
计算机与网络安全
14+阅读 · 2019年4月24日
网络舆情分析
计算机与网络安全
18+阅读 · 2018年10月18日
网络安全态势感知
计算机与网络安全
25+阅读 · 2018年10月14日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
【区块链】区块链是什么?20问:读懂区块链
产业智能官
8+阅读 · 2018年1月10日
干细胞外泌体的市场分析
外泌体之家
8+阅读 · 2017年12月19日
相关论文
Arxiv
23+阅读 · 2018年10月24日
Arxiv
4+阅读 · 2018年10月5日
Relational recurrent neural networks
Arxiv
8+阅读 · 2018年6月28日
Arxiv
9+阅读 · 2018年2月4日
Arxiv
3+阅读 · 2017年12月14日
Top
微信扫码咨询专知VIP会员