
BloodHound Attack Research Kit

BARK هي اختصار لـ BloodHound Attack Research Kit. وهي سكريبت PowerShell صُمم لمساعدة فريق BloodHound Enterprise في البحث والتحقق المستمر من بدائل الإساءة (abuse primitives). تركز BARK حالياً على مجموعة منتجات وخدمات Microsoft Azure.
لا تتطلب BARK أي تبعيات خارجية. صُممت دوال BARK لتكون بسيطة وقابلة للصيانة قدر الإمكان. معظم الدوال هي مجرد أغلفة بسيطة لإجراء طلبات إلى نقاط نهاية REST API المختلفة. حتى أن الدوال الأساسية في BARK لا تحتاج بعضها البعض - يمكنك سحب أي دالة من BARK تقريباً وستعمل بشكل مثالي كدالة مستقلة في سكريبتاتك الخاصة.
المؤلف الأساسي: Andy Robbins @_wald0
المساهمون:
هناك عدة طرق لاستيراد سكريبت PowerShell. إليك إحداها:
أولاً، قم بتحميل BARK.ps1 عن طريق استنساخ هذا المستودع أو ببساطة نسخ محتوياته الخام من GitHub.
git clone https://github.com/BloodHoundAD/BARK
الآن، انتقل إلى الدليل الذي يوجد به ملف PS1:
cd BARK
أخيراً، يمكنك استيراد الملف PS1 باستخدام نقطة (dot import) كما يلي:
. .\BARK.ps1
اضغط Enter، وسيكون لديك الآن إمكانية الوصول إلى جميع دوال BARK في جلسة PowerShell الخاصة بك.
باستثناءات قليلة جداً، تتطلب نقاط نهاية Azure API المصادقة للتفاعل معها. تأتي BARK مع بعض الدوال التي ستساعدك في الحصول على الرموز المميزة (tokens) اللازمة للتفاعل مع MS Graph وAzure REST APIs. أي دالة في BARK تتفاعل مع Azure API تتطلب المصادقة، ستحتاج إلى تزويدها برمز مميز.
لنفترض أنك تريد سرد جميع المستخدمين في مستأجر Entra ID. تحتاج أولاً إلى الحصول على رمز مميز مُحدد النطاق لـ MS Graph. هناك طرق عديدة للحصول على هذا الرمز:
إذا كان لديك اسم مستخدم/كلمة مرور لمستخدم Entra في ذلك المستأجر، يمكنك أولاً الحصول على رمز تحديث (refresh token) للمستخدم باستخدام دالة Get-EntraRefreshTokenWithUsernamePassword من BARK:
$MyRefreshTokenRequest = Get-EntraRefreshTokenWithUsernamePassword -username "[email protected]" -password "MyVeryCoolPassword" -TenantID "contoso.onmicrosoft.com"
الكائن الناتج الذي أنشأته للتو، $MyRefreshTokenRequest، سيحتوي على رمز تحديث لمستخدمك. يمكنك الآن طلب رمز مميز مُحدد النطاق لـ MS Graph باستخدام رمز التحديث هذا:
$MyMSGraphToken = Get-MSGraphTokenWithRefreshToken -RefreshToken $MyRefreshTokenRequest.refresh_token -TenantID "contoso.onmicrosoft.com"
الآن هذا الكائن الجديد، $MyMSGraphToken، سيكون لديه كإحدى خصائصه JWT مُحدد النطاق لـ MS Graph لمستخدمك. أنت الآن جاهز لاستخدام هذا الرمز لسرد جميع المستخدمين في مستأجر Entra:
$MyUsers = Get-AllEntraUsers -Token $MyMSGraphToken.access_token -ShowProgress
بمجرد الانتهاء، سيمتلئ المتغير $MyEntraUsers بكائنات تمثل جميع المستخدمين في مستأجر Entra الخاص بك.
Get-AzureKeyVaultTokenWithClientCredentials يطلب رمزاً مميزاً من STS مع تحديد Azure Vault كمورد/جمهور مقصود باستخدام معرف العميل وسر.Get-AzureKeyVaultTokenWithUsernamePassword يطلب رمزاً مميزاً من STS مع تحديد Azure Vault كمورد/جمهور مقصود باستخدام اسم مستخدم وكلمة مرور يقدمهما المستخدم.Get-AzurePortalTokenWithRefreshToken يطلب رمز تحديث بوابة Azure (Azure Portal Auth Refresh token) باستخدام رمز تحديث يقدمه المستخدم.Get-AzureRMTokenWithClientCredentials يطلب JWT مُحدد النطاق لـ AzureRM باستخدام معرف العميل وسر. مفيد للمصادقة كمدير خدمة (service principal) في Entra.Get-AzureRMTokenWithPortalAuthRefreshToken يطلب JWT مُحدد النطاق لـ AzureRM باستخدام رمز تحديث بوابة Azure يقدمه المستخدم.Get-AzureRMTokenWithRefreshToken يطلب JWT مُحدد النطاق لـ AzureRM باستخدام رمز تحديث يقدمه المستخدم.Get-AzureRMTokenWithUsernamePassword يطلب JWT مُحدد النطاق لـ AzureRM باستخدام اسم مستخدم وكلمة مرور يقدمهما المستخدم.Get-EntraRefreshTokenWithUsernamePassword يطلب مجموعة من الرموز المميزة، بما في ذلك رمز التحديث، من login.microsoftonline.com باستخدام اسم مستخدم وكلمة مرور يقدمهما المستخدم. سيفشل هذا إذا كان المستخدم لديه متطلبات المصادقة متعددة العوامل (MFA) أو متأثر بسياسة الوصول الشرطي (Conditional Access Policy).Get-MSGraphTokenWithClientCredentials يطلب JWT مُحدد النطاق لـ MS Graph باستخدام معرف العميل وسر. مفيد للمصادقة كمدير خدمة في Entra.Get-MSGraphTokenWithPortalAuthRefreshToken يطلب JWT مُحدد النطاق لـ MS Graph باستخدام رمز تحديث بوابة Azure يقدمه المستخدم.Get-MSGraphTokenWithRefreshToken يطلب JWT مُحدد النطاق لـ MS Graph باستخدام رمز تحديث يقدمه المستخدم.Get-MSGraphTokenWithUsernamePassword يطلب JWT مُحدد النطاق لـ MS Graph باستخدام اسم مستخدم وكلمة مرور يقدمهما المستخدم.Parse-JWTToken يأخذ JWT مشفر بـ Base64 كمدخل ويقوم بتحليله لك. مفيد للتحقق من الجمهور (audience) والمطالبات (claims) الصحيحة للرمز.الدوال القائمة على رمز التحديث في BARK مبنية على دوال في TokenTactics بواسطة Steve Borosh.
Get-AllEntraApps يجمع جميع كائنات تسجيل التطبيقات في Entra.Get-AllEntraGroups يجمع جميع مجموعات Entra.Get-AllEntraRoles يجمع جميع أدوار المسؤول في Entra.Get-AllEntraServicePrincipals يجمع جميع كائنات مديري الخدمة في Entra.Get-AllEntraUsers يجمع جميع مستخدمي Entra.Get-EntraAppOwner يجمع مالكي تسجيل تطبيق Entra.Get-EntraDeviceRegisteredUsers يجمع مستخدمي جهاز Entra.Get-EntraGroupMembers يجمع أعضاء مجموعة Entra.Get-EntraGroupOwner يجمع مالكي مجموعة Entra.Get-EntraRoleTemplates يجمع قوالب أدوار المسؤول في Entra.Get-EntraServicePrincipal يجمع مدير خدمة في Entra.Get-EntraServicePrincipalOwner يجمع مالكي مدير خدمة في Entra.Get-EntraTierZeroServicePrincipals يجمع مديري الخدمة في Entra الذين لديهم تعيين دور مسؤول Entra من المستوى الصفري (Tier Zero) أو تعيين دور تطبيق MS Graph من المستوى الصفري.Get-MGAppRoles يجمع أدوار التطبيق المتاحة من مدير خدمة MS Graph.