BARK は BloodHound Attack Research Kit の略です。これは、BloodHound Enterprise チームによる不正行為プリミティブの調査と継続的な検証を支援するために構築された PowerShell スクリプトです。 BARK は現在、Microsoft の Azure スイートとサービスに重点を置いています。
BARK にはサードパーティの依存関係は必要ありません。 BARK の機能は、できる限りシンプルで保守しやすいように設計されています。ほとんどの関数は、さまざまな REST API エンドポイントにリクエストを行うための非常に単純なラッパーです。 BARK の基本関数は相互に必要としません。ほぼすべての BARK 関数を BARK から引き出すことができ、独自のスクリプト内でスタンドアロン関数として完全に動作します。
主な著者: Andy Robbins @_wald0
寄稿者:
PowerShell スクリプトをインポートするには、さまざまな方法があります。一つの方法は次のとおりです。
まず、このリポジトリのクローンを作成するか、GitHub から生のコンテンツをコピー/ペーストして、BARK.ps1 をダウンロードします。
git clone https://github.com/BloodHoundAD/BARK
ここで、PS1 が存在するディレクトリに cd で移動します。
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
プロパティ値の 1 つとして、ユーザー用の MS Graph スコープの JWT が含まれるようになります。これで、このトークンを使用して Entra テナント内のすべてのユーザーを一覧表示する準備が整いました。
$MyUsers = Get-AllEntraUsers -Token $MyMSGraphToken.access_token -ShowProgress
完了すると、Entra テナント内のすべてのユーザーを表すオブジェクトが$MyEntraUsers
変数に設定されます。
Get-AzureKeyVaultTokenWithClientCredentials
クライアント ID とシークレットを使用して、リソース/対象ユーザーとして指定された Azure Vault を持つ STS からのトークンを要求します。Get-AzureKeyVaultTokenWithUsernamePassword
ユーザーが指定したユーザー名とパスワードを使用して、リソース/対象ユーザーとして指定された Azure Vault を持つ STS からのトークンを要求します。Get-AzurePortalTokenWithRefreshToken
ユーザー指定の更新トークンを使用して Azure Portal Auth 更新トークンを要求します。Get-AzureRMTokenWithClientCredentials
クライアント ID とシークレットを使用して AzureRM スコープの JWT を要求します。 Entra サービス プリンシパルとして認証する場合に便利です。Get-AzureRMTokenWithPortalAuthRefreshToken
ユーザーが指定した Azure Portal Auth Refresh トークンを使用して、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 Refresh トークンを使用して 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
Tier Zero Entra 管理者ロールまたは Tier Zero MS Graph アプリ ロールの割り当てを持つ Entra サービス プリンシパルを収集します。Get-MGAppRoles
MS Graph サービス プリンシパルによって利用可能になったアプリ ロールを収集します。 Get-AllAzureManagedIdentityAssignments
すべてのマネージド ID 割り当てを収集します。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
Automation アカウント Runbook を実行し、その出力を取得します。Get-AzureFunctionAppFunctionFile
関数アプリ関数の生のファイル (通常はソース コード) を収集します。Get-AzureFunctionAppFunctions
、関数アプリの下にあるすべての関数を収集します。Get-AzureFunctionAppMasterKeys
、関数アプリの下のすべてのマスター キーを収集します。Get-AzureFunctionOutput
関数アプリ関数を実行し、その出力を取得します。Get-AzureRMKeyVaultSecretValue
Key Vault のシークレット値を収集します。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 を Automation アカウントに追加しようとします。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 を既存の Automation アカウントに発行できるかどうかをテストするために使用されます。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 管理者ロール (たとえば、Global Admin) に自分自身を追加できるかどうかを判断するための不正使用検証テストで使用されます。Test-MGAddSelfToMGAppRole
は、特定の特権を持つサービス プリンシパルが管理者の同意なしに特定の MS Graph アプリ ロールを自分自身に付与できるかどうかを判断するための不正使用検証テストで使用されます。