Tag

嵌入式系統

Browsing

作者:威努特工控安全

公眾號: 威努特工控安全

工控漏洞挖掘方法有很多種,常見的方法包括:基於工控協議的模糊測試漏洞挖掘方法、基於韌體逆向分析的漏洞挖掘方法、基於工控軟體ActiveX控制元件的漏洞挖掘方法、基於VxWorks作業系統的漏洞挖掘方法等。

本文將重點論述韌體逆向分析方法,同時結合實際案例來講解逆向分析過程中遇到的關鍵問題及解決方法。

1、韌體逆向分析方法

韌體逆向分析方法是在不對嵌入式系統進行實際執行的情況下,通過對韌體檔案進行逆向解析,分析韌體中各程式碼模組的呼叫關係及程式碼內容,從而發現嵌入式系統中可能存在的漏洞及後門的一種技術手段。

在韌體逆向分析的過程中,將會涉及到韌體的識別和解壓、韌體的靜態分析等技術。

1.1、韌體的識別和解壓

韌體的識別和解壓,可以借用一些成熟的工具軟體,如:Binwalk、BAT(Binary Analysis Toolkit)等。Binwalk和BAT均為比較流行的韌體映像提取和分析工具。Binwalk以MIT License釋出,BAT以GPL License釋出。它們支援的韌體映像解壓格式對比表如下:

工控漏洞挖掘方法之韌體逆向分析


表1. Binwalk和BAT支援的韌體解壓格式對比

對於常見的嵌入式裝置韌體可以使用Binwalk或BAT來解壓並提取韌體檔案。對於無法自動解壓的韌體,可以嘗試以下方法分析:

  1. 使用檔案分析工具獲得韌體映像檔案的基本資料型別。
  2. 使用字串列印工具提取檔案中所包含的明碼欄位,尋找是否有引導裝載程式以及作業系統核心的資訊。
  3. 使用十六進制轉儲工具(如hexdump)分析爲了對齊韌體檔案空間分段而放入的連續填充位元組,檔案系統標識有可能緊跟其後。
  4. 檔案系統有可能使用非標準的特徵符,如果發現可疑特徵符欄位,可以替換為標準特徵符,再嘗試由韌體解壓工具進行識別。

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所示。

工控漏洞挖掘方法之韌體逆向分析


圖1. 韌體壓縮型別分析

其次,使用Binwalk提取zlib壓縮的檔案,如圖2所示。解壓後的檔案385儲存在 _NOE77101.bin.extracted 目錄中,並以檔案在韌體升級包中的起始位置來命名。

工控漏洞挖掘方法之韌體逆向分析


圖2. NOE77101.bin檔案解壓

接著,使用Binwalk對385檔案進行分析,發現韌體中的一些路徑名、作業系統版本和符號表地址等關鍵資訊。該韌體的作業系統版本是VxWorks 2.5,可以結合VxWorks的原始碼來進行逆向分析。該韌體的符號表地址如圖4所示,符號表可以用來修復反彙編程式碼中的函式名,詳見2.1.3節論述。

工控漏洞挖掘方法之韌體逆向分析


圖3. 385檔案解壓

工控漏洞挖掘方法之韌體逆向分析


圖4. 解壓後發現作業系統版本和符號表地址

2.1.2、韌體載入地址提取

由於嵌入式系統的韌體需要載入到記憶體中的特定位置進行執行,這個特定的位置叫做韌體載入地址(base address)。

嵌入式系統韌體的函式呼叫地址是基於韌體載入地址所計算出的記憶體位置,而不是韌體中的偏移量位置。

因此,爲了使反彙編工具軟體(如IDA Pro)能夠正確的分析函式呼叫關係,我們需要分析出韌體載入地址,否則所有的函式呼叫關係都將是錯誤的。

針對使用ELF封裝的韌體檔案,在ELF檔案的頭部有特定的資料位記錄了該韌體的載入地址,因此我們可以直接讀取ELF檔案頭,從而直接獲取到韌體的載入地址。

如果韌體沒有使用任何封裝,那麼就需要對韌體的程式碼進行逆向,從而分析出韌體的載入地址。這個方法比較複雜,針對不同的嵌入式系統及CPU架構都有區別。

針對NOE771的韌體,我們將通過分析韌體頭部的程式碼呼叫來大致猜測韌體的載入地址。

1)獲取CPU架構,選擇正確的反彙編引擎

首先,使用Binwalk – A命令來獲取目標韌體的CPU架構等資訊,該資訊有助於選擇正確的反彙編引擎,如圖5所示目標韌體的CPU架構為PowerPC big endian。

工控漏洞挖掘方法之韌體逆向分析


