此漏洞仅存在于Windows系统,当Tomcat的readonly 参数被设置为 false(默认为true),允许使用 PUT 方法上传文件时,攻击者能够上传包含恶意 JSP 代码的文件,并通过条件竞争来多次发送请求,触发 Tomcat 进行解析和执行,最终实现远程代码执行。
Apache Tomcat 11.0.0-M1 - 11.0.1
Apache Tomcat 10.1.0-M1 - 10.1.33
Apache Tomcat 9.0.0.M1 - 9.0.97
可在如下地址进行环境下载,选择漏洞范围内版本:
https://archive.apache.org/dist/tomcat/tomcat-9/
https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.97/bin/
安装好后可访问8080端口,看是否安装成功。随后来到Tomcat安装目录下的 conf/web.xml ,增加修改其配置,然后重启Tomcat:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
访问页面,抓取数据包:
在Burp的Repeater中新建一个组,后续在这个组中再进行多次发送到Repeater,这些包就会规划到分组里:
建议前两个包使用GET请求,不同的文件名,我这里使用xlz1和xlz2作为文件名:
后面再发4个包到分组中,使用PUT请求。这里一定要注意的是,在PUT请求中,文件名后缀我们更改一个字母为大写,即为:.Jsp。漏洞POC如下,插入到PUT请求后:
aa<% Runtime.getRuntime().exec("calc.exe");%>
这是由于在 Windows 系统中,文件名不区分大小写(.Jsp与.jsp被视为同一个文件),当文件写入和访问同时发生时就会导致JSP 文件被写入时触发编译,在文件被完全编译成.class文件并删除前,其中某些访问可能会跳过完整检查,导致触发代码执行。
PUT请求中的文件名,需要跟GET请求中的文件名一致,除了后缀进行大写外,无变化。接下来,我们点击设置并选择组发送:
然后进行多次发包,我这里一共发了四次:
全程复现视频如下,自行观看:
实战能不能利用就看运气了,复现咱得会。
修复建议
1、升级Tomcat版本为非漏洞版本范围;
2、设置 readonly 为 false
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
利用本账号所发文章
进行直接或间接的非法行为
均由操作者本人负全责
犀利猪安全及文章对应作者
不为此承担任何责任
文章来自互联网或原创
如有侵权可联系我方进行删除
并诚挚的跟您说声抱歉
原文始发于微信公众号(犀利猪安全):Tomcat RCE | CVE-2024-50379条件竞争RCE复现,带视频教程及POC
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论