作者:Yimi Hu & Light @ PwnMonkeyLab
原文鏈接:https://mp.weixin.qq.com/s/Vag9k6feE9IONJYWhkq_pw
簡介
本篇我們繼續分享一些關于華為智聯旗下小豚AI攝像頭的研究內容,在上一篇文章中,我們已經通過串口順利登錄設備的Linux操作系統,接下來我們還會介紹兩種登錄設備系統的方法,可以在串口無法使用時發揮作用。
下文中,我們需要編譯可以在攝像頭設備中正常運行的程序,所以開始之前,先要把SDK開發環境配置好,比如說交叉編譯器等。好在我們買到的SDK還不錯,該有的文檔、必要的腳本一個都不差,按照指示步驟逐步操作即可。在開發文檔中,可以找到配置SDK相關的章節,如下圖:

按照上圖中的SDK安裝方法,逐步配置完成安裝SDK。在安裝過程中可能需要下載一些文件,別擔心,在正常的網絡環境下,都是可以順利下載到的,不需要額外的輔助工具。配置完畢之后,開始本篇的正題。
telnet分析
串口雖然可以登錄攝像頭設備,但畢竟還需要硬件電路連接,使用起來比較麻煩,而如果能通過telnet登錄則會更加方便快捷。啟動攝像頭的telnetd也需要兩步操作:其一是重新編譯busybox,增加telnetd功能;其二是在linux啟動腳本中掛載設備文件。
在binwalk提取的squashfs文件系統中,可以找到telnetd軟鏈接,鏈接到了busybox程序。逆向分析busybox程序之后,就可以發現固件中的busybox程序并沒有實現telnetd功能,如下圖所示:

上圖中, busybox支持的命令中沒有telnetd。為解決此問題,需要重新編譯SDK中的busybox程序,我們之前已經完成了開發環境的SDK部署工作。SDK中包含了編譯busybox所需要的代碼以及相關的makefile文件,我們只需要調整.config文件,確定編譯出的busybox程序包含telnetd、tftpd等需要的功能,然后執行make hibusybox即可,如下圖所示:

編譯完成之后,用編譯得到的busybox替換固件文件系統中的原有busybox程序,就可以保證攝像頭有了telnetd功能。接下來還需要掛載devpts設備文件,否則telnetd在建立第一個telnet連接后就會崩潰。將掛載devpts設備文件的兩條指令放在linux的啟動腳本(big_run.sh和small_run.sh)中,并加上啟動telnetd的指令,就完成了對文件系統的全部調整,如下圖:

最后,將文件系統重打包并燒錄到Flash中,再次上電后即可通過telnet登錄攝像頭設備。
反向shell分析
雖然通過前文的兩個方法已經能夠順利登錄linux操作系統了,但是Flash已經被熱風槍吹下來了,就再多準備一種后備措施,這樣可以避免因為前兩種方法都失效而翻來覆去地吹焊Flash。在本節中,我們準備了一個簡單的反向(reverse) shell作為后備措施,反向shell代碼有很多,我們隨便選擇一種就好,下面的代碼段即為我們將要編譯的reverse shell代碼:

代碼比較簡單,建立tcp連接之后,將輸入和輸出重定向到tcp連接。
用SDK中包含的交叉編譯器編譯該程序,然后用qemu進行本地測試,測試通過后將其放入固件的文件系統中,然后在linux啟動腳本中,增加啟動反向shell的指令,最后打包文件系統,燒錄固件至Flash中。待攝像頭正常啟動之后,在主機使用nc監聽設置的端口,即可通過反向shell登錄設備linux系統中,如下圖所示:

hilink程序分析
在正常登錄設備Linux系統之后,我們就開始分析和調試設備中運行的程序,在前文提到的3種登錄方式之中,telnet是最簡單易用的,所以我們在后文中統一使用telnet作為登錄方式。
首先使用ps指令查看系統中正在運行的關鍵進程,如下圖所示:

上圖中,有三個關鍵進程:hilink是負責華為智聯的關鍵模塊、ipc是負責攝像頭主要邏輯功能的模塊而monitor看起來是負責監控設備運行狀態的模塊。我們在上一篇中提到攝像頭和云端的TLS通信就是由hilink程序產生的,接下來我們就分析分析這個hilink程序。
照慣例,先開啟該程序的運行日志。通過逆向分析該程序,可以找到用于判斷是否打印日志的函數,如下圖所示:

上圖中,logLevel函數即為判斷當前等級(R0=3)的日志是否需要打印,我們只需要修改logLevel函數的返回值永遠為1,即可打印出所有日志。
通過運行日志可以大體上掌握程序的執行流程。在程序啟動后,首先會在云端注冊登錄,由關鍵字符串“LoginToCloud”找到關鍵代碼段,如下圖:

根據上圖中的內容,推測其通信內容除了TLS加密外,還有一次應用層加密。此時,僅僅做靜態分析有些困難,我們編譯一份gdbserver傳到設備上調試一下。在SDK中,包含了gdb項目,只要正常編譯出來就可以直接使用。我們編譯的busybox包含了tftp功能,可以用來傳輸文件。關于gdbserver調試相關的內容,可以參考海康螢石的那篇分析文章,這里不再復述。調試截圖如下:


通過調試可以確定,有很大一部分請求并沒有執行hilink_encrypt_coap_buf函數,這意味著并沒有進行應用層加密。
接下來,我們試著給程序打個補丁,修正一下其TLS證書,然后做一個中間人攻擊,看看是否能夠拿到通信數據,用于打補丁的腳本如下:

這個腳本功能也很簡單,只是把程序中的TLS證書更改為我們自己生成的TLS證書。
最后再寫一個實施中間人攻擊的腳本,將通信內容進行簡單的整理,即可獲得下圖中的內容:

上圖中的這些通信內容,可以幫助我們繼續深入分析,但這里就不做過多的陳述,感興趣的讀者可以自行嘗試。
小結
關于小豚AI攝像頭的分析文章到此就結束了,在這兩篇分析中,我們介紹了3種登錄linux操作系統的常用方式,分別是串口、telnet和reverse shell,各位讀者在分析其他設備時可以根據實際情況選擇其中一種合適的方法。此外,經由這兩篇對這個攝像頭進行的各種嘗試,設備已經處于一個可調試的狀態,文章中我們只對攝像頭中運行的hilink程序進行了初步分析,感興趣的讀者完全可以在此基礎上繼續探索,挖掘潛在的漏洞。最后,希望各位讀者能夠有所收獲,后續我們還會繼續分享更多的案例。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.jmbmsq.com/1541/
暫無評論