[HACKTHEBOX] MACHINE — ORION (FÁCIL) [HACKTHEBOX] MACHINE — CAP (FÁCIL) [HACKTHEBOX] MACHINE — REACTOR (FÁCIL) [HACKTHEBOX] MACHINE — DEVHUB (MEDIO)
HACKTHEBOX • WRITE-UP

Reactor.

Explotación de una versión vulnerable de React (CVE-2025-55182 - React2Shell), ejecución remota de código, estabilización con servidor C2, acceso a base de datos SQLite y escalada de privilegios mediante depurador Node.js corriendo como root.

PlataformaHackTheBox
DificultadFÁCIL
Vector inicialRCE en React (React2Shell) → C2
EscaladaDepurador de Node.js expuesto → root
CVEsCVE-2025-55182
Autorkeltich · KeltichCibSec
Nmap → RCE React2Shell → Servidor C2 → SQLite → hash → SSH (user) → Node.js debugger → root
// 01

Reconocimiento

Primeramente como siempre un ping icmp para comprobar conexión :

Como bien nos dice el TTL es una máquina Linux.

Como ya hicimos dicho envío ICMP vamos a proceder con el escaneo TCP por nmap :

Aquí podemos ver que tiene los puertos 22 y 3000 abiertos tras registrar los puertos abiertos vamos a hacer un escaneo más exhaustivo viendo que servicios corren en estos puertos

Tras dicho escaneo podemos observar los servicios que hay registrados en dichos puertos son de SSH y de PPP.

A continuación vamos a entrar en la página web que corresponde a dicha IP, concretamente por el puerto que podemos observar que es 3000 evidentemente por HTTP

// 02

Ataque

Tras esto vamos a aplicar FUZZING para ver que directorios hay en la página web, tras esto hemos encontrado esto :

Parece ser que con lo que encontramos tras hacer FUZZING no podemos hacer mucho al menos no por el momento por lo que la idea es buscar CVE de la propia página

Si nos fijamos en inspect dandole click derecho en cualquier parte de la página se nos abrirá el HTML de la página web.

HTML DE LA PAGINA :

Si nos fijamos bien existe un apartado llamado Debugger que es un apartado donde podemos hacer pruebas o test con el código. Ahí nos aparecerá el código JavaScript que le da lógica a la página en si.

En la carpeta indicada en la imagen siguiente podemos ver diferentes archivos javascript en una carpeta.

Aquí podemos ver dentro de Debugger que hay diferentes cosas, una de ellas son esos corchetes que si le damos a ellos, se nos desplegara todo el código en cuestión de la página.

Por último para ver que versión de React en cuestión debemos abrir el primer archivo de JavaScript y presionar la siguiente combinación de teclas (CTRL + F) tras esto se nos abrira un buscador en el cual ingresaremos el input que queramos buscar en este caso, version, en la siguiente captura lo vemos de forma gráfica :

Y finalmente podemos ver que la versión es la siguiente la 19.0.0 esta versión al buscar sobre ella presenta una vulnerabilidad interesante, la vulnerabilidad es la siguiente :

React2Shell (CVE-2025-55182)

CVE-2025-55182 (React2Shell) es una vulnerabilidad de Remote Code Execution (RCE) que afecta a React en entornos de servidor (Next.js, SSR, etc).

Al usar dicha vulnerabilidad conseguimos una shell como la siguiente que se ve en la captura entrando al servidor donde se almacenan los recursos de la página :

¿De que trata?

Se trata de una cadena de exploits que permite a un atacan te ejecutar comandos arbitrarios en el servidor donde corre la aplicación React/Next.js, sin necesidad de autenticación en muchos casos.

Los archivos que aparecen dentro de dicho servidor ubuntu son los archivos que permiten la lógica de la página junto a bases de datos y demás.

Una vez dentro del servidor ubuntu que mantiene la página es cuestión de hacer una escalada de privilegios.

Como la consola tenía un límite de información que podía poner por pantalla estorbaba a la hora de escalar privilegios. Se ha optado por descargar un servidor de comando y control C2, y añadir al equipo víctima al servidor C2 para tomar control desde el.

Servidor de comando y control se ha escogido el siguiente : https://github.com/daemoncibsec/intruder

Además de clonar el repositorio se ha necesitado configurar un malware que es el que conecta con el servidor C2 añadiendo la dirección IP de mi máquina atacante como servidor de C2.

Lo siguiente que se ha hecho ha sido descargar el agente del servidor de comando y control (intruder.py) a la máquina víctima y ejecutar el agente.

Eso se ha hecho gracias al siguiente repositorio : https://github.com/msanft/CVE-2025-55182.git

1º Comando descarga el agente

2º Comando lo ejecuta

Todo esto debemos hacerlo teniendo en cuenta que el servidor C2 debe estar iniciado

