
Herramienta automatizada de explotación de vulnerabilidades de cadena de formato para descubrir fugas de pila, PIE y canary con capacidad de búsqueda de banderas mediante los especificadores %s o %p.
.d8888b. 888 888 888 8888888888 .d8888b.
d88P Y88b 888 888 888 888 d88P Y88b
888 888 888 888 888 888 Y88b.
888 888 888 888 8888888 "Y888b.
888 88888 888 888 888 888 "Y88b.
888 888 888 888 888 888 "888
Y88b d88P 888 Y88b. .d88P 888 Y88b d88P
"Y8888P88 88888888 "Y88888P" 888 "Y8888P"
Por: DiegoAltF4
GLUFS te permite automatizar el tedioso proceso de encontrar filtraciones usando vulnerabilidades de cadena de formato. Te permitirá encontrar filtraciones de pila, PIE y canary, indicando en cada caso el payload que proporciona la filtración. Además, incluye un modo que permite buscar una cadena "flag" en las filtraciones. Para este modo, se puede usar el especificador %s o %p.
Para este ejemplo, vamos a usar GLUFS para obtener una filtración de PIE y canary.
El binario que tomaremos como ejemplo es el correspondiente al desafío 7 de la sala TryHackMe pwn101 TryHackMe room pwn101.
Usaremos la opción -b para indicar el binario, la opción -min para indicar el valor inicial de la iteración y -max para indicar el valor final de la iteración. Además, queremos obtener información sobre los canaries y sobre PIE.
./glufs.py -b ./pwn107.pwn107 -min 5 -max 15 --pie --canary

Para este ejemplo, usaremos GLUFS para obtener la flag.
El desafío que vamos a resolver es Confused environment read de la plataforma 247CTF.
Para este ejemplo no vamos a usar un binario. Solo tenemos una IP y un puerto. Por lo tanto, usaremos la opción -ip para indicar la dirección, -port para indicar el puerto, -flag para especificar el inicio de la flag a buscar. Además, como no tenemos binario, debemos indicar la arquitectura, en este caso, x86-64 (-arch 64). También indicaremos el inicio de la iteración con -min y el final con -max. Además, usaremos la opción -s para usar %s en lugar de %p.
./glufs.py -ip 3bcbadabd1a7e914.247ctf.com -port 50387 -flag 247CTF -arch 64 -min 1 -max 200 --s

Para este ejemplo, usaremos GLUFS para obtener la flag.
El desafío que vamos a resolver es flag leak de la plataforma PicoCTF.
Para este ejemplo, usaremos la opción -ip para indicar la dirección del servidor, -port para indicar el puerto del servidor, -b para indicar el binario, -flag para indicar el inicio de la flag, y finalmente, especificamos el inicio y final de la iteración con -min y -max. Si no especificas la opción --s, se usará el formato %p por defecto.
./glufs.py -ip saturn.picoctf.net -port 50563 -b ./vuln -flag picoCTF -min 20 -max 200

git clone https://github.com/Diego-AltF4/GLUFS.git
cd GLUFS/
pip3 install -r requirements.txt
chmod +x ./glufs.py
Es muy importante que modifiques el código para poder adaptarlo a tu binario/desafío. Para ello, hay dos secciones delimitadas del código en las que debes realizar cambios para obtener la filtración de la cadena de formato, así como para configurar cuándo se debe enviar el payload.
Ejemplos: Para el desafío picoCTF explicado anteriormente, se usa la siguiente configuración:
#######################################################################
# This is the part that you must modify to fit your binary. #
#######################################################################
p.sendlineafter(b'>>', payload)
p.recvuntil(b'-')
leak = p.recv().strip(b'\n')
#print(leak) ## For debugging errors
#######################################################################
| Parámetro | Información |
|---|
| -b | Selecciona esta opción para indicar el binario a explotar. |
| -max | Selecciona esta opción para indicar el valor máximo a probar. Rango: (min, max). Por defecto, max = 40 |
| -min | Selecciona esta opción para indicar el valor mínimo a probar. Rango: (min, max). Por defecto, min = 1 |
| -ip | Selecciona esta opción para especificar la IP del servidor remoto. |
| -port | Selecciona esta opción para especificar el puerto del servidor remoto. |
| -flag | Selecciona esta opción para indicar el inicio de la flag a buscar. |
| -arch | Selecciona esta opción para establecer la arquitectura (32 o 64). |
| --s | Selecciona esta opción para usar %s en lugar de %p. |
| --canary | Selecciona esta opción para encontrar la posición donde se localiza una filtración de canary. |
| --leaks | Selecciona esta opción para imprimir todas las filtraciones encontradas. |
| --pie | Selecciona esta opción para encontrar la posición donde se localiza una filtración de PIE. |
| --stack | Selecciona esta opción para encontrar la posición donde se localiza una filtración de pila. |
| --v | Selecciona esta opción para activar el modo verbose. |