
漏洞概述
【資料圖】
Modbus Slave是一個模擬工業領域通信協議Modbus從站的上位機軟件,主要用于測試和調試Modbus從設備。該軟件7.4.2以及以前的版本,在注冊時,未對注冊碼長度進行安全檢查,存在緩沖區溢出漏洞,導致軟件崩潰。
影響范圍
Modbus Slave 7.4.2以及以前的版本
復現環境
操作系統:Win7 sp1 32位操作系統
分析工具:IDA、OD、Windbg、Procexp
漏洞分析
分析時使用的版本為7.1.2.1357。
首先安裝modbusslavesetup32bit_7.1.2.1357.exe程序,默認安裝后主程序路徑為C:\Program Files\Modbus Tools\Modbus Slave\mbslave.exe。
根據exploit-db上已公開的poc.py生成Modbus.txt,Poc比較簡單,Modbus.txt的內容為736個字符“A”,如下圖所示:
使用Windbg調試器調試主程序mbslave.exe,然后點擊mbslave.exe菜單欄的“Connection”按鈕,在彈出的菜單中選擇“Connect”,此時將彈出注冊對話框,如下圖所示:
復制poc文件Modbus.txt中的字符串內容,粘貼到注冊對話框中,最后點擊“OK”按鈕,驗證是否觸發漏洞,如果poc驗證成功,Windbg將捕獲到異常,如下圖所示:
在Windbg中使用k命令查看調用函數調用棧,發現棧中函數的返回地址已被覆蓋為一個非常規值0x92989d93,說明發生了棧溢出,如下圖所示:
接下來查找棧溢出的原因。
為更方便和直觀,使用調試器OD重新調試程序mbslave.exe,在異常發生地址所在函數0x426B40下斷點,再次將poc內容復制到注冊對話框中,觸發漏洞,調試OD將停止在斷點處,此時,棧中的函數返回地址為正常值0x426141,如下圖所示:
為了定位棧中函數返回地址被覆蓋的代碼,需要對保存函數返回地址的棧地址0x12f07c下硬件寫斷點,然后繼續運行,程序將停止在0x426e00代碼處,此時,棧中的返回地址已被覆蓋為0x426193,如下圖所示:
根據上圖,可以看出,正是地址0x426DF9處的匯編代碼,將EAX最低字節AL的值0x93覆蓋棧中的函數返回地址的最低字節,說明導致棧溢出的代碼就是該條匯編代碼,當前除了覆蓋棧中返回地址,棧溢出還覆蓋了棧中結構化異常處理地址(SEH)等內容。
在反編譯工具IDA中可以看到漏洞產生處的偽指令為 MultiByteStr[v52] = *(_WORD *)v59,此時緩沖區的大小為300個字節,長度太小導致了溢出,覆蓋了棧中函數返回地址和正常變量值,導致后續指令執行錯誤,使程序崩潰,如下圖所示:
從上述的分析可知,溢出產生時,覆蓋的數據并不是poc中的”A”字符,那么覆蓋的數據是否來源于poc中,經過運算后的數據呢?
在IDA中查找數據來源,結合OD中動態調試分析,發現覆蓋的數據是地址0x00426CFA處的代碼運算后的結果,這是一條異或運算的匯編代碼,按字節異或,如下圖所示:
異或的源數據是poc中字符串按兩位一組轉化為十六進制的值,異或的KEY為“97280132”,比如第一輪循環時,將poc中的前兩位字符串“AA”轉換為0xAA,然后與KEY的第一位字符“9”,十六進制為0x39進行異或,最后將異或的結果放到棧中緩沖區MultiByteStr[v52]進行保存,如果poc中的字符串個數大于600個字符(600=300*2,poc中為736個字符“A”),將發生棧溢出,可以覆蓋棧中SEH地址,函數返回地址和局部變量等,導致程序崩潰。
既然發生了棧溢出,并且數據可控,那么是否能執行任意shellcode呢?
漏洞利用
常見的棧溢出利用可以利用被覆蓋的函數返回地址執行任意shellcode,即漏洞發生后,覆蓋了棧中函數返回地址,當當前函數執行完畢后,將跳轉到函數返回地址執行代碼,但是該程序中開啟了Security Cookie棧保護安全機制,位于0x00427237地址處,在函數返回前,Cookie檢驗失敗,無法利用該方法。
除此之外,溢出還覆蓋了棧中結構化溢出處理(SEH)函數地址,當異常發生時,將跳轉到異常處理函數執行代碼,但是該程序中開啟了Safe SEH安全保護機制,簡單來講,不是預定義的異常處理函數地址,不予執行,使用 dumpbin /loadconfig mbslave.exe命令可以查看Safe SEH 表,如下圖所示:
既然開啟了Safe SEH,是否有辦法繞過呢?常見的繞過方法如下:
1、返回地址繞過,該程序開啟了Security Cookie,無法繞過。
2、虛函數繞過,溢出覆蓋范圍有限,無法覆蓋虛函數。
3、從堆中繞過,將shellcode布置在堆中 ,SEH處理函數指向這個地址即可,該程序開啟數據執行保護(DEP),無法將數據作為代碼執行。
4、利用未啟用SafeSEH模塊繞過,可以把這個模塊的指令作為跳板,去執行shellcode,該程序沒有未啟用Safe SEH的模塊。
5、加載模塊之外的地址繞過,內存中有一些Map類型的映射文件,在這些文件中找到跳板指令覆蓋SEH處理函數地址即可繞過,該程序開啟數據執行保護(DEP),無法將數據作為代碼執行。
總的來說,該程序在測試系統win7 sp1上,無法繞過Safe SEH執行shellcode,如果使用低版本的系統,比如Windows XP低版本系統,可以實現執行任意shellcode,因為Safe SEH是Windows XP sp2以及之后的版本中加入的安全特性。
poc
??https://github.com/webraybtl/CVE-2022-1068??
參考鏈接
??https://www.exploit-db.com/exploits/50536??
??https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-1068??