
Outil automatisé d'exploitation de vulnérabilités de chaîne de format pour découvrir les fuites de pile, PIE et canary avec capacité de recherche de flag via les spécificateurs %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
GLUFS vous permet d'automatiser le processus fastidieux de recherche de fuites en utilisant des vulnérabilités de chaîne de format. Il vous permet de trouver des fuites de pile, des fuites PIE et des fuites de canari, en indiquant dans chaque cas la payload qui fournit la fuite. De plus, il inclut un mode qui permet de rechercher une chaîne "flag" dans les fuites. Pour ce mode, le spécificateur %s ou %p peut être utilisé.
| Paramètre | Information |
|---|---|
| -b | Sélectionnez cette option pour indiquer le binaire à exploiter. |
| -max | Sélectionnez cette option pour indiquer la valeur maximale à tester. Plage : (min, max). Par défaut, max = 40 |
| -min | Sélectionnez cette option pour indiquer la valeur minimale à tester. Plage : (min, max). Par défaut, min = 1 |
| -ip | Sélectionnez cette option pour spécifier l'IP du serveur distant. |
| -port | Sélectionnez cette option pour spécifier le port du serveur distant. |
| -flag | Sélectionnez cette option pour indiquer le début du flag à rechercher. |
| -arch | Sélectionnez cette option pour définir l'architecture (32 ou 64). |
| --s | Sélectionnez cette option pour utiliser %s au lieu de %p. |
| --canary | Sélectionnez cette option pour trouver la position où se trouve une fuite de canari. |
| --leaks | Sélectionnez cette option pour afficher toutes les fuites trouvées. |
| --pie | Sélectionnez cette option pour trouver la position où se trouve une fuite PIE. |
| --stack | Sélectionnez cette option pour trouver la position où se trouve une fuite de pile. |
| --v | Sélectionnez cette option pour activer le mode verbeux. |
Pour cet exemple, nous allons utiliser GLUFS pour obtenir une fuite PIE et une fuite de canari.
Le binaire que nous allons prendre comme exemple est celui correspondant au défi 7 de la salle TryHackMe pwn101 TryHackMe room pwn101.
Nous utiliserons l'option -b pour indiquer le binaire, l'option -min pour indiquer la valeur initiale de l'itération et -max pour indiquer la valeur finale de l'itération. De plus, nous voulons obtenir des informations sur les canaris et sur PIE.
./glufs.py -b ./pwn107.pwn107 -min 5 -max 15 --pie --canary

Pour cet exemple, nous allons utiliser GLUFS pour obtenir le flag.
Le défi que nous allons résoudre est Confused environment read de la plateforme 247CTF.
Pour cet exemple, nous n'allons pas utiliser de binaire. Nous n'avons qu'une IP et un port. Par conséquent, nous allons utiliser l'option -ip pour indiquer l'adresse, -port pour indiquer le port, -flag pour spécifier le début du flag à rechercher. De plus, comme nous n'avons pas de binaire, nous devons indiquer l'architecture, dans ce cas, x86-64 (-arch 64). Nous indiquerons également le début de l'itération avec -min et la fin de l'itération avec -max. En outre, nous allons utiliser l'option -s pour utiliser %s au lieu de %p.
./glufs.py -ip 3bcbadabd1a7e914.247ctf.com -port 50387 -flag 247CTF -arch 64 -min 1 -max 200 --s

Pour cet exemple, nous allons utiliser GLUFS pour obtenir le flag.
Le défi que nous allons résoudre est flag leak de la plateforme PicoCTF.
Pour cet exemple, nous utiliserons l'option -ip pour indiquer l'adresse du serveur, -port pour indiquer le port du serveur, -b pour indiquer le binaire, -flag pour indiquer le début du flag, et enfin, nous spécifions le début et la fin de l'itération avec -min et -max. Si vous ne spécifiez pas l'option --s, le format %p sera utilisé par défaut.
./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
Il est très important que vous modifiiez le code pour pouvoir l'adapter à votre binaire/défi. Pour cela, deux sections délimitées du code doivent être modifiées afin d'obtenir la fuite de la chaîne de format ainsi que de configurer quand la payload doit être envoyée.
Exemples : Pour le défi picoCTF expliqué ci-dessus, la configuration suivante est utilisée :
#######################################################################
# 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
#######################################################################