
واجهة برمجة تطبيقات بايثون للاستخدام مع مواصفات External C2 الخاصة بـ Cobalt Strike.
إطار عمل بلغة بايثون للاستخدام مع مواصفات External C2 الخاصة بـ Cobalt Strike كما هو موصوف في المواصفات.
الهدف الأساسي من التصميم هو أن يكون تنفيذًا معياريًا جدًا لمواصفات external c2، بحيث يوفر تجريدًا كافيًا لتطبيق قنوات C2 لـ Cobalt Strike بسهولة. من الناحية المثالية، كل ما على المستخدم فعله هو إنشاء وحدة transport، ووحدة encoder، وملء ملف تكوين لتنفيذ قناة جديدة.
ستحتاج إلى إجراء عدة تغييرات في التكوين قبل البدء في التشغيل. ستحتاج إلى:
builds/client/dbox/dbox_client.py، قم بتغيير token إلى الرمز الذي تم إنشاؤه في الخطوة 2.builds/server/utils/transports/transport_dbox.py، قم بإجراء نفس التغييرات التي أجريتها في الخطوة 3.cd builds/client/dbox && ./compile_dll.shstart_externalc2.cna من عميل CS الخاص بك.cd builds/server/ && ./dbox_server.pyرابط عرض الفيديو التوضيحي: https://www.youtube.com/watch?v=nTRHSh_uCcA
يتكون هذا المشروع من ثلاثة أجزاء رئيسية:
يقوم الباني ببناء نشرات العميل والخادم ديناميكيًا بناءً على التكوين المحدد. من الناحية المثالية، يمكن توزيع العميل كملف واحد مُجمَّع مثل dll أو exe.
العميل هو في الأساس الحمولة (payload) التي تعمل على نقطة النهاية، ويُشار إليها باسم عميل طرف ثالث (third-party client) داخل المواصفات. منطق العميل ثابت بشكل أساسي:
transporttransporttransport بحثًا عن مهام جديدةtransportيتم نسخ التكوينات اللازمة لآليات النقل والترميز بشكل ثابت في العميل. كما يتم نسخ منطق الوظائف لآليات النقل والترميز بشكل ثابت من وحداتها الخاصة.
يتم تحديد منطق حقن العملية من الباني.
الخادم هو التطبيق الذي يقوم بتنسيق الاتصال بين العميل وخادم c2، ويُشار إليه باسم وحدة التحكم في العميل الطرف الثالث (third-party Client Controller) داخل المواصفات. منطق الخادم ثابت بشكل أساسي، ولكنه يدعم الإخراج المطول (verbose) وإخراج التصحيح (debug) للمساعدة في التطوير:
encodertransporttransportencodertransporttransportencoderيتم تحديد وحدة encoder ووحدة transport التي يستوردها الخادم من القيم المخزنة في config.py.
لا يتم استيراد أي وحدات transport أو encoder غير مستخدمة.
تصف الجداول التالية الوظائف المشتركة بين وحدات encoding و transport والعميل. الوظائف المشتركة هي في الأساس نفس الكود تمامًا.
ملاحظة مهمة جدًا: يجب أن تكون البيانات المرسلة إلى وظيفتي sendData و recvData في العميل بيانات خام، بينما يجب أن تكون البيانات المرسلة إلى وظيفتي sendData و retrieveData في وحدة النقل قد تم ترميزها أو فك ترميزها بالفعل حسب الحاجة.
| وظيفة النقل (Transport Function) | وظيفة العميل (Client Function) | الوصف (Description) |
|---|---|---|
| prepTransport | prepTransport | تنفيذ أي تكوينات مسبقة مطلوبة لاستخدام آلية النقل |
| sendData | sendData | يحدد كيف يتم إرسال البيانات عبر آلية النقل |
| retrieveData | recvData | يحدد كيف يتم استقبال البيانات عبر آلية النقل |
| وظيفة الترميز (Encoder Function) | وظيفة العميل (Client Function) | الوصف (Description) |
|---|---|---|
| encode | encode | يحدد التعديلات التي يتم إجراؤها على البيانات الخام لتجهيزها للنقل |
| decode | decode | يحدد التعديلات التي يتم إجراؤها على البيانات الخام المستلمة من النقل ليتم نقلها إلى وجهتها |
أولاً، حدد وحدة النقل ووحدة الترميز التي ترغب في استخدامها. سنستخدم transport_gmail و encoder_b64url في المثال التالي.
بعد ذلك، قم بتعديل server/config.py لتناسب احتياجاتك، مع التأكد من تكوين ENCODER_MODULE و TRANSPORT_MODULE بشكل صحيح والإشارة إلى الوحدات التي تريدها:
EXTERNAL_C2_ADDR = "127.0.0.1"
EXTERNAL_C2_PORT = "2222"
C2_PIPE_NAME = "foobar"
C2_BLOCK_TIME = 100
C2_ARCH = "x86"
IDLE_TIME = 5
ENCODER_MODULE = "encoder_b64url"
TRANSPORT_MODULE = "transport_gmail"
verbose = False
debug = False
بعد ذلك، قم بتعديل قسم التكوين لوحدة transport ووحدة encoder المختارة.
تأكد من أن قسم التكوين في client/mechanism/$mechanism_client.py يتطابق مع أي تكوينات قمت بتعريفها حتى الآن.
على الجهاز الذي يشغل الخادم، قم بتنفيذ:
python server.py
للحصول على إخراج أكثر تفصيلاً، يمكنك تشغيل:
python server.py -v
للحصول على إخراج أكثر تفصيلاً وإخراج إضافي مفيد لتصحيح الأخطاء، يمكنك تشغيل:
python server.py -d
بعد ذلك، قم بتشغيل العميل على نقطة النهاية المستهدفة.
إذا نجح كل شيء، سيتم تسجيل منارة جديدة في وحدة تحكم Cobalt Strike يمكنك التفاعل معها.
لماذا كتبت هذا؟: لم يكن هناك العديد من التطبيقات المنشورة للمواصفات، ومن بين تلك المنشورة، إما أنها ليست بلغة أعرفها أو لا تمتلك المرونة والتجريد الذي كنت أبحث عنه.
لماذا بايثون 2؟: أنا كسول ومن السهل تطبيق قنوات نقل وترميز جديدة به.
الكود الخاص بك سيء: هذا ليس سؤالاً.
هل يمكنني تقديم وحدات نقل و/أو ترميز جديدة؟: نعم من فضلك! أرسل طلب سحب (pull request) وسأكون سعيدًا بمراجعته.
سيتم تنفيذ تجريد وتوزيع مشابه في مكون العميل أيضًا، لدعم طرق مختلفة لحقن العملية لحمولة المنارة وميزات أخرى في خريطة الطريق.
حاليًا، هذا يفتقد إلى وظيفة الباني، والتي من المخطط أن تقوم ببناء نشرات العميل والخادم ديناميكيًا، لكنها موجودة في خريطة الطريق.