Reconocimiento
Primeramente empezaremos con un ping ICMP para poder corroborar como siempre que hay conectividad.
A continuación procedemos con un escaneo típico de NMAP para conseguir los puertos abiertos :
Si lo vemos estos son los puertos abiertos :
A continuación haremos un escaneo más exhaustivo como siempre, viendo los servicios que corren en dichos puertos :
Tras dicho escaneo podemos observar los servicios que corren en los puertos :
El puerto 6274 podemos ver que es un HTTP por lo tanto esta hosteando una página web, si utilizamos la dirección IP junto al puerto indicado y se nos redirigirá a la página que vemos en la captura :
Tras ver que hay ciertos puertos abiertos, el 80 nos redirige a otra página diferente la cual es un panel.
Después de estar investigando y viendo que la página no tenía principales vías de explotación he descubierto que tiene un RCE (Remote Command Execution) debido a su versión la cual vemos en la captura siguiente :
Explotación
Iniciaremos poniendonos a la escucha con netcat :
Tras diseñar un script en python que nos permita explotar la vulnerabilidad (CVE-2026-23744) de forma automatizada conseguimos acceder a la máquina :
La sintaxis del comando para lanzar el script sería la siguiente
Tras esto tendremos acceso al sistema :
Escalada de privilegios lateral
A continuación, si echamos un vistazo a nuestro usuario, podemos ver que somos “mcp-dev”. Si nos dirigimos a nuestro directorio /home/mcp-dev, nos encontramos con que no existe ninguna flag. Estos significa que debemos escalar privilegios hacia otro usuario.
Deberemos de hacer una escalada de privilegios lateral hacia el usuario “analyst” para ello nos aprovechamos de que en el sistema no existe un archivo .ssh por lo que nosotros lo creamos
En la captura podemos ver como cambiamos a la ruta del usuario mcp-dev para posteriormente crear un directorio .ssh (ya que no existe en el sistema) y posteriomente entrar a dicho directorio, dentro de este directorio introduciremos la clave SSH pública que nosotros tengamos en nuestra máquina atacante y lo que haremos será redirigirlo a un archivo authorized_keys :
Tras esto lo que sucede es que tenemos nuestra clave pública cargada en el sistema víctima y ahora vamos a cargar la clave privada en el sistema atacante...
De esta forma lo que conseguimos es una conexión vía SSH ya que introducimos nuestra clave SSH pública en la máquina víctima, y también introducimos nuestra clave privada en la máquina atacante...
Después de conseguir esto saldremos de la sesión SSH para conectarnos por SSH haciendo port forwarding
Tenemos que tener en cuenta que si hacemos un ps aux y vemos el proceso jupyter filtrandolo con grep conseguimos ver una token...
Una vez hecho port forwarding y descubrir que el localhost con el puerto 5000 nos redirige a una API :
Después de iniciar sesión con la token me redirige a una especie de IDE donde puedo ingresar código y ejecutarlo para comprobar su funcionamiento, quizás se puede llegar a hacer una escalada de privilegios con una rev shell, aquí adjunto la captura donde se ve la página a la que me redirige :
A continuación viendo que podemos insertar código, lo que haremos será abrir un puerto a la escucha con netcat de la siguiente forma :
Y a continuación en donde podemos insertar el código introduciremos el código correspondiende para conseguir una rev shell y escalar privilegios, aquí en la rev shell introduciremos la IP atacante y el puerto a la escucha de netcat en este caso el 4447 en la siguiente captura se puede observar :
Aquí encontramos la USER FLAG
de3861808d2332b83a11261f09d25ac5
Como la terminal de la rev shell es una basura lo que he optado por hacer, ha sido volver a tomar los pasos anteriores de nuevo, para poder conectarme vía SSH aquí adjunto la captura :
Tras esto hemos conseguido una escalada de privilegios lateral :
Pero hay que tener en cuenta que uno de los puntos por los que esto fue posible fue porque la aplicación jupyter se encontraba en la ruta /home/analyst/noteboooks del usuario analyst por lo que el código insertado en dicha terminal de jupyter acababa corriendo en el usuario analyst dandonos acceso por medio de una rev shell :
Tras haber hecho todo esto yendo a la ruta de /opt/opsmcp conseguimos llegar a un sitio donde hay un archivo llamado server.py, si a este archivo le hacemos un cat, conseguimos unas cosas muy interesantes :
Un token de admin y un puerto el cual es el puerto 5000 corriendo por localhost, si le hacemos un ss -tulpn | grep 127.0.0.1 tenemos esta respuesta :
Ahora debemos de hacer de nuevo port forwarding pero en este caso lo haremos por el puerto 5000 y con el usuario analyst :
Tras hacer port forwarding y descubrir que el localhost con el puerto 5000 nos redirige a una API :
Finalmente obtenemos la Root flag de la siguiente forma :
Ahora explicación detallada de todo esto:
- Endpoint: http://127.0.0.1:5000/tools/call → API local de Flask donde se ejecutan herramientas.
- Header X-API-Key: Autenticación requerida. Sin esta clave secreta el servidor devuelve 401 Unauthorized.
- Body JSON: Se invoca la función ops._admin_dump con el parámetro "ssh_keys" y confirmación true.
Por último, la clave SSH de root es la de la imagen siguiente:
Por otro lado una vez copiada la clave del root en un archivo, cargaremos el archivo en nuestra terminal atacante de la siguiente forma :
Una vez hecho esto finalmente podemos iniciar sesión en el sistema víctima con el usuario root mediante vía SSH de la siguiente forma :
Una vez hecho todo esto finalmente tenemos la Root Flag :
62ab1decc0970a21e7b54cbe8856f54a