【胖猴小玩闹】智能门锁与BLE设备安全Part 3: 耶鲁智能门锁的简单测试(下)
2020-04-07 11:50:00 Author: www.4hou.com(查看原文) 阅读量:369 收藏

【胖猴小玩闹】智能门锁与BLE设备安全Part 3: 耶鲁智能门锁的简单测试(上)

1.简介

在本专题第三篇文章中,我们研究发现了Yale智能门锁的通信中存在一些问题。在本专题第四篇中(本篇),我们将进行一个“小玩闹”,即利用这些问题实现未授权开锁,具体的操作步骤如下:

a. 嗅探BLE通信获取productInfo;

b. 使用获取的productInfo控制门锁。

在后文中将详细介绍每一步的操作内容。

2. 嗅探BLE通信

Yale门锁的BLE通信没有加密,所以我们通过嗅探的方式可以直接获取Authentication Request和Authentication Response,利用这两个数据包的Payload做减法运算即可得到productInfo。

2.1 嗅探工作

嗅探BLE通信需要有专用的硬件工具,我们使用的是CC2540 Dongle,配合TI的Packet Sniffer软件,如图2-1所示。

图片1.png

图2-1 CC2540 Dongle+Packet Sniffer软件

Dongle直接接到电脑的USB接口即可使用,Packet Sniffer软件可以对Dongle进行配置,并展示Dongle嗅探到的BLE通信数据。

我们在第一篇文章中介绍过,Master在Scanner状态下,会不断地扫描并接收Slave在Advertiser状态下发出的广播包。在BLE通信的全部40个信道中,广播包的发送和接收固定在其中3个信道上进行的,Master想要与某个扫描到的Slave建立连接时会进入Initiator状态并向Slave发起连接请求,双方建立连接后会在其他37个通信信道上以一定的规律进行调频通信。

由于连接建立后,双方以跳频的方式进行通信,而我们并没有全频谱嗅探工具,所以我们必须在Master和Slave建立连接时,也就是Master发出CONNCET_REQ数据包时,开始跟踪双方的通信,与通信双方同步跳频,才能嗅探到完整的通信内容。

因此,Dongle的工作原理如图2-2所示,整个嗅探流程可以分为三个步骤:

a. 启动完成后,Dongle监听某一个广播信道,会嗅探到所有附近设备在该信道上的进行的广播包;

b. 当探测到CONNECT_REQ数据包时,说明该信道上有Master和Slave准备建立连接,此时Dongle会解析CONNECT_REQ数据包的内容,并自动开始跟踪这两个设备的通信过程;

c. 此后,Dongle不再展示其他设备的广播内容,而只显示步骤b中,建立链接的设备双方通信内容。

图片2.png

图2-2 Dongle工作原理示意图

一个Dongle只能监听一个广播信道的通信,而通信双方可能会在3个广播信道中随机挑选一个建立通信,因此如果只有一个Dongle时,可能需要多次尝试才能获得需要的数据,有多个Dongle时则可以分别将它们配置为监听不同的广播信道,选择Dongle并配置监听信道的方式如图2-3所示。

图片3.png

图2-3 选择并配置Dongle

以上就是USB Dongle的简单介绍,下面我们进入正题。BLE嗅探的操作非常简单,配置好Dongle后,点击Packet Sniffer中的开始嗅探按钮,就可以看到Dongle接收到的所有广播包,如图2-4所示。

图片4.png图2-4 嗅探到的广播包

开始嗅探后,我们在Dongle附近尝试在app里连接门锁,如果手机和门锁恰好是在Dongle监听的广播信道上建立连接,那么就可以抓到后续手机和门锁之间BLE通信内容,如图2-5所示。

图片5.png图2-5 手机与门锁建立通信

图2-5中,从黄色数据包开始,手机和门锁的通信开始跳频,可以看到Channel字段每次通信都会变化,而建立通信前的最后一个广播包的类型就是CONNECT_REQ,Dongle是通过这个数据包来跟踪双方随后的跳频通信的。

最后还需要说明,Dongle一次只能监听一个广播信道,所以我们可能需要多次重复才能嗅探到手机和门锁的通信。

2.2 数据包分析

拿到通信内容之后,我们只要找到Authentication Request和Authentication Response即可,要定位这两个数据包,则需要知道数据包的特征和结构。

回想上一篇文章,在生成Payload并发送Authentication Response之前,调用过一个makeACKFrame的函数,从函数名看,这个函数的作用是将Payload封装成ACK Frame,我们就从这里着手分析。

首先我们看一下调用makeACKFrame的地方,如图2-6所示。

图片6.png

图2-6 函数调用处

