Skip to main content
HackTheBox machines – Cybermonday WriteUp

HackTheBox machines – Cybermonday WriteUp

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

Cybermonday 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 Cybermonday 10.10.10.xxx a /etc/hosts como cybermonday.htb y comenzamos con el escaneo de puertos nmap.

 

Una vez detectados los puertos abiertos revisamos más a fondo los mismos

 

Enumeración

No hay mucho que hacer así que vamos de cabeza al portal web

HackTheBox machines – Cybermonday WriteUp

 

Revisamos con whatweb y vemos la versión de php y nginx

 

No vemos gran cosa así que creamos una cuenta y accedemos

HackTheBox machines – Cybermonday WriteUp

 

Revisamos la misma, hay una sección de venta de productos, aunque los botones no funcionan y no parece que podamos hacer gran cosa por aquí por lo que continuamos.

Tratamos de obtener algunos ficheros y conseguimos el fichero .htaccess

 

Viendo las reglas configuradas no vamos a poder hacer un LFI de la forma más sencilla, aunque hay otras formas con las que hacerlo, así que probamos y obtenemos el fichero .env de la aplicación

 

Tenemos el APP_KEY de la aplicación entre otras cosas, así que nos lo guardamos que puede venir bien más adelante.

Seguimos revisando y encontramos un directorio .git

Así que descargamos su contenido con git-dumper

 

Revisamos los cambios realizados pero sólo hay un commit llamado backup

 

Así que revisamos lo que tenemos y encontramos una parte del código interesante

Si el usuario dispone del atributo isAdmin a true puede acceder al panel de administrador, así que vamos a ponerlo en práctica.

Nos vamos al perfil del usuario y lo editamos, interceptamos la petición con burp y añadiremos el parámetro

HackTheBox machines – Cybermonday WriteUp

 

Enviamos y veremos un elemento nuevo en el menú, dashboard, así que pinchamos para llegar al mismo

Revisando dashboards

 

En esta parte no parece que haya gran cosa así que vamos a la sección de changelog

Changelog interesante

 

Y vemos un enlace a un subdominio nuevo

Lo añadimos al fichero hosts y accederemos para ver una api rest

 

Primera vista a la api

 

Abusando de la API

Revisando las opciones de la API vemos que podemos registrarnos, loguearnos y crear un webhook. Con el webhook creado podemos después enviar una petición http o guardar datos en un fichero de log, así que vamos a investigarla un poco.

Revisando la misma podmeos descargarnos el fichero de claves

Con el mismo podemos utilizar la herramienta de jwt_tool para generarnos una clave pública, así que generamos primero un token con el usuario admin

Generando el token de admin

 

Y generamos la clave pública con jwt_tool

 

Una vez tenemos nuestra clave podemos utilizar la misma para generar un token con el cual autenticarnos en la api

 

Ahora con nuestro token vamos a crear un webhook

Y llamaremos al mismo haciendo una petición a un servidor en python que levantamos previamente

Y vemos que funciona

 

Explotación de vuln de SSRF

Viendo el funcionamiento del webhook vamos a tratar de acceder a otros servicios internos del servidor, y revisando el fichero env que vimos antes podemos probar contra redis.

Así que vamos a ver si podemos utilizar nuestra máquina como esclavo, mandamos la petición

Vemos que nos devuelve un error, pero en nuestra escucha vemos que tenemos respuesta

Así que podemos acceder a redis, aunque no obtengamos respuesta del mismo al hacer la petición.

Revisamos en detalle y el siguiente paso será modificar la cookie de sesión almacenada en redis con la idea de poder injectar un payload que nos permite llevar a cabo un RCE, así que para eso vamos a crear un script que nos haga todos estos pasos.

El script tendrá que ser capaz de

  •  Loguearse en la aplicación para obtener una cookie de sesión
  • Descifrar la cookie para obtener el identificador con el cual se almacena la cookie en redis
  • Generar un payload que lleve nuestra reverse shell
  • Modificar la sesión en redis con nuestro payload
  • Cargar la página de nuevo para ejecutar nuestro payload

Visto esto el script tendría las siguientes partes.

