0
| 本文作者: 又田 | 2018-08-02 17:38 |
雷鋒網(wǎng)編者按:如果說一場安全大會能召集五湖四海的白帽子們前來朝圣,看雪學院的安全開發(fā)者峰會必然算是一場。不久前,第二屆安全開發(fā)者峰會在北京國家會議中心落幕,峰會現(xiàn)場有近1000位來自全國各地的安全和開發(fā)人員參加。
本次峰會以“萬物互聯(lián),安全開發(fā)”為主題,聚焦物聯(lián)網(wǎng)及區(qū)塊鏈的開發(fā)安全,10大議題覆蓋物聯(lián)網(wǎng)、智能設備、區(qū)塊鏈、機器學習、WEB安全、逆向、安卓、iOS等前沿領(lǐng)域。
其中,來自綠盟科技的馬良以“智能設備漏洞挖掘中的幾個突破點”為演講題目是,分享了針對智能設備固件提取的攻防手段。并從嵌入式系統(tǒng)的軟硬件的基礎(chǔ)架構(gòu)、智能設備提取固件的十大方法兩個方面進行講解,其中還涉及到軟件和硬件工具,及工具的作用和用法。除此之外,馬良還對智能設備安全研究人員提取固件的常用方法進行梳理,也對開發(fā)者提出了一些安全方面的建議,避免廠家辛苦開發(fā)出的產(chǎn)品、想要保護的固件沒有保護好,被輕易提取出固件分析。

以下為演講實錄:
馬良:今天我講的目錄大綱是四點。我既做過開發(fā)者,也做過安全從業(yè)人員,在這個會議上把固件知識介紹給安全的朋友,把安全的知識做開發(fā)的朋友。
今天我講的目錄大綱是這四點。
一、智能設備基礎(chǔ)知識
二、 提取固件的十種思路
三、 從固件發(fā)掘漏洞的思路
四、 智能設備的加固建議
一、智能設備基礎(chǔ)知識
這是智能設備的組成,分為幾個部分,智能設備必須有這么幾個東西,比如它必須有CPU、內(nèi)存、相當于硬盤的flash,有網(wǎng)絡、網(wǎng)口接口、串口,有時會有SD卡插座存儲設備,也有的有顯示界面。

CPU有很多架構(gòu),有X86、Linux、ARM等等;內(nèi)存分為好幾種。存儲也有各種,比如flash、TF卡、mmc卡、硬盤;一般的電路板都會留串口,尤其做調(diào)試時。廠商做維護時不得不面對的問題:智能設備如果在使用中出現(xiàn)了問題,客戶要求馬上給解決,如果開發(fā)者沒有維護的接口,開發(fā)人員到現(xiàn)場可能解決不了問題。所以這些是必備的;有時是串口,有時是網(wǎng)口之類的;有時候是USB口。智能設備內(nèi)運行的軟件也叫固件,固件有對系統(tǒng)進行引導的部分,常用的是Uboot,這占很大市場份額;操作系統(tǒng)用Linux非常多,因為它對網(wǎng)絡的支持非常好。

跟大家介紹一下什么是串口,串口一般分為兩種類型,主要是RS232或者TTL,TTL是5V或者3.3V,相當于CPU的電壓。左下角是對串口的定義,串口真正引用的是三條線,就是RXD、TXD、DCD。串口傳輸時,有三根線的時候,是按照一定的時序傳輸?shù)?,這個時序有一定的周期,這個周期是異步產(chǎn)生的。異步傳輸有一個波特率的概念: 如:9600的波特率,換算過來大概1秒鐘傳送1000個字節(jié)。波特率越大,傳輸越快。

智能設備的組成里比較重要的還有flash,分為兩種,一種是Nor falsh,它的特點是價格比較貴、容量小、地址線和數(shù)據(jù)線是分開的,好處是CPU可直接尋址,因為電路圖上每一個地址線都是單個連出來的,數(shù)據(jù)線也是單獨連出來的。它常用做代碼存儲,存儲容量越大,這個地址線是越多的。
算一下上圖的nor Flash的地址線的尋址范圍:
8MB = 0x800000(16進制)
換算成二進制: 100000000000000000000000
地址線正好是從addr0 - addr22. 最大地址是22個1

還有一種是Nand Flash,它價格便宜、容量大,主要用作數(shù)據(jù)存儲,但這個東西一般是不可尋址,需要驅(qū)動程序。

