
تنفيذ RunPE مع تقنيات تهرب متعددة (2)
المنهج الدراسي - Maldev Academy
[!NOTE] على الرغم من إمكانية استخدام هذا المستودع لتنفيذ ملفات ثنائية أخرى، كان التركيز الكامل على تشغيل ملف mimikatz.exe التنفيذي. هذا لأغراض العرض والاختبار، حيث أن mimikatz.exe أداة معروفة جيدًا للاستغلال بعد الاختراق.
إخفاء المعلومات: إخفاء حمولات PE داخل ملفات PNG/JPG/JPEG/BMP/GIF باستخدام تحويل المويجات المتقطع (DWT) مع تعديل مؤشر التكميم (QIM) ورموز تصحيح الأخطاء (ECC). ومن الجدير بالذكر أن خوارزمية تصحيح أخطاء ريد-سولومون المطبقة في محمل PE مبنية على SRI-CSL/jel.
استخدام GPU لتفادي ماسحات الذاكرة: باستخدام مكتبة D3d11، ينقل التنفيذ حمولة PE المُحقنة إلى ذاكرة GPU عندما تكون خاملة، مما يخفيها عن ماسحات الذاكرة.
انتحال مكدس الخيط: استنادًا إلى Cobalt-Strike/CallStackMasker، يبحث الكود عن مكدس خيط مناسب ويخفي الخيط الذي يشغّل حمولة PE كلما كانت الحمولة في ذاكرة GPU.
التلاعب باستدعاءات النظام (Syscalls): يُستخدم Maldev-Academy/TrapFlagForSyscalling لاستدعاء استدعاءات نظام معدّلة بالاعتماد على علم الفخ (Trap Flag).
يتعامل مع DLLs الخاصة بـ API Set باستخدام ajkhoury/ApiSet.
يحمّل DLLs الخاصة بالحمولة المطلوبة بترتيب عشوائي للمساعدة ضد إشعارات تحميل الصور القائمة على التسلسل (إن وُجدت).
يستخدم AES-NI من Intel.AES-NI لتشفير أقسام حمولة PE قبل تفريغها إلى ذاكرة GPU، وفك تشفيرها بعد جلبها من هناك.
يعدّ الأعداد الأولية لمدة محددة كوسيلة لتأخير التنفيذ. لا يتم تنفيذ هذه التقنية افتراضيًا.
يلغي ربط DLLs المحملة من دليل \knownDlls\ دون استخدام صلاحيات ذاكرة RWX. لا يتم تنفيذ هذه التقنية افتراضيًا، حيث تمكنت بعض حلول EDR من اكتشاف هذا المنطق.
إذا لم يتم استخدام تقنية التلاعب باستدعاءات النظام المذكورة أعلاه، فسيستخدم التنفيذ HellsHall. إضافة إلى ذلك، في روتين إلغاء ربط DLL، يستخدم التنفيذ win32u.dll لتنفيذ تعليمة syscall، نظرًا لأن قسم النصوص في ntdll.dll سيكون RW، مما يمنعنا من القفز إلى تعليمة syscall هناك.
استبدال معالج VEH الخاص بـ EDR C والمستخدم للتعامل مع استثناءات STATUS_GUARD_PAGE_VIOLATION، حيث تبيّن أن هذا البائع يستخدم صلاحيات PAGE_GUARD لإطلاق الاستثناءات عند الوصول إلى مكتبات DLL مزيفة:
RunPeFile هو الملف الثنائي الرئيسي الذي سينفّذ ملف EXE المقدم من ملفات PNG المخزنة في قسم الموارد الخاص به. بعض الملاحظات عند تجميع RunPeFile:
RunPeFile الحالي بتشغيل mimikatz.exe.FileConstructor.py لتحديث الحمولة التي يوفرها RunPeFile.سكربت FileConstructor.py هو السكربت الرئيسي المستخدم لتوليد ملفات PNG تحتوي على حمولة EXE المشفرة بتقنية DWT. توضع ملفات PNG هذه في دليل EncodedPngs، حيث يدمجها مشروع RunPeFile المحدّث في قسم الموارد للملف الثنائي المترجم. يتم تقسيم كل ملف EXE إلى عدة أجزاء، مع تضمين كل جزء في صورة PNG خاصة به. ونتيجة لذلك، سترى عدة ملفات PNG تعرض جميعها الصورة نفسها. هذا التقسيم ضروري لأن طريقة إخفاء المعلومات (القائمة على DWT مع تصحيح أخطاء ريد-سولومون) عادةً لا يمكنها احتواء حمولة EXE كاملة في صورة واحدة (اعتمادًا على حجم/بكسل PNG، وكذلك حجم الحمولة). يعتمد هذا السكربت على الثابت NUM_SPLIT_PARTS لتحديد عدد الأجزاء التي سيتم تقسيم ملف EXE المدخل إليها.
يتولى FileConstructor.py معالجة ملفات مشروع Visual Studio الخاصة بـ RunPeFile، بالإضافة إلى منطق التقسيم. ويستدعي سكربت DwtStegPeFileToPng.py للقيام بعملية تضمين الحمولة الفعلية.
أمثلة على استدعاء FileConstructor.py:
# Adds the embedded PNG(s) to the 'RunPeFile\RunPeFile.vcxproj' project by dafault:
python.exe .\FileConstructor.py --pe mimikatz.exe --png memes\cat.png
# Adds the embedded PNG(s) to the 'XYZ\XYZ.vcxproj' project:
python.exe .\FileConstructor.py --pe mimikatz.exe --png memes\cat.png --project XYZ\XYZ.vcxproj
سكربت DwtStegPeFileToPng.py هو السكربت الرئيسي الذي يتولى تنفيذ خوارزمية DWT لتشفير ملف معين داخل ملف PNG محدد. وهو سكربت مستقل ويمكن استخدامه في سيناريوهات أخرى، لكنه في هذا المستودع يُستدعى عبر سكربت FileConstructor.py فقط. فيما يلي طريقة استدعاء DwtStegPeFileToPng.py:
usage: DwtStegPeFileToPng.py [-h] (--encode | --decode) --png PNG --output OUTPUT [--file FILE] [-v]
DWT-based steganography tool for hiding files in PNG images
options:
-h, --help show this help message and exit
--encode Encode/embed a file
--decode Decode/extract a file
--png PNG PNG image file
--output OUTPUT Output file path
--file FILE File to embed (required for --encode)
-v, --verbose Verbose output
مشروع ExtractPePayloadFromPng هو أداة مستقلة لاستخراج الحمولات من ملفات PNG. يمكنه التعامل مع الصور المفردة، أو عند إعطائه PNG يحتوي على الجزء الأول من ملف PE مقسّم، فإنه سيعيد بناء الحمولة الكاملة عبر جميع ملفات PNG ذات الصلة. على سبيل المثال، استدعاء ExtractPePayloadFromPng.exe بهذه الطريقة:
.\ExtractPePayloadFromPng.exe --i ..\..\EncodedPngs\mimikatz_part01.png --o mimikatz.exe
سيقوم بسحب ملف mimikatz.exe الثنائي الكامل من ملفات PNG الموجودة تحت دليل EncodedPngs.
[!NOTE] تطلبت بعض حلول EDR تعديلات إضافية على الكود لتحقيق تجاوز ناجح. تم تمكين أو تعطيل بعض الميزات اعتمادًا على بائع الأمان الذي تمت مواجهته.
تجاوز Pesieve الإصدار 0.4.1.1 باستخدام الأمر التالي:
.\pe-sieve64.exe /data 4 /refl /iat 3 /obfusc 3 /shellc 4 /threads /pid XXXX
https://github.com/user-attachments/assets/47f5c3b9-e3c3-4be9-a063-2f3998071a57

تمت إعادة هيكلة الكود من mannyfreddy في وحدة مقدمة إلى التلاعب بمعالجات الفيكتور.
جلب حمولات قسم الموارد يدويًا، مع تجنب واجهات برمجة تطبيقات مثل FindResourceW وLoadResource.