如何在物聯網設備中尋找復雜的惡意軟件(下)
物聯網固件分析
有各種各樣的開放源代碼和封閉源代碼工具可以幫助進行固件分析,最好的方法是結合由經驗豐富的固件分析師建議的工具和技術。
讓我們從最全面的固件分析工具Binwalk開始,Binwalk掃描固件二進制文件并查找已知的模式和簽名。
它為物聯網設備中使用的各種啟動程序和文件系統收集了大量簽名,它還具有用于通用加密和壓縮算法的簽名,以及用于解壓縮和解碼的相應例程。
Binwalk還能夠提取其在固件二進制文件中找到的組件。
以下屏幕截圖顯示了對示例固件二進制文件的Binwalk掃描的輸出:
Binwalk掃描輸出
在這個屏幕截圖中,Binwalk已經找到并打印出了頭文件、引導加載程序和Linux內核以及文件系統。還有從標頭文件和組件本身提取的元數據細節,比如每個組件的類型和大小、CRC校驗和、重要地址、CPU架構、圖像名稱等等。現在,你可以繼續使用Binwalk本身來提取上述部件,或者根據Binwalk找到的開始偏移量手工計算大小并提取部件。
在解壓縮固件組件之后,你可以繼續對文件系統進行解壓縮、解壓甚至掛載,并開始研究文件系統內容。你還可以查看反匯編程序中的引導加載程序代碼,或者通過調試器對其進行調試。
但是,進行固件分析并不總是那么簡單。固件種類繁多,以至于了解其結構和提取組件通常非常復雜。
讓我們仔細看看另一個示例固件,并嘗試了解其結構。
1. Binwalk firmware.bin
Binwalk掃描未顯示任何結果,這意味著Binwalk找不到任何已知的簽名。
Binwalk掃描輸出
在本文的示例中,我們可以看到簡單的Binwalk掃描不是很有幫助。但是,請注意,還有其他工具和技術可以用來了解有關此固件結構的更多信息。
2. 文件firmware.bin
接下來讓我們嘗試固件二進制文件上的Linux文件實用程序。
文件實用程序輸出
文件實用程序將文件類型顯示為Targa圖像數據,通過查看二進制文件的開頭,并對Targa圖像數據簽名進行Google搜索,得到的結果顯然是假的。
固件二進制文件的第一個字節
這是因為固件文件的第一個字節0x01010000與Targa圖像數據簽名匹配,參見上面的截圖。
3. Binwalk:E firmware.bin
讓我們使用Binwalk的另一項功能,并檢查固件二進制文件的熵。
使用“ -E”命令選項運行Binwalk會給出固件文件的熵圖以及一些其他詳細信息,例如下降和上升熵的偏移量。
熵的詳細信息
熵圖
熵值接近1表示壓縮,較低的熵值表示未壓縮和未加密的區域。從上面的屏幕截圖可以看出,偏移量55296 (0xD800)是高熵部分的開始。
還有另一個工具可以幫助可視化二進制文件,借助binvis.io,你可以在兩個并排的窗格中查看固件文件的內容及其可視化,不同的部分根據它們的熵(binvis.io)用不同的顏色表示。
可視化binvis.io創建的固件
4. Binwalk:A firmware.bin
Binwalk還可以掃描二進制文件以查找常見的可執行操作碼簽名。
在文件中找到的第一個函數序言
在文件中找到的最后一個函數序言
正如我們從上面的截圖中看到的,操作碼簽名檢查的結果實際上非常有用!首先,我們可以看到固件屬于ARM設備。
其次,如果我們考慮第一個和最后一個函數序言簽名的偏移量,我們會得到一個指示,即這些是固件二進制文件中包含代碼的部分。
從屏幕截圖中,我們還可以看到在函數0xD600處找到了最后一個函數,該地址僅在熵上升部分之前的0x200字節處。由此,我們可以進行有根據的猜測,即該偏移量很可能是啟動加載程序代碼的結尾和壓縮內核模塊的開頭。
5. Hexdump -C
- hexdump -C firmware.bin | grep -C 4 -e “^\*$”
既然我們知道了固件文件中某些組件的大致邊界,可以嘗試通過查看這些區域周圍固件文件的實際內容來確認這些邊界偏移量。
如果我們通過十六進制轉儲運行固件文件,并查找僅包含星號“*”的行,我們可以找到編譯器為每個固件組件添加的填充。
固件二進制文件的內容
固件二進制文件其他部分的內容
Hexdump實用程序的輸出以及之前的發現,確認了包含ARM代碼的固件二進制文件中的這一部分,我們先前懷疑此代碼屬于啟動加載程序。
6. 字符串:radix = x firmware.bin
接下來,讓我們從固件中提取ASCII字符串及其偏移量。
固件二進制文件中找到的最后一個ASCII字符串
查看上面的屏幕截圖,有一些與模塊入口點相關的字符串,這些字符串可以很好地表明所涉及代碼的性質。
在下面的屏幕截圖中,我們可以從固件二進制文件的開頭看到一些其他有趣的字符串。例如,“MctlApplet.cpp”庫名稱可用于從同一開發人員中查找其他二進制文件或程序包,擁有來自同一供應商的其他固件映像有助于更好地了解二進制結構。
來自同一截屏的另一個有趣的字符串是“Not Booting from softloader”,它可以指示進程狀態或者這個模塊的性質。
包含“Assert()”的字符串可以建議有關代碼的不同信息,在固件開發中,使用Asserts是一種常見的做法,因為它可以幫助開發人員在開發和生產階段調試和故障調試代碼。
在固件二進制文件中找到第一個ASCII字符串
7. IDA:parm firmware.bin
可以看到,我們已經從此固件二進制文件中收集了許多有價值的信息,這些信息在一開始看起來是相當難以理解的。
現在讓我們使用IDA來檢查代碼,由于此二進制文件不是帶有顯示ISA的標準標頭的ELF文件,因此我們需要明確告知IDA使用ARM指令集來反匯編代碼。
IDA中部分函數的反匯編視圖
上面來自IDA的屏幕截圖顯示了如何使用前面分析步驟中找到的字符串來幫助查找對內核模塊入口點的調用。
8. dd
現在,可以繼續提取固件二進制文件的一部分,我們的分析發現它是引導加載器模塊。
9. Qemu
從固件二進制文件中提取了所有模塊(文件系統內容,內核模塊和其他組件)之后,我們可以使用Qemu運行二進制文件,甚至模擬與本機不同的體系結構的文件,并開始與他們互動。
總結
物聯網設備的數量每天都在增加,從工業控制系統、智能城市、智能汽車到移動電話、網絡設備、個人助理、智能手表和各種各樣的智能家電。
物聯網設備源自已經存在多年的嵌入式系統,由于嵌入式設備的軟件性質不同,因此與通用計算機系統相比,嵌入式設備軟件的制造和開發始終具有不同的優先級。這些優先次序是由設備本身有限和具體的功能、基礎硬件有限的能力和能力以及開發的代碼無法用于后來的修改和修改而形成的。然而,物聯網設備與傳統嵌入式系統有顯著的區別。現在大多數物聯網設備運行在硬件上,這些硬件具有與通用計算機系統類似的能力。
隨著物聯網設備的日益普及,它們現在正在訪問和控制我們生活的許多方面以及日常交互。物聯網設備現在可以潛在地為惡意攻擊者提供前所未有的攻擊機會。這凸顯了物聯網設備中安全性的重要性,也顯示了圍繞該主題進行研究的必要性。好消息是,目前已經有許多工具和技術可用于協助該主題的研究。
本文翻譯自:
https://www.trendmicro.com/en_us/research/20/i/exploitable-flaws-found-in-facial-recognition-devices.html