下面講一下軟件里面的Uboot和busybox,Uboot在嵌入式里一個功能是做引導程序,啟動的時候引導用,還有一個功能是做更新時用.支持CPU的種類比較多,比如ARM、Linux、MIPS、PowerPC都支持,也支持簡單的網(wǎng)絡命令之類的。Busybox集成了三百多個常用的Linux命令和工具軟件,它非常小巧,編譯后大概在1-2兆左右,但支持的命令非常多,而且可以根據(jù)需要做裁減。例如:有的裁剪了busybox的指令nc,dd,tar等。

這是智能設備軟件和硬件的協(xié)作關(guān)系,以Linux操作系統(tǒng)為例,上面是內(nèi)存,下面是存儲flash,中間是固件,固件里面的Uboot是啟動時引導用的,啟動起來是kernel,后面跟著是文件系統(tǒng),文件系統(tǒng)里面包括RAMFS和FALSH FS。

這是升級接口,我們對維護接口要有一定的了解,為什么?因為接口是非常重要的,一個是升級時要用,另外一個是調(diào)試時要用,還有一個是升級固件時要用。調(diào)試接口的基本就是這幾個功能。
二、提取固件的十種思路
這十種思路是我所熟知的,是我經(jīng)常用的十種方法,其他不講的方法并不代表不存在。固件提取方法簡單分為硬件和軟件兩種類型。

我剛才對基礎(chǔ)知識做了大概的介紹,比如我要提取它的固件,它的固件放在flash里,我肯定要做一些了解。還有對串口和接口都要有研究。還有固件里面支持這些程序,對文件系統(tǒng)、基礎(chǔ)小命令等都要有一定的了解,這些知識和技巧利用好是可以發(fā)揮很大功效的。
智能設備提取固件的十種思路:

這里先講九種固件提取方法, 最后一種方法給大家一個驚喜!

1、 官網(wǎng)或聯(lián)系售后索取升級包。這點不多講。

2、 在線升級方式提取固件。如果有手機應用或者電腦應用,可以點“升級”,升級固件的時候就可以通過抓包的方式,把固件給抓到。如果老版本和新版本固件的下載地址有一定的命名規(guī)律的話,新版本抓到了,老版本也可以猜出來。PPT這只是一個例子,并不針對于任何廠家。

3、 逆向升級軟件,軟件內(nèi)置解包和通訊算法。如果它的設計是在下位機解密的話稍微安全點;在上位機解密的話是可以逆向破解的。

4、 從調(diào)試接口:JTAG/SWD等方式獲取固件。

騰訊玄武實驗室的小馬哥去年有兩次公開講解,今天時間所限,不做描述。

5、折flash、SD/TF卡、硬盤等,用編程器/讀卡器獲取固件。
常用的是焊下flash芯片,用編程器讀取固件,讀完后再把芯片焊回去。

需要注意的是芯片是有方向的,第一腳的地方有一個圓點,焊接或用編程器讀取時,弄清芯片的方向。

6、從串口(UART)調(diào)試口獲取固件。
這種方法是我在安全測試中幫客戶測試產(chǎn)品總結(jié)出來的。廠商自己做的產(chǎn)品,它在安全方面有追求,但可能力不從心,就找我們做安全方面的測試。還有OEM的產(chǎn)品要上市了,貼大廠的牌子,大廠肯定有安全方面的要求,不希望OEM產(chǎn)品砸了它的招牌,這時也會找我們做一個測試。
在安全測試過程中我發(fā)現(xiàn)了uboot提取固件漏洞,總結(jié)出了一系列固件提取方法。
我最常做的是工控設備漏洞安全的研究,這個東西基本是拿不到固件,拿到的固件也是加密的,困擾了我很長時間。經(jīng)過一段時間摸索之后,有了10來個成功的提取固件的案例。今年又在攝像頭方面,普通物聯(lián)網(wǎng)路由器、攝像頭等類似設備,經(jīng)過實踐研究有二三十個成功案例后,發(fā)現(xiàn)通過串口提取固件的方式是最穩(wěn)妥、最可靠的。為什么這么說呢?去給客戶做測試時,客戶說,隨便你折騰,壞了也無所謂,但樣品就這一個!我想焊下flash提取固件,但設備就這一個,萬一焊接芯片搞壞設備了,后面就無法驗證漏洞了。關(guān)鍵是工控設備一個就2、3萬,5、6萬,10幾萬,一旦給客戶搞壞設備了,就比較尷尬了。所以我慢慢想出了一些辦法,在這里與大家分享。
串口識別:串口有兩種標準,串口識別的時候,一般是把設備拆開以后,串口一般有四個腳,第一步要找到地(GND),地是很好找的,和電源相連的那個地,或者芯片跟地相連的。地確定了以后,我們把它接到USB接口上,我先把接收的腳接上,兩個腳都有可能是高電,這時把接收的腳和地接上,然后隨便接上一個腳,設備一啟動,如果這個時候只要有輸出了,就是接對了;然后把另外一個腳一接,三個腳就接好了。我一般找串口就是上面的思路。

