
يُولّد ملفات تعريف C2 قابلة للتشكيل وعشوائية ومُتحقق منها بواسطة أداة الفحص البرمجي لـ Cobalt Strike، مما يُؤتمت تكوين إشارات HTTP/S وDNS وSMB وSSH مع إمكانية تخصيص عشوائية مؤشرات IOC.
C2concealer هي أداة سطر أوامر تُنشئ ملفات تعريف C2 قابلة للتشكيل (Malleable Profiles) عشوائية لاستخدامها في Cobalt Strike.
git clone https://github.com/RedSiege/C2concealer.git
cd C2concealer
python3 -m venv .venv
source .venv/bin/activate
pip3 install -e .
راجع تعليمات Docker
Usage:
$ C2concealer --hostname google.com --variant 3
Flags:
(optional)
--hostname
اسم المضيف المستخدم في إعدادات جانب العميل والخادم HTTP. القيمة الافتراضية هي None.
--variant
رقم صحيح يحدد عدد المتغيرات (variants) لجانب العميل/الخادم HTTP المراد إنشاؤها.
يوصى بما بين 1 و5. الحد الأقصى 10.
root@kali:~# C2concealer --variant 1 --hostname google.com
[i] Searching for the c2lint tool on your system (part of Cobalt Strike). Might take 10-20 seconds.
[i] Found c2lint in the /opt/cobaltstrike/c2lint directory.
Choose an SSL option:
1. Self-signed SSL cert (just input a few details)
2. LetsEncrypt SSL cert (requies a temporary A record for the relevant domain to be pointed to this machine)
3. Existing keystore
4. No SSL
[?] Option [1/2/3/4]:
نصيحة: استخدم دائمًا شهادة SSL. ويفضل شهادة من LetsEncrypt أو ما شابه. نصيحة: تتيح لك متغيرات HTTP اختيار مؤشرات IOCs مختلفة لحركة HTTP على بيقونات مختلفة. يوصى بقيمة لا تقل عن 1.
لقد درسنا بدقة توثيق Cobalt Strike وحددنا نطاقات من القيم المنطقية لكل سمة من سمات الملف التعريفي (profile). في بعض الأحيان تكون هذه البيانات بسيطة مثل عدد صحيح عشوائي ضمن نطاق معين، وفي أحيان أخرى نحتاج إلى اختيار قيمة عشوائية من قاموس Python. على أية حال، بدأنا إنشاء الأداة بتحديد البيانات التي ستشكل ملف تعريف صالحًا.
ثم قمنا بتقسيم كل قسم (أو كتلة) من الملف التعريفي القابل للتشكيل إلى ملف .py منفصل، يحتوي على المنطق لسحب قيم عشوائية مناسبة لكل سمة ثم إخراج سلسلة منسّقة لكتلة الملف التعريفي تلك. نقوم بدمج جميع كتل الملف التعريفي معًا، ونجري بعض الفحوصات السريعة للاتساق، ثم نمرر الملف التعريفي من خلال مدقق (linter) Cobalt Strike (c2lint). الناتج هو ملف تعريف يجب أن يعمل في مهامك. نوصي دائمًا باختبار الملف التعريفي (بما في ذلك حقن العمليات والتشغيل) قبل بدء حملة.
إذا كنت تتصفح الكود، ننصحك بالبدء بهذين الملفين: /C2concealer/main.py و /C2concealer/profile.py. بعد مراجعة التعليقات، اطلع على مولدات كتل الملف التعريفي الفردية في المجلد: /C2concealer/components.
هذا أمر بالغ الأهمية. هذه أداة مفتوحة المصدر. يمكن للبائعين بسهولة كتابة توقيعات (signatures) للملفات التعريفية التي تُنشئها. بينما يوفر تشغيل الأداة بداية ممتازة لبناء ملف تعريف قابل للتشكيل لـ Cobalt Strike، نوصي بالتعمق في المجالات التالية لتخصيص البيانات المستخدمة لملء الملفات التعريفية المُنشأة:
/C2concealer/data/
بالإضافة إلى ذلك، يمكنك تخصيص سمات مختلفة في جميع مراحل عملية إنشاء الملف التعريفي. على سبيل المثال، في الملف: /C2concealer/components/stageblock.py، يمكنك تغيير النطاق الذي يتم منه سحب قيمة حجم الصورة PE (بالقرب من السطور 73-74). يرجى الاطلاع على جميع الملفات المختلفة في مجلد components.
إذا وصلت إلى هنا، فنحن على يقين من أنك ستحصل على فائدة كبيرة من هذه الأداة. الطريقة التي نوصي بها لرؤية هذه الأداة هي أننا بنينا الكود الهيكلي لإنشاء هذه الملفات التعريفية تلقائيًا. الآن الأمر متروك لك للتفكير في القيم المنطقية لكل سمة لحملاتك وتحديث مصادر البيانات.
بينما قمنا بتغطية العديد من الخيارات الممكنة للغة الملف التعريفي القابل للتشكيل لـ C2، هناك العديد من الخيارات التي لا نضبطها. نشجعك بشدة على مراجعة توثيق Malleable Command and Control وتعديل ملف التعريف الخاص بك.
الخيارات التالية غير مضبوطة، أو مضبوطة بشكل ثابت بواسطة C2concealer، ويجب أن تفكر في تغييرها.
http-config| الخيار المفقود | ملاحظات |
|---|---|
set block_useragents | منع أنماط User-Agent غير الخاصة بالبيقون |
set allow_useragents | قائمة السماح بأنماط User-Agent (CS 4.3+) |
stage| الخيار المفقود | ملاحظات |
|---|---|
set allocator | مشفر بشكل ثابت VirtualAlloc؛ يفتقد HeapAlloc, MapViewOfFile للعشوائية |
set magic_mz_x86 / magic_mz_x64 | تزييف رأس MZ |
set magic_pe | تزييف علامة PE |
set rich_header | تزييف بيانات المترجم الوصفية |
set module_x86 / module_x64 | استبدال الوحدة النمطية (module stomping) |
set copy_pe_header | — |
set data_store_size | — |
set eaf_bypass | تجاوز فحص EAT |
set syscall_method | None/Direct/Indirect (CS 4.8+) |
set rdll_loader | PrependLoader/StompLoader |
set rdll_use_syscalls | — |
set rdll_use_driploading | — |
set rdll_dripload_delay | — |
كتلة transform-obfuscate | خيارات base64, lznt1, rc4, xor غائبة تمامًا |
append في transform-x86/x64 | يتم استخدام prepend و strrep فقط |
process-inject| الخيار المفقود | ملاحظات |
|---|---|
set allocator | مشفر بشكل ثابت VirtualAllocEx؛ يفتقد NtMapViewOfSection للعشوائية |
set use_driploading | — |
set dripload_delay | — |
append في transform-x86/x64 | يتم استخدام prepend فقط |
التنفيذ: NtQueueApcThread | غير موجود في كتلة التنفيذ |
التنفيذ: NtQueueApcThread-s | غير موجود في كتلة التنفيذ |
التنفيذ: ObfSetThreadContext | غير موجود في كتلة التنفيذ |
التنفيذ: SetThreadContext | غير موجود في كتلة التنفيذ |
| تزييف دالة التنفيذ | بناء module!function+0x## غير مدعوم |
post-ex| الخيار المفقود | ملاحظات |
|---|---|
set pipename | الأنبوب المُسمى (named pipe) لمهام ما بعد الاستغلال |
dns-beacon| الخيار المفقود | ملاحظات |
|---|---|
set ns_response | معالجة NS: drop/idle/zero. القيمة الافتراضية drop إذا لم تُضبط. |
set dns_stager_prepend | إلحاق بيانات بالحمولات المرحّلة (staged payloads) |
| التحويل المفقود | ملاحظات |
|---|---|
lznt1 | ضغط — غير موجود في أي سلسلة تشفير |
rc4 "key" | تشفير — غير موجود في أي سلسلة تشفير |
xor "key" | XOR — غير موجود في أي سلسلة تشفير |
uri-append | عبارة إنهاء — غير منفذة |
شكر كبير لـ Raphael Mudge على التحسين المستمر لمجموعة ميزات الملفات التعريفية القابلة للتشكيل والتوثيق لتعلمها. أيضًا، شكر جزيل لـ @killswitch-GUI على سكربته التي تؤتمت إنشاء شهادات LetsEncrypt لخوادم فريق CS. أخيرًا، منشوران في المدونات جعلا الحياة أسهل بكثير: منشور @bluescreenofjeff (https://bluescreenofjeff.com/2017-01-24-how-to-write-malleable-c2-profiles-for-cobalt-strike/) ومنشور Joe Vest (https://posts.specterops.io/a-deep-dive-into-cobalt-strike-malleable-c2-6660e33b0e0b).
الإصدار 1.0
الإصدار 1.1