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 アプリ ロールを自分自身に付与できるかどうかを判断するための不正使用検証テストで使用されます。