Skip to main content
EarlyAccess es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox basada en Linux

HackTheBox machines – EarlyAccess WriteUp

EarlyAccess es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox basada en Linux

EarlyAccess es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Difícil.

En este caso se trata de una máquina basada en el Sistema Operativo Linux.

 

Escaneo de puertos

Como de costumbre, agregamos la IP de la máquina EarlyAccess 10.10.11.110 a /etc/hosts como earlyaccess.htb y comenzamos con el escaneo de puertos nmap.

Observamos los puertos abiertos, y vemos que el portal web existente en el puerto 80 redirecciona al 443, por lo que comenzaremos por ese punto.

 

Enumeración

Como ya indicábamos accedemos al portal web earlyaccess.htb en el puerto 443 y vemos la siguiente ventana

HackTheBox machines – EarlyAccess WriteUp

 

Navegamos un poco por la página y vemos un enlace a una página de login y otro a una de registro, pero lanzamos una enumeración de directorios y ficheros y nos encontramos con que hay un waf de por medio que nos bloquea

Cazados por el WAF

Así que no va a ser una opción, por lo que nos creamos una cuenta, logueamos con la misma y veremos la pantalla del foro

HackTheBox machines – EarlyAccess WriteUp

 

Revisamos un poco el portal y vemos una sección de mensajes privados donde es posible enviar mensajes al usuario admin@earlyaccess.htb, una sección donde se puede registrar la clave de un juego y el foro, donde si indagamos un poco, vemos que los usuarios reportan dos bugs, uno que tiene que ver con el nombre del usuario y otro que habla de la pantalla de puntuaciones.

 

Bugs en la app

 

XSS para escalar a admin

Viendo la parte del usuario, hacemos alguna prueba con el mismo y vemos que es vulnerable a XSS, así que vamos a tratar de obtener la cookie del usuario admin al enviarle un mensaje.

Para ello, lo vamos a hacer de una forma muy simple.

Modificaremos el nombre de nuestro usuario por el siguiente:

El fichero index.js al que llamamos llevará el siguiente contenido:

Levantaremos nuestro servidor con python

Enviaremos un mensaje al usuario admin a través del formulario, y esperamos a que el mismo lo abra para obtener la cookie en nuestro servidor

Y ya tenemos la cookie, ahora sólo nos queda editar la misma en el navegador y recargar, y veremos como nuestro usuario a pasado a ser admin

Escalando a admin

 

Obteniendo la clave de juego

Ahora que vemos el panel de administrador observamos varias cosas.

Por una parte dos subdominios que no conocíamos todavía:

  • dev.earlyaccess.htb
  • game.earlyaccess.htb

Una sección de backups donde podemos descargar un fichero .zip

Backups de validación

 

Y una sección para verificar la key de un juego, así que vamos a descargarnos el backup y observamos que en su interior está el fichero validate.py para validar las claves con el siguiente contenido:

 

Observando el anterior código vemos que la clave consta de 5 grupos, en los cuales los grupos 1, 2 y 4 podemos calcularlos fácilmente, pero el grupo 3 y el 5 no.

Vemos también que el carácter aleatorio se basa en un número mágico

Que se genera aleatoriamente por la aplicación cada 30 min, por lo que tendremos que probar con una serie de códigos hasta dar con la clave.

Y vemos que el grupo 3 está formado por los caracteres “XP” más 3 caracteres que son letras y un número, así que vamos a calcularlo.

En primer lugar nos hemos hecho algunas modificaciones sobre el fichero de validación para ver en que grupo nos quedamos, y hemos generado el siguiente script para calcular los diferentes grupos.

 

En el caso de la función de generate, el valor mínimo de 178 surge del siguiente cálculo

Donde 168 surge de

Dicho esto, ejecutamos el script para sacar 60 combinaciones de claves en base a los posibles números aleatorios que ha podido generar la aplicación

 

Así que ahora vamos a utilizar Burp Suite para hacer un ataque de fuerza bruta con estas claves y conseguir descubrir la válida. Para ello vamos a realizar los siguientes pasos:

  1. Interceptaremos una petición de verificación de clave y la enviaremos al Intruder de Burp
  2. Quitaremos el valor de XSRF-TOKEN de la cookie ya que lo calculará Burp
  3. Añadimos los payloads generados previamente
  4. Añadiremos opciones para el filtrado de respuestas 
  5. Habilitaremos que siempre siga redirecciones en las opciones
  6. Y añadiremos una condición para que capture el token (dejo captura de este último)

 

Configurando burp suite

 

Lanzaremos el ataque y conseguiremos encontrar la clave válida

Obteniendo la clave de jueog

 

Así que con la clave válida, volvemos a la cuenta de nuestro usuario creada al principio, e introduciremos la clave obtenida

Clave verificada

 

Inyección SQL en el portal de juego

Ahora que ya lo tenemos accedemos al subdominio de game.earlyaccess.htb con nuestras credenciales y veremos la siguiente pantalla del juego de la serpiente

Juego de la serpiente

 

Navegamos un poco por el portal y vemos un error sql al ver la pantalla de puntuaciones

Explotando sqli

 

Viendo el error que muestra, está claro que falla por el nombre de nuestro usuario, y además tenemos los caracteres que lo identifican que serían ‘) así que vamos a tratar de hacer una inyección sql para obtener más datos de los usuarios existentes.

