Google Nest智能設備逆向姿勢詳解
如今物聯(lián)網(wǎng)的概念十分火熱,但真正的創(chuàng)新沒有你想象中那么多。那些所謂的“智能”相機、門鎖、電燈真的沒什么新意。然而物聯(lián)網(wǎng)領域的某些廠商還是很了不起的,例如Nest Lab公司,被Google收購之后已經(jīng)變成了物聯(lián)網(wǎng)領域最富盛名的品牌之一。
Protonet公司把擁有并且能夠訪問個人數(shù)據(jù)當作核心價值觀之一,所以雖然我們對Google的技術非常崇敬,還是對它的智能家居產(chǎn)品只能通過云來訪問這一點非常懷疑。
Google Nest攝像頭
只能通過云端訪問
Nest的產(chǎn)品中一個比較厲害的特點就是它們?nèi)慷际切┲荒芡ㄟ^Web操作的產(chǎn)品。而獲取Nest攝像頭或者恒溫器數(shù)據(jù)的唯一途徑就是通過Nests的云。而Nest攝像頭和Nest恒溫器可能會在任何端口運行著任何的服務,我們無從得知。這就會帶來兩個問題:
在沒網(wǎng)的情況下你不能操作相機或者更改恒溫器設置
設備上所有的數(shù)據(jù)都會持續(xù)不斷地被發(fā)到Google,除非設備斷網(wǎng)
設置的控制都能通過Web瀏覽器應用或者手機應用訪問。我選擇通過手機應用的方式,目的是要了解我們?nèi)绾潍@取私人數(shù)據(jù)。很明顯,我們要搭個VPN,然后做個假的SSL證書,再用抓包工具監(jiān)聽所有的HTTPS流量。
Nest恒溫器
逆向流程
1. Nest攝像頭
登錄的過程看起來很直接,應用會發(fā)送給服務器一個JSON對象,包含email和明文的密碼,然后會收到一個會話cookie。
POST /session HTTP/1.1
Content-Type: application/json;charset=UTF-8
User-Agent: Nest/[redacted] (Android; Obsidian) [redacted]
Host: home.nest.com
/.../
{"password":"foo", "email":"bar"}
然后應用會用cookie與dropcam服務器創(chuàng)建會話。API會提供幾個endpoint,例如抓取攝像頭列表和它們大量的數(shù)據(jù),如下:
{
"talkback_stream_host": "stream-delta.dropcam.com:443",
"is_streaming_enabled": true,
"last_connected_time": redacted,
"direct_nexustalk_host": "redacted",
"timezone": "redacted",
"id": redacted,
"live_stream_host": "redacted",
"description": "",...
通過另一個endpoint我們還可以獲取一段時間內(nèi)的信息列表,即動作傳感器被觸發(fā)的時間點,還有的endpoint可以把當前的圖像截成jpeg。本文最后有詳細的相關Go代碼。
2. Nest恒溫器
我們現(xiàn)在把與其他物聯(lián)網(wǎng)設備整合的希望都寄托在了恒溫器上。向服務器發(fā)送用戶、建筑和設備信息之后,我們就會收到關于恒溫器信息的一系列信息,不過其中沒有當前溫度。
{
"alt_heat_delivery": "forced-air",
"alt_heat_source": "gas",
"alt_heat_x2_delivery": "forced-air",
"alt_heat_x2_source": "gas",
"auto_away_enable": true,
"auto_away_reset": false,
"auto_dehum_enabled": false,
"auto_dehum_state": false,
"aux_heat_delivery": "forced-air",
"aux_heat_source": "electric",...
訪問Nest恒溫器的Go代碼
以下是完整代碼的樣本,代碼的功能包括登錄、下載信息、截取畫面和獲取恒溫器信息:
package main import ( "bytes" "encoding/json" "errors" "fmt" flags "github.com/jessevdk/go-flags" "io" "io/ioutil" "net/http" "os"...
Nest設備在硬件工程方面非常出色,但在軟件層面,在用戶自己的數(shù)據(jù)周圍建一個圍墻還是一個可疑的舉動。既然是我個人的數(shù)據(jù),就應該能讓我通過開放的API輕易地訪問到,我不需要什么花招就應該能夠訪問。Nest在新聞公告曾經(jīng)承諾要引進新的API,而它的引用文檔已經(jīng)有了。但是這個API相比Nest手機app中的內(nèi)部API限制了很多。我們還是希望Nest能夠把自己的產(chǎn)品做得更加開放。