Hotel
Máquina de dificultad fácil de la plataforma HackMyVM
Comprobación
Arrancamos esta máquina como siempre, creando un directorio con el nombre de la máquina y utilizando la función “maquina”, la cual está previamente definida en mi zshrc.

Nos metemos dentro del directorio de “reconocimiento” y empezamos la comprobación.
Realizamos un ping a la máquina para ver si nos responde.

Podemos ver que nos responde sin ningún problema, por lo que vamos a pasar a la parte de escaneo de puertos.
Escaneo de puertos
Vamos a realizar un escaneo de puertos con nmap, el cual va a tener los siguientes parámetros:
-sS ← este parámetro hace que nuestro escaneo sea más rápido y silencioso, ya que no se efectúa un Three-Way Handshake.
–min-rate 5000 ← indicamos que no queremos que nuestro escaneo vaya a menos de 5000 paquetes por segundo.
-n ← con este parámetro le decimos a nmap que no queremos que nos aplique resolución DNS.
-Pn ← también le vamos a decir que no queremos que nos aplique descubrimiento de hosts a través de ARP.
-oG ← por último, queremos que nos exporte todo el contenido del escaneo en formato “grepeable”.

Una vez que lo realizamos, vamos a pasarle al archivo que nos ha creado “puertos_” nuestra herramienta portsClean, la cual representará el contenido del archivo “puertos_” de forma más bonita y concreta.

Ahí podemos ver que están abiertos los puertos 22 y 80 y que, de primeras, parece que están corriendo los servicios SSH y HTTP.
Una vez que hemos visto qué puertos están abiertos, vamos a realizar un escaneo un poco más concreto para estos puertos.

Con este escaneo lo que conseguimos es sacar qué versión está corriendo para ese servicio (-sV) y también algo más de información lanzando unos scripts básicos de reconocimiento de nmap programados en LUA (-sC).
Todo el output que se refleje por consola nos lo va a reportar al archivo “versiones” gracias al parámetro -oN.
Una vez que ha terminado el escaneo, vamos a ver el contenido del archivo representado por colores gracias a nuestro cat (que es un alias de bat).

Bueno, por ahí estamos viendo que el servicio 22 es efectivamente SSH y el 80 un HTTP.
Como vemos que el servicio 80 es un nginx, vamos a realizar las dos operativas que siempre realizo cuando me estoy enfrentando a una máquina que tiene un servidor web.
La primera de todas es ver qué tecnologías corren para este servidor web.
Gracias a la herramienta whatweb podemos verlas.

Por ahí podemos ver que es un nginx 1.18.0, que el título es “HotelDruid” y poquita cosa más. Ahora vamos a realizar un mini fuzzing con un script que tiene nmap.


Tampoco he conseguido ver mucho, por lo que vámonos directos a la página web.
Web
Una vez que entramos en la web, esto es lo que vemos de primeras:

En esta página, si le damos a “Create the year 2025”, se nos abrirá el siguiente menú:

Tiene toda la pinta de ser un sistema de gestión de reservas de hotel.
Ya que parece que es un software, podemos mirar si tiene algún CVE.
En exploitdb nos sale un script en Python el cual nos permite ejecutar código en el servidor que está alojando este servicio. Aquí vamos a explotarlo a mano, pero el que quiera usar este script con todo ya automatizado simplemente tiene que buscar en exploitdb “Hotel Druid 3.0.3 - Remote Code Execution (RCE)” o por el CVE-2022-22909.
Como bien he dicho, nosotros aquí vamos a explotarlo a mano para ver qué es lo que pasa y por qué se acontece este RCE.
En el exploit lo que se hace es a través de la solicitud de crear una nueva habitación.

Podemos modificar los parámetros que viajan a través de ella.
Para ello vamos a interceptar la solicitud con BurpSuite y vamos a ver cómo podemos ganar acceso a la máquina.
Esta es la solicitud en el repeater de BurpSuite.

