
BloodHound 攻撃調査キット

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
最後に、次のようにドットインポートできます。
. .\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
完了すると、$MyEntraUsers 変数に Entra テナント内のすべてのユーザーを表すオブジェクトが格納されます。
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 更新トークンを使用して AzureRM を対象とした JWT を要求します。Get-AzureRMTokenWithRefreshToken は、ユーザー指定の更新トークンを使用して AzureRM を対象とした JWT を要求します。Get-AzureRMTokenWithUsernamePassword は、ユーザー指定のユーザー名とパスワードを使用して AzureRM を対象とした JWT を要求します。Get-EntraRefreshTokenWithUsernamePassword は、ユーザー指定のユーザー名とパスワードを使用して login.microsoftonline.com から更新トークンを含むトークンコレクションを要求します。ユーザーに多要素認証が必要な場合や条件付きアクセスポリシーの影響を受ける場合は失敗します。Get-MSGraphTokenWithClientCredentials は、クライアント ID とシークレットを使用して MS Graph を対象とした JWT を要求します。Entra サービスプリンシパルとして認証する場合に便利です。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-AllAzureManagedIdentityAssignments は、すべてのマネージド ID 割り当てを収集します。Get-AllAzureRMAKSClusters は、サブスクリプション配下のすべての Kubernetes サービス クラスターを収集します。Get-AllAzureRMAutomationAccounts は、サブスクリプション配下のすべての Automation アカウントを収集します。Get-AllAzureRMAzureContainerRegistries は、サブスクリプション配下のすべてのコンテナーレジストリを収集します。Get-AllAzureRMFunctionApps は、サブスクリプション配下のすべての関数アプリを収集します。Get-AllAzureRMKeyVaults は、サブスクリプション配下のすべてのキー コンテナーを収集します。Get-AllAzureRMLogicApps は、サブスクリプション配下のすべてのロジック アプリを収集します。Get-AllAzureRMResourceGroups は、サブスクリプション配下のすべてのリソース グループを収集します。Get-AllAzureRMSubscriptions は、すべての AzureRM サブスクリプションを収集します。Get-AllAzureRMVMScaleSetsVMs は、VM スケール セット配下のすべての仮想マシンを収集します。Get-AllAzureRMVMScaleSets は、サブスクリプション配下のすべての仮想マシン スケール セットを収集します。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 は、Automation アカウントに 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 は、新しいサービスプリンシパルを作成し、上記の関数で作成されたアプリに関連付けます。Get-MSGraphTokenWithPortalAuthRefreshToken は、ユーザー指定の Azure Portal Auth 更新トークンを使用して MS Graph を対象とした JWT を要求します。Get-MSGraphTokenWithRefreshToken は、ユーザー指定の更新トークンを使用して MS Graph を対象とした JWT を要求します。Get-MSGraphTokenWithUsernamePassword は、ユーザー指定のユーザー名とパスワードを使用して MS Graph を対象とした JWT を要求します。Parse-JWTToken は、Base64 エンコードされた JWT を入力として受け取り、解析します。正しいトークンの対象ユーザーとクレームを確認する場合に便利です。Get-EntraTierZeroServicePrincipals は、Tier Zero Entra 管理者ロールまたは Tier Zero MS Graph アプリロールの割り当てを持つ Entra サービスプリンシパルを収集します。Get-MGAppRoles は、MS Graph サービスプリンシパルによって利用可能にされたアプリロールを収集します。Get-AllAzureRMVirtualMachines は、サブスクリプション配下のすべての仮想マシンを収集します。Get-AllAzureRMWebApps は、サブスクリプション配下のすべての Web アプリを収集します。Get-AzureAutomationAccountRunBookOutput は、Automation アカウントの Runbook を実行し、その出力を取得します。Get-AzureFunctionAppFunctionFile は、関数アプリ関数の生ファイル(通常はソースコード)を収集します。Get-AzureFunctionAppFunctions は、関数アプリ配下のすべての関数を収集します。Get-AzureFunctionAppMasterKeys は、関数アプリ配下のすべてのマスターキーを収集します。Get-AzureFunctionOutput は、関数アプリ関数を実行し、その出力を取得します。Get-AzureRMKeyVaultSecretValue は、キー コンテナーのシークレット値を収集します。Get-AzureRMKeyVaultSecretVersions は、キー コンテナー シークレットのすべてのバージョンを収集します。Get-AzureRMKeyVaultSecrets は、キー コンテナー配下のすべてのシークレットを収集します。Get-AzureRMRoleAssignments は、オブジェクトに対するすべてのロール割り当てを収集します。Get-AzureRMRoleDefinitions は、カスタムロールを含むサブスクリプションスコープで記述されたすべてのロール定義を収集します。Get-AzureRMWebApp は、Web アプリを収集します。Remove-AbuseTestAzureRMRoles は、テスト中に作成された AzureRM 管理者ロールを削除するためのクリーンアップ関数です。Remove-AbuseTestServicePrincipals は、テスト中に作成されたサービスプリンシパルを削除して悪用テストをクリーンアップします。Test-AzureRMAddSelfToAzureRMRole は、特定の権限を持つサービスプリンシパルがサブスクリプションに対して自身に User Access Admin ロールを付与できるかどうかを判断するために悪用検証テストで使用されます。Test-AzureRMCreateFunction は、サービスプリンシパルが既存の関数アプリに新しい関数を追加できるかどうかをテストするために悪用検証テストで使用されます。Test-AzureRMPublishAutomationAccountRunBook は、サービスプリンシパルが既存の Automation アカウントに新しい 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 アプリロールを自身に付与できるかどうかを判断するために悪用検証テストで使用されます。