這頁ppt是修改uboot啟動腳本進入密碼保護的登陸系統(tǒng)思路,不展開講了。共5條,每一條都是一個不用密碼進入系統(tǒng)的思路。

前面說到uboot,每次啟動時都有3秒時間,這個時間是可設的,一般有3秒時間在等待輸入(或者其它快捷鍵,一般有提示),進入uboot模式后,uboot有幫助命令,這些命令里有一條引起我的注意,就是md。md有什么作用?顯示內(nèi)存,能夠把內(nèi)存顯示出來。這就有點意思了。發(fā)現(xiàn)只要是Nor flash,md可以把Nor flash的內(nèi)容顯示出來(因為nor flash可以通過CPU直接尋址),這就相當于md命令可以提取固件。但md命令是需要知道起始地址和長度的,知道起始地址和長度就可以把固件提取出來。怎么知道起始地址和命令?我查看了更多的命令的信息,結(jié)果發(fā)現(xiàn)bdinfo和flinfo可以查看到flash起始地址和容量。如果還是找不到的話就重啟一下,重啟時不要打斷,看它會不會打印更多flash地址分布信息,通過這些信息基本就能找到起始地址把固件提取出來了。

最后把uboot提取固件的流程總結(jié)出來了:第一步,獲取flash的存儲信息,它這個flash有多大、什么型號的、CPU訪問它的地址區(qū)間是什么?第二步,用md命令提取固件信息。第三步,記錄下來。第四步,分析輸出信息,獲取固件。但這個方法的缺點是時間長一點,有的時候半個小時,有的時候2個小時。但這也無所謂,只要能穩(wěn)定的提取固件,不要把硬件損壞,焊3條線就可以搞定了。
視頻請工作人員幫我放一下。(視頻播放)我用簡單的命令去嘗試,果然能夠讀到內(nèi)核。下一步就全部讀出來,提取固件了。把上面的信息刪除掉,當時的內(nèi)存地址信息和固件沒關(guān)系就刪掉了,右邊ASCII碼信息沒關(guān)系也刪掉了。最后把文件轉(zhuǎn)成二進制,就是我要得到的固件。

成功案例比較多,暫時沒有失敗的案例。總結(jié)為三個難度(第三個Level難度不講),Level1最簡單,用md就可以搞定了,只用Nor flash做存儲。

Level2級別是Nand flash里有其他文件系統(tǒng),這里有一個命令先把nand flash讀到內(nèi)存,然后用md把內(nèi)存讀出來,這個簡單的思路就可以搞定了。

這是我當時調(diào)試的經(jīng)驗,發(fā)現(xiàn)用上面的這些命令可以獲取信息。另外一種需要重啟,重啟的方式有時會打印關(guān)鍵地址信息。
還有讀取命令,把flash里的md直接讀出來,如果讀不出來就用其他的思路,把SD卡或者其他文件系統(tǒng)的存儲讀到內(nèi)存里,最后再從內(nèi)存里讀出來,基本就是這個思路。

Uboot提取固件不是針對某一個廠商,幾乎所有廠商都存uboot安全問題,嵌入式設備里面95%都用uboot作為它的啟動,基本相當于嵌入式Linux的一個標配。在開發(fā)者大會上希望與開發(fā)者做個溝通,也希望安全研究員有新的固件提取方式或者有些漏洞利用的方式能夠讓開發(fā)者知道,也是為了讓廠家更快修復漏洞,為安全做貢獻。這個方法有可能成為未來一段時間提取固件一個比較流行的方法,我發(fā)現(xiàn)基本都能提取出固件來。
7、通過利用網(wǎng)頁和通訊漏洞獲取固件的敏感信息。這個就不做演示了,只要做安全的,這種都是小問題,通過網(wǎng)頁能夠把敏感信息提取出來,再通過字典產(chǎn)生密碼暴力猜解passwd的破解設備口令。一般是嵌入式系統(tǒng)的權(quán)限配置不當。