Podemos ver que viaja por POST y que tiene datos como el año, el id, el tipo de tabla, un parámetro que se llama crea_app y otro parámetro que contiene, parece ser, el input que el usuario ha puesto.
Para poder ejecutar código en el servidor vamos a hacer lo siguiente: como nombre de la habitación vamos a poner “{${system($_REQUEST[‘cmd’])}}” para que se almacene y luego nos lo interprete.
La solicitud quedaría así:

Estamos poniendo “{${system($_REQUEST[‘cmd’])}}” de esta manera porque el software usa un sistema de plantillas donde el texto entre {} se procesa.
Una vez que hemos tramitado la solicitud, nos sale lo siguiente:

Vemos que nos ha añadido la habitación con el nombre malicioso correctamente.
Una vez que estamos en este punto, lo único que tenemos que hacer es apuntar a la ruta “http://{ip}/dati/selectappartamenti.php”.
Se apunta a este archivo porque es el encargado de leer el nombre de los apartamentos de la base de datos, por lo que, como el nombre es una sentencia en PHP, me la interpreta.

Esa es la URL. Vamos a pasarlo por BurpSuite e intentar ejecutar comandos con el parámetro cmd que hemos definido.


Me sale el comando ejecutado dos veces porque he añadido el payload dos veces sin querer.
Genial, pues una vez que podemos ejecutar comandos, vamos a intentar ganar acceso a la máquina.
Nos ponemos en escucha por el puerto 1212 y ejecutamos este comando del lado del servidor para entablarnos una reverse shell.

Y en nuestra terminal recibimos la conexión.

Escalada de privilegios
Genial, pues vamos a empezar con la escalada de privilegios, pero antes vamos a hacer un tratamiento de la tty para que nos sea más cómodo trabajar.

Empezamos obteniendo una bash en condiciones.

La paramos y ajustamos los modos TTY y volvemos al proceso.

Reiniciamos la xterm y, por último, establecemos la terminal.

Ahora podemos ejecutar un ctrl + c sin que nos corte la conexión.
Por último, falta establecer las proporciones para que al abrir “nano” nos salga con la misma proporción que en nuestra máquina. Para ello ejecutamos el comando “stty size” en una terminal de nuestra máquina y luego nos vamos a la terminal con la reverse shell y ejecutamos lo siguiente:

Cambia los números por los que te salgan a ti al realizar el stty size.
Una vez que hemos terminado, si buscamos un poco podemos ver que tenemos el directorio “person” el cual tiene la primera flag, pero no podemos leerla por falta de permisos.
Al realizar un find, hemos podido ver que hay un archivo llamado “ttylog”, el cual vamos a ver si podemos sacar algo de ahí.

Si abrimos el archivo con un cat nos salen todos los datos mal representados.

Por lo que vamos a utilizar la herramienta ttyplay, la cual nos va a permitir ver qué es lo que tiene este archivo.

Ahí podemos ver que nos da la contraseña del usuario “person”.

Si intentamos loguearnos, nos va a decir que contraseña incorrecta, por lo que vamos a probar por SSH para ver si nos deja.

Ahí podemos ver que nos deja perfectamente, por lo que vamos a ver la flag.

Ahora, para poder escalar privilegios a root, vamos a tener que explotar un binario, el cual es el siguiente:

Este binario lo que hace es convertir páginas web en archivos PDF con el motor de renderizado de WebKit.
Yo lo explotaría de la siguiente manera:

Esto lo que hace es lo siguiente: estamos enviando un archivo el cual estamos especificando que es la clave privada de root para poder conectarnos a él por SSH. También le estamos diciendo que nos lo envíe a nuestra IP (por lo que previamente tenemos que estar en escucha por el puerto que le hemos puesto) y que nos lo mande en formato PDF.
Al ejecutarlo, en nuestra terminal en escucha recibimos lo siguiente:

Ahí podemos ver que nos ha reportado toda la clave privada de root, por lo que si ahora nos intentamos conectar como este usuario con la clave privada…

Vemos que ya estamos como root en la máquina víctima.
Y esta es la flag de root:
