
مولد محمّل شيلكود مع دعم لتقنيات حقن متعددة، مصمم لعمليات الفريق الأحمر.
hollow هو مُولِّد مُحمل شل كود. أنت تُقدم له ملف شل كود خام وملف تعريف، فيُخرج لك مُحمل ويندوز PE مُترجم مع شل الكود المُشفَّر بداخله.
الملفات الثنائية متوفرة على صفحة الإصدارات، أو يمكنك البناء من المصدر:
go build -o hollow .
يتطلب x86_64-w64-mingw32-gcc للترجمة المُتقاطعة.
على Arch Linux: pacman -S mingw-w64-gcc
على Debian/Ubuntu: apt install gcc-mingw-w64-x86-64
./hollow -shellcode payload.bin -profile profiles/new_process_injection_sc.json
| العلم (Flag) | الوصف |
|---|---|
-shellcode | المسار إلى شل الكود الخام (bin.) |
-profile | المسار إلى ملف تعريف JSON |
-templates | دليل القوالب (الافتراضي: ./templates) |
يتبع hollow مسارًا من ثلاث خطوات: تشفير، استبدال، ترجمة.
يتم تشفير شل الكود الخاص بك باستخدام AES-256-CBC باستخدام مفتاح و IV مُولَّدين عشوائيًا في كل مرة تشغيل. يتم تضمين كلاهما داخل الملف الثنائي المُخرج. ثم يتم استبدال العناصر النائبة في قالب C المُختار بشل الكود المُشفَّر، والمفتاح، و IV، ويتم ترجمة النتيجة إلى PE مُرتبط ثابتًا ومُجرَّد بواسطة MinGW.
في وقت التشغيل، يقوم المُحمل بفك تشفير شل الكود باستخدام BCrypt لويندوز وينفذه باستخدام تقنية الحقن التي يُنفذها القالب.
القوالب هي ملفات مصدر C تُنفذ منطق الحقن الفعلي. كل قالب موجود في templates/ ويحتوي على رموز نائبة (${SHELLCODE}، ${KEY}، ${IV}، ${TARGET_PROCESS}) يملؤها hollow قبل الترجمة. تختار قالبًا من خلال ملف التعريف الخاص بك.
يأتي hollow مع ستة قوالب:
يمكنك كتابة قوالبك الخاصة ووضعها في templates/ — سيلتقطها hollow تلقائيًا طالما أن ملف التعريف الخاص بك يشير إليها.
ملفات التعريف هي ملفات JSON تُخبر hollow بالقالب الذي يجب استخدامه، والعملية المستهدفة، وكيفية ترجمة المخرج. وهي موجودة في profiles/ والمقصود بها التخصيص لكل مهمة.
{
"name": "New Process Injection via Direct Syscalls",
"author": "",
"template": "new_process_injection_sc",
"target_process": "C:\\Windows\\System32\\cmd.exe",
"arch": "x64",
"compile": {
"automatic": true,
"gcc": "x86_64-w64-mingw32-gcc",
"strip": true,
"output_type": "exe"
},
"output_dir": "./output"
}
output_type إما exe أو dll. اضبط automatic: false لتفريغ كود C المُستبدل على القرص بدلاً من ترجمته، مفيد إذا كنت تريد تعديل الكود قبل البناء.
يتم كتابة ملف المخرج إلى output_dir، مُسمى {template}_loader.{exe|dll}.
القالب: new_process_injection
التقنية: حقن خيط عن بُعد في عملية تم إنشاؤها حديثًا.
يُنشئ العملية الهدف مع CREATE_BREAKAWAY_FROM_JOB | CREATE_NO_WINDOW، وينتظر ثانيتين لتهيئتها، ثم يُخصص ذاكرة في مساحة عنوانها، ويكتب شل الكود المُفكك تشفيره، ويُعلمها كقابلة للتنفيذ، ويُنشئ خيطًا عن بُعد يُشير إليه. علامة BREAKAWAY مطلوبة عندما يتم تشغيل المُحمل من WinRM، الذي يُغلف جميع العمليات في كائن مهمة. الهدف هو مسار كامل لملف تنفيذي.
استدعاءات Win32: CreateProcessA، VirtualAllocEx، WriteProcessMemory، VirtualProtectEx، CreateRemoteThread.
القالب: new_process_injection_sc
التقنية: حقن خيط عن بُعد في عملية تم إنشاؤها حديثًا، عبر استدعاءات النظام المباشرة (Hell's Gate).
نفس سلوك new_process_injection، ولكن كل استدعاء تخصيص وخيط يتجاوز طبقة Win32 تمامًا. يتم حل SSNs من ntdll في وقت التشغيل وتنفيذها عبر تعليمة syscall الخام. انظر قسم القياس.
القالب: remote_thread_injection
التقنية: حقن الخيط عن بُعد الكلاسيكي في عملية موجودة.
يجد عملية قيد التشغيل بالاسم باستخدام CreateToolhelp32Snapshot، ويفتح مقبضًا لها، ثم يُخصص ذاكرة، ويكتب شل الكود، ويُنشئ خيطًا عن بُعد. لا يتم إنشاء عملية جديدة. يُفضل استخدامه ضد العمليات طويلة العمر مثل explorer.exe. الهدف هو اسم صورة العملية، وليس مسارًا كاملاً.
استدعاءات Win32: OpenProcess، VirtualAllocEx، WriteProcessMemory، VirtualProtectEx، CreateRemoteThread.
القالب: remote_thread_injection_sc
التقنية: حقن الخيط عن بُعد الكلاسيكي في عملية موجودة، عبر استدعاءات النظام المباشرة (Hell's Gate).
نفس سلوك remote_thread_injection، مع تجاوز طبقة Win32. انظر قسم القياس.
القالب: earlybird_apc
التقنية: حقن APC المبكر (CyberArk، 2018).
يُنشئ العملية الهدف في حالة معلقة (CREATE_SUSPENDED | CREATE_BREAKAWAY_FROM_JOB | CREATE_NO_WINDOW)، ويكتب شل الكود المُفكك في مساحة عنوانها، ثم يُصطف استدعاء إجراء غير متزامن (APC) إلى الخيط الرئيسي يُشير إلى شل الكود عبر QueueUserAPC، ويستأنفها بـ ResumeThread. نظرًا لأن APC يُطلق قبل تشغيل نقطة دخول العملية، يتم تنفيذ شل الكود قبل تهيئة أي أدوات دفاعية في العملية. يتجنب الثالوث VirtualAllocEx + WriteProcessMemory + CreateRemoteThread تمامًا.
القالب: dll_sideload
التقنية: التحميل الجانبي لـ DLL / تنفيذ شل الكود داخل العملية.
يُنتج DLL بدلاً من EXE. عند DLL_PROCESS_ATTACH، يتم إنشاء خيط يُفك تشفير وينفذ شل الكود داخل العملية: VirtualAlloc، memcpy، VirtualProtect، ثم استدعاء دالة مباشرة إلى شل الكود. يجب أن تظل العملية المضيفة حية أثناء تهيئة الحمولة (حوالي 10 ثوانٍ لمنارة Sliver). انشر DLL في موقع حيث سيقوم برنامج شرعي بتحميله عبر مسار بحث DLL مفقود.
تم الاختبار على ويندوز 10 Build 19041، مع تمكين حماية الوقت الفعلي لـ Windows Defender، التعريفات 1.453.354.0، مع حمولة منارة Sliver ملتفة بحجم 17 ميجابايت كحمولة:
Trojan:Win64/AsyncRat.RPY!MTB هي قاعدة تهديد آلي تُشغلها سلسلة الحقن عن بُعد الكلاسيكية: VirtualAllocEx + WriteProcessMemory + CreateRemoteThread المُستدعاة على مقبض عملية بعيدة عبر طبقة واجهة برمجة تطبيقات Win32. يُسجل Defender رد اتصال kernel يُطلق عند ظهور هذه الاستدعاءات الثلاثة في تسلسل.
تتجاوز قوالب _sc هذا بعدم استدعاء دوال Win32 هذه أبدًا. بدلاً من ذلك، تحل أرقام خدمة استدعاء النظام (SSNs) المقابلة مباشرة من ntdll في وقت التشغيل باستخدام Hell's Gate: كل كعب ntdll غير مُعَدَّل يبدأ بـ 4C 8B D1 B8 كتمهيد من أربعة بايتات، وSSN موجود في الإزاحة 4. استدعاء النظام الفعلي هو دالة عارية في GCC لا تحتوي إلا على movq %rcx, %r10 / movl ssn(%rip), %eax / syscall / ret، وهو التسلسل الدقيق الذي كان سينفذه كعب ntdll نفسه. لا يتم تشغيل رد اتصال Defender أبدًا لأن أغلفة Win32 المراقبة لا تُستدعى أبدًا.
على الأنظمة التي تم فيها تعديل أكواد ntdll بواسطة EDR كامل (تم استبدال التمهيد بقفزة)، يفشل فحص الكعب النظيف ويخرج المُحمل مبكرًا. لم يتم تنفيذ Halo's Gate (مسح الأكواد المجاورة لاستنتاج SSN).
يُضيف كود المُحمل حوالي 19 كيلوبايت من النفقات العامة. حجم المخرج هو أساسًا حجم شل الكود المُدخل. منارة Sliver بحجم 17 ميجابايت تُنتج مُحملًا بحجم 18 ميجابايت. شل كود Metasploit النموذجي (~200 كيلوبايت) سيُنتج مُحملًا بحجم ~220 كيلوبايت.
المساهمات مرحب بها. إذا كان لديك قالب كتبته وتريد إضافته، أو تحسينات للقوالب الحالية، فلا تتردد في فتح طلب سحب (PR). إذا وجدت خطأ أو كان لديك اقتراح، افتح مشكلة (issue).
الهدف من هذه الأداة هو جعل عملية تطوير المُحمل أسهل، وليس أن تكون منتجًا نهائيًا. القوالب الجديدة، وملفات التعريف الأفضل، والتحسينات على النواة كلها موضع ترحيب. تم بناء hollow أيضًا بهدف مساعدة الأشخاص على فهم المفاهيم الكامنة وراء مُحملات شل الكود وتقنيات الحقن، لذا فإن كود القالب الواضح والقابل للقراءة لا يقل قيمة عن الوظيفة.
سأقوم قريبًا بتفصيل المفاهيم الكامنة وراء كل تقنية والاستخدام الكامل لـ hollow على مدونتي. تابعونا.
| القالب | التقنية |
|---|
new_process_injection | حقن الخيط عن بُعد في عملية تم إنشاؤها حديثًا |
new_process_injection_sc | نفس الأسلوب، عبر استدعاءات النظام المباشرة (Hell's Gate) |
remote_thread_injection | حقن الخيط عن بُعد الكلاسيكي في عملية موجودة |
remote_thread_injection_sc | نفس الأسلوب، عبر استدعاءات النظام المباشرة (Hell's Gate) |
earlybird_apc | حقن APC المبكر (Early Bird) |
dll_sideload | التحميل الجانبي لـ DLL، يُنتج DLL بدلاً من EXE |
| القالب | تنبيه سلوك Windows Defender | تم إنشاء الجلسة |
|---|
| new_process_injection | Trojan:Win64/AsyncRat.RPY!MTB | نعم |
| remote_thread_injection | Trojan:Win64/AsyncRat.RPY!MTB | نعم |
| earlybird_apc | لا شيء | نعم |
| dll_sideload | لا شيء | نعم |
| new_process_injection_sc | لا شيء | نعم |
| remote_thread_injection_sc | لا شيء | نعم |