Desciframos la cookie con el siguiente trozo de código

 

Generamos un payload con nuestra revshell, para ello he utilizado phpggc

En el payload es vital escapar los caracteres \ y ” para evitar errores y que funcione tal y como esperamos

Y modificaremos la sesión en redis

 

Vistas las partes críticas del mismo el código final sería el siguiente

 

Una vez lo tenemos todo ejecutamos

Y tenemos una revshell al contenedor

 

Enumerando el contenedor

Ahora dentro del contenedor enumeramos el mismo.

Mirando el fichero route sacamos la ip en formato hex

La convertimos y tenemos una ip en claro 172.18.0.1

Y si miramos el fichero hosts obtenemos la ip de este contenedor

 

No hay ping, ni nada que nos pueda ayudar a enumerar el resto de contenedores existentes así que nos descargamos una versión estática de nmap para enumerar la misma.

Ejecutamos la misma sobre el cidr /24 completo y descubrimos una máquina con un registry de docker:

 

Si revisamos la máquina descubrimos también un punto de montaje en la ruta /mnt donde vemos la clave pública de un usuario en su fichero authorized_keys y con ello su nombre

 

Obtención de los datos del docker registry

No podemos acceder desde nuestra máquina así que subimos el binario de chisel y levantamos un servidor en nuestro kali

Y nos mandamos el puerto 5000

Una vez hecho utilizaremos la herramienta DockerRegistryGrabber para traernos su contenido

Descubrimos primero las imágenes

Y nos descargamos todo su contenido

 

Extraemos el contenido de todos ellos y en dos vemos el código de la API en la ruta var/www/html/app

 

Explotando LFI en la API

Revisamos el código de la api y vemos un endpoint que no estaba documentado antes, se trata de logs

Buscando vulnerabilidades en el código

 

Y si revisamos el código vemos que hay una vulnerabilidad a la hora de acceder a la lectura de los ficheros de log

Buscando vulnerabilidades en el código

 

Si analizamos el mismo vemos que realiza 4 comprobaciones

  •  Revisa que no existan los caracteres ../ seguidos
  • Elimina los espacios
  • Revisa que el nombre del fichero incluya el string log
  • Comprueba que el fichero existe

Visto esta parte podemos saltarnos la restricción utilizando . ./ en lugar de ../ y echando un directorio atras en primer lugar para volver a entrar al directorio logs e incluir la palabra log.

Para explotar esto hemos hecho otro pequeño script que sería el siguiente

 

Y ejecutaremos el mismo para obtener el fichero passwd

 

Ahora ya vemos que funciona así que vamos a traernos las variables de entorno del proceso en ejecución

Y en las mismas encontramos una password que utilizaremos para acceder con el usuario john que vimos anteriormente.

 

Obteniendo la flag de user

Accedemos por ssh con las claves obtenidas y cogemos la flag

 

Escalado de privilegios

Una vez dentro, revisamos los permisos del usuario

 

Y puede ejecutar como root el script secure_compose.py cuyo contenido es el siguiente

 

El mismo necesita que se le pase como argumento un fichero yaml con la configuración de un entorno de docker compose.

Sobre el mismo realiza una serie de comprobaciones para asegurarse de que los mismos son seguros, aunque se olvida de alguna cosilla.

Vemos que podemos añadir un punto de montaje como sólo lectura y que el contenedor no debe tener privilegios pero no revisa dos partes importantes, las capabilities y las security options.

Así que vamos a aprovecharnos de que no verifica estas opciones para remontar el punto de montaje como escritura dentro del contenedor y hacer aquello que queramos.

 

Generamos nuestro fichero yml que sería el siguiente

 

Una vez generado, ejecutamos

 

Y tendremos acceso en nuestra escucha al contenedor

 

Copiamos el binario de bash desde la máquina a la home del usuario

 

Ahora en el contenedor, remontamos el disco, pero en este caso con permisos de escritura

Y cambiaremos los permisos del binario de bash poniendo a root como propietario y dandole permisos de suid

 

Una vez hecho volvemos al servidor y ejecutamos para escalar a root

 

Obteniendo la flag de root

Y vamos a por 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 *