Usando el comando !list podemos ver los agentes conectados.

Usando el comando !intrude seguido del identificador del agente, podemos conseguir una consola para controlar al equipo víctima.

A continuación como la consola que obtenemos mediante el C2 es una consola interactiva y tiene sus limitaciones, desde dicha consola, insertamos una reverse shell de la página https://www.revshells.com/

Para conseguir esto necesitamos lo siguiente :

1º debemos ponernos a la escucha por el puerto indicado en la págiona de revshell con netcat de esta forma :

2º debemos de insertar la rev shell que se nos ha proporcionado en revshell.com en la consola interactiva del C2 de esta forma :

Después de investigar por todo el sistema se ha llegado a la conclusión de que la contraseña del usuario engineer esta en una database en el directorio /home/node concretamente la database se llama reactor.db.

Si le hacemos un cat reactor.db a simple vista no veremos nada, pero si cambiamos el tamaño de la terminal podemos observar un hash que si vemos las correlaciones que hay en la database coinciden con ser la contraseña del usuario engineer :

Ahora procederemos con la identificación del hash y a su vez la explotación del propio con la herramienta de hashcat para conseguir la contraseña :

1º Identificamos que tipo de hash es hashid (hash)

Aquí podemos ver como hay ciertas correlaciones y una de ellas es que es MD5

Tras saber esto tenemos que entender que hashcat tiene un montón de parámetros de información y tipos de ataques, para poder acceder a dicha información debemos usar hashcat -h | less

Un punto a tener en cuenta es que para salir de la bbase de datos de hashcat hay que darle a la Q

Ahí nos apareceran diferentes parámetros uno de ellos es el número con el identifica MD5 y este es el 0 :

Por otro lado hay unos número también con los que se identifican ataques en este caso como es uin 0 estamos realizando un ataque straight un ataque directo :

Sabiendo esto, podemos ir a formular el comando en la terminal y nos quedaría así :

Tras crackearlo tenemos la contraseña de esta forma :

Tras obtenerla iniciamos sesión mediante SSH con el usuario engineer y la IP del servidor :

USER FLAG
deb898b0e194ba07fc5665f1a0486005
// 03

Escalada de privilegios

A continuación haremos una escalada de privilegios, en este caso de forma automatizada con una herramienta llamada linpeas, como no nos permite descargarla en el servidor víctima, lo que haremos será transferirla por vía SSH con el comando scp (nombre de archivo a transferir) (nombre usuario)@(IP):(RUTA_ABSOLUTA)

Al ejecutar linpeas tras darle permisos porque obviamente hay que otorgarle permisos de ejecución.

Nos aparece esto, que es como una especie de leyenda donde nos comenta que tipo de vectores de ataquie existen para una escalada de privilegios, dependiendo el color es más importante o menos

ROOT FLAG
fa0b25bee2b2e422802eb9116da75af5

1º ¿Cual era la vulnerabilidad?

El sistema tenía un servicio interno de Node.js inspector (Depurador) corriendo en el puerto 9229

El peligro : este depurador estaba siendo ejecutado por el usuario administrador (root) y no requería contraseña para conectarse desde dentro de la máquina

2º ¿Como se descubrió?

Paso A : con el comando `ss -lntp` se vio que el puerto 9229 estaba escuchando conexiones locales (127.0.0.1:9229)

Paso B : con ps aux |grep node se confirmó que el procesa de Node que usaba ese puerto pertenecía al usuario root (gracias al parámetro --inspect)

3º El método de explotación (paso a paso)

1 Conexión al depurador : node inspect 127.0.0.1:9229

Inyección de código (RCE)

exec("process.mainModule.require('child_process').execSync('chmod +s /bin/bash')") ¿Que hace esto? Usa las funciones internas de Node.js (child_process) para ejecutar un comando en el sistema operativo. La orden específica : chmod +s /bin/bash añade el permiso SUID a la consola del sistema. Esto significa : “Cualquiera que use esta consola podrá ejecutarla con los privilegios del dueño original (root)”

Activación de los superpoderes :

Tras salir del depurador con Ctrl + C se ejecuta :

Bash -p

El parámetro -p (preservar) le dice a la consola que mantenga los privilegios heredados del SUID, convirtiéndole inmediatamente en el usuario root

Node.js Inspector (9229): Si un proceso corre como root con --inspect, permite ejecución remota de código (RCE) inmediata a quién se conecte.

SUID (chmod +s): Es un permiso especial en Linux. Si se lo pones a un programa como /bin/bash, dejas una puerta trasera para volverte administrador al instante.

Un depurador (en inglés, debugger) es una herramienta de software que los programadores utilizan para buscar, inspeccionar y corregir errores (llamados bugs) en el código de un programa

root@keltich:~/HackTheBox/Reactor
root@keltich:~$

COMANDOS

← Volver a Artículos