圖5. 獲取韌體的CPU架構

其次,使用IDA Pro載入PowerPC big endian架構的反彙編引擎進行分析。

工控漏洞挖掘方法之韌體逆向分析


圖6. 選擇IDA Pro的反彙編引擎

2)分析韌體載入地址,進行正確的反彙編

當未修改韌體載入地址時,IDA Pro僅僅分析出了極少數的函式,如圖7所示。

工控漏洞挖掘方法之韌體逆向分析


圖7. 未修改載入地址時IDA Pro分析的函式

通過對韌體頭上的程式碼進行分析後(往往很耗時),可以發現在0x09f8的位置有一段非常可疑的函式呼叫。該函式呼叫地址為一個偏移量0x339AB8+一個絕對地址0x10000,有相當大的可能0x10000就是我們所需要的韌體載入地址。

工控漏洞挖掘方法之韌體逆向分析


圖8.韌體載入地址分析和提取

現在我們需要驗證0x10000是否是我們真正的韌體載入地址。重新使用IDA Pro載入韌體檔案,並按照下圖進行配置。配置完成後,IDA Pro能夠正常的分析韌體的函式呼叫關係。

工控漏洞挖掘方法之韌體逆向分析


圖9.重新配置韌體載入地址

2.1.3、韌體反彙編程式碼中的函式名修復

上一節,IDA Pro雖然成功分析出了函式的呼叫關係,但是尚無法自動識別出函式名,這對我們的進一步分析造成了很大的阻礙。

因此,我們需要檢視韌體是否包含了符號表。如包含了符號表,就可以利用符號表中的內容,來修復IDA Pro中所顯示的函式名。

1)獲取符號表在韌體中的位置

VxWorks系統的符號表包含了函式及函式名的對應關係,因此我們的第一步是要找到符號表在韌體中的位置。之前使用Binwalk分析韌體時,已經發現了韌體中的符號表位置為0x301E74。

工控漏洞挖掘方法之韌體逆向分析


圖10.獲取符號表在韌體中的位置

2)確定符號表的起始及結束地址

在獲取了符號表在韌體中的位置後,我們可以使用16進位制編輯器對韌體進行檢視,從而確認Binwalk分析出的地址是否正確。

VxWorks系列的位元組排序有獨特的格式,以16個位元組為一組資料,前4個位元組是函式名的記憶體地址,後4個位元組是函式的記憶體位置,然後以另4個特徵位元組資料+4個位元組0x00結尾。

通過檢視Binwalk分析出的地址位置可見,這個地址的確是符號表,0x27655C是函式名所在的記憶體地址,0x1FF058是函式的記憶體位置。

由於符號表有自己的特徵,因此能夠通過遍歷的方式快速的鎖定符號表的起始及結束地址。我們所測試的韌體的符號表起始地址為0x301e64+0x10000,結束地址為0x3293a4+0x10000。

工控漏洞挖掘方法之韌體逆向分析


圖11.確定符號表的起始及結束地址

3)編寫指令碼外掛修復函式名

在得到了符號表的位置後,我們需要使用IDA Pro的API來修復函式名,這裏將使用如下的Python指令碼。

工控漏洞挖掘方法之韌體逆向分析


圖12.編寫指令碼外掛修復函式名

4)執行指令碼外掛修復反彙編程式碼中的函式名

在IDA Pro中執行Python指令碼,如下圖所示。

工控漏洞挖掘方法之韌體逆向分析


圖13.執行指令碼外掛修復函式名

指令碼執行完畢後,IDA Pro中的函式名,如下圖所示。

工控漏洞挖掘方法之韌體逆向分析


圖14.修復函式名後的IDA Pro反彙編介面

2.2、施耐德NOE 771後門賬號分析

在韌體逆向分析完畢後,可以通過檢視韌體的服務載入過程,來檢視初始化時所新增的賬號等資訊。

檢視usrAppInit函式,可以發現大量的loginUserAddd呼叫,如圖15所示。同時可以發現多個後門賬號,如圖16所示。

工控漏洞挖掘方法之韌體逆向分析


圖15.發現多個loginUserAdd呼叫

工控漏洞挖掘方法之韌體逆向分析


圖16.發現多個後門賬號

3、小結

基於韌體逆向分析的漏洞挖掘方法可以發現隱藏較深的軟體後門漏洞,是一種非常實用的漏洞挖掘方法。在工業控制領域,存在著數量龐大的嵌入式系統,這些系統大多采用韌體升級的方式更新,多數韌體只壓縮未加密,多數韌體採用VxWorks系統,因此本文論述的韌體逆向分析方法具有普遍的通用性,建議感興趣者多加嘗試,會有效的發現各類安全漏洞。