XUT_ / MACHINES / THM

0083

Infinity Pool

THMMACHINENONEMEDIUM

Introduction

infinity-pool

Sin borde visible. Rastreas la red hasta el horizonte y encuentras 3 sistemas de los que nadie te habló en la otra parte.

infinity-pool

Getting the Flags

Reconocimiento Inicial

Comenzamos escaneando los puertos abiertos.

infinity-pool

Ahora vamos a profundizar el escaneo de dichos puertos.

infinity-pool

Vamos a ver qué directorios hay en la web.

infinity-pool

Vemos unas cuantas cosas interesantes. Ahora vamos a ver cómo se ve la web.


Profundización

Vamos a mirar en los directorios, empezaremos con el archivo robots.txt.

infinity-pool

En /status:

infinity-pool

Huele que tira para atrás a SSRF.

Vamos a ver qué vemos en /internal/:

infinity-pool

Parece que este endpoint es interno y sólo podremos acceder a él desde el interior (o al menos da esa sensación).

Vamos a probar el SSRF:

  1. Nos ponemos en escucha. infinity-pool
  2. Mandamos una petición. infinity-pool
  3. Comprobamos si la hemos recibido. infinity-pool

Parece que se está quedando atrapado en un ping. Vamos a intentar inyectar un comando.

infinity-pool


Explotación

Vamos a ver si conseguimos una reverse shell. El error nos clarifica que el intérprete utilizado por el servidor es sh, y no bash. Es por esto que vamos a forzar la utilización de bash con -c.

infinity-pool

Si miramos el listener:

infinity-pool

Buscamos la flag de usuario.


Escalada de Privilegios

Después de investigar las técnicas convencionales y no poder escalar nada, decidí listar servicios activos con ss:

infinity-pool

Para escanear dichos puertos vamos a usar el comando:

bash
for p in 3000 8080 8088 8089 9000 3306 4573 5038; do echo "==== $p ===="; curl -s -m 3 http://127.0.0.1:$p/ | head -c 200; echo; done

infinity-pool

Podemos ver algunos puertos que revelan servicios. Sin embargo, estos servicios existen sólo internamente, por lo que sólo podemos acceder desde el propio host. Para poder usar el navegador, necesitamos una conexión directa (puente). Vamos a mirar a ver si podemos escribir un par de claves SSH.

infinity-pool

Parece que sí podemos escribir. Vamos a generar un par de claves y a servirlas.

infinity-pool

Ahora las descargamos directamente en el directorio relevante.

infinity-pool

Ahora lo copiamos y pegamos en authorized_keys:

infinity-pool

Ahora usamos dicha clave para iniciar una sesión SSH que conecte nuestros puertos con los de la máquina.

infinity-pool

Vamos a ver lo que hay en esos puertos.

En el puerto 3000:

infinity-pool

  • /api/health: infinity-pool

  • /api/config: infinity-pool

    Acabamos de encontrar usuario y contraseña.

En el puerto 8088 no parece haber nada:

infinity-pool

En el puerto 8080:

infinity-pool

Sin embargo en el endpoint reflejado en el puerto 3000:

infinity-pool

Vamos a iniciar sesión.

infinity-pool

Nos encontramos con un gestor de widgets y dashboards. Si investigamos, podemos ver un widget que parece bastante interesante, el de voicemail:

infinity-pool

Parece que tiene una clave de autentificación. Vamos a intentar autentificarnos. Para ello crearemos un listener:

infinity-pool

Si nos fijamos en lo que había en el puerto 3000, podemos ver que el endpoint de automatización se encuentra en el puerto 9000. Vamos a enlazar el puerto 9000 también.

infinity-pool

Una vez hecho esto vamos a lanzar una petición a un endpoint común de las APIs, como /health.

infinity-pool

Hemos encontrado un endpoint interesante y sabemos que se ejecuta como root. Vamos a mandar una petición con el token del dashboard de voicemail:

infinity-pool

Usamos ; para separar comandos y # para comentar el resto, asemejando una inyección SQL típica. Miramos el listener y...

infinity-pool

Obtenemos la shell. Ahora miramos la flag y está:

infinity-pool