
pyCobaltHound هو امتداد لـ Aggressor script لـ Cobalt Strike يهدف إلى توفير تكامل عميق بين Cobalt Strike و Bloodhound.
pyCobaltHound هو امتداد لبرنامج Aggressor النصي لـ Cobalt Strike يهدف إلى توفير تكامل عميق بين Cobalt Strike و Bloodhound.
يسعى pyCobaltHound لمساعدة مشغلي الفريق الأحمر عن طريق:
BloodHound لاكتشاف مسارات التصعيد التي فتحتها بيانات الاعتماد التي تم جمعها حديثًا.لتحقيق ذلك، يستخدم pyCobaltHound مجموعة من الاستعلامات المضمنة. يمكن للمشغلين أيضًا إضافة/إزالة استعلاماتهم الخاصة لضبط قدرات المراقبة لـ pyCobaltHound. يمنحهم هذا المرونة لتكييف pyCobaltHound أثناء العمليات لمراعاة الأهداف الخاصة بالعملية (المستخدمين، المضيفين، إلخ).
لتثبيت pyCobaltHound، قم باستنساخ هذا المستودع. لا تنسَ استنساخ الوحدة الفرعية المضمنة أيضًا!
يمكنك استخدام الأمر التالي:
git clone https://github.com/NVISOsecurity/pyCobaltHound.git --recurse-submodulesتأكد من تثبيت المتطلبات التالية بشكل صحيح:
PyCobalt هي واجهة برمجة تطبيقات بايثون لـ Cobalt Strike. تعرض العديد من وظائف Aggressor لاستخدامها مباشرة من بايثون.
تأكد من تثبيت Python3+. بينما قد يعمل PyCobalt على macOS و Windows أيضًا، إلا أننا اختبرناه فعليًا على Linux فقط.
هناك طريقتان لاستخدام مكتبة PyCobalt البايثونية:
pyCobaltHound هذا الأسلوب، حيث يقوم بتعيين مسار البحث من داخل برنامج بايثون باستخدام المتغير sys.path.PyCobalt. للقيام بذلك، قم بتشغيل python3 setup.py install. ستحتاج إلى تعديل pycobalthound.py لضمان استخدام المكتبة المثبتة بدلاً من تلك الموجودة في المستودع المضمن.PyCobalt سيتم صيانته في المستقبل. في الواقع، كان آخر تحديث للمشروع لدمج التغييرات التي تم إدخالها في Cobalt Strike 4.2. نظرًا لأن pyCobaltHound يستخدم فقط وظائف Aggressor الأساسية للتفاعل مع Cobalt Strike ومشغله، فإن هذا لا يمثل مشكلة كبيرة لـ pyCobaltHound.PyCobalt المستخدمة في هذا المشروع هي فرع قمنا به. لكننا لا نتحكم في مستودع PyCobalt.يأتي PyCobalt مع بعض أوامر Script Console لإدارة نصوص بايثون الجارية. عند إعادة تحميل برنامج Aggressor النصي، يجب عليك إيقاف نصوص بايثون أولاً صراحةً. وإلا فستستمر في العمل دون فائدة. أثناء تطوير pyCobaltHound لاحظنا أن هذا قد يؤدي أيضًا إلى سلوك غير محدد.
يمكن إعادة تحميل pyCobaltHound على النحو التالي:
aggressor> python-stop-all`
[pycobalt] Asking script to stop: /root/pycobalthound/pycobalthound.py
[pycobalt] Script process exited: /root/pycobalthound/pycobalthound.py
aggressor> reload example.cna`
[pycobalt] Executing script /root/pycobalthound/pycobalthound.py
لكي يعمل PyCobalt بشكل صحيح، يمكنك فقط استدعاء PyCobalt في برنامج Aggressor نصي واحد. ضع ذلك في اعتبارك إذا كنت تريد استخدام pyCobaltHound مع برامج Aggressor النصية الأخرى التي تستخدم PyCobalt. نهجنا هو أن يكون لدينا برنامج Aggressor نصي مع استدعاءات python() و include() لكل أداة تعتمد على PyCobalt.
notify2 هي - أو كانت - حزمة لعرض إشعارات سطح المكتب على Linux. كما سنرى لاحقًا، يدعم pyCobaltHound عدة طرق لإعلام المشغل. يتم استخدام notify2 على Linux لإرسال الإشعارات إلى برنامج الإشعارات عبر D-Bus.
لتمكين ذلك، يجب تثبيت notify2 باستخدام:
pip install notify2
استخدام pyCobaltHound في Cobalt Strike بسيط مثل استيراد برنامج Aggressor النصي pycobalthound.cna إلى عميلك. بمجرد القيام بذلك، يجب أن ترى قائمة pyCobaltHound تظهر في شريط القوائم في Cobalt Strike.

