
Plantilla de Nuclei para detectar servidores Apache vulnerables a CVE-2024-38473

Plantilla de Nuclei diseñada para detectar servidores Apache vulnerables a CVE-2024-38473. Primero identifica servidores que ejecutan Apache < 2.4.60 con la configuración predeterminada de PHP-FPM. Luego, realiza fuzzing para encontrar posibles archivos PHP protegidos por ACLs que podrían ser omitidos debido a esta vulnerabilidad.
Para usar esta plantilla de Nuclei, necesitas clonar el repositorio. Puedes hacerlo ejecutando el siguiente comando:
git clone https://github.com/juanschallibaum/CVE-2024-38473-Nuclei-Template
Navega al directorio del repositorio clonado:
cd CVE-2024-38473-Nuclei-Template
Ejecutar la plantilla de Nuclei en un solo host:
nuclei -t CVE-2024-38473.yaml -u http://example.com
Ejecutar la plantilla de Nuclei contra una lista de hosts:
nuclei -t CVE-2024-38473.yaml -l hosts.txt
Ejecutar la plantilla de Nuclei en un solo host especificando un archivo .html o .php válido:
nuclei -t CVE-2024-38473.yaml -u http://example.com/valid.php
Ejecutar Nuclei de esta manera puede producir una mayor tasa de detección. También puedes incluir URLs en este formato dentro del archivo de hosts para ejecutar la plantilla contra esa lista.
Para probar fácilmente la vulnerabilidad CVE-2024-38473, puedes configurar un entorno vulnerable usando Docker. Sigue estos pasos para verificar rápidamente la efectividad de la plantilla de Nuclei:
Asegúrate de que el demonio de Docker esté en ejecución: Verifica que el demonio de Docker esté corriendo en tu sistema. Puedes iniciarlo con el siguiente comando si aún no lo está:
sudo systemctl start docker
Ejecutar el contenedor Docker: Dentro del directorio del repositorio, usa el siguiente comando Docker para iniciar un contenedor con una configuración vulnerable de Apache y PHP-FPM:
docker run -p 8787:80 -v "$(pwd)/test-env-webroot:/app" webdevops/php-apache:7.1
Probar la vulnerabilidad:
Manualmente: Abre tu navegador web y navega a http://localhost:8787 para interactuar con el servidor Apache que se ejecuta en el contenedor Docker. Accede a http://localhost:8787/info.php para probar la vulnerabilidad. Este archivo está protegido por una ACL y, si la omisión de la ACL es exitosa, verás la salida de phpinfo():

Usando la plantilla de Nuclei: Ejecuta el siguiente comando de Nuclei para probar el servidor con la plantilla:
nuclei -t CVE-2024-38473.yaml -u http://localhost:8787
El 8 de agosto de 2024, el investigador de seguridad Orange Tsai presentó una charla en Black Hat USA 2024 titulada: Confusion Attacks: Exploiting Hidden Semantic Ambiguity in Apache HTTP Server!. En esta presentación, reportó múltiples vulnerabilidades que afectan a Apache HTTP Server. Explicó que Apache tiene una arquitectura altamente modular, compuesta por cientos de módulos, cada uno realizando su función mientras lee y escribe en una estructura compartida llamada request_rec, que consta de casi 100 campos.
La causa raíz de las vulnerabilidades reportadas por el investigador de seguridad radica en la inconsistencia en cómo los diferentes módulos de Apache tratan los diversos campos de la estructura compartida. Por ejemplo, mod_authz_core trata el campo r->filename como un archivo, mientras que mod_proxy lo trata como una URL, lo que genera discrepancias que resultan en una amplia gama de vulnerabilidades.
En su presentación, Orange Tsai define un tipo de ataque llamado "Filename Confusion". Aunque este ataque tiene una superficie de ataque variada, CVE-2024-38473, que cubrimos en esta plantilla, se refiere a cómo podemos aplicar el ataque "Filename Confusion" para omitir las ACL de Apache y obtener acceso a archivos restringidos.
El problema surge cuando el módulo de autenticación de Apache, mod_authz_core, trata el atributo r->filename como un archivo, mientras que mod_proxy lo trata como una URL. Debido a esto, las instalaciones de Apache con PHP-FPM en su configuración predeterminada se ven afectadas por esta vulnerabilidad. Imagina que un servidor que ejecuta Apache y PHP-FPM tiene una ACL configurada como la siguiente para proteger el acceso al archivo admin.php con credenciales:
<Files "admin.php">
AuthType Basic
AuthName "Admin Panel"
AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
</Files>
Debido a la vulnerabilidad, es posible omitir ACL como la anterior que implican proteger un archivo individual. De hecho, esto se puede hacer tan fácilmente como enviando la siguiente solicitud: http://server/admin.php%3fooo.php.
Para entender esto en profundidad, es importante considerar que cuando Apache procesa una solicitud como la anterior, el módulo mod_authz_core lee el valor admin.php?fooo.php del campo r->filename de la estructura compartida. Trata este valor como el nombre del archivo solicitado y, al compararlo con la ACL, no coincide porque admin.php?fooo.php es diferente de admin.php.
Luego, dado que admin.php?fooo.php termina en .php, la solicitud es manejada por PHP-FPM. PHP-FPM elimina todo lo que sigue al ? en el nombre de archivo recibido de Apache antes de procesarlo, tratándolo como una URL en lugar de un archivo. Como resultado, PHP-FPM procesará admin.php directamente. Debido a que la verificación de ACL se superó anteriormente, el atacante puede acceder a admin.php sin autenticación.
La plantilla de Nuclei actual no solo tiene como objetivo descubrir archivos protegidos por fuerza bruta, sino que también incluye lógica para identificar cuándo un servidor tiene una configuración vulnerable de Apache < 2.4.60 con PHP-FPM, incluso si no se detectan casos de archivos protegidos por ACL. En el flujo básico, primero intenta identificar si el servidor tiene una configuración vulnerable y, luego, si es positivo, intenta identificar archivos comunes que puedan estar protegidos por ACL.
La idea detrás de la detección de configuraciones vulnerables con Apache < 2.4.60 y PHP-FPM se basa en dos premisas básicas:
En una configuración vulnerable, si file.php existe en el servidor, entonces la solicitud a http://server/file.php%3fooo.php devolvería el mismo código de estado 200 y la misma longitud de cuerpo que la solicitud a http://server/file.php (porque después de que PHP-FPM elimina %3fooo.php, el archivo solicitado sería el mismo).
En una configuración vulnerable, si file.html existe en el servidor, entonces la solicitud a http://server/file.html%3fooo.php devolvería 403 Acceso Denegado. Esto se debe a que PHP-FPM intentaría cargar un archivo con extensión .html en lugar de .php, lo cual no está permitido por defecto.
El flujo de la plantilla consta de 7 grupos de solicitudes. Deben ejecutarse en orden y deben cumplir las respectivas condiciones de coincidencia para pasar al siguiente grupo de solicitudes. Esto ayuda a minimizar la cantidad de solicitudes enviadas en vano cuando ya se sabe que las condiciones no se cumplen.