HTB – Traceback – Write-up10 min de lecture
Sommaire
Introduction
Traceback est une machine virtuelle Linux plutôt fun à faire, que ce soit pour la partie énumération que l’élévation des privilèges.
Pour ma part, j’ai appris à utiliser un nouvel outil pour arriver à mes fins.
La phase d’énumération sort un peu de l’ordinaire et nous force à nous creuser les méninges.
Les informations que nous avons à notre disposition sont :
- IPv4 = 10.10.10.181
- Nom de la VM = traceback.htb (par défaut chez HTB)
J’ai utilisé une VM Kali Rolling pour cet article. La plupart des outils utilisés sont disponibles par défaut et certains seront à téléchargés. Nous utiliserons différentes techniques pour parvenir à nos fins.
Phase de reconnaissance
J’effectue un scan (TCP) complet de la machine virtuelle de cette manière :
nmap -A -T4 -sV -p1-65535 -Pn -n --stats-every 10 10.10.10.181 --min-rate 100 -oN nmap-traceback-complete.txt
On identifie ainsi rapidement tous les ports ouverts avec leurs services respectifs. Seulement deux ports (TCP) ouverts :
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
Je n’effectue pas de scan des ports UDP.
Phase d’énumération 1/2
D’après les ports ouverts nous voyons qu’il s’agit d’un simple serveur Web. Une seule page Web accessible lors de la connexion :
Il semble y avoir une porte dérobée mais laquelle…
J’ai commencé par regarder le site Web en profondeur (fuzzing) avec différents outils et listes de mots mais sans succès…
Mais en regardant le code source de la page, on a un indice :
Du coup, j’ai fait une recherche sur Internet (Google) avec les mots clés web shells Xh4H (signature du message) et là on tombe sur la page GitHub de l’auteur (le premier lien). Puis avec une recherche sur la page (CTRL + F) avec le mot shell on a ce dépôt :
Et en bas de la page du dépôt on retrouve la fameuse citation, nous sommes sur la bonne piste :
Je décide de créer ma propre liste de mots avec les pages présentes :
root@HTB:~/HTB/Traceback# cat wordlist.txt alfa3.php alfav3.0.1.php andela.php bloodsecv4.php by.php c99ud.php cmd.php configkillerionkros.php jspshell.jsp mini.php obfuscated-punknopass.php punk-nopass.php punkholic.php r57.php smevk.php wso2.8.5.php
Puis je lance à nouveau une recherche avec l’outil DirSearch et cette fois on obtient un résultat prometteur :
Nous avons enfin accès à la porte dérobée :
Sur GitHub, le code source indique que par défaut les accès sont admin/admin :
Effectivement, c’est bien ca 🙂
Nous pouvons constater que notre user s’appelle webadmin :
$ whoami webadmin
Malheureusement, pas de fichier user.txt mais d’autres fichiers intéressants qui devraient nous aider pour la suite :
$ ls -la total 44 drwxr-x--- 5 webadmin sysadmin 4096 Mar 16 04:03 . drwxr-xr-x 4 root root 4096 Aug 25 2019 .. -rw------- 1 webadmin webadmin 105 Mar 16 04:03 .bash_history -rw-r--r-- 1 webadmin webadmin 220 Aug 23 2019 .bash_logout -rw-r--r-- 1 webadmin webadmin 3771 Aug 23 2019 .bashrc drwx------ 2 webadmin webadmin 4096 Aug 23 2019 .cache drwxrwxr-x 3 webadmin webadmin 4096 Aug 24 2019 .local -rw-rw-r-- 1 webadmin webadmin 1 Aug 25 2019 .luvit_history -rw-r--r-- 1 webadmin webadmin 807 Aug 23 2019 .profile drwxrwxr-x 2 webadmin webadmin 4096 Feb 27 06:29 .ssh -rw-rw-r-- 1 sysadmin sysadmin 122 Mar 16 03:53 note.txt
Nous allons ajouter notre clé publique SSH sur le serveur. Pour cela, il suffit de se rendre dans le dossier /home/webadmin/.ssh puis d’éditer le fichier authorized_keys et de cliquer sur >> pour valider :
Il ne reste plus qu’à se connecter et à poursuivre nos recherches :
root@HTB:~/HTB/Traceback# ssh -i ~/.ssh/id_rsa webadmin@10.10.10.181 # -------- OWNED BY XH4H --------- I guess stuff could have been configured better ^^ - # Welcome to Xh4H land Last login: Thu Feb 27 06:29:02 2020 from 10.10.14.3 webadmin@traceback:~$
Je m’intéresse toujours à l’historique des commandes Bash, il y a souvent des chose intéressantes, et c’est le cas ici avec le script luvit qui se lancerait avec les droits d’un second utilisateur, sysadmin :
webadmin@traceback:~$ cat .bash_history ls -la sudo -l nano privesc.lua sudo -u sysadmin /home/sysadmin/luvit privesc.lua rm privesc.lua logout
On a la confirmation avec le fichier note.txt :
webadmin@traceback:~$ cat note.txt sysadmin - I have left a tool to practice Lua. I'm sure you know where to find it. Contact me if you have any question.
Phase d’exploitation 1/2
Nous pouvons effectivement lancer le script, nous obtenons une sorte de Shell dédié au langage de script LUA :
webadmin@traceback:~$ sudo -u sysadmin /home/sysadmin/luvit Welcome to the Luvit repl! >
J’effectue des recherches sur Internet sur ce langage et je tombe sur ce cite : https://gtfobins.github.io/gtfobins/lua/. Il semble possible d’obtenir un Shell interactif.
Effectivement, cela fonctionne, et nous obtenons les droits du second utilisateur sysadmin :
Il nous suffit là aussi d’ajouter notre clé publique SSH afin d’obtenir une connexion SSH confortable pour continuer l’énumération :
Parfait, cela fonctionne :
root@HTB:~/HTB/Traceback# ssh -i ~/.ssh/id_rsa sysadmin@10.10.10.181 # -------- OWNED BY XH4H --------- I guess stuff could have been configured better ^^ - # Welcome to Xh4H land Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings Last login: Mon Mar 16 03:50:24 2020 from 10.10.14.2 $ bash sysadmin@traceback:~$
Nous pouvons obtenir le fichier user.txt, enfin :
sysadmin@traceback:~$ cat user.txt
4a3e8183cde813a34ffd94180e7e216a
Phase d’énumération 2/2
Je commence à faire le tour du propriétaire manuellement mais je ne trouve rien. Je décide d’utiliser le script LinEnum.sh mais sur le coup rien ne me saute aux yeux. Sur le forum de Hack the box je vois le nom d’un outil qui circule que je ne connaissais pas et décide de m’en servir : https://github.com/DominicBreuker/pspy.
Je le copie sur le serveur et l’exécute :
root@HTB:~/HTB/Traceback# scp -i ~/.ssh/id_rsa pspy64 sysadmin@10.10.10.181:pspy64
Après quelques secondes je vois un message apparaître :
Pourquoi un script écraserait toutes les 30 secondes les bannières de connexion au shell (motd) ?… et là cela me donne idée ! Vérifier les droits que nous avons dans le répertoire /etc :
sysadmin@traceback:~$ find /etc/ -writable find: ‘/etc/ssl/private’: Permission denied /etc/update-motd.d/50-motd-news /etc/update-motd.d/10-help-text /etc/update-motd.d/91-release-upgrade /etc/update-motd.d/00-header /etc/update-motd.d/80-esm sysadmin@traceback:~$ ll /etc/update-motd.d/* -rwxrwxr-x 1 root sysadmin 981 Apr 19 16:26 /etc/update-motd.d/00-header* -rwxrwxr-x 1 root sysadmin 982 Apr 19 16:26 /etc/update-motd.d/10-help-text* -rwxrwxr-x 1 root sysadmin 4264 Apr 19 16:26 /etc/update-motd.d/50-motd-news* -rwxrwxr-x 1 root sysadmin 604 Apr 19 16:26 /etc/update-motd.d/80-esm* -rwxrwxr-x 1 root sysadmin 299 Apr 19 16:26 /etc/update-motd.d/91-release-upgrade*
Bingo ! Nous pouvons écrire dans ces fichiers qui appartiennent à root. La suite est toute simple : modifier l’un de ces fichiers afin de pouvoir obtenir des accès privilégié. Mais il faudra faire vite !
Phase d’exploitation 2/2
Pour la phase d’exploitation j’ai ouvert quatre consoles avec pour chacune un accès Shell (SSH), comme ceci (vidéo de démonstration en dessous) :
- Un Shell qui surveille le processus de copie (en bas à droite)
- Un Shell pour copier le fichier root.txt (en bas à gauche)
- Un Shell qui surveille la copie du fichier (en haut à droite)
- Un shell qui va déclencher l’exploitation (en haut à gauche)
Et voilà, nous avons pu atteindre l’objectif 🙂
sysadmin@traceback:~$ cat root.txt
eacee4160b184a5937ce2ff366e08a00
Conclusion
Machine virtuelle sympathique donc qui change un peu de l’ordinaire, un vrai CTF finalement.
Pour ma part j’ai découvert un nouvel outil qui me servira pour la suite : pspy64 qui est bien fichu.