专栏首页物联网IOT安全看大佬如何破解智能门锁

看大佬如何破解智能门锁

1

简介

上一篇文章的分析中,我们发现Yale智能门锁的通信中存在两个问题,本篇文章将分为两个部分描述如何利用这两个问题:

a. 嗅探BLE通信获取productInfo;

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

2

嗅探BLE通信,获取productInfo

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

2.1 嗅探通信

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

图2-1 CC2540 Dongle+Packet Sniffer软件

Dongle直接接到电脑的USB接口即可使用,Packet Sniffer软件可以对Dongle进行配置,并显示嗅探到的BLE消息。

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

由于连接建立后,双方以跳频的方式进行通信,因此我们只能在Master和Slave建立连接时,也就是Master在Initiator状态下发出CONNCET_REQ数据包时,就开始跟踪双方的通信,才有可能嗅探到所有通信内容。

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

a. 启动完成后,Dongle工作在某一个广播信道上,会嗅探所有该信道上的广播包;

b. 当探测到CONNECT_REQ数据包时,说明该信道上有Master和Slave准备建立连接,此时Dongle会解析CONNECT_REQ数据包的内容,获取主从设备的信息及双方第一次跳频通信的通信信道;

c. 此后,Dongle只会过滤步骤b中主从设备之间的通信,并跟随双方的跳频,这样双方所有的通信都被嗅探到了。

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

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

图2-3 选择并配置Dongle

介绍完嗅探工具,我们就可以尝试嗅探通信了。

嗅探的操作非常简单,配置好Dongle后,点击Packet Sniffer中的开始嗅探按钮,就可以看到Dongle接收到的所有广播包,如图2-4所示。

图2-4 嗅探到的广播包

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

图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所示。

图2-6 函数调用处

调用makeACKFrame函数时传入了4个参数,其中v2、v3分别是已经初始化好的变量,所以Authentication Response中应该有两个固定内容的字节,v4显然是个累加的计数器,最后一个参数arg7,我们上一篇文章中就提到了,这个参数是encodeCounter函数的返回值,也就是Authentication Response的Payload。

我们在上一篇文章中获取到的日志,如图2-7,send 72ACK的内容,起始字节是0x72和0xA1,而图2-6中,参数v2和v3分别包含了HexString(72)和HexString(A1)。所以,我们可以推断Authentication Reponse起始字节是固定的0x72A1,这一点可以作为数据包的特征。帮助我们在嗅探到的通信中寻找Authentication Response。

图2-7 app的日志

makeACKFrame的结果在v1中,打印Log时调用了v1.toString(),这个函数如图2-8所示。

图2-8 FrameModel类的toString函数

在toString函数中我们能直观的看出Authentication Response的数据包结构:

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

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

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

d. 最后一个字节是校验,校验算法暂时未知。

通过数据包的特征,我们在嗅探到的通信中定位到图2-9了这样一组数据包。

图2-9 嗅探到的BLE通信

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

图2-10 数据包结构

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

图2-11 计算productInfo

我们在已绑定了门锁的手机中查看app的数据库,其中显示了已绑定门锁的productInfo,如图2-12所示。

图2-12 数据库中的productInfo

对比图2-11我们计算出来的结果,和2-12中数据库里的product_info字段数值,二者前6字节是相同的,上一篇分析中在分析productInfo变量的使用时,其中也只有6个字节参与了计算,所以我们推测后两个字节是无效字节,下一章的操作中可以看到,这两个字节置0也能够开启门锁。

3

使用计算得到的productInfo开启门锁

前文提到app数据库中有product_info字段,而app在构造Authentication Response时直接使用了这个字段的数值,那么如果我们在未绑定门锁的手机上,跳过门锁绑定步骤,直接将门锁的相关信息写入到app的数据库中会出现什么情况呢?接下来我们对这种情况进行实验。

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

要操作/data目录下指定app的文件,需要我们拥有root权限或者使用run-as指令,在未root的手机中,执行run-as + 包名,就可以直接以root权限进入该应用的沙盒中查看数据库、xml、各种信息文件等内容。使用run-as指令,需要指定的应用处于允许debug的模式,所以我们在上一篇文章中添加Log代码时,也在AndroidManifest.xml文件中添加了Android:debuggable = true的标签。

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

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

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

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

4

总结

我们用了两篇文章记录了Yale门锁的漏洞分析及利用过程。

首先我们从Yale Bluetooth Key这款app的Log着手,定位到了app中的关键代码,随后通过对关键代码的分析,发现了门锁与手机之间的身份认证环节存在漏洞,最终通过嗅探门锁与手机之间的BLE通信,我们利用身份认证的漏洞在未绑定门锁的手机上打开了门锁。

这次对智能门锁的安全测试仍然是从BLE入手的,重点分析的是手机端的app。而智能门锁的开锁方式不只有蓝牙这一种,之后我们会和大家分享更多的内容,大家如果有想要讨论或者分享的事情,欢迎在公众号后台留言,或发邮件到pwn@pwnmonkey.org。

作者:Light & Yimi Hu @ PwnMonkeyLabs

本文分享自微信公众号 - 物联网IOT安全(IOTsafety),作者:胖猴实验室

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 智能汽车安全入门|世界智能驾驶挑战赛总结

    这两天参加了世界智能汽车挑战赛,比赛使用了visual threat的汽车仿真设备。不过这个文章题目起的有些夸张,准确的说应该是CAN总线安全学习入门

    用户7021283
  • Cobalt Strike|从入门到入狱

    Hello大家好哇,我是你们的lmn小姐姐,从今天开始,我们要发N期Cobalt Strike的教程,主要是介绍从入门到入狱的过程,欢迎师傅们转发留言走起。

    用户7021283
  • 【技术分享】红队权限维持方法杂谈

    本次分享分两部分,分别介绍Linux和Windows的权限维持,今天主要介绍Linux的,为了节省时间,这里就选择我平时用的比较多的较为好用的方法来介绍

    用户7021283
  • Java并发编程之原子变量

    原子变量最主要的一个特点就是所有的操作都是原子的,synchronized关键字也可以做到对变量的原子操作。只是synchronized的成本相对较高,需要获...

    哲洛不闹
  • 对某三资信息管理平台的一次审计和破解

    经过了一周的忙碌,总算是可以闲下来写写东西了。这次我跟大家分享的是上周在项目中遇到的一个案例,这里把当时挖掘漏洞的过程和思路做一个分享。文章分为两部分分别为漏洞...

    用户2202688
  • 机器人会消灭工人阶级吗?

    周政华   腾讯研究院高级研究员   在北京很多老旧居民楼里,电梯门开时,迎接你的是一个五十岁上下的中年妇女,她通常面无表情地坐在张油漆斑驳的靠背椅上,手持...

    腾讯研究院
  • Python代码搭建简单的神经网络

    https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-ne...

    Stanley Sun
  • Router Configuration

    RA(config-if)#ip address 172.16.1.5 255.255.255.252

    py3study
  • 通过Eigen score衡量变异位点的功能重要性

    变异位点的注释是突变分析中最重要的一项分析内容,在过去的十几年中,各个组织和团队开发了大量的软件和数据库,对变异位点进行注释。现阶段对于变异位点的注释而言,最大...

    生信修炼手册
  • Rocket框架多文件上传,介绍rocket_upload 使用

    Rust让这种情况彻底改观。Rust本身在系统开发方面就有不错的表现,社区中又出现了不少优秀的开源框架提供Web编程支持。 这其中老牌的Actix和新秀Roc...

    俺踏月色而来

扫码关注云+社区

领取腾讯云代金券