Hacemos alguna prueba y descubrimos que la tabla existente dispone de 3 campos con la siguiente query

Indagamos un poco más para obtener las tablas existentes en el sistema

Obteniendo las tablas con sqli

 

Y vemos una tabla users, así que vamos a descubrir que columnas tiene la misma

Y como la tabla scoreboards sólo tenía 3 campos, cogemos los 3 que más nos interesan de la tabla users

Y obtenemos todos los usuarios existentes

SQLi completada

 

Así que ahora que tenemos los hashes de los usuarios vamos a identificar el tipo de hash

Y lo romperemos con hashcat

 

Obteniendo una shell con www-data

Y ya tenemos la contraseña de admin para ir al otro portal, el de dev. Así que vamos al mismo y nos logueamos viendo el siguiente panel

Acceso al portal de dev

 

Navegamos por la ventana y vemos dos secciones, una sección de ficheros que indica que está en construcción y una sección de hash donde se ve el siguiente formulario

Comprobando herramientas de hashing

Revisamos el código html y vemos que el formulario hace una petición POST a /actions/hash.php por lo que vamos a tratar de acceder a la sección de ficheros con curl a ver si el fichero existe.

Hacemos la prueba con curl y bingo! existe

Pero ahora tenemos un problema, y es que no conocemos como especificar un fichero, así que como entendemos que será por parámetro, vamos a enumerar posibles parámetros a ver si encontramos el bueno

 

Y tenemos el parámetro filepath, así que ahora vamos a tratar de obtener por medio de los filtros de php el fichero hash.php.

Hacemos la siguiente petición para conseguir el fichero en base64

Y obtenemos el siguiente código

 

Revisamos el código anterior y vemos varias partes. Un comentario del desarrollador que indica que tiene que ser sencillo…

Y una función para la verificación del tipo de hash, pero que además indica un parámetro más, debug

Así que vamos a hacer una petición añadiendo el parámetro debug

Nos devuelve un error relacionado con la función llamada, así que hacemos alguna prueba más y observamos que utilizando la función system no devuelve ningún error

Así que vamos a tratar de obtener una shell aprovechando la misma

Y dentro

Revisamos un poco la máquina y los usuarios existentes y escalamos al usuario www-adm con las credenciales obtenidas anteriormente

 

Escalado a drew

Ahora ya estamos dentro pero no tenemos nada al respecto, y no podemos coger la flag, así que vamos a enumerar y encontramos unas credenciales de una api en la home del usuario

Revisamos los procesos existentes 

El fichero de hosts

Y los cgroups existentes

Y vemos que realmente estamos dentro de un contenedor de docker, por lo que la api estará en otro contenedor diferente, así que usamos ping para detectar las ips levantadas y enumeramos los puertos posibles con nc en las mismas

 

Y encontramos un puerto 5000 en el contendor con ip 172.18.0.101 que parece que será donde esté la api montada, así que testeamos con un simple curl y bingo!

Nos indica que los administradores pueden verificar la base de datos con la uri /check_db así que probamos

Introducimos las credenciales…

En el cual podemos obtener las credenciales del usuario drew

 

Obteniendo la flag de user

Con las credenciales obtenidas del usuario, accedemos por ssh con las mismas para conseguir acceder y obtener la flag de user

 

Escalado de privilegios

Ahora que ya estamos dentro con el usuario drew, enumeramos de nuevo la máquina y encontramos un mail del usuario donde mencionan otra aplicación de juegos

Y observamos también la clave ssh del usuario game-tester que suponemos que será para la máquina mencionada en el correo

Así que revisando las ips disponibles para docker que serían los siguientes rangos

Vamos a descubrir que ips están accesibles

 

Y como ya vimos antes los rangos de la 17 y 18 vamos a enumerar puertos con nc en el rango de la 19 y vemos uno en concreto 

Así que hacemos una petición con curl a esa ip para verificar

 

Y vemos que se trata del juego de piedra, papel o tijera, pero vamos a abrir un tunel ssh para verlo en el navegador

 

Y vemos la siguiente ventana

Juego de piedra - papel - tijera en Earlyaccess

Navegamos un poco por el mismo para ver su funcionamiento, y observamos que, como mencionaba en el correo, está en desarrollo por lo que podemos provocar que falle.

Probamos en la sección de autoplay a introducir un valor float en lugar de un entero y conseguimos que se rompa y se reinicie el servidor.

Además observamos que la ruta /opt/docker.entrypoint.d es editable

y que se comparte con el contenedor en cuestión por lo que puede ser la forma de conseguir escalar privilegios.

Para ello vamos a crear un script que copie bash a la ruta en el arranque del contenedor con permisos de suid y usuario root

Lanzaremos el siguiente while

Una vez lanzado, provocaremos que falle la aplicación para reiniciar el servidor y accederemos al nuevo contenedor con el usuario y la clave obtenidas antes

Revisamos que se ha ejecutado el script y que tenemos el fichero bash  en la ruta /tmp

Y lo ejecutamos para escalar a root dentro del contenedor

Ahora viene la segunda parte.

Desde la máquina host, copiamos el fichero /bin/bash a la ruta compartida

Desde el contenedor del juego le damos permisos suid y cambiamos el propietario

Y ejecutamos el binario desde el host

 

Obteniendo la flag de root

Ahora que ya somos root, nos vamos a su home y cogemos la flag

Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.

 

Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *