Introduction

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

Getting the Flags
Reconocimiento Inicial
Comenzamos escaneando los puertos abiertos.

Ahora vamos a profundizar el escaneo de dichos puertos.

Vamos a ver qué directorios hay en la web.

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.

En /status:

Huele que tira para atrás a SSRF.
Vamos a ver qué vemos en /internal/:

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:
- Nos ponemos en escucha.

- Mandamos una petición.

- Comprobamos si la hemos recibido.

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

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.

Si miramos el listener:

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:

Para escanear dichos puertos vamos a usar el comando:
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

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.

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

Ahora las descargamos directamente en el directorio relevante.

Ahora lo copiamos y pegamos en authorized_keys:

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

Vamos a ver lo que hay en esos puertos.
En el puerto 3000:

-
/api/health:
-
/api/config:
Acabamos de encontrar usuario y contraseña.
En el puerto 8088 no parece haber nada:

En el puerto 8080:

Sin embargo en el endpoint reflejado en el puerto 3000:

Vamos a iniciar sesión.

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

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

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.

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

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:

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

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