كان الهدف الأولي لـ pyCobaltHound هو مراقبة ذاكرة التخزين المؤقت لبيانات الاعتماد في Cobalt Strike (View > Credentials) بحثًا عن إدخالات جديدة. يقوم بذلك عن طريق التفاعل مع حدث on_credentials الذي يطلقه Cobalt Strike عند إجراء تغييرات على مخزن بيانات الاعتماد.
عند تشغيل هذا الحدث، سيقوم pyCobaltHound بما يلي:
Cobalt Strike.BloodHound.BloodHound لكل كيان جديد باستخدام كل من الاستعلامات المضمنة والمخصصة.نظرًا لأن كل هذا يحدث بشكل غير متزامن من عميل Cobalt Strike الرئيسي، فلا ينبغي أن تؤدي هذه العملية إلى حظر واجهة المستخدم الخاصة بك، لذا يمكنك الاستمرار في العمل بينما يقوم pyCobaltHound بالتحقيق في الخلفية.
يستخدم pyCobaltHound ذاكرات تخزين مؤقت منفصلة لكل خادم فريق لمنع المشكلات عند استخدام خوادم فرق متعددة.
في بعض الأحيان تكون هناك حالات ترغب فيها في التحقيق في مستخدمين محددين (أو مخزن بيانات الاعتماد بالكامل) مرة أخرى. قد يكون هذا هو الحال عند تحميل بيانات جديدة في قاعدة بيانات BloodHound.
نظرًا لأن pyCobaltHound يجب أن يكون قد قام بالفعل بالتحقيق في (وبالتالي تخزين في ذاكرة التخزين المؤقت) جميع الكيانات في مخزن بيانات الاعتماد الخاص بك، فإنه لن يقوم بتقييمها مقابل هذه البيانات الجديدة دون تدخل المشغل.
تتوفر طريقتان للمشغلين للتحكم في الكيانات المخزنة مؤقتًا.
في الحالات التي ترغب فيها في إزالة كيان معين (أو عدة كيانات) من ذاكرة التخزين المؤقت، يمكنك القيام بذلك في عارض بيانات الاعتماد (View > Credentials). ما عليك سوى تحديد الهدف (الأهداف) والنقر فوق خيار إزالة من ذاكرة التخزين المؤقت ضمن إدخال القائمة pyCobaltHound.

في الحالات التي ترغب فيها في إزالة جميع الكيانات من ذاكرة التخزين المؤقت، يمكنك القيام بذلك في القائمة الرئيسية لـ pyCobaltHound (Cobalt Strike > pyCobaltHound > Wipe cache). يكون هذا مفيدًا جدًا عندما تريد إعادة تقييم مخزن بيانات الاعتماد بالكامل.

بعد إزالة أهدافك من ذاكرة التخزين المؤقت، يمكنك حث pyCobaltHound يدويًا على إعادة التحقيق في محتويات مخزن بيانات الاعتماد. يتبع هذا نفس العملية تمامًا كما هو مذكور أعلاه.
يحتوي pyCobaltHound على وظائف للتفاعل مع جلسات البيكون الحالية. يمكن العثور على ذلك في قائمة السياق الخاصة بالبيكون. لاحظ أنه يمكن تنفيذ هذه الأوامر على بيكون واحد أو مجموعة مختارة من البيكونات.

تكون هذه الوظيفة مفيدة بشكل خاص عند التعامل مع المستخدمين وأجهزة الكمبيوتر التي لم يتم اختراق بيانات اعتمادهم (بعد)، ولكنها تحت سيطرتنا فعليًا (على سبيل المثال، لأن لدينا بيكون يعمل تحت رمز الجلسة الخاص بهم).
يمكن استخدام وظيفة وضع علامة كمملوكة (pyCobaltHound > Mark as owned) لوضع علامة على بيكون (أو مجموعة من البيكونات) كمملوكة في قاعدة بيانات BloodHound.

سيطلب هذا الحوار من المشغل المعلومات التالية:
pyCobaltHound فقط بوضع علامة على أجهزة الكمبيوتر كمملوكة إذا كانت جلسة البيكون تعمل كمسؤول محلي، أو SYSTEM، أو جلسة عالية التكامل كمستخدم آخر.يمكن استخدام وظيفة التحقيق (pyCobaltHound > Investigate) للتحقيق في المستخدمين والمضيفين المرتبطين ببيكون (أو مجموعة من البيكونات).

