
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 서비스 주체로 인증하는 데 유용합니다.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 계층 0 Entra 관리자 역할 또는 계층 0 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 구독 아래의 모든 웹 앱을 수집합니다.Get-AzureAutomationAccountRunBookOutput 자동화 계정 실행 책을 실행하고 출력을 검색합니다.Get-AzureFunctionAppFunctionFile 함수 앱 함수의 원시 파일(일반적으로 소스 코드)을 수집합니다.Get-AzureFunctionAppFunctions 함수 앱 아래의 모든 함수를 수집합니다.Get-AzureFunctionAppMasterKeys 함수 앱 아래의 모든 마스터 키를 수집합니다.Get-AzureFunctionOutput 함수 앱 함수를 실행하고 출력을 검색합니다.Get-AzureRMKeyVaultSecretValue 키 자격 증명 모음 비밀 값을 수집합니다.Get-AzureRMKeyVaultSecretVersions 키 자격 증명 모음 비밀의 모든 버전을 수집합니다.Get-AzureRMKeyVaultSecrets 키 자격 증명 모음 아래의 모든 비밀을 수집합니다.Get-AzureRMRoleAssignments 개체에 대한 모든 역할 할당을 수집합니다.Get-AzureRMRoleDefinitions 구독 범위에서 설명된 모든 역할 정의를 수집합니다. 사용자 지정 역할을 포함합니다.Get-AzureRMWebApp 웹 앱을 수집합니다.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 다른 사용자의 암호를 사용자가 제공한 새 값으로 설정하려고 시도합니다.