當前位置:
首頁 > 最新 > 智能家居設備的另一種打開方式——如何控制區域網中的小米設備

智能家居設備的另一種打開方式——如何控制區域網中的小米設備

近兩年,物聯網技術發展迅猛,各樣的智能設備漸漸地走進了我們的家居生活。在眾多的智能設備廠商中,小米是較早的布局智能家居生態的廠商,購買智能家居設備的用戶幾乎都會有一到兩個小米設備。那麼是否可以控制這些小米設備呢,其中過程是否會有安全風險呢?本文接下來會主要介紹這些內容。

具體地,除了米家app控制小米設備外,小米還提供一種區域網控制的方式,但前提是要獲得用於設備認證一串字元串(即token),所以接下來主要介紹如何獲取設備token,以及如何實現區域網控制設備。

一. 總體流程介紹

在同一區域網下,小米設備可以使用專有的加密UDP網路協議miio協議通信控制。在網路可達的前提下,向小米設備發送一串hello bytes即可獲得含有token的結構體數據。之後,構造相應的結構體,並以同樣的方式發送給設備即可實現控制。具體流程如下圖所示:

二. 小米設備token獲取

小米設備的token獲取有三種途徑,如下所述:

1

miio獲取token

miio有基於Python實現的庫,其Github項目地址為:https://github.com/rytilahti/python-miio。該項目支持所有兼容miio協議的設備,並將設備發現、識別和控制的方法進行了分類。

>>>>

1.1 環境安裝

python-miio需要Python3.5以上版本上才能運行,所以首先搭建Python環境。下面,我們在操作系統為Ubuntu的電腦或者樹莓派中安裝Python3.5:

安裝Python3.5依賴(本機存在的會忽略)

sudoapt-getinstallbuild-essentiallibsqlite3-devsqlite3bzip2libbz2-devlibssl-devopenssllibgdbm-devliblzma-devlibreadline-devlibncursesw5-dev

編譯安裝Python3.5

wgethttps://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz

tarzxvfPython-3.5.2.tgz

cd./Python-3.5.2

./configure--prefix=/usr/bin/python3.5

sudomake

sudomakeinstall

編譯後運行一下python3.5,結果如下證明安裝成功

sean@ubuntu:~/Desktop/week/ProcessAndDeadline$ python3.5

Python3.5.2(default,Nov232017,16:37:01)

[GCC5.4.20160609]onlinux

Type"help","copyright","credits"or"license"formoreinformation.

安裝miio庫,下載庫代碼到本地並安裝

gitclonehttps://github.com/rytilahti/python-miio

cdpython-miio/

python3.5setup.py install

>>>>

1.2 通過腳本獲取token

下面就以小米智能插座為例,說明如何獲取該設備的token。

腳本編寫

首先要保證獲取token的客戶端要與插座網路可達。為了顯示直觀,我們將主要實現代碼從庫中提取出來(如下)。將文件放在python-miio/miio目錄下(該腳本主要就是使用socket向設備ip的54321埠發送固定字元串,返回值即為設備token):

#-*-coding:utf8-*-

importcodecs

importsocket

fromprotocolimportMessage

helobytes=bytes.fromhex("21310020ffffffffffffffffffffffffffffffffffffffffffffffffffffffff")

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

s.sendto(helobytes,("192.168.42.17",54321))#插座ip,埠54321

data,addr=s.recvfrom(1024)

m=Message.parse(data)

tok=codecs.encode(m.checksum,"hex")

print(m)

print(tok)

運行:python3.5 miio_test.py

返回如下消息結構,其中checksum即為設備的token,解碼之後為:"1d0616858062b8f836ebcacc98e62dd2"。

root@raspberrypi:~/python-miio/miio#python3.5miio_test.py

Container:

data=Container:

offset2=32

offset1=32

length=

value=(total)

data=(total)

header=Container:

offset2=16

offset1=

length=16

value=Container:

length=32

unknown=

device_id=x03xa9x84xb6(total4)

ts=1970-01-2222:10:05

data=!1x00x00x00x00x00x03xa9x84xb6x00x1cxe7=(total16)

checksum=x1dx06x16x85x80bxb8xf86xebxcaxccx98xe6-xd2(total16)

支持這種方式拿token的還有小米的空氣凈化器、凈水器、掃地機器人、智能插座插線板等。具體列表見https://github.com/rytilahti/python-miio。

