作者:威努特工控安全
公眾號:威努特工控安全
工控漏洞挖掘方法有很多種,常見的方法包括:基于工控協議的模糊測試漏洞挖掘方法、基于固件逆向分析的漏洞挖掘方法、基于工控軟件ActiveX控件的漏洞挖掘方法、基于VxWorks操作系統的漏洞挖掘方法等。
本文將重點論述固件逆向分析方法,同時結合實際案例來講解逆向分析過程中遇到的關鍵問題及解決方法。
1、固件逆向分析方法
固件逆向分析方法是在不對嵌入式系統進行實際運行的情況下,通過對固件文件進行逆向解析,分析固件中各代碼模塊的調用關系及代碼內容,從而發現嵌入式系統中可能存在的漏洞及后門的一種技術手段。
在固件逆向分析的過程中,將會涉及到固件的識別和解壓、固件的靜態分析等技術。
1.1、固件的識別和解壓
固件的識別和解壓,可以借用一些成熟的工具軟件,如:Binwalk、BAT(Binary Analysis Toolkit)等。Binwalk和BAT均為比較流行的固件映像提取和分析工具。Binwalk以MIT License發布,BAT以GPL License發布。它們支持的固件映像解壓格式對比表如下:

對于常見的嵌入式設備固件可以使用Binwalk或BAT來解壓并提取固件文件。對于無法自動解壓的固件,可以嘗試以下方法分析:
- 使用文件分析工具獲得固件映像文件的基本數據類型。
- 使用字符串打印工具提取文件中所包含的明碼字段,尋找是否有引導裝載程序以及操作系統內核的信息。
- 使用十六進制轉儲工具(如hexdump)分析為了對齊固件文件空間分段而放入的連續填充字節,文件系統標識有可能緊跟其后。
- 文件系統有可能使用非標準的特征符,如果發現可疑特征符字段,可以替換為標準特征符,再嘗試由固件解壓工具進行識別。
1.2、固件的靜態分析
固件解壓之后的分析主要集中在對常見漏洞入口進行針對性的靜態分析,包括:密碼、默認開啟的服務、端口、配置文件等。
分析方法如下:
1)嘗試提取文件中包含的明碼字段是否存在硬編碼密碼等。
2)發掘固件的關聯性,包括分析固件作者、庫使用、目錄結構、配置文件關鍵字、定制默認密碼等信息。
3)對二進制可執行文件進行反匯編分析,可以借用一些成熟的工具軟件,如:IDA Pro、Capstone等。對特定的嵌入式系統(如VxWorks)的登錄模塊進行反匯編分析,獲取其登錄密碼的哈希算法等信息。
IDA Pro是應用最廣泛的靜態反匯編工具,它支持對大量的CPU架構進行逆向分析,包括X86、MIPS、PowerPC及Arm等。
Capstone是一個反匯編框架,它支持多種平臺,能夠運行在Windows、Mac OS X、Linux、 FreeBSD、OpenBSD和Solaris中。Capstone可反匯編ARM、ARM64 (ARMv8)、MIPS、PPC和X86架構下的應用。
4)如果發現包含密碼哈希的文件,可考慮使用John the Ripper或Hash Suite等工具進行暴力破解。前者有版本支持GPU加速(支持CUDA和OpenCL)。使用暴力破解工具可以利用前述步驟中提取的關鍵字,顯著加快運行效率。
2、固件逆向分析案例
本文將針對施耐德NOE 771固件進行逆向分析,NOE 771是施耐德Quantum系列PLC的以太網模塊,Quantum系列PLC是施耐德的高端PLC,應用在我國核心能源調度網絡系統中,如:西氣東輸的區域子段SCADA系統。
在分析過程中,我們將重點論述固件的識別和解壓、固件加載地址提取和固件反匯編代碼中的函數名修復等關鍵技術。
2.1、施耐德NOE 771固件逆向分析
2.1.1、固件的識別和解壓
1)固件升級包的獲取
我們可以從施耐德官方網站下載固件升級包,從該升級包中提取固件文件。NOE 771的固件文件名為NOE77101.bin。
2)固件的識別和解壓
首先,使用Binwalk來確認該文件的壓縮類型,發現為zlib類型,如圖1所示。
其次,使用Binwalk提取zlib壓縮的文件,如圖2所示。解壓后的文件385存儲在_NOE77101.bin.extracted目錄中,并以文件在固件升級包中的起始位置來命名。
接著,使用Binwalk對385文件進行分析,發現固件中的一些路徑名、操作系統版本和符號表地址等關鍵信息。該固件的操作系統版本是VxWorks 2.5,可以結合VxWorks的源碼來進行逆向分析。該固件的符號表地址如圖4所示,符號表可以用來修復反匯編代碼中的函數名,詳見2.1.3節論述。
2.1.2、固件加載地址提取
由于嵌入式系統的固件需要加載到內存中的特定位置進行運行,這個特定的位置叫做固件加載地址(base address)。
嵌入式系統固件的函數調用地址是基于固件加載地址所計算出的內存位置,而不是固件中的偏移量位置。
因此,為了使反匯編工具軟件(如IDA Pro)能夠正確的分析函數調用關系,我們需要分析出固件加載地址,否則所有的函數調用關系都將是錯誤的。
針對使用ELF封裝的固件文件,在ELF文件的頭部有特定的數據位記錄了該固件的加載地址,因此我們可以直接讀取ELF文件頭,從而直接獲取到固件的加載地址。
如果固件沒有使用任何封裝,那么就需要對固件的代碼進行逆向,從而分析出固件的加載地址。這個方法比較復雜,針對不同的嵌入式系統及CPU架構都有區別。
針對NOE771的固件,我們將通過分析固件頭部的代碼調用來大致猜測固件的加載地址。
1)獲取CPU架構,選擇正確的反匯編引擎
首先,使用Binwalk - A命令來獲取目標固件的CPU架構等信息,該信息有助于選擇正確的反匯編引擎,如圖5所示目標固件的CPU架構為PowerPC big endian。
其次,使用IDA Pro加載PowerPC big endian架構的反匯編引擎進行分析。
2)分析固件加載地址,進行正確的反匯編
當未修改固件加載地址時,IDA Pro僅僅分析出了極少數的函數,如圖7所示。
通過對固件頭上的代碼進行分析后(往往很耗時),可以發現在0x09f8的位置有一段非常可疑的函數調用。該函數調用地址為一個偏移量0x339AB8+一個絕對地址0x10000,有相當大的可能0x10000就是我們所需要的固件加載地址。
現在我們需要驗證0x10000是否是我們真正的固件加載地址。重新使用IDA Pro加載固件文件,并按照下圖進行配置。配置完成后,IDA Pro能夠正常的分析固件的函數調用關系。
2.1.3、固件反匯編代碼中的函數名修復
上一節,IDA Pro雖然成功分析出了函數的調用關系,但是尚無法自動識別出函數名,這對我們的進一步分析造成了很大的阻礙。
因此,我們需要查看固件是否包含了符號表。如包含了符號表,就可以利用符號表中的內容,來修復IDA Pro中所顯示的函數名。
1)獲取符號表在固件中的位置
VxWorks系統的符號表包含了函數及函數名的對應關系,因此我們的第一步是要找到符號表在固件中的位置。之前使用Binwalk分析固件時,已經發現了固件中的符號表位置為0x301E74。
2)確定符號表的起始及結束地址
在獲取了符號表在固件中的位置后,我們可以使用16進制編輯器對固件進行查看,從而確認Binwalk分析出的地址是否正確。
VxWorks系列的字節排序有獨特的格式,以16個字節為一組數據,前4個字節是函數名的內存地址,后4個字節是函數的內存位置,然后以另4個特征字節數據+4個字節0x00結尾。
通過查看Binwalk分析出的地址位置可見,這個地址的確是符號表,0x27655C是函數名所在的內存地址,0x1FF058是函數的內存位置。
由于符號表有自己的特征,因此能夠通過遍歷的方式快速的鎖定符號表的起始及結束地址。我們所測試的固件的符號表起始地址為0x301e64+0x10000,結束地址為0x3293a4+0x10000。
3)編寫腳本插件修復函數名
在得到了符號表的位置后,我們需要使用IDA Pro的API來修復函數名,這里將使用如下的Python腳本。
4)運行腳本插件修復反匯編代碼中的函數名
在IDA Pro中運行Python腳本,如下圖所示。
腳本執行完畢后,IDA Pro中的函數名,如下圖所示。
2.2、施耐德NOE 771后門賬號分析
在固件逆向分析完畢后,可以通過查看固件的服務加載過程,來查看初始化時所添加的賬號等信息。
查看usrAppInit函數,可以發現大量的loginUserAddd調用,如圖15所示。同時可以發現多個后門賬號,如圖16所示。
3、小結
基于固件逆向分析的漏洞挖掘方法可以發現隱藏較深的軟件后門漏洞,是一種非常實用的漏洞挖掘方法。在工業控制領域,存在著數量龐大的嵌入式系統,這些系統大多采用固件升級的方式更新,多數固件只壓縮未加密,多數固件采用VxWorks系統,因此本文論述的固件逆向分析方法具有普遍的通用性,建議感興趣者多加嘗試,會有效的發現各類安全漏洞。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/613/