1.4 改变灯泡状态
到目前为止,我们知道了如何向网桥发送命令改变灯泡状态。网桥本身使用ZigBee Light Link(ZLL)无线协议向灯泡发送指令。ZLL协议以IEEE 802.15.4标准为基础,是一种低成本、低功耗、广泛应用于数以百万计的设备和传感器上的协议。ZLL标准实际上是一个ZigBee应用配置的规范,定义了与消费市场和小型专业设备相关的照明系统参数。
ZLL需要开发商提供主密钥,并将它保存在网桥和灯泡上。初始化时(也就是用户按下网桥按键时),网桥会产生一个随机网络密钥并使用主密钥进行加密。灯泡使用主密钥解密并读取出网络密钥,之后网桥和灯泡就可以使用该网络密钥进行通信了。
使用KillerBee框架和RZ U盘,我们可以嗅探ZLL的网络流量。插入RZ U盘之后,我们先使用zbid工具验证一下,zbid是KillerBee套件中的一个工具:
# zbid
Dev Product String Serial Number
002:005 KILLERB001 [DELETED]
之后,我们就可以使用zbwireshark命令进行嗅探(比如这里嗅探11信道):
# zbwireshark -f 11 -i '002:005'
该命令会启动Wireshark(http://www.wireshark.org/)工具,并开始捕获ZigBee流量。
如图1-15所示,网桥持续不断地在信道11上发送信标广播请求(ZigBee的信道范围从11~26),候选设备如灯泡可以对该信标请求做出响应,以加入到网络中。
图1-15:WireShark捕获信标请求
本例中,除了信标请求之外,在20信道上也会出现ZLL流量,如图1-16所示。ZigBee的Security Header中的Security Control字段设为0x01,表示正在使用一个消息认证码(AES-CBC-MAC-3/MIC-32)。该消息认证码的传输过程也被捕获到并显示出来了。
图1-16:WireShark捕获20信道流量
当网桥收到一个认证请求用以改变与其关联的灯泡状态时,就需要使用ZigBee协议以及ZLL规范进行通信了,通信过程如图1-15和图1-16所示。
我们知道网桥使用ZLL协议与灯泡通信。网桥还会使用一个共享密钥来维持与照明系统基础设施的基于HTTP的带外连接。当网桥接收到来自照明网站(或者来自远程网络的iOS App)路由过来的命令时,会启用该连接。应用于网桥的ZLL实现或者加密方法有可能存在缺陷。然而,要利用这些缺陷,攻击者需要与被攻击对象保持很近的距离(以便于利用ZLL的问题),或者能够拦截网络数据并注入数据包。
由于这类问题发生的概率比较低,所以它并不视为关键的风险,但是它的潜在威胁还是值得我们陈述一下。