HackTheBox - Ready
Creado

Máquina Linux nivel medio. Empezaremos readys a buscar exploits ante un lindo lobo (Gitlab), encontraremos contraseñas volando y tendremos que escapar de la ballena (Docker) :O
TL;DR (Spanish writeup)
Creada por: bertolis.
Este writeup lo hice despues de haber resuelto la máquina, por lo tanto (quizás) iré muy directo :P
Clasificación de la máquina
Tiene vulnerabilidades bastante comunes.
Escribo para tener mis “notas”, por si algun dia se me olvida todo, leer esto y reencontrarme (o talvez no) :) además de enfocarme en plasmar mis errores y exitos (por si ves mucho texto), todo desde una perspectiva más de enseñanza que de solo plasmar lo que hice.
…
…
Enumeración #
Empezamos realizando un escaneo de puertos para saber que servicios está corriendo la máquina:
Parámetro | Descripción |
---|---|
-p- | Escanea todos los 65535 |
–open | Solo los puertos que están abiertos |
-v | Permite ver en consola lo que va encontrando |
-oG | Guarda el output en un archivo con formato grepeable para usar una función de S4vitar que me extrae los puertos en la clipboard |
Tenemos los siguientes servicios activos:
Puerto | Descripción |
---|---|
22 | SSH: Conexión remota segura mediante una Shell |
5080 | Un puerto con poca información, veamos si en el siguiente escaneo conseguimos algo más |
Hagamos nuestro escaneo de scripts y versiones con base en cada puerto, con ello obtenemos información más detallada de cada servicio:
Parámetro | Descripción |
---|---|
-p | Escaneo de los puertos obtenidos |
-sC | Muestra todos los scripts relacionados con el servicio |
-sV | Nos permite ver la versión del servicio |
-oN | Guarda el output en un archivo |
Tenemos:
Puerto | Servicio | Versión |
---|---|---|
22 | SSH | OpenSSH 8.2p1 Ubuntu 4 |
5080 | HTTP | nginx (Ahora si tenemos data :P) |
Pues empecemos a enumerar los servicios (:
…
Puerto 5080 ⌖
Ingresamos en la web: 10.10.10.220:5080
y obtenemos:
Interesante, tenemos el servicio GitLab
, que nos sirve para gestionar repositorios, controlar versiones de proyectos y mantener software desarrollado colaborativamente. Podemos crearnos una cuenta e ingresar al sistema, intentémoslo:
Creamos la cuenta y si todo está bien, nos redirige al dashboard de proyectos:
Nice, jmmm, pues veamos que podemos encontrar…
Despues de algo de jugueteo, encontramos la versión de GitLab
en el apartado /help
:
GitLab 11.4.7
.
Perfecto, ahora tenemos algo en lo que enfocarnos, pues a buscar si existen exploits para esa versión o que podemos intentar hacer con ella (:
…
Explotación #
Despues de un rato probando, me encontré este repositorio:
En el cual recopila algunos CVE’s con los cuales se logra ejecución remota en la máquina afectada, explotando así un SSRF (que básicamente es manipular un servidor, a tal punto de contar con información con la cual no deberíamos contar :P) que juntándolo con un CSRF injection (que nos permite jugar con los submit
entre aplicaciones) hacia el protocolo git:// lograr Remote Command Execution (RCE):
Revisando el código debemos cambiar el puerto al que queramos hacer la reverse Shell. Nos ponemos en escucha primero:
Ahora ejecutamos:
Damos a la opción 0
, ya que es nuestra versión yyyyyyyyy:
Tenemos una Shell como el usuario git
en el sistema. Antes de seguir hagámosle un tratamiento a la Shell (TTY), ya que con la que tenemos estamos limitados, no podemos ver los comandos anteriormente ingresados, no podemos hacer CTRL + C
y demás cosas que podemos hacer en una sesión completa:
Listosss, ahora a enumerar…
El archivo user.txt
puede ser visualizado con el usuario git
, aunque su propietario es dude
:O
…
Escalada de privilegios #
En la raíz hay un objeto llamativo (cuál es? e.e) pero pues solo es eso, llamativo, ya que esa “pass” no nos sirve con ningún usuario:
Despues de un rato enumerando y no revisar lo basico :l encontramos esta carpeta:
Revisando cada archivo tenemos curiosidades:
¬ docker-compose.yml:
- Tenemos el archivo
root_pass
, que está siendo usado para la ejecución de GitLab. - El puerto
5080
debe estar haciendo algún tipo de Forwarding sobre el80
. - Monturas, donde i.e:
./srv/gitlab/config
esta sobre la ruta/etc/gitlab
. Y así con las demás. - Ah y que al tener el archivo
docker-compose.yml
sabemos que estamos dentro de un contenedor.
¬ gitlab-secrets.json:
En internet dice que es un archivo para restaurar el sistema en caso tal o.o
¬ gitlab.rb:
Un archivo con muchos comentarios (: si se los quitamos nos encontramos:
Con
-E
le ingresamos la expresion regular, para que tome todo lo que inicie con#
. Y con-v
le indicamos que nos borre ese output.
Tenemos una contraseña, intentemos probar con los usuarios:
Opa, somos usuario administrador del sistema :) Ahora solo nos quedaría ver las flags:
Ehhh?
Pues no esta y no, no es error de la máquina. Acá estuve un rato atascado (buen rato) enumerando… Me fui para el foro y lo primero que vi fue "Escape!"
. Relacionando las cosas entendí que al estar en un contenedor, debía buscar una manera de moverme (“escapar”) al host.
Este artículo explica muy bien como es el proceso, vamos a repasarlo:
Are containers that are run with the
--privileged
flag. Unlike regular containers, these containers have root privilege to the host machine. Vickie Li
Pues si, a veces necesario (pero siempre peligroso) para cumplir algunas tareas. Pero bueno, primero debemos saber si estamos sobre un contenedor explotable :P
Para saberlo nos apoyamos del feature en Linux que aísla el uso de recursos (que en nuestro caso Docker lo usa para asilar sus contenedores), llamado cgroup
(control groups) ubicado en proc/1/cgroup
:
El artículo nos dice que si estamos dentro de un contenedor debemos ver /docker/ID_del_contenedor
. Así que vamos bien (:
Ahora, ¿cómo sabemos si tiene el atributo --privileged
?: lo explica, pero no pude probarlo, ya que el comando no está habilitado :P Peeero vamos a creer que si lo tenemos activado (pensamiento lateral e.e)… Escapemos:
Creamos un cgroup
:
Habilitamos el feature (release_agent
) que está siendo ejecutado desde el host como root
:
release_agent: the path to use for release notifications (this file exists in the top cgroup only) kernel.org/cgroups
Ahora alojamos la ruta del archivo que tendrá nuestros comandos hacia el archivo conteniendo el feature:
Terminando, añadimos nuestros comandos al archivo, donde /cmd
son los comandos y /output
la respuesta:
En mi caso quiero listar el directorio home de root
.
Finalmente ejecutamos un proceso que termina sobre el cgroup
que hemos creado y nuestro release_agent
es lanzado:
Veamos el resultado en el archivo /output
:
Perfecto, perfectisimo… Pues hagamos lo mismo, pero extraigamos la llave privada SSH (id_rsa
) del usuario root (bueno, si es que existe), para así entrar sin necesitar contraseña:
Y el resultado:
Ahora guardémosla en un archivo, le damos los permisos necesarios (chmod 600 keyroot
) y entremos :O
Ta nice eh!! Bueno, solo nos quedaría ver las flags:
…
Final de la máquina neas :P En general me gusto, el tema de Docker está superinteresante y loco.
¡Nos charlamos en otro set de ideas y bueno, a seguir rompiendo todo!! ❤️🖤
Comments