
Ferramenta automatizada de exploração de vulnerabilidade de string de formato para descobrir vazamentos de pilha, PIE e canary com capacidade de busca de flag via especificadores %s ou %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"
By: DiegoAltF4
O GLUFS permite automatizar o processo tedioso de encontrar vazamentos usando vulnerabilidades de format string. Ele permitirá que você encontre stack leaks, pie leaks e canary leaks, em cada caso indicando o payload que fornece o vazamento. Além disso, inclui um modo que permite buscar por uma string "flag" nos vazamentos. Para este modo, o especificador %s ou %p pode ser usado.
| Parâmetro | Informação |
|---|---|
| -b | Selecione esta opção para indicar o binário a ser explorado. |
| -max | Selecione esta opção para indicar o valor máximo a ser testado. Intervalo: (min, max). Por padrão, max = 40 |
| -min | Selecione esta opção para indicar o valor mínimo a ser testado. Intervalo: (min, max). Por padrão, min = 1 |
| -ip | Selecione esta opção para especificar o IP do servidor remoto. |
| -port | Selecione esta opção para especificar a porta do servidor remoto. |
| -flag | Selecione esta opção para indicar o início da flag a ser procurada. |
| -arch | Selecione esta opção para definir a arquitetura (32 ou 64). |
| --s | Selecione esta opção para usar %s em vez de %p. |
| --canary | Selecione esta opção para encontrar a posição onde um canary leak está localizado. |
| --leaks | Selecione esta opção para imprimir todos os vazamentos encontrados. |
| --pie | Selecione esta opção para encontrar a posição onde um pie leak está localizado. |
| --stack | Selecione esta opção para encontrar a posição onde um stack leak está localizado. |
| --v | Selecione esta opção para ativar o modo verbose. |
Para este exemplo, vamos usar GLUFS para obter um pie leak e um canary leak.
O binário que vamos usar como exemplo é o correspondente ao desafio 7 da sala TryHackMe pwn101 Sala TryHackMe pwn101.
Usaremos a opção -b para indicar o binário, a opção -min para indicar o valor inicial da iteração e -max para indicar o valor final da iteração. Além disso, queremos obter informações sobre os canaries e sobre pie.
./glufs.py -b ./pwn107.pwn107 -min 5 -max 15 --pie --canary

Para este exemplo, usaremos GLUFS para obter a flag.
O desafio que vamos resolver é Leitura de ambiente confuso da plataforma 247CTF.
Para este exemplo, não vamos usar binário. Temos apenas um IP e porta. Portanto, vamos usar a opção -ip para indicar o endereço, -port para indicar a porta, -flag para especificar o início da flag a ser procurada. Além disso, como não temos binário, temos que indicar a arquitetura, neste caso, x86-64 (-arch 64). Também indicaremos o início da iteração com -min e o fim da iteração com -max. Além disso, vamos usar a opção -s para usar %s em vez de %p.
./glufs.py -ip 3bcbadabd1a7e914.247ctf.com -port 50387 -flag 247CTF -arch 64 -min 1 -max 200 --s

Para este exemplo, usaremos GLUFS para obter a flag.
O desafio que vamos resolver é vazamento de flag da plataforma PicoCTF.
Para este exemplo, usaremos a opção -ip para indicar o endereço do servidor, -port para indicar a porta do servidor, -b para indicar o binário, -flag para indicar o início da flag e, finalmente, especificamos o início e o fim da iteração com -min e -max. Se você não especificar a opção --s, o formato %p será usado por padrão.
./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
É muito importante que você modifique o código para ser capaz de adaptá-lo ao seu binário/desafio. Para isso, existem duas seções delimitadas do código nas quais você deve fazer alterações para obter o vazamento da format string e também para configurar quando o payload deve ser enviado.
Exemplos: Para o desafio picoCTF explicado acima, a seguinte configuração é usada:
#######################################################################
# 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
#######################################################################