智能手环的漏洞挖掘

本文深入解析蓝牙智能手环的通信原理,介绍低功耗蓝牙(BLE)标准及其在智能穿戴设备中的应用。通过逆向工程分析蓝牙手环控制APP,揭示蓝牙命令构造方式,包括操作头、操作数和CRC的组成。并利用python脚本验证蓝牙信息,展示如何让手环执行特定指令。
摘要由CSDN通过智能技术生成

在一个悠闲的阳光午后,拿出一个未知品牌的蓝色小药……,哦,小手环。用力撕扯半张卫生纸,将搁置已久的手环表面擦拭。

既然是蓝牙版的智能手环,那必不可少的要介绍一下通信协议啦。低功耗蓝牙(BLE)是蓝牙技术联盟设计和销售的一种鲁棒性无线技术,旨在用于医疗保健、运动健身、信标、安防、家庭娱乐等领域的新兴应用。相较经典蓝牙,低功耗蓝牙旨在保持低成本、短距离、可互操作。

  1. 生平介绍
  • 安卓的 BLE 标准在 2013 年 7 月发布,一般搭配Android 4.3 及以上系统的手机都是支持蓝牙 BLE 的。
  • IOS的 BLE 标准在 2013 年9月更新推出,一般搭配IOS 7.0及以上系统的手机都是开始支持蓝牙 BLE 的。
  1. 协议内容

要使安卓设备连接上智能穿戴设备(如智能手表),通过经典蓝牙的socket连接一般是连接不上的(为什么说一般呢,因为有些不良厂家和杂牌智能手环用的不是低功耗蓝牙,这个可以使用经典蓝牙连接上),必须要使用BLE的 GATT连接才能连接上。

GATT连接涉及到四个比较陌生的名词:服务(service)、特征值(Characteristic)、描述(discript)、UUID

  • service服务是包含了若干个数据包(特征值)的集合,一个智能设备可能包含多个服务,使用之恩那个设备生产厂商提供的UUID码来识别。比如之恩那个手环中有测心率的服务、步数的服务,心率和步数的数据包(特征值)都包含在服务中,通过指定的UUID来辨别到底是心率的服务还是步数的服务。
  • characteristic特征值包含在服务里面,顾名思义就是一种数据值,特征值包含一个或者多个描述。如心率是多少,今天走了多少步都可以放进特征值里面,服务中有多个特征值,也是通过UUID来识别
  • discript描述一般是对特征值的值进行描述,比如单位等等的描述,开发中一般用不到(我用不到)
  • UUID由蓝牙设备厂商提供的UUIDUUID是在硬件编程里已经确定了的,想要草所特定的服务、特征值都需要通过UUID来找。

手机是通过app控制的蓝牙手环,那么由想而知,apk内肯定有控制蓝牙手环命令的功能代码,那么这些蓝牙的命令是如果构造通过蓝牙发出去的?我们首先逆向蓝牙手环的控制APP,找找蓝牙命令构造的代码片段。

  1. Apk逆向

apk逆向工具有很多,比较成熟有名气的例如:JEB、APKTOOL、AFE、DEX2JAR、ENJARIFY、JD-GUI等等,安卓安全测试这篇文章就不在累述了,下次专门写一个安卓安全的系列。回归正传,本次通过JEB反编译该APK,通过搜索我们确定了该APP中蓝牙命令构造的类BleUtile:

通过对代码进行分析,我们确定了APP与智能手环蓝牙通信的命令构造方式:操作头(126)+操作数(不同方法不同)+CRC(消息鉴别码)。下图为手环震动命令(函数setRemindCmd)的构造方法:

下图为CRC(消息鉴别码)在该APK中的构造方式:

虽然看起来很简单的定位到了我们所需的功能实现代码,但从开始到成功定位,代码分析和查找的工作量确是最大的,在整个漏洞挖掘过程中所耗时间也是最多的。但庆幸的是,本次apk并未进行代码加固,很容易就成功逆向出代码,并且未做代码混淆,方便了我们分析,而且省下很多时间,否则可能会耗费更多。

分析出蓝牙命令的结构了,来点实际的验证一下。

  1. 分析手环蓝牙信息

分析手环蓝牙信息首先得获取手环的蓝牙属性,可以使用python脚本(利用python bluepy模块)对智能手环进行扫描,

扫描得到手环蓝牙信息:

如图,该手环低功耗蓝牙handle为3和14的属性存在WRITE方法,其中handle为3的属性同时具有读和写的属性,读出的值为“Lem_S9P”,我们猜测此属性用于读或修改设备名称,下面数据包分析中我们将重点关注handle为14的属性。

可采用蓝牙模块(CC2540)或手机蓝牙数据包记录功能抓取APP与智能手环蓝牙通信数据包,本次采用的是手机蓝牙日志,通常智能手机可以点击5下版本号打开开发者选项,勾选一下蓝牙hci日志,重启手机后手机就会自动保存手机蓝牙通信的所有数据包啦,每款手机生成的蓝牙数据包名不一样,可以去各家网站搜一下,将这个数据包上传到电脑后用wireshark打开进行分析。

下面为抓取到的蓝牙通信数据包(主要关注handle为14及0x000e的通信数据包,篇幅有限给出两个示例):

与apk内的命令构造模块进行对比,格式完全匹配。开始写脚本尝试发送一些我们构造的蓝牙指令吧!

  1. 拿下手环

手环震动的命令是由长度为5的字节数组构成,其中第四字节值可为(1,2,3,4)中的一个(表示震动类型,如来电为1)。

以来电为例,构造低功耗蓝牙命令:126=0x7e, 5=0x05, 8=0x08, 1=0x01, CRC=0x82。或者通过蓝牙日志发现的value值重放“7e05080182”,我们使用python脚本实现手环震动命令:

手环成功的不停震动~太邪恶了。

详细测试过程、截图请关注“信安攻防”公众号:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

devi1.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值