Introduction
Getting the Flags
Reconocimiento Inicial
Comenzamos escaneando los puertos abiertos de la máquina.

Una vez escaneados vamos a realizar un escaneo más en profundidad de dichos puertos.

Vemos un httponly flag not set, puede que podamos usar un XSS.
Ahora saltamos a listar directorios web de la página.

Esta es la estructura de los documentos que dan código 200 con un tamaño >0B.
sequence.thm ├── mail [200 452B] │ └── dump.txt [200 442B] ├── phpmyadmin [200 3KB] │ ├── doc │ │ └── html │ │ ├── config.html [200 44KB] │ │ ├── faq.html [200 48KB] │ │ ├── index.html [200 3KB] │ │ ├── search.html [200 1KB] │ │ ├── settings.html [200 2KB] │ │ └── user.html [200 2KB] │ ├── js │ │ ├── common.js [200 5KB] │ │ ├── config.js [200 7KB] │ │ ├── export.js [200 6KB] │ │ └── sql.js [200 9KB] │ ├── favicon.ico [200 22KB] │ └── index.php [200 3KB] ├── uploads [200 404B] ├── contact.php [200 764B] ├── header.php [200 576B] ├── login.php [200 747B] └── new.html [200 357B]
Vamos a ver cómo es la web.

Vamos a revisar los directorios.

Un archivo dump.txt, interesante, seguimos mirando directorios.

Vemos un script que parece hecho para elevar los privilegios de un usuario promote_coadmin.php. Seguimos mirando directorios.

Aquí podemos ver que la versión utilizada de phpMyAdmin es la 4.9.5.
Además vemos que hay un directorio de subidas, que por el momento está vacío.
Profundización
Vamos a ver qué es el documento dump.txt.

De aquí sacamos varia información importante.
- Hay dos correos conocidos:
software@review.thmproduct@review.thm
- Dos endpoints en una red interna,
192.x.x.x:/finance.phplottery.php
- La contraseña que protege el acceso a dichos paneles.
- El usuario que manda el correo es
Robert, puede que tenga usuario en la máquina comorobert.
Vamos a mirar a ver si hay alguna vulnerabilidad conocida en phpMyAdmin 4.9,5.
Acceso Inicial
XSS
Empezamos probando un payload contra el formulario.

Parece que nos ha dejado enviarlo y que alguien lo verá.

De vuelta en nuestro listener hemos obtenido la cookie.

La sustituimos en el navegador, nos vamos a dashboard.php y...

En el panel de Settings vemos que hay una manera de cambiar la contraseña.

La cambiamos y volvemos a iniciar sesión. Ahora vamos a probar con el de promocionarnos a co-admin.

Parece que no podemos promocionarnos. Vamos a investigar un poco más.
Si nos metemos en el chat podemos observar lo siguiente.

Hemos encontrado la flag del mod. Además, mirando el código fuente del chat vemos lo siguiente:

Por lo que asumimos que se están filtrando palabras clave "maliciosas". Sin embargo, si nos fijamos en la página, parece que se interpreta incorrectamente:

CSRF
Vamos a intentar aprovechar esto para obtener la cookie del admin.

Sin embargo nos salta la alerta:

Vamos a mandar sólo la IP.

Parece que obtenemos una conexión:

Esto significa que el admin hace click en cualquier enlace mandado. Sin embargo, antes vimos que se estaba usando un token csrf, por lo que sin el token csrf correcto no podremos hacer que el admin haga una petición exitosa a /promote_coadmin.php.
Vamos a investigar el token CSRF, parece un MD5.

Vaya vaya, parece que el token CSRF se genera a partir del username. Vamos a generar una petición HTTP para que el admin cambie el rol de mod. Para ello, vamos a generar el token del usuario admin.

Ahora mandamos la petición.

Y técnicamente ahora somos admin.

Si cerramos sesión y volvemos a abrirla vemos que el panel ha cambiado.

Si volvemos al chat, podemos ver la flag de admin.
Escalada de Privilegios
SSRF
Si vamos y seleccionamos la funcionalidad de lotería podemos ver lo siguiente:

Vamos a cambiar el lottery.php por un finance.php, que vimos antes.

Parece que acabamos de encontrar el panel de finanzas. Vamos a interceptar la petición en Burp y a mandarlo y metemos la contraseña.

Vamos a ver qué hay dentro.

Una funcionalidad de subida, esto puede sernos útil, teniendo en cuenta que había un directorio expuesto para las subidas /uploads/.
Upload Vulnerability
Vamos a subir una reverse shell en PHP. Pare ello primero la copiamos y editamos.

Nos ponemos en escucha

La subimos.

Y obtenemos lo siguiente:

Sin embargo, si vamos al directorio no vemos nada.

Es probable que sea porque estamos en una red interna. Pero vamos a modificar la petición que hacíamos a finance.php para hacerla a /uploads/sequence.php.

Bingo! Vamos a ver qué hay dentro. Primero la estabilizamos.

Y ahora podemos claramente ver que estamos dentro de un contenedor.
Docker Escape
Vamos a cargar y a ejecutar linpeas.sh:
- Creamos un servidor.

- Lo cargamos y ejecutamos.

No hemos encontrado nada muy obvio, sin embargo, podemos ejecutar docker dentro del contenedor (y somos root).

Vamos a ver si podemos elevar privilegios por ahí.

Podemos usar la imagen para montar el / del host en /host y leer el directorio /root.

Ahora simplemente leemos la flag.
Conclusión
Una máquina muy divertida, encadenando varias vulnerabilidades. La parte más complicada sin lugar a dudas vuelve a ser la del escape del contenedor. Sin embargo esta se adecua mucho más al nivel que la anterior máquina de dificultad media. Me ha gustado bastante.
