2018-11-14 16:47:126822人阅读
ZigBee是除了wifi、蓝牙之外目前最重要的无线通信协议之一,主要应用于物联网和智能硬件等领域。首先ZigBee是IEEE802.15.4协议的代名词,根据这个协议规定的技术是一种近距离、低复杂度、低功耗、低数据速率、低成本的双向无线通信技术,主要适合于自动控制和远程控制领域,可以嵌入各种设备中,同时支持地理定位功能。目前国内包括小米在内的多家厂商已经研发出基于ZigBee的智能家居,应用前景和潜力非常远大。
本小节主要讲述利用CC2530搭建一个简单的ZigBee智能灯泡系统,并对ZigBee帧结构和组网过程进行分析。
某宝上购得CC2530两块开发板,让其分别作为协调器和终端,整体需要的硬软件如下:
2块基于CC2530的zigbee开发板;SmartRF04EB仿真器;二极管一个;
软件在Windows7 X86环境中运行,所需要准备的软件如下:
IAREmbedded Workbench;Smartrf Flash Programmer;驱动人生;Zstack-CC2530-2.3.0-1.4.0协议栈;ZigBee上位机软件
通过SmartRF04EB仿真器将开发板与电脑USB接口连接,用IAR打开SerialAPP开发代码(代码可询问开发板商家),切换到CoordinatorE8-Pro。
打开菜单栏Project-Rebuild All进行代码编译,待编译完成没有错误后,点击绿色的按钮将编译好的代码下载到开发板中,将这块开发板标记为协调器。完成后,换另一块板子,将Workspace切换到EndDeviceEB-Pro,重复上述的操作,将终端固件写入该开发板。
将协调器开发板通过连接线直连电脑USB接口,相关的驱动可以利用驱动人生安装,打开电脑的设备管理器查看串口,可以看到协调器连接在COM4。
右键管理员身份打开Zigbee上位机软件,选择串口COM4并打开。
将终端开发板连接USB通电即可,将二极管长脚插入PO4,短脚插入GND。在在PC端控制终端4(具体哪个终端跟写入终端的代码参数配置有关),即可控制二极管开关。下图左为终端,右为协调器。
具体的控制示意图如下,可以通过PC上软件控制二极管的亮或者灭:
IEEE 802.15.4/ZigBee帧结构的设计原则为在保证网络在有噪音的信道上以足够健壮性的传输的基础上将网络的复杂性降到最低。每一后继的协议层都是在其前一层添加或者剥除了帧头和帧尾而形成,IEEE 802.15.4的MAC层定义了4种基本帧结构。
信标帧:协调器用以传输信标。
数据帧:用于传输数据。
响应帧:用于子确认帧已被成功的接收
MAC命令帧:用子处理所有MAC层对等实体的控制传输。
在Mac头的帧控制信息中有3bit是标致该帧的类型,这3bit内容对应的Frame Type如下:
Frame Type | Description |
000 | Beacon Frame(信标帧) |
001 | Data Frame(数据帧) |
010 | Acknowledgement(响应帧) |
011 | Reserved(保留) |
信标帧
信标帧主要由协调器定时发送,以保证这些设备能够同协调器进行同步(同步工作和同步休眠),以达到网络功耗最低。信标帧包含MAC服务数据单元(MSDU)、MAC头部(MHR)和MAC尾部(MFR)三部分。MSDU包含超帧域、未处理数据地址域、地址列表域、信标载荷域;MHR包含帧控制域、信标序列号和寻址信息域。MFR包含16bit的帧校验序列。
我们利用Ubiqua Protocol Analyzer中抓取的信标帧如下:
Superframe Specification:信标帧中超帧描述字段规定了该超帧的持续时间,活跃期持续时间以及竞争接入期持续时间等信息。
GTS field: GTS分配字段将非竞争接入期划分为若干个GTS,并把每个GTS具体分配给相应设备。
Pending Address field:转发数据目标地址列出了与个域网协调器保存的数据相对应的设备地址。一个设备如果发现自己的地址出现在待转发数据目标地址字段里,则表明协调器存有属于该设备的数据,所以它就会向协调器发出请求传送数据的MAC命令帧。
Beacon Payload:信标帧负载数据为上层协议提供数据传输接口。例如在使用安全机制的时候,这个负载域将根据被通信设备设定的安全通信协议填入相应的信息。
响应帧
为了保证设备之问通信的可靠性,发送设备通常要求接收设各在接收到正确的帧信息后返回一个应答帧,向发送设备表示已经正确的接收了相应的信息。其帧结构如下图所示:
响应帧由MHR和MFR组成。MHR包括MAC帧控制域和数据序列号;MFR由16bit的FCS组形成。我们抓取的响应帧如下:
命令帧
在ZigBee网络中,为了对设备的工作状态进行控制,同网络中的其他设备进行通信,MAC层将根据命令类型生成相应的命令帧。其帧结构如下图所示:
命令帧主要由MHR、MSDU、FCS组成,其中MSDU包含命令类型和命令载荷,我们抓取的命令帧如下所示:
数据帧
数据帧用来传输上层传到MAC子层的数据,它的负载字段包含上层需要传送的数据。数据负载传送至MAC子层时,被称为MAC服务数据单元。它的首尾被分别附加头信息和尾信息后,就构成了MAC帧。下图是我们抓取到的一个典型的数据帧,用以控制开发终端的二极管的开关。
我们可以从MAC层开始由下而上分析:
MAC层主要由MAC Header、MAC Payload以及MAC Footer组成,其中我们需要了解几个重要的标志。PAN(Personal Area Networks),该域网里所有的设备共用一个ID,ZigBee 设备的PANID可以通过程序预先指定,也可以在设备运行期间,自动加入到一个附近的PAN中,图中PANID为0xFFF1。寻址信息,最开始为IEEE分配的64位物理地址,在加入网络后可由协调器分配16位短地址。FCS(Frame Check Sequence),即帧校验序列通常在MAC帧尾部,采用CRC校验方式。剥开MAC层载荷后则会发现网络层(NWK),网络层由网络头、网络载荷组成,网络头中包含帧控制、寻址、安全等信息。打开网络层载荷则是应用层(APS),包含应用层头及应用层载荷。应用层头部中,Profile ID及Cluster ID与应用规范有关,规范profile可以理解成一套规定,每个应用应该是对应一个profile ID,每个profile ID可以应用于某项具体的应用,例如自动家居、楼宇自动化等。Cluster则是具体在Profile下的细节,比如一个具体的应用如智能灯泡中的小细节(如开关灯)。
利用Ubiqua Protocol Analyzer连接CC2531进行抓包准备,打开协调器,待协调器工作一会后,打开终端,待组网成功后,在PC机上控制二极管的开关。
可以看到最开始协调器一直在发送Link Status数据帧,间隔为15s。在zigbee网络中,不管是哪种设备,只要上电后就会按照15秒每包的间隔时间发送link status数据包。此数据包中包含了此设备与同一网络中的其他设备的连接状态。
终端通电后,CC2531马上检测到了Beacon Request命令帧,为终端所发广播序号为76、77、78,随后协调器发送Beacon信标帧。
终端收到信标帧后,获取到了协调器的地址,向协调器发送了序号为79的Association Request的命令帧,请求组网;协调器收到请求后,向终端发送了Assocaition Response的命令帧,成功建立连接,并为终端分配了16位短地址0xC8E0,可以看到后续通信的地址都为短地址。
组网成功后,协调器和终端都发送了Device Announce的数据帧。当一个设备加入网络之后,它从其父节点获取一个随机地址,然后向整个网络广播一个包含其短地址和IEEE 地址的“设备声明”(Device Announce),如果另外一个设备收到此广播后,发现与自己地址相同,它将发出一个“地址冲突”(Address Conflict)的广播信息。有地址冲突的设备将全部重新更换地址,然后重复上述过程,直至整个网络中没有地址冲突。
PC上控制灯泡开关按钮时,抓到了应用层数据帧,簇ID为Power Configuration,表示这个数据包的细节描述为开关配置。
Zigbee采用了128位的AES加密算法,其安全架构决定了安全性取决于对称密钥的安全保存、保护机制及相关策略的正确实现等。
Zigbee定义了三种密钥类型:主密钥、网络密钥、链路密钥。
主密钥(Master Key): 用于配合ZigBee对称密钥的建立(SKKE)过程来派生其它密钥,也就是说,设备要先拥有信任中心(ZigBee网络中有且仅有的一个可信任设备,负责密钥分发与管理,以及网络的建立与维护)生成的主密钥才能派生网络密钥和链路密钥给其它设备,它可以由信任中心设置,也可基于用户访问数据,比如个人识别码(PIN),口令或密码等信息;
链路密钥(Link Key): 用于保护两个设备之间单播数据的机密性和完整性,仅通讯中的88个设备持有,而单个设备需要多个链接密钥来保护每个端对端会话。
网络密钥(Network Key):用于保护广播和组数据的机密性和完整性,同时也为网络认证提供保护,被网络中的多个设备所共享,仅在广播消息中使用;
在ZigBee Pro(更高安全级别的ZigBee版本)中,管理员使用对称密钥建立方法来派生设备上使用的网络密钥和链接密钥,但是这要求设备拥有从信任中心生成的主密钥,同时要求设备已经加入网络。关于密钥生成的方法主要有两种方式:
密钥传输:采用此方法后,网络密钥与链接密钥可能以明文形式发送到网络中的其它设备,因此密钥有可能被窃听到,从而解密出所有通讯数据,或者伪造合法设备去控制相应智能设备。
预安装:在设备上直接配置好密钥,如果需要更改,就需要重新刷设备固件,虽然这种方式更加安全可信,但也是最繁琐复杂的方式。
密钥分发攻击
密钥分发攻击主要是在新节点入网向信任中心请求密钥时对密钥进行窃听,有多种工具都可以用于窃听,例如Killerbee、Ubiqua、Packet Sniffer等。当密钥采用协调器分发而不是预置在设备中时,分发密钥很可能被嗅探窃取,攻击者可以利用获取的密钥对通信解密。
从设备中获取密钥
如果采用的是密钥预置的方式或者密钥派生的方式部署密钥,那么预置的网络密钥或者主密钥需要与固件一起存储在设备的ROM中,而这些密钥是网络中的所有设备共享的,如果能够读出设备的固件就可以设法找到密钥。
利用SmartRF Flash Programmer、SmartRF04EB读取协调器中的固件,注意这里先新建一个空文件,在Flash image处选择空文件后再执行 Perform actions。
获取到了固件后,可以使用Killerbee中的ZBgoodfind,用于在固件中寻找密钥,其主要原理是首先抓取加密数据包,然后尝试使用固件中所有的连续16字节来解密。另外,利用处理密钥的指令特征是一种寻找密钥的更快的方法,由于现在很多产品都是基于芯片厂家的协议栈来开发应用的,而底层的密钥处理都有协议栈实现,所以密钥处理指令的特征在不同的产品中都可能存在。
KillerBee——是攻击ZigBee和IEEE 802.15.4网络的框架和工具。使用killerBee工具和一个兼容的IEEE 802.15.4无线接口,你就能窃取zigbee网络流量,重放流量,攻击密码系统等等。使用KillerBee框架,你能构建你自己的工具,定义zigbee fuzzing,模仿和攻击终端设备,路由器设备和协调器设备等等。
KillerBee最好配置RZUSBSTICK,可以实现其所有的功能。但直接购买的RZUSBSTICK中的固件需要烧入KillerBee特制的固件,固件地址在https://github.com/riverloopsec/killerbee /tree/master/firmware。最新已经到kb-rzusbstick-006.hex,最简单的烧入方法见AVR Wireless Software (Windows)(这种方法项目作者提示只是其他人尝试过而自己没有验证),需要准备:
win7 32位系统、Atmel AVR Wireless Services AVR2017_RZRAVEN_Firmware.zip(下载地址见github),烧制步骤如下:
确保AVR软件安装位置在C:\Program Files (x86)\Atmel\AVR Tools\AVR Wireless Services。
打开安装目录将RFUSBSTICK-10_10.hex替换为firmware/目录下的killerbee固件,这里我使用的是kb-rzusbstick-004.hex,注意固件名称要改过来。
将RZUSBSTICK插入USB口,这时指示灯是蓝色的。打开软件的Tools-Upgrade USB stick,地址和端口默认就可以,点击Upgrade。
这时会弹出一些警告信息,但最终提示升级完成,USBSTICK的指示灯由蓝色变成橘黄色。(这里我是Mac利用Vmware安装的win7 32位虚拟机)
刷好RZUSBSTICK固件后,就可以配合着KillerBee进行攻击尝试,最好安装在Linux系统中,MacOS中总提示usb有问题。KillerBee常见的指令如下:
zbid ----- 识别可利用的网卡接口。
zbfind --- GTK GUI应用,用来追踪IEEE 802.15.4发射机的位置。
zdgoodfind --- 搜索二进制文件来识别加密密钥。
zbassocflood --- 发送关联请求洪水攻击到目标网络。
zbreplay ---- 重放zigbee/802.15.4网络流量。
zbdsniff --- 从zigbee网络抓取的pcap文件中发现明文的key。
zbconvert --- 转化Daintree SNA 文件到libpcap格式和vice-versa。
zbdump --- 一个类似于tcpdump工具针对zigbee/IEEE 802.15.4网络。
zbstumbler --- 传输beacon request 帧到广播地址,通常用于发现信道和设备。
zbkey -- 尝试向协调器发送连接请求获取密钥。
通过上述指令可以实现抓包、重放、Dos攻击等。我先用两块CC2530开发板搭建了简易的智能灯泡的测试环境,利用KillerBee尝试进行抓包、重放等攻击。
zbid:可以看到产品描述已经变成了KILLERB001,这是由于刷了killerbee固件,RZUSBSTICK原始的产品描述为”RZUSBSTICK”。
zbstumbler: 由于之前已经知道设备工作在11信道,zbstumbler -c 11探测到了PANID为0xFFF1的网络,短地址为0x0000的设备。
zbdump: 我们在11信道上抓取了119个数据包,保存为5_1.pcap。
zbreplay: 重放刚才抓取到的5_1.pcap,显示只有66个数据包被发送了;观察终端发现红色二极管会熄灭和点亮,说明重放攻击成功。
zbkey: 试图加入11信道上,PANID为0xFFF1的网络中,尝试在密钥分发阶段获取到明文密钥,结果没能成功。
zbassocflood: 进行洪水攻击,不停地向协调器发送关联请求,导致协调器没有能力处理指令。实验结果表明,控制二极管开关的按钮没有了作用。
在万物物联的时代,ZigBee作为一种近距离、低功耗的通信协议,非常适合在智能家居和可穿戴设备上使用。本文简单介绍了ZigBee协议,利用开发板搭建了一个简单的智能灯泡系统,并为基础进行协议分析和攻击尝试,本文涉及到的软硬件均可以在互联网上搜索到。
本文来自百度安全SiemPent Team,转载请注明出处及本文链接