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 应用程序角色。