作者:天融信阿尔法实验室
SysGauge 是一个系统和性能监视程序, 允许监视CPU使用率、NAS服务器监控、远程服务器监控、网络传输速率以及一些其他系统关键信息监控。在SysGauge Server 3.6.18中存在一个栈缓冲区溢出漏洞,由于该程序对网络数据处理不严谨,使得攻击者发送网络数据包可以执行任意代码。
Windows 7 x64
Windbg X64
IDA Pro
SysGauge.exe在处理网络请求的过程中过滤不严格导致拷贝越界。程序试图从网络数据包中拷贝一段字符串到一处栈缓冲区中,而结束拷贝的条件取件于是否遇到了指定的特字符。下面是漏洞发生的具体位置(libpal!SCA_GetToken()):
分析代码可知, 该函数会从参数1中拷贝数据到参数3指定的内存中, 当遇到 0xD、0xA、0×00以及参数a4的时候, 才会停止拷贝。
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回调函数进行处理。
由上面的分析可知, 构造一个网络数据包, 覆盖栈中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端口的访问