• 本文作者: 天融信安全应急响应中心
  • |
  • 2018年4月13日
  • |
  • 漏洞分析
  • |

SysGauge Server 3.6.18 栈溢出漏洞分析及利用

一、漏洞简介

SysGauge 是一个系统和性能监视程序, 允许监视CPU使用率、NAS服务器监控、远程服务器监控、网络传输速率以及一些其他系统关键信息监控。在SysGauge Server 3.6.18中存在一个栈缓冲区溢出漏洞,由于该程序对网络数据处理不严谨,使得攻击者发送网络数据包可以执行任意代码。

 

二、漏洞分析及利用

2.1分析环境及工具

Windows 7 x64

Windbg X64

IDA Pro

 

2.2漏洞原理

SysGauge.exe在处理网络请求的过程中过滤不严格导致拷贝越界。程序试图从网络数据包中拷贝一段字符串到一处栈缓冲区中,而结束拷贝的条件取件于是否遇到了指定的特字符。下面是漏洞发生的具体位置(libpalSCA_GetToken()):

 

sysgaue_316_1

分析代码可知, 该函数会从参数1中拷贝数据到参数3指定的内存中, 当遇到 0xD0xA0×00以及参数a4的时候, 才会停止拷贝。

 

2.3漏洞分析

libpal!SCA_NetTransport::WaitForMessage()函数用以接收数据和数据处理, 其伪代码如下,112行的位置调用libpal!SCA_NetMessage::Deserialize()函数进行提取数据的过程中触发了漏洞。sysgaue_316_2

该函数调用则最终调用了漏洞触发函数libpal!SCA_GetToken()

 

 

sysgaue_316_3

看到这里, 代码流程其实已经明了。此时检查一下传递给SCA_GetToken()函数的参数3, 即目标缓冲区. 该参数即libpal!SCA_NetTransport::WaitForMessage()的参数3. 下面贴一下调用libpal!SCA_NetTransport::WaitForMessage()的函数:

 

sysgaue_316_4

可以确认目标缓冲区不超过0×118大小, 当拷贝的数据超出0×118字节的时候便会污染了栈中其他数据。上图可以看出该函数有安装SEH 结构化异常处理函数,在该函数调用过程中产生的异常,操作系统均会调用该SEH回调函数进行处理。

 

2.4漏洞利用

 

由上面的分析可知, 构造一个网络数据包, 覆盖栈中SEH回调函数,触发漏洞即可获得代码执行权限。

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

 

sysgaue_316_5

 

由于原Exp中的SEH回调函数地址经过测试无法使用, 该地址处的代码如下:

sysgaue_316_6

此段代码无法正常引导流程转向payload,所以这里针对原Exp做了一些修改,值得说明的是以下两点。

Payload中用来覆盖的SEH回调函数地址。使用地址0x100692B1(pop ebp # pop ebx # ret),可以成功将流程引导到payload中。

PayloadStage1 引导代码。此处代码从栈中取参数,加上偏移取数据,定位到payload首地址,然后加上偏移跳转到Shellcode首字节开始执行。有疑问的可以查一下SEH回调函数的参数列表即可。

 

 

在运行该代码之后, Windbg追踪一下整个流程。

sysgaue_316_7

这里开始进行数据拷贝,当拷贝到0×120字节的时候, 目标缓冲区到达分页末尾,继续拷贝引发一个C05异常。

sysgaue_316_8

前面已经覆盖了SEH回调函数, 异常分发的时候系统调用了POC中指定的0x100692B1 函数。

sysgaue_316_9

EIP转入0x100692B1,下面准备跳转到stage1中执行。sysgaue_316_10

sysgaue_316_11

 

成功执行Shellcode,返回了一个Bindshell

 

 

sysgaue_316_13

 

三、修复方法

1)升级到最新版的SysGauge

2)建立防火墙规则, 禁止未知来源的IP对本机9221端口的访问

Written by 天融信安全应急响应中心