对智能佩戴装置的一次分析

iso60001  336天前

22.png

你好,我是Sayli Ambure,刚进入信息安全领域的新人。网络应用和物联网/硬件的通信安全一直是我想探索的东西,而本文也是关于我对某款智能设备的研究。

我并不会过多描述低功耗蓝牙(BLE)的工作原理是啥(已经有很多人科普过了),就让我们直接开始吧。

此次目标是一个非常便宜且容易获得的智能手表(手环?),我将简单地分析它,并与其交互。

市面上不少智能手表的外表都极其相似,而我最常见到的是M4手表,只需5美元,来自中国。

得到通讯数据

第一步,尝试获得移动应用和设备之间的通信。

即使你没有任何专业、昂贵的嗅探器,也没关系,android可帮你嗅探蓝牙通信。

33.png

你可以在开发者选项——>BT Snoop中找到它。具体获得相关PCAP的方法可能取决于设备的不同。

一旦得到你的PCAP数据,在Wireshark中打开它,你会看到所有的蓝牙通信。我们只关注其中和BLE有关部分,即GATT或ATT协议。

44.png

通过btatt过滤器,就可以筛选出ATT协议,我们现在不需要任何其他种类的蓝牙通信。

现在寻找发送写请求的数据包,因为应用已发送一个写请求来设置时间和发送一些通知到设备。

55.png

从上图可以清晰看到“发送写请求”,现在选择写请求的操作码,将其作为过滤器,很快你就可以看到所有正在发送的数据。

66.png

这里请重点注意一下HandleValue,我们将在下一节讨论它们的重要性。

77.png

上述操作完成之后,你可以使用scape-radio移动数据,或者手动复制粘贴所有数据,并尝试发送测试。

我编写了一个python脚本来提取关键数据,你可以使用它来执行重放攻击或深度分析。

https://github.com/the-girl-who-lived/ble_pcap_dissector

88.png

连接设备

首先需要设置工作机的蓝牙,使用hciconfig命令查看它是否正常工作。

99.png

如果有任何异常,你也可以使用它来重置接口。

hciconfig hci0 reset 或 hciconfig hci0 up

为了连接到设备,我使用一个很棒的框架,名为ExplIoT,你可以从这里下载。

运行命令expliot启动工具,并通过run ble.generic.scan扫描BLE设备。

100.png

现在,你可以看到该设备的MAC地址,以进行连接。

简单介绍一下BLE以及它的交流方式。

重点有三样:Service、Characteristics和data。

  • Service就像一块有“整合”意义的内存(由多个Characteristics集合而成)。

  • Characteristics是每个数据点的内存地址。

  • Data是控制设备的值。

现在让我们看看如何使用expliot来查看这些信息

Service列表:run ble.generic.scan -a <mac address> -s

Characteristics列表:run ble.generic.scan -a <mac address> -c

110.png

120.png

从上节可以看到,和写请求有关的数据包中的handle都为0x0e

因此,设备的写入命令是:

run ble.generic.charwrite -a <mac addr> -n <handle> -w <value>

分析通信数据

既然我们已经了解如何使用Expliot框架向设备写入数据以及捕获数据包,那现在是时候分析通信内容了。虽然以上流程可以对任何BLE设备进行分析,但不同厂商不同产品的数据格式是不同的,需要专门针对某一种进行分析。

分析通信数据的方法之一就是一个一个地发送所有的数据,看看是否引起了设备的任何变化。对于这个智能手环,我能够更改时间、日期或显示通知以及某些特定内容。

我试着重放所有的数据包,发现有一个数据包会改变日期和时间。

Handle: 0x0e Value: ab0b0401130c030d313beb

当我试图改成其他时间时,它并不生效,我意识到存在CRC-8校验,要想生效需要和CRC-8配合生成新数据包。

为了分析数据,我将其分隔为字节,并转换为十进制,观察它是否与智能手表中更改的时间/日期有相似之处。

130.png

第一个字节表示包头,因为所有的数据包都一样。

第二个字节表示数据包的长度。

第三个字节仍然是个谜(如果你有任何想法,请告诉我)。

第四个字节表示消息、时间或通知之类的类型。

第五个字节是年。

第六个字节是月。

第七个字节是日。

第八个字节是24小时格式的小时。

第九个字节是分。

第十个字节是秒。

第十一个字节是CRC Maxim。

然后,我成功把时间、日期、小时、分和秒都改为11!

https://youtu.be/hXjGk9KFjaM

140.png

这让我很是兴奋,接着编写开始编写脚本,随机显示时间和日期。

https://youtu.be/yOEsQ9n9fqY

150.png

除了以上,我还发现了一些有趣的东西(发送通知)!

Value:
ab1417100201047361796c6969206f74686572c3
ab111710020204753a5368646e646e642d

要成功发送通知,我们需要发送两个或更多的数据包,同样也需要CRC校验(可自定义通知)。

ab 11 17 10 02 02 04 753a5368646e646e64 2d

第一个字节是头部。

第二个字节是通知payload的大小。

第三个字节是数据块的大小。

第四个字节是包的类型。

第五个字节是所需的通知payload的数量。

第六个字节是按第五个字节所计算的payload数。

第七个字节表示通知的类型:消息或whatsapp或电话。

第八个字节是ascii消息本身。

最后一个字节是CRC MAXIM。

https://youtu.be/3DSCfUKZ4Po

160.png

这个设备还有更多的可更改的设置,如闹钟和启用丢失模式,当然控制原理都一样的。

谢谢你的阅读!如果你有疑问,请在LinkedInTwitter上联系我!

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://medium.com/@sayliambure/hacking-a-5-smartband-824763ab6e8f

最新评论

昵称
邮箱
提交评论