BARK 代表 BloodHound 攻擊研究套件。它是一個 PowerShell 腳本,旨在幫助 BloodHound Enterprise 團隊研究並持續驗證濫用原語。 BARK 目前專注於微軟的 Azure 產品和服務套件。
BARK 不需要第三方依賴。 BARK的功能設計得盡可能簡單和可維護。大多數函數都是非常簡單的包裝器,用於向各種 REST API 端點發出請求。 BARK 的基本函數甚至不需要彼此 - 您可以從 BARK 中提取幾乎任何 BARK 函數,並且它將在您自己的腳本中作為獨立函數完美運行。
主要作者:安迪羅賓斯@_wald0
貢獻者:
導入 PowerShell 腳本的方法有多種。這是一種方法:
首先,透過複製此儲存庫或簡單地從 GitHub 複製/貼上其原始內容來下載 BARK.ps1。
git clone https://github.com/BloodHoundAD/BARK
現在,cd 進入 PS1 所在的目錄:
cd BARK
最後,你可以像這樣點導入 PS1:
. .BARK.ps1
按 Enter 鍵,您的 PowerShell 實例現在將可以存取 BARK 的所有功能。
除極少數例外,Azure API 端點都需要驗證才能進行互動。 BARK 隨附了一些函數,可協助您取得與 MS Graph 和 Azure REST API 互動所需的令牌。任何與需要身份驗證的 Azure API 互動的 BARK 函數都需要您提供令牌。
假設您想要列出 Entra ID 租用戶中的所有使用者。您首先需要取得一個適用於 MS Graph 的令牌。取得此令牌的方法有多種:
如果您有該租用戶中 Entra 使用者的使用者名稱/密碼組合,您可以先使用 BARK 的Get-EntraRefreshTokenWithUsernamePassword
函數來取得該使用者的刷新令牌:
$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
將為您的使用者提供一個 MS Graph 範圍的 JWT 作為其屬性值之一。現在您可以使用此令牌列出 Entra 租戶中的所有使用者:
$MyUsers = Get-AllEntraUsers -Token $MyMSGraphToken.access_token -ShowProgress
完成後, $MyEntraUsers
變數將由代表 Entra 租用戶中所有使用者的物件填入。
Get-AzureKeyVaultTokenWithClientCredentials
使用用戶端 ID 和金鑰從 STS 要求令牌,並將 Azure Vault 指定為資源/目標受眾。Get-AzureKeyVaultTokenWithUsernamePassword
使用使用者提供的使用者名稱和密碼從 STS 要求令牌,並將 Azure Vault 指定為資源/目標受眾。Get-AzurePortalTokenWithRefreshToken
使用使用者提供的刷新令牌請求 Azure 入口網站驗證刷新令牌。Get-AzureRMTokenWithClientCredentials
請求具有客戶端 ID 和金鑰的 AzureRM 範圍的 JWT。對於作為 Entra 服務主體進行身份驗證很有用。Get-AzureRMTokenWithPortalAuthRefreshToken
使用使用者提供的 Azure 入口網站驗證刷新令牌請求 AzureRM 範圍的 JWT。Get-AzureRMTokenWithRefreshToken
使用使用者提供的刷新權杖請求 AzureRM 範圍的 JWT。Get-AzureRMTokenWithUsernamePassword
使用使用者提供的使用者名稱和密碼請求 AzureRM 範圍的 JWT。Get-EntraRefreshTokenWithUsernamePassword
使用使用者提供的使用者名稱和密碼從 login.microsoftonline.com 請求令牌集合,包括刷新令牌。如果使用者有多重身份驗證要求或受條件存取策略影響,此操作將會失敗。Get-MSGraphTokenWithClientCredentials
請求帶有客戶端 ID 和金鑰的 MS Graph 範圍的 JWT。對於作為 Entra 服務主體進行身份驗證很有用。Get-MSGraphTokenWithPortalAuthRefreshToken
使用使用者提供的 Azure 入口網站驗證刷新令牌請求 MS Graph 範圍的 JWT。Get-MSGraphTokenWithRefreshToken
使用使用者提供的刷新令牌請求 MS Graph 範圍的 JWT。Get-MSGraphTokenWithUsernamePassword
使用使用者提供的使用者名稱和密碼請求 MS Graph 範圍的 JWT。Parse-JWTToken
將採用 Base64 編碼的 JWT 作為輸入並為您解析它。對於驗證正確的令牌受眾和聲明很有用。BARK 中基於刷新令牌的函數是基於 Steve Borosh 的 TokenTactics 中的函數。
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 管理角色或零層 MS Graph 應用程式角色指派的 Entra 服務主體。Get-MGAppRoles
收集 MS Graph 服務主體提供的應用程式角色。 Get-AllAzureManagedIdentityAssignments
收集所有託管識別分配。Get-AllAzureRMAKSClusters
收集訂閱下的所有 kubernetes 服務叢集。Get-AllAzureRMAutomationAccounts
收集訂閱下的所有自動化帳戶。Get-AllAzureRMAzureContainerRegistries
收集訂閱下的所有容器註冊表。Get-AllAzureRMFunctionApps
收集訂閱下的所有函數應用程式。Get-AllAzureRMKeyVaults
收集訂閱下的所有金鑰保管庫。Get-AllAzureRMLogicApps
收集訂閱下的所有邏輯應用程式。Get-AllAzureRMResourceGroups
收集訂閱下的所有資源組。Get-AllAzureRMSubscriptions
收集所有 AzureRM 訂閱。Get-AllAzureRMVMScaleSetsVMs
收集 VM 規模集下的所有虛擬機器。Get-AllAzureRMVMScaleSets
收集訂閱下的所有虛擬機器規模集。Get-AllAzureRMVirtualMachines
收集訂閱下的所有虛擬機器。Get-AllAzureRMWebApps
收集訂閱下的所有 Web 應用程式。Get-AzureAutomationAccountRunBookOutput
執行自動化帳戶 Runbook 並擷取其輸出。Get-AzureFunctionAppFunctionFile
收集函數應用程式函數的原始檔案(通常是原始碼)。Get-AzureFunctionAppFunctions
收集函數應用程式下的所有函數。Get-AzureFunctionAppMasterKeys
收集函數應用程式下的所有主金鑰。Get-AzureFunctionOutput
執行函數應用程式並檢索其輸出。Get-AzureRMKeyVaultSecretValue
收集金鑰保管庫機密值。Get-AzureRMKeyVaultSecretVersions
收集金鑰保管庫機密的所有版本。Get-AzureRMKeyVaultSecrets
收集金鑰保管庫下的所有機密。Get-AzureRMRoleAssignments
收集物件的所有角色分配。Get-AzureRMRoleDefinitions
收集訂閱範圍中所述的所有角色定義,包括自訂角色。Get-AzureRMWebApp
收集 Web 應用程式。 Get-IntuneManagedDevices
收集 Intune 託管設備。Get-IntuneRoleDefinitions
收集可用的 Intune 角色定義。 Add-MemberToEntraGroup
將嘗試將主體新增至 Entra 群組。Enable-EntraRole
將嘗試啟用(或「啟動」)Entra 角色。New-EntraAppOwner
將嘗試為 Entra 應用程式新增擁有者。New-EntraAppRoleAssignment
將嘗試向服務主體授予應用程式角色。例如,您可以使用它來向服務主體授予 RoleManagement.ReadWrite.Directory 應用角色。New-EntraAppSecret
將嘗試為現有 Entra 應用程式註冊建立新的金鑰。New-EntraGroupOwner
將嘗試為 Entra 群組新增所有者。New-EntraRoleAssignment
將嘗試將 Entra 管理員角色指派給指定主體。New-EntraServicePrincipalOwner
將嘗試將新所有者新增至 Entra 服務主體。New-EntraServicePrincipalSecret
將嘗試為現有 Entra 服務主體建立新金鑰。Reset-EntraUserPassword
將嘗試重置另一個使用者的密碼。如果成功,輸出將包含 Azure 產生的新使用者密碼。Set-EntraUserPassword
將嘗試將另一個使用者的密碼設定為使用者提供的新值。 Invoke-AzureRMAKSRunCommand
將指示 AKS 叢集執行指令。Invoke-AzureRMVMRunCommand
將嘗試在 VM 上執行命令。Invoke-AzureRMWebAppShellCommand
將嘗試在 Web 應用程式容器上執行指令。Invoke-AzureVMScaleSetVMRunCommand
將嘗試在 VM 規模集 VM 上執行指令。New-AzureAutomationAccountRunBook
將嘗試將 Runbook 新增至自動化帳戶。New-AzureKeyVaultAccessPolicy
將嘗試授予主體對金鑰保管庫的機密、金鑰和憑證的「取得」和「列出」權限。New-AzureRMRoleAssignment
將嘗試將使用者指定的 AzureRM 角色指派授予特定範圍內的特定主體。New-PowerShellFunctionAppFunction
將嘗試在函數應用程式中建立新的 PowerShell 函數。 ConvertTo-Markdown
用於調整 Invoke-Tests 函數的輸出,以便在另一個平台中使用。Invoke-AllAzureMGAbuseTests
執行可以透過持有 MS Graph 應用程式角色來執行的所有濫用驗證測試。傳回一個對象,描述哪些權限成功執行每個濫用測試。Invoke-AllAzureRMAbuseTests
執行所有 AzureRM 濫用驗證測試,並輸出一個結果對象,該對象描述哪些 AzureRM 角色被授予執行每種濫用的能力。Invoke-AllEntraAbuseTests
執行可由授予 Entra 管理員角色的主體執行的所有濫用驗證測試。傳回一個對象,描述哪些權限成功執行每個濫用測試。New-EntraIDAbuseTestSPs
為每個活動的 Entra 管理員角色建立一個新的服務主體,並為每個服務主體授予適當的角色。傳回為每個服務主體建立的純文字憑證。New-EntraIDAbuseTestUsers
為每個活動的 Entra 管理員角色建立一個新用戶,並授予每個用戶適當的角色。傳回為每個使用者建立的純文字憑證。New-IntuneAbuseTestUsers
為每個 Intune 角色建立一個新用戶,並授予每個用戶適當的角色。傳回為每個使用者建立的純文字憑證。New-MSGraphAppRoleTestSPs
為每個 MS Graph 應用角色建立一個新的服務主體,並為每個服務主體授予適當的角色。傳回為每個服務主體建立的純文字憑證。New-TestAppReg
創建一個應用程式註冊對象,用於濫用驗證測試的明確目的。New-TestSP
建立一個新的服務主體,並將其與上述函數所建立的應用程式關聯起來。Remove-AbuseTestAzureRMRoles
是一個清理函數,用於刪除測試期間建立的 AzureRM 管理員角色。Remove-AbuseTestServicePrincipals
透過刪除測試期間建立的服務主體來清理濫用測試。Test-AzureRMAddSelfToAzureRMRole
在濫用驗證測試中使用,以確定具有特定權限的服務主體是否可以透過訂閱向自己授予使用者存取管理員角色。Test-AzureRMCreateFunction
用於濫用驗證測試,以測試服務主體是否可以為現有函數應用程式新增函數。Test-AzureRMPublishAutomationAccountRunBook
用於測試服務主體是否可以將新 Runbook 發佈到現有自動化帳戶。Test-AzureRMVMRunCommand
用於測試主體是否可以在現有 VM 上執行命令。Test-MGAddMemberToNonRoleEligibleGroup
用於測試服務主體是否可以將自身新增至非角色合格群組。Test-MGAddMemberToRoleEligibleGroup
用於測試服務主體是否可以將自身新增至角色合格群組。Test-MGAddOwnerToNonRoleEligibleGroup
用於測試服務主體是否可以授予自己非角色合格群組的明確所有權。Test-MGAddOwnerToRoleEligibleGroup
用於測試服務主體是否可以授予自己角色合格群組的明確所有權。Test-MGAddRootCACert
用於測試服務主體是否可以向租用戶新增新的根 CA 憑證。Test-MGAddSecretToApp
用於測試服務主體是否可以為現有應用程式新增金鑰。Test-MGAddSecretToSP
用於測試服務主體是否可以為現有服務主體新增金鑰。Test-MGAddSelfAsOwnerOfApp
用於濫用驗證測試,以確定具有特定權限的服務主體是否可以授予自己現有 Entra 應用程式的所有權。Test-MGAddSelfAsOwnerOfSP
用於濫用驗證測試,以確定具有特定權限的服務主體是否可以向自己授予現有 Entra 服務主體的所有權。Test-MGAddSelfToEntraRole
用於濫用驗證測試,以確定具有特定權限的服務主體是否可以將自身新增至 Entra 管理員角色(例如全域管理員)。Test-MGAddSelfToMGAppRole
用於濫用驗證測試,以確定具有特定權限的服務主體是否可以在未經管理員同意的情況下向自己授予特定的 MS Graph 應用程式角色。