
CobaltWhispers هو سكربت aggressor يستخدم مجموعة من ملفات Beacon Object Files (BOF) لـ Cobalt Strike لتنفيذ حقن العمليات والاستمرارية والمزيد، مستفيدًا من استدعاءات النظام المباشرة (SysWhispers2) لتجاوز EDR/AV
المؤلف: @Cerbersec
CobaltWhispers هو سكربت aggressor يستخدم مجموعة من ملفات Beacon Object Files الخاصة بـ Cobalt Strike لتنفيذ حقن العمليات (process injection) والاستمرارية (persistence) وغير ذلك، مستفيدًا من استدعاءات النظام المباشرة (direct syscalls) لتجاوز EDR/AV.
CobaltWhispers مدعوم بواسطة SysWhispers2 وInlineWhispers2
CobaltWhispers مبني على StayKit وأعمال كل من Hasherezade وForrest Orr.
تم تطوير CobaltWhispers كجزء من تدريب داخلي في فريق Red Team التابع لـ NVISO Security. يمكن العثور على المقالات ذات الصلة هنا (process-injection) وهنا (kernel karnage).
يتطلب CobaltWhispers عدة أدوات للتجميع:
apt install mingw-w64apt install makeيتطلب كل مشروع 3 ملفات مولّدة بواسطة SysWhispers2 / InlineWhispers2 ليعمل:
يمكن توليد هذه الملفات وفقًا لتوثيق InlineWhispers2، ولكن هذه ليست الطريقة المثلى لأنها ستتضمن الكثير من الكود غير المستخدم:
git clone https://github.com/Sh0ckFR/InlineWhispers2 && cd InlineWhispers2
cd SysWhispers2/ && python3 syswhispers.py --preset all -o syscalls_all && cd ..
python3 InlineWhispers2.py
بدلاً من ذلك، استخدم SysWhispers2 لتوليد ملفات الإخراج لواجهات برمجة التطبيقات (APIs) الضرورية فقط، ثم قم بتزويدها يدويًا (أو عبر سكربت) إلى InlineWhispers2 الذي سيحوّلها إلى الصيغة المناسبة. راجع ملف makefile المرفق للحصول على معلومات إضافية أو استخدم الملفات المرفقة على مسؤوليتك الخاصة.
| نوع الحمولة | الهدف | الموثوقية (0-5) | صلاحيات مرتفعة | ملاحظات |
|---|---|---|---|---|
| - | - | 5 | لا | يرث الصلاحيات من العملية الأم |
ينشئ عملية جديدة معلّقة مع تفعيل Code Integrity Guard (CIG) لحظر الملفات الثنائية غير الموقعة من Microsoft. يزيّف (spoof) العملية الأم المحددة. يتم إرجاع PID.
العملية الأم: اسم العملية التي سيتم تعيينها كعملية أم
موقع الملف التنفيذي: المسار الكامل للملف التنفيذي على القرص المستخدم لإنشاء العملية الجديدة
| نوع الحمولة | الهدف | الموثوقية (0-5) | صلاحيات مرتفعة | ملاحظات |
|---|---|---|---|---|
| Shellcode/Raw | PID | 5 | لا | - |
يحقن حمولة في عملية بعيدة باستخدام NtCreateThreadEx
PID العملية: معرف العملية البعيدة
موقع الحمولة: موقع الحمولة بشكل ثنائي على القرص (شرطي | اختياري)
الحمولة b64: شيل كود خام بتنسيق سلسلة base64 (شرطي | اختياري)
المستمع (Listener): المستمع الذي سيتم توليد الحمولة له (شرطي)
يجب تحديد مستمع لتوليد حمولة Beacon. إذا كانت الحمولة اليدوية مطلوبة، فيجب توفيرها عبر مسار إلى الملف الثنائي الخام على القرص، أو شيل كود مشفر بـ Base64.
| نوع الحمولة | الهدف | الموثوقية (0-5) | صلاحيات مرتفعة | ملاحظات |
|---|---|---|---|---|
| Shellcode/Raw | PID | 2 | لا | قد يتسبب في تعطل العملية المستهدفة |
يحقن حمولة في عملية بعيدة باستخدام NtQueueApcThread
PID العملية: معرف العملية البعيدة
الخيوط: عدد الخيوط التي سيتم إضافة استدعاء APC إليها
موقع الحمولة: موقع الحمولة بشكل ثنائي على القرص (شرطي | اختياري)
الحمولة b64: شيل كود خام بتنسيق سلسلة base64 (شرطي | اختياري)
المستمع (Listener): المستمع الذي سيتم توليد الحمولة له (شرطي)
يجب تحديد مستمع لتوليد حمولة Beacon. إذا كانت الحمولة اليدوية مطلوبة، فيجب توفيرها عبر مسار إلى الملف الثنائي الخام على القرص، أو شيل كود مشفر بـ Base64.
| نوع الحمولة | الهدف | الموثوقية (0-5) | صلاحيات مرتفعة | ملاحظات |
|---|---|---|---|---|
| Shellcode/Raw | عملية بديلة | 5 | لا | - |
يحقن حمولة في عملية بديلة (surrogate process) باستخدام NtMapViewOfSection
العملية الأم: اسم العملية التي سيتم تعيينها كعملية أم
موقع الملف التنفيذي: موقع الملف التنفيذي على القرص المستخدم لإنشاء عملية جديدة
موقع الحمولة: موقع الحمولة بشكل ثنائي على القرص (شرطي | اختياري)
الحمولة b64: شيل كود خام بتنسيق سلسلة base64 (شرطي | اختياري)
المستمع (Listener): المستمع الذي سيتم توليد الحمولة له (شرطي)
يجب تحديد مستمع لتوليد حمولة Beacon. إذا كانت الحمولة اليدوية مطلوبة، فيجب توفيرها عبر مسار إلى الملف الثنائي الخام على القرص، أو شيل كود مشفر بـ Base64.
| نوع الحمولة | الهدف | الموثوقية (0-5) | صلاحيات مرتفعة | ملاحظات |
|---|---|---|---|---|
| PE | عملية بديلة | 5 | لا | يتطلب حمولة PE بصيغة x64 |
يحقن حمولة في عملية بديلة باستخدام أقسام المعاملات (transacted sections) وطرق عرض معيّنة (mapped views). يتم تحديث نقطة الدخول البعيدة وPEB، دون وجود أقسام ذاكرة شاذة أو صلاحيات ذاكرة غير طبيعية. انظر هنا لمزيد من المعلومات.
العملية الأم: اسم العملية التي سيتم تعيينها كعملية أم
موقع الملف التنفيذي: موقع الملف التنفيذي على القرص المستخدم لإنشاء عملية جديدة
موقع الحمولة: موقع حمولة PE بصيغة x64 على القرص (شرطي | اختياري)
الحمولة b64: حمولة PE بصيغة x64 بتنسيق سلسلة base64 (شرطي | اختياري)
المستمع (Listener): المستمع الذي سيتم توليد الحمولة له (شرطي)
يجب تحديد مستمع لتوليد حمولة Beacon. إذا كانت الحمولة اليدوية مطلوبة، فيجب توفيرها عبر مسار إلى ملف PE بصيغة x64 على القرص، أو حمولة PE بصيغة x64 مشفرة بـ Base64.
غير مُنفَّذ حاليًا
| نوع الحمولة | الهدف | الموثوقية (0-5) | صلاحيات مرتفعة | ملاحظات |
|---|---|---|---|---|
| Position Independent Shellcode (PIC) | عملية بديلة | 5 | نعم | تتطلب صلاحيات مرتفعة لفتح مكتبات DLL الخاصة بالنظام بصلاحيات الكتابة |
يحقن حمولة في عملية بديلة باستخدام أقسام المعاملات (transacted sections) مع تجويف DLL (DLL hollowing). انظر هنا لمزيد من المعلومات.
العملية الأم: اسم العملية التي سيتم تعيينها كعملية أم
موقع الملف التنفيذي: موقع الملف التنفيذي على القرص المستخدم لإنشاء عملية جديدة
موقع الحمولة: موقع الحمولة بشكل ثنائي على القرص (شرطي | اختياري)
الحمولة b64: شيل كود خام بتنسيق سلسلة base64 (شرطي | اختياري)
المستمع (Listener): المستمع الذي سيتم توليد الحمولة له (شرطي)
يجب تحديد مستمع لتوليد حمولة Beacon. إذا كانت الحمولة اليدوية مطلوبة، فيجب توفيرها عبر مسار إلى الملف الثنائي الخام على القرص، أو شيل كود مشفر بـ Base64.
إنشاء أو تعديل مفتاح تسجيل (registry key) في الموقع المحدد.
اسم المفتاح: اسم القيمة
الأمر: الأمر الذي سيتم تشغيله عند استخدام التسجيل
مفتاح التسجيل: الموقع الذي سيتم فيه إنشاء مفتاح التسجيل
مخفي: سيضيف بايت فارغ (null byte) في بداية اسم المفتاح؛ يسبب أخطاء في regedit
التنظيف: يزيل المفتاح الذي تم إنشاؤه
يتطلب التنظيف اسم المفتاح ومفتاح التسجيل (الموقع).
إنشاء أو تعديل مفتاح تسجيل في الموقع المحدد.
اسم المفتاح: اسم القيمة
الأمر: الأمر الذي سيتم تشغيله عند استخدام التسجيل
مفتاح التسجيل: الموقع الذي سيتم فيه إنشاء مفتاح التسجيل
مخفي: سيضيف بايت فارغ (null byte) في بداية اسم المفتاح؛ يسبب أخطاء في regedit
التنظيف: يزيل المفتاح الذي تم إنشاؤه
يتطلب التنظيف اسم المفتاح ومفتاح التسجيل (الموقع).
UserInit: يضبط تلقائيًا 'اسم المفتاح' و'مفتاح التسجيل'.
إنشاء أو تعديل مفتاح تسجيل في الموقع المحدد.
اسم المفتاح: اسم القيمة
الأمر: الأمر الذي سيتم تشغيله عند استخدام التسجيل
مفتاح التسجيل: الموقع الذي سيتم فيه إنشاء مفتاح التسجيل
مخفي: سيضيف بايت فارغ (null byte) في بداية اسم المفتاح؛ يسبب أخطاء في regedit
التنظيف: يزيل المفتاح الذي تم إنشاؤه
يتطلب التنظيف اسم المفتاح ومفتاح التسجيل (الموقع).
إنشاء أو تعديل مفتاح تسجيل في الموقع المحدد.
اسم المفتاح: اسم القيمة
الأمر: الأمر الذي سيتم تشغيله عند استخدام التسجيل
مفتاح التسجيل: الموقع الذي سيتم فيه إنشاء مفتاح التسجيل
مخفي: سيضيف بايت فارغ (null byte) في بداية اسم المفتاح؛ يسبب أخطاء في regedit
التنظيف: يزيل المفتاح الذي تم إنشاؤه
يتطلب التنظيف اسم المفتاح ومفتاح التسجيل (الموقع).
UserInitMprLogonScript: يضبط تلقائيًا 'اسم المفتاح' و'مفتاح التسجيل'.
يختطف معالج COM الخاص بمهمة مجدولة. ينشئ مفتاح تسجيل في HKCU:\Software\Classes\CLSID\\InprocServer32 يشير إلى ملف DLL.
معرف الفئة (Class ID): CLSID المطابق لـ CLSID الخاص بمعالج COM للمهمة
مسار DLL: المسار إلى ملف DLL الذي سيتم تحميله
التنظيف: يزيل المفتاح الذي تم إنشاؤه
| الموثوقية (0-5) | صلاحيات مرتفعة | ملاحظات |
|---|---|---|
| 4 | نعم | قد يتسبب في شاشة الموت الزرقاء (BSOD) للنظام المستهدف |
يقوم بتحميل برنامج تشغيل موقّع قابل للاستغلال مع قراءة/كتابة عشوائية لذاكرة النواة (NalDrv/iqvm64.sys). يغيّر علامة g_CiEnabled في ntoskrnl.exe أو علامة g_CiOptions في CI.dll لتعطيل فرض توقيع برامج التشغيل (Driver Signature Enforcement - DSE).
يقوم بتحميل برنامج تشغيل غير موقّع (Interceptor/Interceptor.sys)، ثم يستعيد قيم علامات DSE. تتم كتابة كل من برنامج التشغيل الموقّع وغير الموقّع على القرص.
| برنامج التشغيل | المجموع الاختباري MD5 |
|---|---|
| iqvm64.sys | 1898ceda3247213c084f43637ef163b3 |
| Interceptor.sys | 508c8943359717cfa0c77b61ebea2118 |
موقع برنامج التشغيل القابل للاستغلال: موقع برنامج التشغيل الموقّع القابل للاستغلال بشكل ثنائي على القرص
موقع برنامج التشغيل الخبيث: موقع برنامج التشغيل غير الموقّع الخبيث بشكل ثنائي على القرص
اسم برنامج التشغيل القابل للاستغلال: الاسم المستخدم لإنشاء مفتاح التسجيل '\Registry\Machine\System\CurrentControlSet\Services\'
اسم جهاز برنامج التشغيل القابل للاستغلال: الاسم المستخدم للتواصل مع برنامج التشغيل '\DosDevices\'
اسم برنامج التشغيل الخبيث: الاسم المستخدم لإنشاء مفتاح التسجيل '\Registry\Machine\System\CurrentControlSet\Services\'
اسم جهاز برنامج التشغيل الخبيث: الاسم المستخدم للتواصل مع برنامج التشغيل '\DosDevices\'
المسار الهدف: مسار مؤقت لكتابة ملفات برامج التشغيل القابلة للاستغلال والخبيثة إليه
| الموثوقية (0-5) | صلاحيات مرتفعة | ملاحظات |
|---|---|---|
| 5 | نعم | - |
يفرغ برنامج تشغيل على الهدف باستخدام مفتاح التسجيل المقدم ويحذف الملف الثنائي من القرص في المسار المحدد.
مفتاح تسجيل برنامج التشغيل: مفتاح التسجيل المستخدم لتفريغ برنامج التشغيل '\Registry\Machine\System\CurrentControlSet\Services\'
مسار تثبيت برنامج التشغيل: موقع برنامج التشغيل على القرص
| الموثوقية (0-5) | صلاحيات مرتفعة | ملاحظات |
|---|---|---|
| 4 | لا | قد يتسبب في شاشة الموت الزرقاء (BSOD) للنظام المستهدف |
معلومات: الاستعلام عن برنامج تشغيل Interceptor
خطاف (Hook): ربط الوظائف الرئيسية لبرنامج التشغيل المستهدف (IRP)
إزالة الخطاف (Unhook): استعادة الوظائف الرئيسية لبرنامج التشغيل المستهدف
ترقيع (Patch): ترقيع استدعاءات النواة المستهدفة
استعادة (Restore): استعادة استدعاءات النواة المستهدفة
المورّدون: عرض المورّدين المدعومين
الوحدات: الاستعلام عن جميع برامج التشغيل المحمّلة
الوحدات المُخطَّفة: عرض جميع برامج التشغيل المُخطَّفة
الاستدعاءات: الاستعلام عن جميع الاستدعاءات المسجلة
الفهرس: ربط برنامج تشغيل حسب الفهرس (انظر: المعلومات - الوحدات)
الاسم: ربط برنامج تشغيل حسب اسم الجهاز (\Device\Name)
القيم: قائمة مفصولة بفواصل من الفهارس (شرطي)
الاسم: اسم الجهاز لبرنامج التشغيل المستهدف (شرطي)
القيم مطلوبة عند تحديد 'Index'. الاسم مطلوب عند تحديد 'Name'.
الفهرس: إزالة خطاف برنامج تشغيل حسب الفهرس (انظر: المعلومات - الوحدات المُخطَّفة)
الكل: إزالة خطاف جميع برامج التشغيل المُخطَّفة
القيم: قائمة مفصولة بفواصل من الفهارس (شرطي)
القيم مطلوبة عند تحديد 'Index'.
المورّد: ترقيع جميع الاستدعاءات المرتبطة بوحدات المورّد
الوحدة: ترقيع جميع الاستدعاءات المرتبطة بالوحدات
العملية: ترقيع استدعاءات العملية
الخيط: ترقيع استدعاءات الخيط
الصورة: ترقيع استدعاءات الصورة
التسجيل: ترقيع استدعاءات التسجيل
كائن العملية: ترقيع استدعاءات كائن العملية
كائن الخيط: ترقيع استدعاءات كائن الخيط
القيم: قائمة مفصولة بفواصل من الفهارس (انظر: المعلومات - الاستدعاءات) (شرطي)
الاسم: قائمة مفصولة بفواصل من أسماء الوحدات أو اسم مورّد واحد (انظر: المعلومات - المورّدون) (شرطي)
القيم مطلوبة عند تحديد 'process' أو 'thread' أو 'image' أو 'registry' أو 'object process' أو 'object thread'. الاسم مطلوب عند تحديد 'vendor' أو 'module'.
المورّد: استعادة جميع الاستدعاءات المرتبطة بوحدات المورّد
الوحدة: استعادة جميع الاستدعاءات المرتبطة بالوحدات
العملية: استعادة استدعاءات العملية
الخيط: استعادة استدعاءات الخيط
الصورة: استعادة استدعاءات الصورة
التسجيل: استعادة استدعاءات التسجيل
كائن العملية: استعادة استدعاءات كائن العملية
كائن الخيط: استعادة استدعاءات كائن الخيط
الكل: استعادة جميع الاستدعاءات
القيم: قائمة مفصولة بفواصل من الفهارس (انظر: المعلومات - الاستدعاءات) (شرطي)
الاسم: قائمة مفصولة بفواصل من أسماء الوحدات أو اسم مورّد واحد (انظر: المعلومات - المورّدون) (شرطي)
القيم مطلوبة عند تحديد 'process' أو 'thread' أو 'image' أو 'registry' أو 'object process' أو 'object thread'. الاسم مطلوب عند تحديد 'vendor' أو 'module'.