
Análisis detallado de CVE-2021-41773, explotación de path traversal y RCE en Apache, con comandos paso a paso y análisis de causa raíz desde un entorno de laboratorio de TryHackMe.
Writeup de la sala "Modern Web Stacks" de TryHackMe, enfocado en explotar CVE-2021-41773, una vulnerabilidad de path traversal en Apache HTTP Server 2.4.49 que conduce a ejecución remota de código cuando mod_cgi está habilitado.
| Ítem | Detalle |
|---|
| Vulnerabilidad | CVE-2021-41773 — Apache 2.4.49 Path Traversal / RCE |
| Servicio objetivo | Servidor Apache HTTP en el puerto 8080 |
| Versión vulnerable | Apache/2.4.49 (Unix) |
| Causa raíz | Orden de normalización incorrecto en ap_normalize_path() |
| Impacto | Lectura arbitraria de archivos → Ejecución Remota de Código vía mod_cgi |
| Herramientas utilizadas | curl |
Apache 2.4.49 cambió la forma en que ap_normalize_path() procesa las URLs. Apache debería bloquear cualquier ruta de solicitud que contenga ../ antes de que llegue al sistema de archivos, pero el filtro de traversal se ejecuta antes de que se complete la decodificación completa de la URL.
Esto significa que una solicitud que utiliza la secuencia doblemente codificada .%2e/ no es reconocida como ../ por el filtro. Sin embargo, una vez que Apache pasa la ruta al sistema operativo, .%2e/ se resuelve a ../, y el filtro de traversal ya ha sido evadido.
Por sí sola, esto permite la lectura arbitraria de archivos fuera de la raíz web. El impacto se vuelve crítico cuando se combina con mod_cgi: si la ruta de traversal resuelve a un ejecutable como /bin/sh dentro de un directorio habilitado para CGI (por ejemplo, /cgi-bin/), Apache lo ejecuta como un script CGI y pasa el cuerpo HTTP POST a su entrada estándar — lo que otorga ejecución remota de comandos.
Se identificó la cabecera de respuesta Server del objetivo como:
Apache/2.4.49 (Unix)
Esta versión está directamente afectada por CVE-2021-41773.
/cgi-bin/Se solicitó /cgi-bin/ y se recibió una respuesta 403 Forbidden (no un 404), lo que indica que el directorio existe y es probable que mod_cgi esté habilitado — una condición previa para RCE mediante este CVE.
Se utilizó curl con la opción --path-as-is para enviar la secuencia de traversal codificada exactamente como se escribió, sin que curl la normalice del lado del cliente primero:
curl -s --path-as-is "http://<TARGET_IP>:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh" \
--data 'echo Content-Type: text/plain; echo; cat /flag.txt'
Por qué se requiere --path-as-is: de forma predeterminada, curl normaliza las URLs y elimina las secuencias .%2e/ antes de que se envíe la solicitud. --path-as-is le indica a curl que envíe la URL exactamente como está escrita, preservando la traversal codificada para que llegue intacta al servidor.
El payload recorrió desde /cgi-bin/ hasta el sistema de archivos raíz, ejecutó /bin/sh como un script CGI mediante el cuerpo POST inyectado, y devolvió el contenido de /flag.txt.
Formato de flag confirmado: THM{...}
(Flag redactada según las directrices de TryHackMe para writeups públicos.)
mod_cgi + path traversal = RCE. La lectura de archivos por sí sola es mala; combinada con un directorio ejecutable CGI, se convierte en ejecución de comandos.--path-as-is (o una herramienta equivalente de solicitud raw) es esencial al probar bypass basados en codificación.mod_cgi a menos que se requiera explícitamente.Este writeup documenta un entorno de laboratorio (TryHackMe). No se accedió a sistemas no autorizados.