
ثغرة تجاوز سعة المخزن المؤقت القائمة على المكدس الكلاسيكية في War FTP Daemon 1.65 توضح تنفيذ التعليمات البرمجية عن بُعد بالطريقة القديمة عبر أوامر FTP مشوهة.
تجاوز سعة المخزن المؤقت التقليدي على المكدس في خادم FTP War الإصدار 1.65 يوضح تنفيذ التعليمات البرمجية عن بعد بالأسلوب القديم من خلال أوامر FTP غير صالحة.
هذا المستودع جزء من المواد التي أستخدمها عند تدريس استغلال تلف الذاكرة (بالإضافة إلى عملي المعتاد، أقوم أيضًا بالتدريس في دورات مختلفة في الأمن السيبراني حيث أساعد في تدريب الجيل القادم من مهندسي الهندسة العكسية).
CVE-2007-1567 هي حالة أستخدمها مباشرة بعد تقديم أساسيات تجاوز EIP البسيط. الاستغلال نظيف ومباشر، لكنه يأتي بتفصيل يجعله أكثر إثارة قليلاً من تمرين أول نموذجي، وهو حرف سيء إضافي يقدمه بروتوكول FTP ويجب على الطلاب تحديده وأخذه في الاعتبار عند بناء شيلكود الخاص بهم. إنه قيد صغير، لكنه كافٍ لجعل الطلاب يفكرون بدلاً من مجرد نسخ تقنية استخدموها بالفعل.
خادم FTP War الإصدار 1.65 هو خادم FTP قديم لنظام ويندوز من أواخر التسعينيات. الثغرة تكمن في معالج أمر USER، الذي يستخدم الدالة sprintf لنسخ المدخلات التي يتحكم بها المستخدم إلى مخزن مؤقت ذي حجم ثابت على المكدس دون التحقق من طوله. ما يجعل هذه الحالة مفيدة للتدريس:
خادم FTP War هو خادم FTP لنظام ويندوز تمت كتابته أصلاً في أواخر التسعينيات. يستمع على منفذ TCP 21 ويعالج أوامر FTP القياسية. الثغرة تكمن في معالج أمر USER، الذي يعالج اسم المستخدم المرسل من قبل العميل المتصل باستخدام sprintf دون التحقق من الطول.
التفاصيل الفنية الرئيسية:
يقوم خادم FTP War بمعالجة أمر USER عن طريق تمرير اسم المستخدم المقدم إلى sprintf، الذي ينسخه في مخزن مؤقت ذي حجم ثابت على المكدس دون التحقق من طوله. يبدو إصدار مبسط من المنطق الضعيف كالتالي:
char buffer[256];
sprintf(buffer, "%sCRLF", username);
إرسال سلسلة طويلة بما فيه الكفاية كوسيطة USER يؤدي إلى نسخ البيانات بعد نهاية المخزن المؤقت، مما يؤدي إلى إتلاف المكدس حتى يتم تجاوز عنوان العودة المحفوظ. عندما تعود الدالة، يقوم المعالج المركزي بتحميل القيمة التي يتحكم بها المهاجم من المكدس إلى EIP ويقفز إليها.
يمكن إعادة إنتاج الانهيار عن طريق إرسال وسيطة USER كبيرة الحجم عبر FTP. لا تتطلب مصادقة. مثال باستخدام بايثون:
import socket
HOST = '127.0.0.1'
PORT = 21
payload = b"A" * 700
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.recv(1024)
s.send(b"USER " + payload + b"\r\n")
s.close()
عند تنفيذه تحت مصحح أخطاء، يظهر الانهيار أن EIP قد تم تجاوزه ببيانات يتحكم بها المستخدم:
EIP = 41414141
مما يؤكد أن عنوان العودة المحفوظ قد تم إتلافه بسبب التجاوز.
الهدف من هذا المستودع ليس فقط توضيح الانهيار، بل أيضًا المرور بعملية الاستغلال الكاملة خطوة بخطوة، من الفازينغ إلى شل عكسي يعمل.
للحفاظ على README الرئيسي نظيفًا، يتم وضع ملاحظات الاستغلال التفصيلية والنصوص وخطوات المصحح داخل مجلد Vulnerability 📂 من هذا المستودع.
هناك ستجد سير العمل الكامل المستخدم لاستغلال هذه الثغرة CVE، بما في ذلك: