
تنفيذ Ghostly-Hollowing باستخدام استدعاءات نظام معدّلة لحقن PE عن بُعد
[!NOTE] كانت النسخة الأصلية من المستودع تستخدم ترخيصًا غير صحيح حذف الإسناد إلى مؤسس DeceptIQ، @Rad9800، الذي يُنشر مستودعه TamperingSyscalls بموجب رخصة MIT. كان عمله منسوبًا إليه بالفعل في وحدة الدورة التدريبية (استدعاءات النظام المعدلة عبر نقاط الإيقاف في العتاد) وهو موضح أيضًا في صفحة تراخيص الأطراف الثالثة العامة لدينا.
عند اكتشافنا لهذا الإغفال، قمنا فورًا بتصحيح المستودع الأصلي وتواصلنا مع Rad في نفس اليوم للاعتذار عن هذا السهو. على الرغم من جهودنا الحثيثة لتصحيح الخطأ غير المقصود، لم يرد علينا وحظر أي تواصل إضافي، واستلمنا إشعار إزالة بموجب DMCA بعد خمسة أشهر، مما أدى إلى حذف المستودع الأصلي.
لسوء الحظ، لم يترك لنا هذا التصعيد السيئ النية أي سبيل عملي لحل المسألة، لذلك قمنا بإعادة رفع المستودع مع الترخيص والإسناد الصحيحين في مكانهما.
يستخدم هذا التنفيذ تقنيتين مشمولتين في التحديثات الأخيرة لدورة Maldev Academy:
استدعاءات النظام المعدلة عبر نقاط الإيقاف في العتاد: تُستخدم لتجاوز خطاطيف بيئة المستخدم مع التزييف المتزامن لوسائط استدعاء النظام المستدعى.
الإفراغ الشبحى: تقنية هجينة بين إفراغ العملية (Process Hollowing) وإشباح العملية (Process Ghosting).
جميع استدعاءات النظام المستدعاة في هذا التنفيذ تُستدعى عبر ماكرو TAMPER_SYSCALL. يستدعي هذا الماكرو الدالة StoreTamperedSyscallParms من أجل:
syscall داخل كعب استدعاء النظام NtQuerySecurityObject (أي استدعاء النظام الوهمي)، وضبط نقطة إيقاف عتادية على هذا العنوان.عند استدعاء ماكرو TAMPER_SYSCALL، سيقوم TAMPER_SYSCALL بتزييف الوسائط الأربعة الأولى لاستدعاء النظام المستدعى بقيم NULL. ثم يستدعي استدعاء النظام NtQuerySecurityObject، مما يؤدي إلى إطلاق نقطة الإيقاف المثبتة مسبقًا.
نتعامل مع الاستثناء المُطلق عن طريق استبدال SSN الخاص باستدعاء النظام الوهمي (NtQuerySecurityObject) برقم استدعاء النظام الحقيقي المستدعى (مثل SSN الخاص بـ ZwAllocateVirtualMemory). ثم نستبدل الوسائط المزوَّرة بالوسائط الحقيقية. تُنفَّذ هذه الخطوات في دالة معالج الاستثناء ExceptionHandlerCallbackRoutine (VEH).
جلب حمولة PE: يجلب التنفيذ حمولة PE (mimikatz.exe) من القرص. في الوضع المثالي، ينبغي تشفير الحمولة وتخزينها في قسم الموارد.
إنشاء ملف فارغ على القرص: إنشاء ملف مؤقت (.tmp) في دليل $env:TMP. سيتم لاحقًا استبدال محتوى هذا الملف بحمولة PE.
إنشاء قسم شبحى من الملف المؤقت: يتم إنشاء قسم شبحى عبر استدعاء ZwCreateSection لإنشاء قسم من ملف .tmp المُعلَّق حذفه، ثم إغلاق مقبض الملف، وحذف الملف من القرص.
إنشاء عملية بعيدة: باستخدام واجهة WinAPI CreateProcess، نقوم بإنشاء عملية بعيدة وتعيين القسم الشبحى إليها.
تصحيح ImageBaseAddress: تصحيح عنصر ImageBaseAddress في بنية PEB ليشير إلى القسم الشبحى المُعيَّن، وتنفيذ نقطة دخول حمولة PE عبر اختطاف الخيط.
شكر كبير إلى hasherezade لنشرها تقنية الإفراغ الشبحى وجميع تقنيات الحقن المثيرة للاهتمام الأخرى.