2

從米家app獲取token

如果能用上述的探測方法獲取token還是比較便捷的,但目前只有部分小米設備支持。接下來還有一種方法可以直接從app獲取token。以小米綠米網關為例:首先下載米家app,將綠米網關配置入網後,點擊網關設備。接下來步驟如下組圖,最後的密碼即為網關的token。

目前綠米的這種設計模式是用戶友好的,而且設備的所有者還可以選擇是否開放區域網控制以及刷新控制token的有效性,比較安全。個人還是很希望小米的其他設備同樣開放app側獲取設備token,因為畢竟獲取需要搭建複雜的環境以及調試代碼,大部分使用者應該不能接受的。

3

從資料庫獲取token

該方法是讀取手機中米家的app中的數據記錄來獲取設備的token,具體步驟如下:

1.準備一部獲取root許可權的安卓手機

2.安裝米家app並登錄賬號

3.進入/data/data/com.xiaomi.smarthome/databases/

4.拷貝miio2.db,下載到電腦

5.前往網站(http://miio2.yinhh.com/),上傳miio2.db,點擊提交,即可獲得token。

因為沒有root的安卓手機,筆者沒有具體測試這種方式獲取token的有效性,具體可以參考這篇文章(https://homekit.loli.ren/docs/show/12)

三. 控制小米WiFi插座

如果獲得了token,就能對小米的設備進行操作,接下來介紹使用miio協議控制小米插座的主要步驟。

1

控制腳本編寫

基於1.1.2獲取到的回傳的token信息,構造如下數據結構,用來控制設備。

cmd={"id":1,"method":"set_power","params":["on"]}

"device_id":device_id,"ts":ts}

msg={"data":{"value":cmd},

"header":{"value":header},

"checksum":}

其中:

token為獲取到的設備token;

device_id為獲取token返回結構中的device_id欄位;

ts是一個時間結構,控制傳的ts的需要在獲取到ts基礎上加1秒;

cmd中的method包括:set_power(控制開關)、get_prop(獲取狀態),控制的params是["on"]/ ["off"],獲取狀態的params是["power", "temperature"]

下面的代碼是實現打開插座的控制,其中插座的IP為192.168.42.17。

m0=Message.build(msg,token=m.checksum)

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

s.sendto(m0,("192.168.42.17",54321))

data,addr=s.recvfrom(1024)

m1=Message.parse(data,token=tok)

print(m1)

2

執行控制腳本

root@raspberrypi:~/python-miio/miio#python3.5miio_test.py

Container:

data=Container:

value={"id":1,"result":["ok"]}

data=x03x88Tx86x1axbdxb5xb24.xdcmxdbxc3xb4xdbxe7x80JRxexdaxa987x91Qxd0xeex9bV(total32)

offset2=64

offset1=32

length=32

header=Container:

value=Container:

length=64

unknown=

device_id=x03xa9x84xb6(total4)

ts=1970-01-2220:40:38

data=!1x00@x00x00x00x00x03xa9x84xb6x00x1cxd2F(total16)

offset2=16

offset1=

length=16

checksum=xfcxe2
x8bxd9xb6x1dxfdaxd5x11x04xe1bxbexfd(total16)

四. 總結

從目前的智能家居市場來看,用戶不會只使用單個智能設備廠商的設備,所以對於廠商來說,通過開放介面給用戶一些區域網的控制「自由」,實現不同廠商設備的聯動是一個不錯的選擇。

從另外一個角度,本文中體現的安全問題我們也不容忽視。如果如2.1所示在區域網中不經過認證就能獲取物聯網設備的訪問憑證,並進而進行控制,無形中給入侵者留了一扇門。例如,攻擊者可經過掃描互聯網發現家庭路由器,並利用弱口令或設備漏洞獲得路由器的shell許可權,接下來就可按照文中步驟就可以獲得設備token進而控制。

在接下來的文章中,我們會給大家介紹一些智能家居的平台,以及家庭環境中智能設備的一些安全防護方法,讓智能與安全同行。

內容編輯:物聯網安全實驗室 桑鴻慶 責任編輯:肖晴


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 綠盟科技研究通訊 的精彩文章:

容器鏡像安全概述

TAG:綠盟科技研究通訊 |