سيطلب هذا الحوار من المشغل المعلومات التالية:
pyCobaltHound فقط بالتحقيق في أجهزة الكمبيوتر إذا كانت جلسة البيكون تعمل كمسؤول محلي، أو SYSTEM، أو جلسة عالية التكامل كمستخدم آخر.pyCobaltHound بالتحقيق في جميع الكيانات دون التحقق من مستويات التكامل.يحتوي pyCobaltHound على وظائف للتحقيق بحرية في الكيانات. يمكن العثور على ذلك في القائمة الرئيسية (Cobalt Strike > pyCobaltHound > Investigate).
تكون هذه الوظيفة مفيدة بشكل خاص عند التعامل مع المستخدمين وأجهزة الكمبيوتر التي لم يتم اختراق بيانات اعتمادهم وليست تحت سيطرتنا.

سيطلب هذا الحوار من المشغل المعلومات التالية:
يمكن العثور على قائمة إعدادات pyCobaltHound ضمن Cobalt Strike > pyCobaltHound > Settings.

سيحفظ pyCobaltHound إعداداتك على القرص. في كل مرة يتم فيها إعادة تحميل pyCobaltHound، سيتحقق من وجود ملف إعدادات ويحمل الإعدادات المحفوظة إذا وجدها.
يحفظ pyCobaltHound ملف إعدادات لكل خادم فريق، لذلك من الممكن الحصول على إعدادات مختلفة على خوادم فرق مختلفة.
للمصادقة على قاعدة بيانات BloodHound، سيحتاج pyCobaltHound إلى المعلومات التالية:
ملاحظة: إذا اخترت حفظ إعداداتك بشكل دائم (للحفاظ عليها عبر إعادة تشغيل العميل/المضيف)، فسيقوم pyCobaltHound بإلغاء تسلسل وتخزين بيانات الاعتماد هذه على القرص.
كما نوقش سابقًا، يستخدم pyCobaltHound التخزين المؤقت للتأكد من أنه لا يؤدي عملاً غير ضروري. يمكن تعطيل هذا التخزين المؤقت في الإعدادات. يكون هذا مفيدًا بشكل خاص عند تطوير استعلامات جديدة حتى لا تضطر إلى إدارة/مسح ذاكرة التخزين المؤقت باستمرار.
يدعم pyCobaltHound عدة طرق مختلفة لإعلام المشغل بمجرد تحديد كيان ذي اهتمام. من الممكن تعطيل هذه الإشعارات.
افتراضيًا، سيقوم pyCobaltHound بإعلام المشغل باستخدام مربع رسالة Aggressor الافتراضي. يمكن لهذا الخيار أن يعمل في سير عمل المشغل. ومع ذلك، فهي الطريقة الافتراضية لأنها مدعومة على كل منصة يمكنك تشغيل عميل Cobalt Strike عليها.

يدعم pyCobaltHound أيضًا عرض إشعارات سطح المكتب على Linux. هذا هو خيارنا المفضل لأنه لا يقطع سير عمل المشغل.

خلال بعض سير العمل، سيقوم pyCobaltHound بإنشاء تقرير HTML. تم اتخاذ هذا القرار التصميمي لتجنب إغراق المشغل بإشعارات ضخمة في حالة التحقيق في الكثير من الكيانات. سيتم إنشاء هذه التقارير في مجلد reports. من الممكن تعطيل إنشاء التقرير.

افتراضيًا، سيقوم pyCobaltHound بمزامنة الاستعلامات عبر خوادم الفريق باستخدام ملف مركزي لجميع الإعدادات المتعلقة بالاستعلامات. هذا يعني أن الاستعلامات التي يتم تمكينها أو إضافتها أو حذفها على خادم فريق واحد سيتم أيضًا تمكينها أو إضافتها أو حذفها في الاستعلامات التي يتم إجراؤها بواسطة خوادم الفريق الأخرى. هذا في الغالب خيار للراحة ويمكن تعطيله، وهو مفيد في الحالات التي تقوم فيها بتشغيل استعلامات خاصة بالعملية لا تنطبق على جميع خوادم الفريق المتصلة بها.
عند تعطيل مزامنة الاستعلامات، سيتحقق pyCobaltHound من وجود ملفات استعلام فريدة. إذا كانت موجودة، فسيقوم بتحميلها واستخدام هذه الاستعلامات في سير العمل الخاصة به. إذا كانت الملفات غير موجودة، فسيقوم بإنشائها وتحميلها. سيستمر هذا الإعداد من خلال عمليات إعادة التحميل.
عند تمكين مزامنة الاستعلامات، سيتحقق pyCobaltHound من وجود ملفات استعلام فريدة. إذا كانت موجودة، فسيتم مطالبة المشغل باختيار.

