Craft presenta Gogs donde encontramos el codigo fuente y una vulnerabilidad en una API la cual explotamos para ejecutar una shell inversa. Utilizando credenciales de la base de datos nos conectamos a esta y obtuvimos credenciales para realizar movimiento lateral. Con informacion de los repositorios y de la base de datos obtuvimos acceso al siguiente usuario. El repositorio de Infraestructura nos permitio obtener acceso privilegiado con la informacion de Vault.
Informacion de la Maquina
Nombre | Craft |
---|---|
OS | Linux |
Puntos | 30 |
Dificultad | Media |
IP | 10.10.10.110 |
Maker | |
|
MASSCAN & NMAP
|
|
HTTPS
Visitamos la pagina en HTTPS nos muestra un mensaje que nos habla de una rest API.
Subdominios
Nos movilizamos atravez de las diferentes rutas que nos provee la pagina y encontramos un dominio y dos subdominios, los cuales agregamos a nuestro archivo /etc/hosts
.
craft.htb
api.craft.htb
gogs.craft.htb
https://api.craft.htb/api/
En la pagina de api nos meustra distintas opciones con las cuales podemos interactuar con una interfaz y tambien nos provee diferentes comandos con curl, para hacer solicitudes a la API.
https://gogs.craft.htb/
En la pagina de gogs nos encontramos con la plataforma gogs que permite el gestionamiento de repositorios, dentro de la misma plataforma nos encontramos con un repositorio.
CRAFT API
Analizamos el codigo que se encuentra en el repositorio el cual pertenece a la rest API que nos menciona la pagina principal (craft.htb
), contiene toda la estructura de como funciona esta API. Dentro, encontramos que se hizo un cambio a una parte de codigo que pertenece a la creacion de un nuevo brew
de la API.
Dicho cambio incluye una porcion de codigo de python que es vulnerable a ejecucion de comandos remota o RCE.
Porcion de codigo vulnerable especificamente eval()
:
|
|
Ademas de eso encontramos un archivo test.py que contiene un usuario y contraseña para generar un token, para luego crear un ‘brew’ insatisfactorio y satisfactoriamente. El primero contiene un numero con punto decimal mayor a 1 que debe de ser rechazado por la API. El segundo un numero menor a 1 con punto decimal que debe de ser aceptado por la API.
Archivo test.py:
|
|
Prueba del archivo test.py:
RCE - Craft API
Para poder ejecutar comandos y obtener una shell inversa a travez de la vulnerabilidad que encontramos en el codigo del repositorio vamos a modificar el archivo test.py
, agregandole un comando que va a ser ejecutado por la funcion eval(). Agregamos nuestra shell inversa “escapando” todas los backslash que se encuentran para no tener ningun problema al ejecutarse. Y Ponemos a la escucha nuestra maquina.
|
|
Al ejecutar el script obtenemos una shell inversa:
MYSQL - Dump Credentials
Dentro del sistema de archivos encontramos los mismos archivos pertenecientes al repositorio, al ejecutar el archivo de dbtest.py
obtenemos una respuesta de la base de datos MySQL.
Archivos:
Prueba dbtest.py
Archivo settings.py con credenciales de la base de datos:
Para poder obtener Credenciales que se encuentran en la base de datos utilizamos nuevamente el repositorio, ya que en este se encuentra el modelo de las tablas de la base de datos, brew y user, por lo que podemos obtener facilmente las columnas y el nombre de las tablas.
craft_api/database/models.py
Para realizar un query a la base de datos utilizamos y modificamos el archivo dbtest.py
:
|
|
Teniendo nuestro archivo listo utilizamos el siguiente query para obtener los datos:
|
|
Archivo dbtest.py modificado:
Obtenemos las credenciales que estan dentro de la base de datos, una de ellas ya la teniamos dentro del script test.py:
|
|
USER gilfoyle - SHELL SSH
Obtuvimos las credenciales de 3 “usuarios”, ninguno de ellos funciona en el servicio de SSH, pero dos de ellos si funcionan en la plataforma Gogs.
Por un lado tenemos al usuario dinesh quien puede realizar cambios dentro del codigo del repositorio de la API de craft.
Con el usuario gilfoyle nos muestra un repositorio más al del usuario dinesh este nos muestra como esta la infraestructura del ‘servidor’. Entre las cosas que tiene este repositorio encontramos el ‘craft-flask’ el cual contiene la informacion para la Shell de privilegios bajos con la que pudimos obtener las credenciales, y, tambien informacion del servidor nginx, mysql, vault y ssh.
En la carpeta .ssh encontramos la clave publica y privada del usuario gilfoyle perteneciente al servicio de SSH, utilizamos dicha clave para obtener una shell SSH. Al utilizar la clave nos pide una frase utilizamos la contraseña (ZEU3N8WNM2rh4T
) que encontramos en la base de datos de este usuario.
Obtenemos una shell y nuestra flag user.txt
.
PRIVILEGE ESCALATION
Nuevamente volvemos al repositorio donde encontramos la infraestructura que tiene el servidor, dentro, encontramos en la carpeta vault la configuracion de esta plataforma, esta plataforma da el acceso y control de contraseñas, certificados, claves de APIs, contraseñas, etc.
|
|
Revisamos la documentacion de esta plataforma y las opciones que contiene este archivo. Encontramos que la plataforma esta corriendo en el puerto 8200 y su interfaz grafica (ui) esta desactivada. Dentro de la maquina especificamente en el archivo /etc/hosts
encontramos que la plataforma esta configurada en la ip y dominio:
|
|
Comprobamos que la interfaz grafica este desactivada traemos 172.20.0.2
con el puerto 8200
localmente:
|
|
SSH
Local
Pudimos comprobar que la plataforma esta desactivada graficamente.
ROOT - One Time Password
One time password permite a algun usuario crear una contraseña cada vez que lo desee conectarse en el servicio SSH mediante comandos. De igual forma dentro del repositorio encontramos un archivo llamado secret.sh
el cual contiene una configuracion para activar ssh, crear un Rol con el usuario root con las IP que se representen dentro de cidr_list
.
|
|
Utilizamos el archivo secrets.sh
, lo modificamos y lo ejecutamos:
|
|
Creamos una credencial para nuestra ip con el rol de root_otp.
|
|
Cuando creamos nuestra credencial nos muestra los detalles:
Utilizamos la clave (key) como contraseña:
key: 70a2c9bc-4644-8bbd-f010-0c08193a3b7f
Nos conectamos mediante ssh al usuario root localmente (0.0.0.0):
ssh root@0.0.0.0
Obtenemos una shell como usuario root y nuestra flag root.txt
: