施耐德NOE77101以太网模块固件逆向漏洞挖掘
MIS 固件逆向漏洞挖掘
實驗?zāi)康?/h2>
選取任意一個路由器、攝像頭或者其它智能設(shè)備的固件漏洞,對目標(biāo)固件進(jìn)行逆向工程和漏洞分析,剖析漏洞機理,找到漏洞利用方法,編寫漏洞利用代碼,展示漏洞利用效果,簡述漏洞防護(hù)方法;標(biāo)明漏洞的CVE編號,壓縮包中包含固件、源代碼等。
實驗準(zhǔn)備
-
所選固件:施耐德NOE77101以太網(wǎng)模塊固件
-
漏洞編號:CVE-2011-4859
-
漏洞選擇理由:施耐德公司的大量PLC設(shè)備被大量部署于我國能源、電力、化工等行業(yè)工業(yè)控制網(wǎng)絡(luò)中,比如Modicon Quantum 系列PLC作為高端PLC參與著我國核心能源調(diào)度網(wǎng)絡(luò)系統(tǒng),如西氣東輸區(qū)域子段SCADA系統(tǒng)。
然而,作為全球能效管理專家的施耐德電氣公司雖然有著同行業(yè)難以望其項背的技術(shù)產(chǎn)品,但至少在早年間暴露的CVE-2011-4859漏洞側(cè)面反映了其對于網(wǎng)絡(luò)安全的忽視,該漏洞涉及施耐德多款PLC設(shè)備,包含其CPU模塊和以太網(wǎng)模塊。通過默認(rèn)賬號,破壞者可以遠(yuǎn)程登錄訪問設(shè)備Telnet、Windriver或FTP服務(wù),登錄后可獲取設(shè)備實時數(shù)據(jù)、掌握設(shè)備權(quán)限、甚至破壞網(wǎng)絡(luò),直接威脅到設(shè)備甚至設(shè)備所在網(wǎng)絡(luò)的安全。而在這個漏洞被曝出后,施耐德公司花了兩年時間才更新了固件,然而新固件仍舊存在大量安全漏洞,許多問題完全沒有解決。
因此,這一經(jīng)典的漏洞及其衍生題目被不少信息安全比賽選用于題目中,筆者知道的有兩個:2018工業(yè)信息安全技能大賽,與2020工業(yè)信息安全技能大賽(ICSC)石家莊站——簡單的固件逆向分析(CTFHUB中已收錄)。故而選擇它作為本次作業(yè)的分析對象。
固件下載鏈接:https://github.com/ameng929/NOE77101_Firmware
-
主機:win 10
-
虛擬環(huán)境:kali 2021.4 / win 7
實驗步驟
下載固件后解壓文件,名為FLASH0的文件夾中,wwwroot/classes/內(nèi)的jar文件即是Web配置端APP文件,而wwwroot/conf/exec/NOE77101.bin很明顯就是NOE77101的固件了。另外,fw/fw.ini文件內(nèi)是固件版本,打開可以看到是6.40版本
諷刺的是,就筆者了解,這個6.40版本就是施耐德公司修了兩年修出來的新固件,相關(guān)問題并沒有完全得到修復(fù),原先的版本是3.60
一、簡單的破解-分析jar格式的APP文件
通常來說(比如實驗準(zhǔn)備中提到的兩個信息安全比賽)要求僅僅找出后門密碼即可,而如果只是想要實現(xiàn)這一目標(biāo),我們可以走捷徑,要做的就是分析jar格式的APP文件即可。針對.jar文件的逆向分析,常使用的工具是JD-GUI,安裝該工具需要提前配置java環(huán)境。
jd-gui的github下載鏈接:https://github.com/java-decompiler/jd-gui/releases
下載jd-gui-1.6.6.jar即可,拖入虛擬機中就可以直接使用,無需安裝。
用下列命令打開工具,拖入所有.jar包,工具會自動反編譯源碼
java -jar jd-gui-1.6.6.jarwindows上使用的話可以直接雙擊打開
顯然,工程師在打包文件的時候并沒有使用加殼或者混淆等手段,源碼清晰可讀,那接下來就簡單了,我們直接搜索pwd, password, PASSWORD等常見字符后,就直接得到了密碼。
連帶著用戶名一起,我們就拿到了后門賬戶,進(jìn)一步搜索我們還能看到,這是ftp連接的默認(rèn)賬號及密碼
到這里,常規(guī)題目一般就不會要求更多了,但是我們本次作業(yè)的內(nèi)容是固件漏洞分析,所以我們還需要更進(jìn)一步,從固件本身開始逆向。
二、bin固件分析
首先我們先用binwalk跑一下,可以看出從0x385位置后為Zlib壓縮格式
這里我們可以直接打開16進(jìn)制編輯器,將0x385之前的部分截掉,再用python調(diào)用zlib庫解壓并保存為新的固件,不妨就叫NOE77101_cut_de.bin
import zlib results = zlib.decompress(open('NOE77101_cut_de.bin', 'rb').read()) open('NOE77101_cut_de.bin', 'wb').write(results)又或者可以用binwalk -e命令提取文件,解壓后的文件385存儲在_NOE77101.bin.extracted目錄中,實際上這個文件名就是以文件在固件升級包中的起始位置來命名的,再次binwalk385文件,我們能得到更多信息
我們發(fā)現(xiàn)輸出信息多了許多,包含LZMA壓縮格式的數(shù)據(jù)、HTML、XML文件、系統(tǒng)內(nèi)核固件以及重要的字符串信息等。可以解讀的有固件依賴系統(tǒng)VxWorks WIND kernel version “2.5”,符號表的地址也給出來了,即最后一行的 0x301E74 ,這在之后的修復(fù)函數(shù)中會很有用。
VxWorks 操作系統(tǒng)是美國WindRiver(風(fēng)河)公司于設(shè)計開發(fā)。它以其良好的可靠性和卓越的實時性被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實時性要求極高的領(lǐng)域中,如衛(wèi)星通訊、軍事演習(xí)、彈道制導(dǎo)、飛機導(dǎo)航等。在美國的 F-16、FA-18戰(zhàn)斗機、B-2 隱形轟炸機和愛國者導(dǎo)彈上,甚至在火星登陸的探測器也都使用了VxWorks系統(tǒng)。最新的VxWorks7的口號是——為全球智能連接設(shè)備和系統(tǒng)提供動力。
用 strings 385 命令我們可以提取文件中的字符串,雖然總的內(nèi)容特別多,但是還是可以找到一些有用的信息,比如下圖顯示設(shè)備CPU為PowerPC,這對后面的逆向是很有用的信息。
接下來,我們用IDA來進(jìn)行逆向分析,因為筆者在linux上沒有IDA pro,所以將文件遷移到有IDA的win 7虛擬機上進(jìn)行。
將固件拖入IDA中,注意選擇處理器型號為PPC,然后一路默認(rèn),IDA會提示你找不到代碼段起始地址,這是正常的,我們接下來就要重定位代碼段基址。確定基址的思路是尋找一條相對尋址方式的lis指令。在IDA中使用ALT+T直接搜lis指令,CTRL+T進(jìn)行向下(上)搜索,發(fā)現(xiàn)在000009F8處的lis指令
嵌入式系統(tǒng)固件需要加載到內(nèi)存中特定位置運行,這個特定位置就是固件加載地址
固件加載地址 = 符號表中字符串的地址 - 相應(yīng)字符串在固件中的偏移
嵌入式系統(tǒng)固件的函數(shù)調(diào)用地址是基于固件加載地址所計算出的內(nèi)存位置,而不是固件中的地址
觀察地址后面的@ha確定基址為0x10000,這也是固件常用基址,關(guān)于@h與@ha的問題是PowerPC匯編的特性問題,這里不詳細(xì)說,可以看這個blog:
http://blog.chinaunix.net/uid-20663797-id-35772.html
接下來重新載入ida,還是處理器選擇PPC模式,這次的基址就可以填上0x10000了
這時候我們發(fā)現(xiàn)其實也不能真正的找到函數(shù),這是因為IDA找不到代碼段起始地址從而反編譯失敗,我們從網(wǎng)上找到了相關(guān)的腳本文件用來重構(gòu)符號表,從而修復(fù)函數(shù)名。
腳本鏈接:https://github.com/p1Kk/idc-idapython/blob/main/noe711.idc
執(zhí)行重構(gòu)符號表腳本的前提是需要先確定符號表在固件的具體位置,還記得之前binwalk出來的符號表起始位置嗎?我們再次打開hex編譯器,這次我們還需要找到符號表的結(jié)束位置。
所以符號表的結(jié)束位置是 0x3293b4 ,據(jù)此我們就能完成腳本的填寫了
/* 腳本內(nèi)容 */ /* Ruben Santamarta - IOActive */ /* Rebuild VxWorks Symbol Table */#include <idc.idc>static main() {auto load_addr;auto ea;auto offset;auto sName;auto eaStart;auto eaEnd; // You'll need to adjust these valuesload_addr = 0x10000; /* 加載地址 */ eaStart = 0x301E74 + load_addr; /* 符號表起始地 */eaEnd = 0x3293b4 + load_addr; /* 符號表結(jié)束地址 */SetStatus(IDA_STATUS_WORK);ea = eaStart;while( ea < eaEnd) {MakeDword( ea );offset = 0;if ( Dword( ea ) == 0x900 || Dword( ea ) == 0x500){offset = 8;}else if( Dword( ea ) == 0x90000 || Dword( ea ) == 0x50000 ){ offset = 0xc;} if( offset ){MakeStr( Dword( ea - offset ), BADADDR); sName = GetString( Dword( ea - offset ), -1, ASCSTR_C ) ; if ( sName ){if( Dword( ea ) == 0x500 || Dword( ea ) == 0x50000){if ( GetFunctionName( Dword( ea - offset + 4) ) == "" ){MakeCode( Dword( ea - offset + 4) );MakeFunction( Dword( ea - offset + 4), BADADDR ); }}MakeName( Dword( ea - offset + 4 ), sName ); }}ea = ea + 4; }SetStatus(IDA_STATUS_READY); }將上面的代碼復(fù)制,寫入記事本中,更改后綴名為.idc
在IDA中選擇file-script file,將寫好保存的.idc文件導(dǎo)入,我們就能得到所有真正的函數(shù)了。
接下來就是枯燥的分析函數(shù)調(diào)用了,從_sysInit函數(shù)開始,我們找到一個usrInit的函數(shù)比較可疑
我們可以接著用view-open subviews-proximity browser查看它的調(diào)用關(guān)系圖
順著一個個查下來,大致的調(diào)用關(guān)系是這樣的:
重點在于最后一個函數(shù),usrAppInit,可以看到他有許多調(diào)用它的函數(shù),我們點進(jìn)去就能看到相應(yīng)的后門賬戶點擊查看固件后門賬戶還是存在。
至此,本次試驗結(jié)束。
參考鏈接
固件分析技術(shù)(3)-漏洞復(fù)現(xiàn)
施耐德PLC以太網(wǎng)模塊后門賬戶解密
施耐德PLC以太網(wǎng)模塊固件后門引發(fā)的血案
施耐德PLC以太網(wǎng)模塊固件后門引發(fā)的血案(二)
施耐德NOE77101以太網(wǎng)模塊固件逆向及后門挖掘
施耐德PLC以太網(wǎng)模塊固件NOE77101后門賬戶漏洞
總結(jié)
以上是生活随笔為你收集整理的施耐德NOE77101以太网模块固件逆向漏洞挖掘的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 11月VR大数据:SteamVR新增PI
- 下一篇: 无线电跳频技术之母 海蒂·拉玛