作者:天融信阿爾法實驗室

一、漏洞簡介

SysGauge 是一個系統和性能監視程序, 允許監視CPU使用率、NAS服務器監控、遠程服務器監控、網絡傳輸速率以及一些其他系統關鍵信息監控。在SysGauge Server 3.6.18中存在一個棧緩沖區溢出漏洞,由于該程序對網絡數據處理不嚴謹,使得攻擊者發送網絡數據包可以執行任意代碼。

二、漏洞分析及利用

2.1 分析環境及工具

Windows 7 x64

Windbg X64

IDA Pro

2.2 漏洞原理

SysGauge.exe在處理網絡請求的過程中過濾不嚴格導致拷貝越界。程序試圖從網絡數據包中拷貝一段字符串到一處棧緩沖區中,而結束拷貝的條件取件于是否遇到了指定的特字符。下面是漏洞發生的具體位置(libpal!SCA_GetToken()):

分析代碼可知, 該函數會從參數1中拷貝數據到參數3指定的內存中, 當遇到 0xD、0xA、0×00以及參數a4的時候, 才會停止拷貝。

2.3 漏洞分析

libpal!SCA_NetTransport::WaitForMessage()函數用以接收數據和數據處理, 其偽代碼如下,在112行的位置調用libpal!SCA_NetMessage::Deserialize()函數進行提取數據的過程中觸發了漏洞。

該函數調用則最終調用了漏洞觸發函數libpal!SCA_GetToken()

看到這里, 代碼流程其實已經明了。此時檢查一下傳遞給SCA_GetToken()函數的參數3, 即目標緩沖區. 該參數即libpal!SCA_NetTransport::WaitForMessage()的參數3. 下面貼一下調用libpal!SCA_NetTransport::WaitForMessage()的函數:

可以確認目標緩沖區不超過0×118大小, 當拷貝的數據超出0×118字節的時候便會污染了棧中其他數據。上圖可以看出該函數有安裝SEH 結構化異常處理函數,在該函數調用過程中產生的異常,操作系統均會調用該SEH回調函數進行處理。

2.4 漏洞利用

由上面的分析可知, 構造一個網絡數據包, 覆蓋棧中SEH回調函數,觸發漏洞即可獲得代碼執行權限。

以下是本次漏洞驗證的Exp,該利用修改自exploit-db所公布的exp, 原Exp地址:https://www.exploit-db.com/exploits/43588/

由于原Exp中的SEH回調函數地址經過測試無法使用, 該地址處的代碼如下:

此段代碼無法正常引導流程轉向payload,所以這里針對原Exp做了一些修改,值得說明的是以下兩點。

Payload中用來覆蓋的SEH回調函數地址。使用地址0x100692B1(pop ebp # pop ebx # ret),可以成功將流程引導到payload中。

Payload中Stage1 引導代碼。此處代碼從棧中取參數,加上偏移取數據,定位到payload首地址,然后加上偏移跳轉到Shellcode首字節開始執行。有疑問的可以查一下SEH回調函數的參數列表即可。

在運行該代碼之后, 在Windbg追蹤一下整個流程。

這里開始進行數據拷貝,當拷貝到0×120字節的時候, 目標緩沖區到達分頁末尾,繼續拷貝引發一個C05異常。

前面已經覆蓋了SEH回調函數, 異常分發的時候系統調用了POC中指定的0x100692B1 函數。

EIP轉入0x100692B1,下面準備跳轉到stage1中執行。

成功執行Shellcode,返回了一個Bindshell。

三、修復方法

1)升級到最新版的SysGauge

2)建立防火墻規則, 禁止未知來源的IP對本機9221端口的訪問


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/568/