
إثبات مفهوم لتجاوز SEH مع حقن DLL تعسفي
إثبات مفهوم لتجاوز سعة SEH مع حقن DLL تعسفي
خادم Kolibrì HTTP 2.0 معرّض لـ تجاوز سعة المخزن المؤقت المؤسس على المكدس. في وقت الاكتشاف، تم استغلال هذه الثغرة بمجرد الكتابة فوق مؤشر التعليمات بتعليمة JMP ESP، حيث كان ESP يشير إلى شيلكود تم إسقاطه على المكدس. لاحقًا، تم اكتشاف أنه يمكن الكتابة فوق سلسلة SEH إذا تم إرسال حمولة أكبر. ومع ذلك، لا يحتوي التطبيق على تعليمات صالحة POP - POP - RET لجعل معالج SE يشير إلى سجل SEH التالي. وذلك لأن جميع عناوين الذاكرة ذات الصلة تبدأ ببايت فارغ (nullbyte).

يقترح هذا الاستغلال تنفيذ التعليمات البرمجية عبر تجاوز سلسلة SEH من خلال حقن DLL. فتح حقن DLL عشوائي في عملية Kolibrì يفتح فرصة للكتابة فوق معالج SE بعنوان خالٍ من البايت الفارغ يشير إلى تعليمة POP - POP - RET من داخل ذلك الـ DLL. من الواضح أن هذه الطريقة لا يمكن استخدامها إلا لتطوير إثبات مفهوم، ولا يمكن الاعتماد عليها إذا تم تنفيذ الاستغلال لرفع صلاحيات النظام محليًا. وذلك لأنك تحتاج إلى الحصول على نفس صلاحيات العملية المستهدفة إذا أردت حقن DLL فيها. بخلاف ذلك، يعمل الاستغلال!

عندما قمت برفع هذا الاستغلال لأول مرة، كان يدعم فقط شيلكودات مخصصة قصيرة جدًا مع عناوين WinExec وExitProcess مثبتة. كان ذلك بسبب مساحة المخزن المؤقت القصيرة المتاحة بعد الكتابة فوق SEH. الآن قمت للتو بتحديث كود الاستغلال من خلال نشر شيلكود egghunter مباشرة بعد SEH وإسقاط البيضة (egg) + الشيلكود في ترويسة User-Agent لخادم الويب. وبالتالي سيتم إعادة توجيه تدفق التنفيذ من SEH المستبدل إلى egghunter، والذي سيبحث بعد ذلك عن الشيلكود المُعلَّم بالبيضة 'w00t'.
يعود الفضل في هذه الطريقة إلى FULLSHADE من هذا المستودع الأصلي.
https://github.com/FULLSHADE/POPPOPRET-nullbyte-bypass
كل ما قمت به هو تطبيق الفكرة على هذه الثغرة المحددة.