8、用邏輯分析儀監(jiān)聽flash,ram獲取信息。它的優(yōu)點是不用拆東西,只要把這個東西接上去就可以了,而且這個東西也挺好接的。但缺點是邏輯分析儀目前價格便宜的頻率低,但flash一般頻率比較高,都是100兆、200兆。我做了一個實驗,結(jié)果發(fā)現(xiàn)確實是可以的。需要把這幾個腳引出來,在它啟動的時候抓取數(shù)據(jù),用夾子夾在芯片上,那個標紅色的腳是第一腳。抓在上面以后,通過SPI接口把傳輸?shù)倪@個數(shù)據(jù)保存。

前面是SPI的命令,命令里面這個是輸出的數(shù)據(jù)。前面第一個是讀的意思,這三個應該是地址,后面的是數(shù)據(jù)。這邊是發(fā)出的命令,那邊是接收的命令,結(jié)果是這個邏輯分析儀提取出的東西跟flash里的固件的二進制是一致的,說明這個思路是可行的,我當時找了一個速度稍微慢點的設備,也是可以把固件提取出來的。

9、用tar/dd、nc提取固件。利用原來的硬件接口,再用它原來的軟件,可能會達到事半功倍的效果,不用焊板子。這里先是用串口,通過串口得到系統(tǒng)權(quán)限,用nc從網(wǎng)絡傳輸固件出去。

10、綜合應用
第十種固件提取方法是,前面幾種方法的融會貫通,綜合應用。它相當于“降龍十八掌”的最后一掌。
通過串口獲取權(quán)限的話,如果運氣好,它也沒有設登陸密碼,如果能夠進入系統(tǒng),就用這種方法:通過USB或者SD卡,執(zhí)行拷貝命令、打包命令,把這個打包到U盤里或者大的內(nèi)存文件系統(tǒng)里,然后再拷貝到外置文件系統(tǒng)里(U盤或TF卡)。
第二種是發(fā)現(xiàn)echo命令可以通過二進制方式寫入“1234567”,用輸入命令的方式發(fā)送二進制文件,通過命令的方式傳輸木馬,這個木馬把固件輸出來,通過串口記錄輸出,這也是一個思路。

總結(jié)固件提取方法:智能設備普遍存在uboot,如果沒有把md類似的命令屏蔽掉,是可以輕易提取固件的。智能設備固件存在flash里,flash沒有保護固件被非法讀取的措施。如果FLASH和RAM集成在CPU上,并且開啟了加密的話是比較難提取固件的。但如果它用另外一種方式:(FLASH和RAM、CPU分別獨立),是特別容易被提取固件的,原因是拆下FLASH用編程器直接能讀到flash里面的內(nèi)容了。
硬件調(diào)試接口方法方便了維護客戶,但有時也方便了不速之客,軟件如果留一個后門是便于維護,但密碼太簡單的話容易被破解或者猜測,或者容易讓別人從固件里分析出來。結(jié)論是目前部分智能設備的架構(gòu)存在一定安全隱患。

三、從固件發(fā)掘漏洞的思路

用binwalk進行固件拆解,有些同事用binwalk解不出來,但我能夠解出來,為什么?因為它是沒有掌握binwalk的安裝方法,binwalk有些依賴的軟件,這些依賴的東西都要裝全。有一個命令(./deps.sh)是需要執(zhí)行的,會把所有相關(guān)的依賴的軟件安裝,安裝以后就比較好提取了。我常用的-Me的方式提取固件。

這里舉了一個例子,可以通過密碼字典暴力破解的方式破解linux登陸密碼,如果它的密碼比較簡單,很快就破解出來了。

我以前做過開發(fā),所有的問題如果沒有思路時,就想一下開發(fā)人員會怎么做?他會留下什么調(diào)試后門?有什么接口?如果你提取固件以后。能不能查固件里系統(tǒng)的敏感信息?看一下廠家有沒有留下維護的后門密碼?如果有后門密碼就簡單了。這些看完了以后,看總共有多少網(wǎng)絡服務、網(wǎng)絡端口,網(wǎng)絡服務運行的二進制有沒有溢出點,把web調(diào)用接口調(diào)試調(diào)試,看看有沒有問題?;揪褪沁@些思路,非常簡單。時間有限,只能點一下。
四、智能設備的加固建議

信息隱藏非常重要,比如uboot把固件提取出來就是因為知道它是什么芯片,如果芯片是打磨的可能好一點,或者把封裝改了也好一點,這些重要信息要注意隱藏。

調(diào)試接口能不能屏蔽掉,比如軟件的、硬件的屏蔽掉,或者busybox不用的功能能不能去掉和裁剪掉。比如,智能設備進入系統(tǒng)都是root權(quán)限,權(quán)限太大,可以干的事情太多了,這些是可以避免的,不一定要給root權(quán)限。其他加固建議如PPT。

雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。