sancliffe/CVE-2026-29145-Tester
GitHub: sancliffe/CVE-2026-29145-Tester
针对Apache Tomcat双向TLS认证中OCSP检查绕过漏洞(CVE-2026-29145)的一键化PoC测试环境,支持自动化证书生成与多场景漏洞验证。
Stars: 0 | Forks: 0
# CVE-2026-29145 测试环境
## 📌 概述
本仓库包含一个概念验证 (PoC) 环境,旨在测试 **CVE-2026-29145**。
该漏洞是 **Apache Tomcat 双向 TLS (CLIENT_CERT) 实现中的身份验证绕过**。当配置了 OCSP (在线证书状态协议) 且禁用软失败时,Tomcat 可能无法将 OCSP 检查失败视为硬拒绝。这使得持有已吊销或未验证证书的客户端,在 OCSP 响应器不可达或返回错误时,能够绕过身份验证。
## 🛡️ 漏洞详情
| 属性 | 值 |
|----------|-------|
| **CVE ID** | CVE-2026-29145 |
| **CVSS 评分** | 9.1 (严重) - CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
| **攻击向量** | 网络 |
| **所需权限** | 无 |
| **影响** | 身份验证绕过 |
### 漏洞前置条件
- ✓ Tomcat 中启用了 CLIENT_CERT 身份验证
- ✓ 启用了 OCSP 吊销检查
- ✓ 禁用了软失败选项 (硬失败模式)
- ✓ OCSP 响应器不可达或发生故障
## 🚀 入门指南
### 前置条件
- **Docker 和 Docker Compose**:用于运行存在漏洞的 Tomcat 容器
- **OpenSSL**:用于生成 PKI (公钥基础设施) - 通常预装在 Linux/macOS 上
- **Python 3.7+**:用于运行测试脚本和模拟响应器
- **curl** (可选):用于手动测试
### 1. 自动化完整测试周期 (推荐)
`run_test.sh` 脚本自动化了整个过程:清理、证书生成和运行所有测试场景 (存在漏洞、成功和已修补)。
```
# 导航到项目目录
cd CVE-2026-29145-Tester
# 使脚本可执行
chmod +x cleanup.sh setup_certs.sh run_test.sh
# 安装 Python 依赖(如果 poc_exploit.py 需要)
pip install -r requirements.txt
# 运行完整测试套件
./run_test.sh
```
#### 2. 生成证书
```
./setup_certs.sh
```
**此步骤的作用:**
- 创建根 CA (证书颁发机构)
- 为 Tomcat 生成服务器证书
- 生成带有指向 `http://localhost:8888` 的 OCSP 扩展的客户端证书
- 验证所有证书是否已成功创建
**预期输出:**
```
[INFO] Starting certificate generation for CVE-2026-29145 testing environment
[INFO] OpenSSL found: OpenSSL 3.0.x (...)
[INFO] Created certs directory
[INFO] Generating Root CA...
[INFO] Generating Server Certificate...
[INFO] Generating Client Certificate with OCSP Extension...
[INFO] Certificate setup completed successfully!
```
#### 3. 启动漏洞环境
```
docker-compose up -d
```
**此步骤的作用:**
- 在端口 8888 上启动 OCSP 模拟响应器 (使用 HTTP 500 模拟失败)
- 在端口 8443 上启动存在漏洞的 Tomcat 10.1.52,并配置 CLIENT_CERT 身份验证
- 创建用于服务通信的内部 Docker 网络
- 为两个服务设置健康检查
**验证容器是否正在运行:**
```
docker-compose ps
```
#### 4. 运行漏洞利用测试
```
python poc_exploit.py
```
**预期输出:**
**存在漏洞的系统:**
```
[INFO] Attempting connection to https://localhost:8443/protected-resource...
[WARNING] VULNERABLE: Access granted despite OCSP check failure.
[WARNING] Response preview: ...
```
**已修补的系统:**
```
[INFO] Attempting connection to https://localhost:8443/protected-resource...
[INFO] NOT VULNERABLE: Access denied (Authentication working).
```
## 🧪 测试场景
| 场景 | OCSP 状态 | 预期结果 (已修补) | 结果 (存在漏洞) | 备注 |
|----------|-------------|-------------------|---------------------|-------|
| 正常操作 | 在线且有效 | 200 OK ✓ | 200 OK ✓ | OCSP 检查成功,授予访问权限 |
| 软失败 | 离线/超时 | 403 Forbidden ✓ | 200 OK ✗ | **绕过** - OCSP 响应器不可达 |
| 硬吊销 | 在线且已吊销 | 403 Forbidden ✓ | 403 Forbidden ✓ | 证书被明确吊销 |
| 无效证书 | 无效链 | 403 Forbidden ✓ | 403 Forbidden ✓ | 链验证失败 |
### 运行不同的测试场景
**测试 1:默认情况 (OCSP 响应器故障)**
```
# 保持容器运行
python poc_exploit.py
```
**测试 2:停止 OCSP 响应器 (模拟超时)**
```
docker-compose pause ocsp-responder
python poc_exploit.py
docker-compose unpause ocsp-responder
```
**测试 3:使用 curl 进行手动测试**
```
curl -v \
--cert certs/client-cert.pem \
--key certs/client-key.pem \
--cacert certs/ca-chain.pem \
https://localhost:8443/protected-resource
```
## 🛠️ 项目结构
```
CVE-2026-29145-Tester/
├── README.md # This file
├── setup_certs.sh # Certificate generation script (with validation)
├── cleanup.sh # Cleanup and reset script
├── docker-compose.yml # Docker service orchestration
├── requirements.txt # Python dependencies
├── poc_exploit.py # Main testing script (with logging and error handling)
├── simple_proxy_fail.py # Mock OCSP responder (with detailed logging)
├── .gitignore # Git ignore rules for certificates and logs
├── certs/ # Generated certificates (created by setup_certs.sh)
│ ├── ca-chain.pem # Root CA certificate
│ ├── ca-key.pem # Root CA private key
│ ├── server-cert.pem # Tomcat server certificate
│ ├── server-key.pem # Tomcat server private key
│ ├── client-cert.pem # Test client certificate
│ └── client-key.pem # Test client private key
├── tomcat/
│ └── server.xml # Vulnerable Tomcat configuration
└── logs/ # Tomcat logs (created at runtime)
```
## 📋 配置详情
### Server.xml 配置 (存在漏洞)
`tomcat/server.xml` 文件配置了:
```
```
**关键设置:**
- `certificateVerification="required"` - 强制执行 CLIENT_CERT 身份验证
- `OCSP on` - 启用 OCSP 吊销检查
- 没有软失败覆盖 - 使用硬失败模式 (存在漏洞)
### OCSP 响应器配置
模拟 OCSP 响应器 (`simple_proxy_fail.py`):
- 监听 `localhost:8888`
- 始终返回 HTTP 500 (服务器错误)
- 记录所有传入的 OCSP 请求
- 模拟不可达/发生故障的 OCSP 服务
## 🔧 故障排除
### 常见问题及解决方案
#### ❌ 错误:“OpenSSL is not installed”
```
# macOS
brew install openssl
# Ubuntu/Debian
sudo apt-get install openssl
# CentOS/RHEL
sudo yum install openssl
```
#### ❌ 错误:“Missing certificate files”
**原因:** 证书生成失败或未运行。
```
# 清理并重新生成
rm -rf certs
./setup_certs.sh
```
#### ❌ 错误:端口 8443 上出现 “Connection refused”
**原因:** Tomcat 容器未运行或未就绪。
```
# 检查容器状态
docker-compose ps
# 检查日志
docker-compose logs vulnerable-tomcat
# 确保两个服务都在运行且状态正常
docker-compose up -d
sleep 10 # Wait for services to start
```
#### ❌ 错误:“Connection timeout”
**原因:** Tomcat 启动时间过长或存在网络问题。
```
# 检查 Tomcat 启动日志
docker-compose logs vulnerable-tomcat
# 增加 timeout 并重试
timeout 30 docker-compose logs -f vulnerable-tomcat # Monitor startup
```
#### ❌ 错误:“docker-compose: command not found”
**原因:** 未安装 Docker Compose 或其不在 PATH 中。
```
# 安装 Docker Compose(如果使用独立版)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.x.x/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 或者使用 docker compose(V2 集成在 Docker Desktop 中)
docker compose up -d
```
#### ❌ 错误:“SSL: CERTIFICATE_VERIFY_FAILED”
**原因:** 证书验证失败。
```
# 验证证书文件是否存在
ls -la certs/
# 检查证书有效性
openssl x509 -in certs/client-cert.pem -noout -text
```
#### ❌ 错误:“requests.exceptions.SSLError”
**原因:** SSL 握手失败 - 可能表明硬失败机制正在正常工作。
**解决方案:** 这实际上是一个积极的信号!硬失败机制在 OCSP 失败时阻止了访问。
```
# 检查 OCSP responder 是否正在运行
docker-compose ps ocsp-responder
# 查看详细错误信息
python poc_exploit.py # Already provides detailed logging
```
#### ❌ 错误:“Address already in use”
**原因:** 端口 8443 或 8888 已被占用。
```
# 查找占用端口的进程
lsof -i :8443
lsof -i :8888
# 终止进程或在 docker-compose.yml 中使用不同的端口
```
### 调试与日志
#### 查看详细日志
```
# Tomcat 日志
docker-compose logs -f vulnerable-tomcat
# OCSP responder 日志
docker-compose logs -f ocsp-responder
# Python 脚本调试
python poc_exploit.py # Already includes detailed logging
```
#### 监控实时事件
```
# 打开终端并运行
docker-compose logs -f
# 在另一个终端中,运行测试
python poc_exploit.py
```
#### 网络调试
```
# 测试与 OCSP responder 的连通性
curl http://localhost:8888/
# 从 Tomcat 容器内部测试 OCSP responder
docker exec vulnerable-tomcat curl http://ocsp-responder:8888/
# 测试 SSL 握手
openssl s_client -connect localhost:8443 \
-cert certs/client-cert.pem \
-key certs/client-key.pem \
-CAfile certs/ca-chain.pem
```
## 🧹 清理
要移除所有容器、卷、证书和日志:
```
./cleanup.sh
```
**此步骤的作用:**
- 停止并移除所有 Docker 容器
- 移除生成的 `certs/` 目录
- 移除 `logs/` 目录
- 清理 Python 缓存文件
**验证清理:**
```
docker-compose ps # Should show nothing
ls -la certs/ # Should not exist
```
## ⚖️ 免责声明
本项目仅用于**教育和授权安全测试目的**。
- ⚠️ 请仅对您拥有或获得明确书面授权测试的系统使用
- ⚠️ 未经授权对这些系统使用这些工具是**非法的**且不道德的
- ⚠️ 作者不对本软件的任何滥用行为负责
- ⚠️ 在生产系统上进行测试前,请务必确保您已进行适当的备份
## 📝 修复建议
要缓解此漏洞,请将 Apache Tomcat 升级到以下版本:
| 版本系列 | 最低修复版本 |
|----------------|----------------------|
| 11.0.x | 11.0.20 或更高版本 |
| 10.1.x | 10.1.53 或更高版本 |
| 9.0.x | 9.0.116 或更高版本 |
**升级步骤:**
```
# 示例:更新 docker-compose.yml 以使用已修补的版本
# 将:image: tomcat:10.1.52-jdk17
# 更改为:image: tomcat:10.1.53-jdk17
docker-compose down
docker-compose up -d
```
## 🔗 参考文献
- [CVE-2026-29145 详情](https://nvd.nist.gov/)
- [Apache Tomcat 文档](https://tomcat.apache.org/)
- [OCSP (RFC 6960)](https://tools.ietf.org/html/rfc6960)
- [双向 TLS (mTLS) 概述](https://en.wikipedia.org/wiki/Mutual_TLS)
## 📬 支持
如有问题、疑问或贡献,请提交 issue 或发起 pull request。
**最后更新:** 2026 年 4 月
**状态:** 测试与文档已完成
标签:Apache Tomcat, CISA项目, CLIENT_CERT, Cutter, CVE-2026-29145, CVSS 9.1, Docker, mTLS, OCSP验证, OpenSSL, PKI证书, Python, 协议安全, 双向TLS, 安全测试工具, 安全漏洞, 安全防御评估, 无后门, 测试环境, 漏洞PoC, 漏洞复现, 网络安全, 认证绕过, 请求拦截, 身份验证绕过, 逆向工具, 隐私保护