makeACKFrame函数有4个参数,其中v2、v3是两个固定内容的字节,用于表示包类型,v4显然是个累加的计数器,最后一个参数arg7,我们上一篇文章中就提到了,这个参数是encodeCounter函数的返回值,也就是Authentication Response的Payload。

在本专题第三篇文章中日志内容截图,如图2-7,第三条日志输出send 72ACK的内容,起始字节是0x72和0xA1,即上文中v2和v3的变量值。所以,我们可以推断Authentication Reponse起始字节是固定的0x72A1,这一点可以作为数据包的特征。帮助我们在BLE嗅探数据中快速找到的Authentication Response。

图片7.png

图2-7 app的日志

此外, 在FrameModel类的toString函数中,可以更直观地看出Authentication Response的数据包结构,这个函数如图2-8所示。

图片12.png

图2-8 FrameModel类的toString函数

根据此图可以猜测BLE通信内容的帧结构如下:

a. 开始的两个字节是event和source;

b. 第3个字节表示数据包的序号,第4个字节则是长度,我们暂时还不清楚这是数据包的长度还是Payload的长度;

c. 第5字节开始是数据包的Payload;

d. 最后一个字节是校验。

根据以上结论,我们在嗅探到的通信中定位到图2-9了这样一组数据包,红框中即为Request和Response两次通信:

图片8.png

图2-9 嗅探到的BLE通信

根据起始字节是0x72A1这一特征,第二个数据包应该就是Authentication Response,那么第一个数据包应该是Authentication Request,Response数据包的结构分析如图2-10。

图片9.png

图2-10 数据包结构

通过类似的方式可以取出Request数据包的Payload,按照上一篇文章的分析,只需要将Response的Request两个数据包的Payload做差运算即可得到这个门锁的productInfo,做差运算过程如图2-11。

图片10.png

图2-11 计算productInfo

最后,我们可以通过adb工具从手机中取得Yale app的应用数据库,其中显示了已绑定门锁的productInfo,如图2-12所示。

图片11.png

图2-12 数据库中的productInfo

对比图2-11和图2-12,可以看到product info二者部分字节是相同的,结合本专题第三篇的分析,可以确定productInfo只有前6个字节参与了计算。在接下来的操作中可以进一步验证,其他字节置0也能够开启门锁。

3. 未授权开锁

前文提到手机和门锁的认证过程完全依靠product_info字段,如果我们在未绑定门锁的手机上,跳过门锁绑定步骤,直接将计算得到的product_info等相关信息写入到app的数据库中会出现什么情况呢?接下来我们对这种情况进行复现。

我们修改数据库的办法很简单:通过ADB将app中的数据库(位于/data/data/com.irevo.blepack/databases目录下)拉取到电脑上,在电脑上修改完成后再推送回app。

使用ADB获取该app的数据库文件有一个前提,即我们必须拥有root权限或者使用run-as指令。而使用run-as指令,需要指定的应用处于允许debug的模式,所以我们在上一篇文章中添加Log代码时,也在AndroidManifest.xml文件中添加了Android:debuggable = true的标签。

在未绑定门锁的手机中,数据库应该是空的。空数据库的填写方式如图3-1所示。除了product_info外,还有一个module_addr字段需要注意,这个字段应该填写门锁的蓝牙地址,这个地址可以在门锁附近,使用nRF Connect扫描周围设备获取。

图片13.png

图3-1 app数据库填写方式

数据库填写完成后,使用ADB指令推送回手机,即可使用该手机控制门锁了。如图3-2所示,手机最初并没有绑定门锁,在我们将数据库推送进手机后,重启app,会发现手机开始尝试与门锁建立连接,稍等片刻连接建立之后,就可以直接用这个手机打开门锁了。

图3-2缩小版 (1).gif

图3-2 用未绑定门锁的手机打开门锁

4. 总结

本篇为耶鲁智能门锁的简单测试下篇,也是本专题的第四篇文章。在本篇中,我们介绍了用于嗅探BLE通信的USB Dongle,并借助这个Dongle分析了门锁和手机的BLE通信数据,完成利用Yale门锁的安全问题实现未授权开锁。

这次对Yale智能门锁的研究仍然是从BLE入手,重点逆向分析了安卓手机端的app代码。而智能门锁种类繁多,开锁方式也不只有BLE这一种方式。在此后的文章中,我们会和大家分享更多的例子,大家如果有想要讨论或者分享的事情,欢迎发邮件到[email protected]

作者:Light & Yimi Hu @ PwnMonkeyLabs

本文为 胖猴实验室 原创稿件,授权嘶吼独家发布,如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/o633
如有侵权请联系:admin#unsafe.sh