
مختبر Docker قابل لإعادة الإنتاج + استغلال raw-socket لـ CVE-2015-3306 (نسخ ملفات تعسفي قبل المصادقة في ProFTPD mod_copy) — تمرين تعليمي لمقارنة التصحيحات
مختبر قابل لإعادة الإنتاج بالكامل واستغلال مكتوب يدويًا لـ CVE-2015-3306 — مبني كتمرين تعليمي في أبحاث الثغرات: مقارنة التصحيحات، الاستدعاء اليدوي، وتطوير الاستغلال عبر المقابس الخام.
وحدة mod_copy في ProFTPD تنفّذ زوج الأوامر SITE CPFR / SITE CPTO
الذي ينسخ الملفات على جانب الخادم دون
نقل البيانات إلى العميل.
في الإصدار 1.3.5، لم يتحقق أي من المعالجين من أن الجلسة مصادق عليها. افترضت الوحدة ببساطة "لن يرسل أحد أوامر SITE قبل تسجيل الدخول" — افتراض خاطئ تحوّل إلى CVE. أي عميل غير مصادق يمكنه نسخ أي ملف قابل للقراءة من قبل عملية الخادم إلى أي موقع قابل للكتابة من قبله.
الإصلاح (الالتزام 212d54271f، صدر في 1.3.5a) يقوم بأمرين:
copy_cpfr و copy_cpto:
authenticated = get_param_ptr(cmd->server->conf, "authenticated", FALSE);
if (authenticated == NULL || *authenticated == FALSE) {
pr_response_add_err(R_530, _("Please login with USER and PASS"));
errno = EPERM;
return PR_ERROR(cmd);
}
CopyEngine on|off — سابقًا لم يكن بالإمكان حتى
تعطيل الوحدة في البنيات التي تضمّنتها.الفرق الموحّد الكامل موجود في patch.diff. قراءة التصحيحات هي
المهارة: الإصلاح يخبرك أين كان الجرح.
يقوم ملف Dockerfile بترجمة ProFTPD 1.3.5 (آخر إصدار معرّض للثغرة) من
الملف المصدر الرسمي المضغوط مع تفعيل mod_copy:
docker build -t proftpd-135 .
docker run -d --name lab135 -p 127.0.0.1:2121:21 -p 127.0.0.1:30000-30010:30000-30010 proftpd-135
docker exec lab135 chmod 777 /home/ftp
PassivePorts في proftpd.conf يثبّت قناة البيانات — بنية FTP ثنائية القنوات
(التحكم + البيانات الديناميكية) هي السبب في فشل تعيينات الحاويات
الساذجة: منفذ التحكم يعمل، منفذ البيانات لا يعمل.
يستخدم exploit.py مقابس خام — بدون ftplib، لأن المكتبات تخفي
البروتوكول، وإخفاء البروتوكول هو بالضبط ما نحاربه:
SITE CPFR /etc/segredo.txt -> 350 (لم يتم إرسال USER/PASS: هذه هي الثغرة)
SITE CPTO /home/ftp/... -> 250 (تم النسخ التعسفي)
USER ftp / PASS ... -> 230 (تسجيل الدخول هو فقط مسار استخراج البيانات)
PASV / RETR -> 150 -> 226 (تم التقاط العلم)
DELE -> 250 (تنظيف: لا مؤشرات اختراق متبقية)
AllowOverwrite، تعيينات المنافذ) تحدد الأثر النهائي.time.time_ns()، وليس time.time())، وعدم الاعتماد
على حالة متبقية.RETR يجيب مرتين: 150،
ثم 226. استنزف كليهما قبل الأمر التالي.-d10) يخبرك بالضبط
أي فحص تم تفعيله.للاستخدام التعليمي والمختبري المصرح به فقط. تشغيل هذا ضد أنظمة لا تملكها أو ليس لديك إذن كتابي لاختبارها غير قانوني.