
BARK 代表 BloodHound Attack Research Kit(BloodHound 攻击研究工具包)。它是一个 PowerShell 脚本,旨在帮助 BloodHound Enterprise 团队研究和持续验证滥用原语。BARK 目前专注于微软的 Azure 系列产品和服务。
BARK 不需要任何第三方依赖。BARK 的函数设计得尽可能简单且易于维护。大多数函数只是用于向各种 REST API 端点发出请求的简单包装器。BARK 的基本函数甚至不依赖彼此——你可以将几乎任何 BARK 函数独立提取出来,它都能作为独立函数在你自己的脚本中完美运行。
主要作者: Andy Robbins @_wald0
贡献者:
有多种方法可以导入 PowerShell 脚本。这里介绍一种:
首先,通过克隆此仓库或直接从 GitHub 复制粘贴 BARK.ps1 的原始内容来下载它。
git clone https://github.com/BloodHoundAD/BARK
现在,进入 PS1 所在目录:
cd BARK
最后,像这样点导入 PS1:
. .\BARK.ps1
按回车键,你的 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 Portal Auth 刷新令牌。Get-AzureRMTokenWithClientCredentials 使用客户端 ID 和密码请求一个 AzureRM 范围的 JWT。适用于作为 Entra 服务主体进行身份验证。Get-AzureRMTokenWithPortalAuthRefreshToken 使用用户提供的 Azure Portal Auth 刷新令牌请求一个 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 Portal Auth 刷新令牌请求一个 MS Graph 范围的 JWT。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-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-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 管理员角色。Get-MSGraphTokenWithRefreshToken 使用用户提供的刷新令牌请求一个 MS Graph 范围的 JWT。Get-MSGraphTokenWithUsernamePassword 使用用户提供的用户名和密码请求一个 MS Graph 范围的 JWT。Parse-JWTToken 将 Base64 编码的 JWT 作为输入并为你解析它。有助于验证正确的令牌受众和声明。Get-EntraTierZeroServicePrincipals 收集具有 Tier Zero Entra 管理员角色或 Tier Zero MS Graph 应用角色分配的服务主体。Get-MGAppRoles 收集 MS Graph 服务主体提供的应用角色。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 应用。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 应用角色。