作者:Yimi Hu & Light @ PwnMonkeyLab
原文鏈接:https://mp.weixin.qq.com/s/tBzJH2fN2UadWxgDnpLGvg
簡介
諸位好久不見,[胖猴小玩鬧]專題從這篇起將開始一個新的系列,即智能設備分析系列。舊的系列并沒有結束,而且文章也已經寫好了,只是在發送之前又不小心發現了一些漏洞,所以就暫且放一放吧。作為新系列的開篇,我們打算分享一下華為智聯旗下的小豚AI攝像頭,這也是我們在2020年某AIoT安全峰會上的分享內容。
胖猴實驗室在去年某日收到了一批贊助,贊助內容為華為IoT終端獎勵計劃列表里面的大部分設備,如下圖:

小豚AI 攝像頭就是表格中的一項,而且在上圖的所有設備中,小豚AI 攝像頭是分析難度比較小的一款設備,比較適合與大家一起分享。
外部分析
照慣例,拿到一款新設備肯定是正常使用一下,看看設備都提供什么功能、猜一猜其背后的運行邏輯。通過監聽正常使用時的通信數據,可以獲得手機、攝像頭通信內容如下圖所示:

上圖中,手機和攝像頭之間存在COAP協議通信數據。此部分通信僅在給攝像頭配網的過程中出現,在這之后,手機和攝像頭不再直接通信,而是完全由云端轉發兩者的通信數據,攝像頭和云端的通信內容如下圖所示:

可以看到,攝像頭與云端的絕大部分通信都是TLS加密通信。事實上,攝像頭對云端的TLS證書有校驗,我們無法用簡單的中間人攻擊拿到通信內容。
除通信監聽外,我們還對攝像頭開放的tcp端口進行了掃描,截圖如下:

結果顯示該設備并沒有監聽任何tcp端口,是個麻煩的設備啊。
硬件分析
在此前的文章中,我們已經分析過不少設備固件了,這里就輕車熟路地開始吧。簡單翻閱設備官網,可以確定固件并沒有在官網提供下載鏈接。那就直接拆開設備看一看吧,如下圖所示:

可以看到,該設備使用hi3518ev300作為SoC,還有型號為winbond的16MB Flash存儲器。
分析過華為設備的小伙伴肯定知道他們官網是沒有公開海思芯片的相關資料,只有經過官方認證的組織才能拿到指定型號的芯片手冊,顯然我們并沒有被認證。不過,萬能的淘寶幫了我們一把,可以在淘寶上買到了hi3518ev300的芯片手冊以及開發SDK,這些資料在后文中發揮了重要作用。

將Flash存儲器用熱風槍從板子上吹下來,放入編程器提取Flash內容,并將提取得到的文件交給binwalk分析一下,結果很讓人滿意,該分析的都分析出來了,如下圖:

在IoT獎勵計劃的列表中,路由器、AI音箱2等設備都是無法直接用binwalk分析的,有機會再和大家分享那些設備的分析過程。
通過binwalk的分析結果,我們可以確定攝像頭中運行了一個嵌入式Linux操作系統,那么,接下來的工作就是以某種方式登錄到系統之中,由此觀察系統中程序的運行狀態并調試感興趣的程序代碼。雖然qemu也可以用于調試工作,但在原設備上直接分析和調試肯定是更好的選擇。為了登錄系統,我們踩了不少坑,這些踩坑過程我們就不在文章中復述,感興趣的讀者可以找找當時會議分享的PPT,這里直接給出我們用到的3種登錄方法:串口登錄、telnet登錄以及反向(reverse) shell 登錄。
串口分析
借助在淘寶買到的芯片手冊以及萬用表,就可以確定電路板上懸空的幾個過孔即為SoC的UART接口,如下圖:

僅僅接通電路板上的UART接口是無法正常使用UART串口的,開啟攝像頭的串口還需要兩步操作:其一是調整uboot在引導linux kernel時使用的啟動參數(bootargs);其二是調整linux啟動腳本中對串口的各種設置。
用16進制編輯器打開固件中的uboot部分,觀察這部分固件內容,并與SDK文檔中描述的uboot固件結構進行對比,如下圖:


通過對比圖4-2上下兩圖,可以確定起始4個字節為magic word,代表著設備啟動了secure boot機制。在該機制的保護下,boot rom代碼會對uboot部分進行RSA簽名校驗,以防止uboot程序被篡改。緊接著4個字節代表uboot部分的總長度,在該設備中為0x036A58字節。
由于整個uboot部分被RSA簽名校驗保護,而我們又沒有簽名私鑰以重新計算簽名,所以uboot這部分是沒辦法改動的。但是通過深入地逆向分析uboot代碼,我們發現uboot并沒有對固件其他部分進行簽名校驗,這意味著我們可以隨意調整文件系統。此外,我們又發現了linux kernel的引導參數被保存在了uboot之外的部分,如下圖所示:

上圖中,kernel的引導參數保存位置為0x40000,已經超過了uboot的范圍。所以我們可以調整引導參數,如下圖:

上圖中起始的4個字節為crc32校驗,我們更改了啟動參數,所以需要重新計算crc32值并填回此處。
接著,查看squashfs文件系統中的啟動腳本(big_run.sh和small_run.sh兩個),并對比SDK文檔中芯片手冊內容,如下圖:


可以看到,在啟動腳本中,SoC的此引腳被設置為GPIO功能。我們需要調整啟動腳本,將該引腳重新設置為UART功能,如下圖所示:

在完成上述兩個調整之后,需要將固件重新打包并燒錄至Flash中。由于linux啟動腳本在binwalk提取的squashfs文件系統中,所以我們需要用SDK中的mksquashfs工具,重新打包squashfs文件系統,具體方法在胖猴專題之前的關于海康螢石設備分析的文章中介紹過,這里就不再贅述。
完成以上工作后,給設備重新上電,即可使用串口登錄設備,如下圖:

小結
到此即是我們對小豚AI攝像頭的第一篇,在本文中,我們對此設備進行了簡單的外部分析,并順利的開啟了設備的串口功能。但事實上,我們分析的很多設備是無法啟用串口的,所以在下一篇文章中,我們會繼續分享其他的系統登錄方法。在登錄系統之后,我們還會分析其中的一個關鍵程序,就是產生TLS加密通信的關鍵程序。最后,還希望各位讀者能夠從中有所收獲。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.jmbmsq.com/1540/
暫無評論