
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
마지막으로, 다음과 같이 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와 비밀을 사용하여 Azure Vault를 리소스/대상 대상으로 지정하여 STS에서 토큰을 요청합니다.Get-AzureKeyVaultTokenWithUsernamePassword 사용자가 제공한 사용자 이름과 비밀번호를 사용하여 Azure Vault를 리소스/대상 대상으로 지정하여 STS에서 토큰을 요청합니다.Get-AzurePortalTokenWithRefreshToken 사용자가 제공한 새로 고침 토큰으로 Azure Portal Auth Refresh 토큰을 요청합니다.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 서비스 주체로 인증하는 데 유용합니다.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 구독 아래의 모든 자동화 계정을 수집합니다.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 웹 앱 컨테이너에서 명령을 실행하려고 시도합니다.Invoke-AzureVMScaleSetVMRunCommand VM 확장 집합 VM에서 명령을 실행하려고 시도합니다.New-AzureAutomationAccountRunBook 자동화 계정에 실행 책을 추가하려고 시도합니다.New-AzureKeyVaultAccessPolicy 키 자격 증명 모음의 비밀, 키 및 인증서에 대해 보안 주체에 "Get" 및 "List" 권한을 부여하려고 시도합니다.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 Refresh 토큰을 사용하여 MS Graph 범위의 JWT를 요청합니다.Get-MSGraphTokenWithRefreshToken 사용자가 제공한 새로 고침 토큰을 사용하여 MS Graph 범위의 JWT를 요청합니다.Get-MSGraphTokenWithUsernamePassword 사용자가 제공한 사용자 이름과 비밀번호를 사용하여 MS Graph 범위의 JWT를 요청합니다.Parse-JWTToken Base64로 인코딩된 JWT를 입력으로 받아 구문 분석합니다. 올바른 토큰 대상 및 클레임을 확인하는 데 유용합니다.Get-EntraTierZeroServicePrincipals 계층 0 Entra 관리자 역할 또는 계층 0 MS Graph 앱 역할 할당이 있는 Entra 서비스 주체를 수집합니다.Get-MGAppRoles MS Graph 서비스 주체에서 사용할 수 있도록 한 앱 역할을 수집합니다.Get-AllAzureRMVirtualMachines 구독 아래의 모든 가상 머신을 수집합니다.Get-AllAzureRMWebApps 구독 아래의 모든 웹 앱을 수집합니다.Get-AzureAutomationAccountRunBookOutput 자동화 계정 실행 책을 실행하고 출력을 검색합니다.Get-AzureFunctionAppFunctionFile 함수 앱 함수의 원시 파일(일반적으로 소스 코드)을 수집합니다.Get-AzureFunctionAppFunctions 함수 앱 아래의 모든 함수를 수집합니다.Get-AzureFunctionAppMasterKeys 함수 앱 아래의 모든 마스터 키를 수집합니다.Get-AzureFunctionOutput 함수 앱 함수를 실행하고 출력을 검색합니다.Get-AzureRMKeyVaultSecretValue 키 자격 증명 모음 비밀 값을 수집합니다.Get-AzureRMKeyVaultSecretVersions 키 자격 증명 모음 비밀의 모든 버전을 수집합니다.Get-AzureRMKeyVaultSecrets 키 자격 증명 모음 아래의 모든 비밀을 수집합니다.Get-AzureRMRoleAssignments 개체에 대한 모든 역할 할당을 수집합니다.Get-AzureRMRoleDefinitions 구독 범위에서 설명된 모든 역할 정의를 수집합니다. 사용자 지정 역할을 포함합니다.Get-AzureRMWebApp 웹 앱을 수집합니다.Remove-AbuseTestAzureRMRoles 테스트 중에 생성된 AzureRM 관리자 역할을 제거하기 위한 정리 함수입니다.Remove-AbuseTestServicePrincipals 테스트 중에 생성된 서비스 주체를 제거하여 남용 테스트를 정리합니다.Test-AzureRMAddSelfToAzureRMRole 남용 검증 테스트에서 특정 권한이 있는 서비스 주체가 구독에 대해 자신에게 사용자 액세스 관리자 역할을 부여할 수 있는지 확인하는 데 사용됩니다.Test-AzureRMCreateFunction 남용 검증 테스트에서 서비스 주체가 기존 함수 앱에 새 함수를 추가할 수 있는지 테스트하는 데 사용됩니다.Test-AzureRMPublishAutomationAccountRunBook 서비스 주체가 기존 자동화 계정에 새 실행 책을 게시할 수 있는지 테스트하는 데 사용됩니다.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 앱 역할을 자신에게 부여할 수 있는지 확인하는 데 사용됩니다.