لدى المشغل الخيارات التالية:
pyCobaltHound ببساطة بإزالة ملفات الاستعلام الفريدة. سيتم فقدان جميع الاستعلامات المخصصة.pyCobaltHound دمج ملفات الاستعلام الفريدة في ملفات الاستعلام العامة. قبل دمج استعلام، سيتحقق مما إذا لم يكن هناك استعلام في الملف العام بنفس الاسم أو نفس عبارة Cypher. في حالة حدوث أي تعارضات في الدمج، سيتم سؤال المشغل عما إذا كان يريد الاحتفاظ بالاستعلامات غير المدمجة. سيتم حفظها في ملف منفصل. ثم ستتم إزالة ملفات الاستعلام الفريدة.pyCobaltHound فقط بترك ملفات الاستعلام الفريدة. سيتم الاحتفاظ بجميع الاستعلامات المخصصة وسيتم تحميل الملفات مرة أخرى إذا تم تعطيل مزامنة الاستعلامات مرة أخرى.يدعم pyCobaltHound حاليًا الاستعلامات المضمنة التالية:
يمكن إدارة الاستعلامات المختلفة التي يستخدمها pyCobaltHound من خلال القائمة الرئيسية (Cobalt Strike > pyCobaltHound > Queries).

يتيح حوار تحديث الاستعلامات للمشغلين تمكين/تعطيل استعلامات محددة. عند استخدام هذا الحوار، سيُطلب من المشغل أولاً تحديد نوع الاستعلامات التي يريد تحديثها. يتم ذلك لعرض/تحميل الاستعلامات الصحيحة ديناميكيًا خلال سير العمل هذا.

بعد الرد على الحوار الأول، سيتم عرض قائمة بجميع الاستعلامات المتاحة من هذا النوع للمشغل. هنا يمكنهم اختيار الاستعلامات التي يرغبون في تمكينها/تعطيلها.

خيار نوع الاستعلام هو حل بديل قبيح لتمرير نوع الاستعلام إلى الوظيفة التالية في سير العمل وليس له علاقة بالمشغل.
تتيح وظيفة إضافة استعلام للمشغلين إضافة/إزالة استعلاماتهم الخاصة لضبط قدرات التحقيق لـ pyCobaltHound. يمنحهم هذا المرونة لتكييف pyCobaltHound أثناء العمليات لمراعاة الأهداف الخاصة بالعملية (المستخدمين، المضيفين، إلخ).

سيطلب هذا الحوار من المشغل المعلومات التالية:
pyCobaltHound.pyCobaltHound إلى تنفيذه. المشغلون أحرار إلى حد كبير في تحديد استعلاماتهم. المتطلبات الوحيدة هي ما يلي:
pyCobaltHound بإنشاء سلسلة Cypher التالية ديناميكيًا بناءً على أسماء الكيانات التي يحقق فيها:
WITH [account names here] AS samAccountNames UNWIND samAccountNames AS namesMATCH (x) WHERE x.name STARTS WITH names(x:User)) اعتمادًا على نوع الاستعلام الذي تضيفه.pyCobaltHound أن يقوم الاستعلام بإرجاع مجموعة مميزة من أسماء المستخدمين.
RETURN DISTINCT (x.name)pyCobaltHound للاستعلام المخصص. سيتم استخدام هذا في الإشعارات والتقارير خلال سير عمل pyCobaltHound.
pyCobaltHound بعدد نتائج هذا الاستعلام.يسمح حوار حذف استعلام للمشغلين بإزالة استعلامات مخصصة محددة من pyCobaltHound. عند استخدام هذا الحوار، سيُطلب من المشغل أولاً تحديد نوع الاستعلام الذي يريد إزالته. يتم ذلك لعرض/تحميل الاستعلامات الصحيحة ديناميكيًا خلال سير العمل هذا.

بعد الرد على الحوار الأول، سيتم عرض قائمة بجميع الاستعلامات المتاحة من هذا النوع للمشغل. هنا يمكنهم اختيار الاستعلامات التي يرغبون في إزالتها.

خيار نوع الاستعلام هو حل بديل قبيح لتمرير نوع الاستعلام إلى الوظيفة التالية في سير العمل وليس له علاقة بالمشغل.
يستخدم pyCobaltHound و/أو يستلهم مما يلي: