
Acerca de MonitorsThree
Es una máquina Linux de dificultad media que presenta un sitio web para una empresa que ofrece soluciones de red. El sitio web tiene una página de olvido de 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 con 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](https://nvd.nist.gov/vuln/detail/CVE-2024-25641), que se aprovecha para obtener un punto de apoyo 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 de usuario. Esto se utiliza entonces para obtener acceso a las claves privadas SSH, lo que lleva al acceso SSH al sistema. La enumeración de puertos abiertos en el sistema revela una instancia vulnerable de Duplicati, que se aprovecha para obtener un shell como root.
Matriz de la máquina.
*Características de explotación de la máquina.

*Sin actualizaciones.
Comienzo enumerando los puertos, servicios y versiones.
rustscan -a 10.10.11.30 -- -sCV -oN scan.txt

1) Version del servicio ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
2) Nginx 1.18.0.
3) Nombre de dominio.
4) Los metodos que podriamos utilizar por medio de curl, burpsuite y automatizar por medio de bash y python.
Adjunto la dirección **IP** al nombre de dominio para facilitar un manejo más eficiente en la web. Esto nos permite acceder a recursos que podrían no estar disponibles al utilizar solo la dirección **IP**.
echo '10.10.11.30 monitorsthree.htb' | sudo tee -a /etc/hosts
Verifico servicios web que estan corriendo.

Usando ' en forgot_password.php obtengo un error SQL syntax.

Procedo a probar el parámetro utilizando SQLMap.

En primer lugar, se encontró una inyección boolean-based blind, donde el payload username=' OR NOT 3779=3779-- GCQs permite determinar la verdad de una condición en la cláusula WHERE o HAVING.
detectó una inyección error-based con el payload username=' OR (SELECT 5707 FROM(SELECT COUNT(*),CONCAT(0x71716b7171,(SELECT (ELT(5707=5707,1))),0x7171707871,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)-- Ysuf, que explota errores en la consulta para obtener información de la base de datos.
También se identificó la posibilidad de realizar stacked queries mediante el payload username=';SELECT SLEEP(5)#, que permite ejecutar múltiples consultas en una sola solicitud, y una inyección time-based blind con el payload username=' AND (SELECT 7246 FROM (SELECT(SLEEP(5)))YUHQ)-- XmLH, que utiliza la función SLEEP para medir el tiempo de respuesta y así inferir información sobre la base de datos

Compruebo que funciona la inyección SQL con la función sleep, pero aun así no logro obtener RCE.


Identifico 2 bases de datos

Identifico las tablas de la base de datos en monitorsthree_db

Obtengo los hashes de los usuarios en monitorsthree.htb

Identifico el tipo de hash

Logro crackear el hash obteniendo la contraseña en texto plano

admin:31a181c8372e3afc59dab863430610e8:greencacti2001
Encuentro un subdominio

sudo sed -i '/10.10.11.30/s/$/ cacti.monitorsthree.htb/' /etc/hosts
Verifico servicios web que están corriendo.

La vulnerabilidad se encuentra dentro de import_package() función definida en el script /lib/import.php
La función no filtra adecuadamente en el nombre y el contenido del archivo proporcionados en los datos XML y escribe dichos archivos en la ruta base de Cacti (o incluso fuera de ella, ya que las secuencias de recorrido de la ruta no se filtran). Esto se puede aprovechar para escribir o sobrescribir archivos arbitrarios en el servidor web, lo que provoca la ejecución de código PHP

El usuario admin reutiliza las credenciales en el servicio de cacti.

Encuentro este CVE-2024-25641, ejecuta código PHP arbitrario en el servidor web ganando (RCE), por medio de la función “Package Import“, permite a usuarios autenticados que dispongan del permiso “Import Templates“.
https://github.com/StopThatTalace/CVE-2024-25641-CACTI-RCE-1.2.26/blob/master/README.md
Por medio del cve ejecuto el comando whoami en el servidor, mostrando que lo corre el usuario www-data

obtengo traza a mi servidor python local

Ejecuto una revshell por medio del cve, logrando obtener una terminal del sistema.

Sanatizo la terminal, enumero usuario, grupo, usuarios en el sistema, información del sistema, listo archivos, directorios presentes y ocultos.

Verifico usuarios.

Encuentro las credenciales de la base de datos cacti

Selecciono la tabla user_auth

Visualizo el hash del usuario marcus

Identifico el tipo de hash

Logro crackear el hash obteniendo la contraseña en texto plano

Reutiliza las credenciales tanto el servicio cacti como en el servidor, asique me auténtico con el usuario marcus.

Gano flag user

Inicio sesión con el id_rsa de marcus para tener más estabilidad en la terminal

Encuentro otras bases de datos

Sobre Duplicati-server.sqlite en la tabla option visualizo “passphrase”

Verifico los puertos que están corriendo, me paso por medio de ssh el puerto 8200 que está corriendo el servicio duplicati.

Revela como se autentica los usuarios, el script calcula un hash SHA-256 de la concatenación de una contraseña, una sal y un nonce.

var noncedpwd = CryptoJS.SHA256(CryptoJS.enc.Hex.parse(CryptoJS.enc.Base64.parse(data.Nonce) + saltedpwd)).toString(CryptoJS.enc.Base64);
La idea es convertir el valor de la frase de contraseña del servidor obtenida de la tabla Option a Base64 y luego a hexadecimal, para generar una contraseña de inicio de sesión válida.

Creo un NoncePwd válido que nos permita autenticar usando Server-passphrase desde DB > pasamos por Base64 > y por ultimo Hex, uso el comando var desde la consola del navegador.

Devolviendo un valor válido para Noncepwd, asique adjunto la cadena y reenvío la solicitud sobre password=

Accedo al panel de Duplicati, genera y almacena copias de seguridad y lo está corriendo root.

Teniendo en cuenta que la ruta de la flag de root es obvia procedo a obtener una copia, es importante utilizar el No encryption dado que quiero obtener la flag en texto plano.

Indico el tipo de almacenamiento local folder or drive y utilizo el directorio fuente /source/.

Agrego la ruta de la flag de root

Ejecuto la copia de seguridad.

Procedo a restaurar la copia de seguridad que establecí

Selecciono el archivo root.txt

Selecciono la ruta a restaurar en donde se alojara la flag de root.

Gano flag de root

Esto me llama mucho la atencion, ya que tiene tareas programadas bajo el demonio cron con privilegios de root

Genero todos los pasos anteriores, pero esta vez en /home/marcus/ genero una revshell que se ejecute en cron con privilegios de root, creo la copia de seguridad, lo restauro y configuro que apunte a cron.
Creo el archivo cron con la revshell incluida en bash

Efectivamente, gano RCE obteniendo una terminal de root.

You must be logged in to post a comment.