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 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 인증 새로 고침 토큰을 요청합니다.Get-AzureRMTokenWithClientCredentials
클라이언트 ID 및 비밀을 사용하여 AzureRM 범위 JWT를 요청합니다. Entra 서비스 주체로 인증하는 데 유용합니다.Get-AzureRMTokenWithPortalAuthRefreshToken
사용자가 제공한 Azure Portal 인증 새로 고침 토큰을 사용하여 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 인증 새로 고침 토큰을 사용하여 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
구독 아래의 모든 Key Vault를 수집합니다.Get-AllAzureRMLogicApps
구독에 속한 모든 논리 앱을 수집합니다.Get-AllAzureRMResourceGroups
구독에 속한 모든 리소스 그룹을 수집합니다.Get-AllAzureRMSubscriptions
모든 AzureRM 구독을 수집합니다.Get-AllAzureRMVMScaleSetsVMs
VM 확장 집합 아래의 모든 가상 머신을 수집합니다.Get-AllAzureRMVMScaleSets
구독에서 모든 가상 머신 확장 집합을 수집합니다.Get-AllAzureRMVirtualMachines
구독에 속한 모든 가상 머신을 수집합니다.Get-AllAzureRMWebApps
구독에 따라 모든 웹앱을 수집합니다.Get-AzureAutomationAccountRunBookOutput
자동화 계정 Runbook을 실행하고 해당 출력을 검색합니다.Get-AzureFunctionAppFunctionFile
함수 앱 함수의 원시 파일(일반적으로 소스 코드)을 수집합니다.Get-AzureFunctionAppFunctions
함수 앱 아래의 모든 함수를 수집합니다.Get-AzureFunctionAppMasterKeys
함수 앱 아래의 모든 마스터 키를 수집합니다.Get-AzureFunctionOutput
함수 앱 함수를 실행하고 해당 출력을 검색합니다.Get-AzureRMKeyVaultSecretValue
Key Vault 비밀 값을 수집합니다.Get-AzureRMKeyVaultSecretVersions
모든 버전의 Key Vault 비밀을 수집합니다.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
다른 사용자의 비밀번호를 새로운 사용자가 제공한 값으로 설정하려고 시도합니다. Invoke-AzureRMAKSRunCommand
AKS 클러스터에 명령을 실행하도록 지시합니다.Invoke-AzureRMVMRunCommand
VM에서 명령 실행을 시도합니다.Invoke-AzureRMWebAppShellCommand
웹앱 컨테이너에서 명령 실행을 시도합니다.Invoke-AzureVMScaleSetVMRunCommand
VM 확장 집합 VM에서 명령 실행을 시도합니다.New-AzureAutomationAccountRunBook
자동화 계정에 Runbook을 추가하려고 시도합니다.New-AzureKeyVaultAccessPolicy
Key Vault의 비밀, 키 및 인증서에 대한 "가져오기" 및 "목록" 권한을 주체에게 부여하려고 시도합니다.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을 게시할 수 있는지 여부를 테스트하는 데 사용됩니다.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 앱 역할을 스스로 부여할 수 있는지 여부를 확인하는 데 사용됩니다.