利用miio控制局域网内的小米智能设备

控制局域网内的IOT设备

中间人攻击—流量分析

使用Nmap分析局域网内设备,得到智能设备的IP


小米智能插座:192.168.31.197 网关:192.168.31.147(控制它的手机ip)

ettercap嗅探智能设备和网关之间的流量

sudo ettercap -i ens33 -T -q -M ARP:remote /192.168.31.197// /192.168.31.147//

wireshark抓包分析


从图中可以看出,设备的命令控制包为UDP传输,既然是UDP协议传输,那么是否可以通过命令包重放攻击来对设备进行控制?
了解到在homeassistant中可实现对小米设备的集成,并在其中对设备进行管理和操作。Homeassistant,主要以Python语言开发,既然它能操控小米设备,那它底层肯定有相关的函数调用库。
为了可以消除对专有软件(米家app)的依赖,并能控制自己的设备,所以出现了MiIo。设备和米家app在同一局域网下使用的加密专有网络协议我们称之为MiIo协议。
Miio库支持的设备有:

小米IOT控制流程

在同一局域网中,小米设备可以使用专有的加密UDP网络协议进行通信控制。在网络可达的前提下,向小米设备发送hello bytes就可以获得含有token的结构体数据。之后,构造相应的结构体,并且以同样的方式发送给设备即可完成控制。具体流程如下:

设备Token的获取方式

小米设备的token获取有三种途径:miio获取、从米家app获取、从数据库获取

miio获取

在ubuntu下,先安装miio,然后发现设备:
npminstall -g miio
miiodiscover

但是很可惜,很多设备隐藏了token,使用该方法可能无法获取到token或获取到的token不正确。

米家app获取

这种方法需要的mijia app版本较老,且只对部分设备有效。

从数据库获取token

这种方法仅在Mi Home 5.0.19之前的版本可用。
该方法是读取手机中米家的app中的数据记录来获取设备的token,具体步骤如下:

  • 准备一部获取root权限的安卓手机
  • 安装米家app并登录账号
  • 进入/data/data/com.xiaomi.smarthome/databases/
  • 拷贝db,下载到电脑
  • 前往网站,上传db,点击提交,即可获得token。
  • 8894c73cbd5c7224fb4b8a39e360c255

脚本控制IOT设备

首先随意发送hellobytes获得时间和设备ID,token我们自己设置;然后构造发送的数据结构msg,cmd中的method包括:set_power(控制开关)、get_prop(获取状态),控制的params是[‘on’]/ [‘off’],获取状态的params是[‘power’, ‘temperature’]

如果获得了token,就能对小米的设备进行操作,如图下面是返回的信息。

总结

从目前的智能家居市场来看,用户不会只使用单个智能设备厂商的设备,所以对于厂商来说,通过开放接口给用户一些局域网的控制“自由”,实现不同厂商设备的联动是一个不错的选择。
从另外一个角度,本文中体现的安全问题我们也不容忽视。如果在局域网中不经过认证就能获取物联网设备的访问凭证,并进而进行控制,无形中给入侵者留了一扇门。例如,攻击者可经过扫描互联网发现家庭路由器,并利用弱口令或设备漏洞获得路由器的shell权限,接下来就可按照文中步骤就可以获得设备token进而控制。好在小米已经在最新的miio版本中修复了这一漏洞,大大提高了攻击者获取token的难度。

您的支持将鼓励我继续创作!
0%