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 앱 역할을 스스로 부여할 수 있는지 여부를 확인하기 위해 남용 유효성 검사 테스트에 사용됩니다.