Az - Automatisierungskonten

Reading time: 12 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

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 innerhalb der Runbooks befindet, könnten sensible Informationen (wie Anmeldeinformationen) enthalten sein.

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 für eine 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 sein werden, 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 muss zur Zuweisung einer benutzerdefinierten verwalteten Identität zum Automatisierungskonto die Client-ID der Benutzer-MI in der Variablen AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID angegeben werden.

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.

Hybride Arbeitsgruppen

In Azure Automation ist die Standardausführungsumgebung für Runbooks die Azure Sandbox, eine cloudbasierte Plattform, die von Azure verwaltet wird und sich für Aufgaben mit Azure-Ressourcen eignet. Diese Sandbox hat jedoch Einschränkungen, wie z.B. eingeschränkten Zugriff auf lokale Ressourcen und Beschränkungen hinsichtlich der Ausführungszeit und Ressourcennutzung. Um diese Einschränkungen zu überwinden, werden hybride Arbeitsgruppen eingesetzt. Eine hybride Arbeitsgruppe besteht aus einem oder mehreren Hybrid Runbook Workers, die auf Ihren eigenen Maschinen installiert sind, sei es vor Ort, in anderen Cloud-Umgebungen oder Azure-VMs. Diese Konfiguration ermöglicht es Runbooks, direkt auf diesen Maschinen ausgeführt zu werden, was direkten Zugriff auf lokale Ressourcen, die Möglichkeit, längere und ressourcenintensive Aufgaben auszuführen, und die Flexibilität bietet, mit Umgebungen über den unmittelbaren Zugriff von Azure hinaus zu interagieren.

Wenn eine hybride Arbeitsgruppe erstellt wird, müssen die Anmeldeinformationen angegeben werden, die verwendet werden sollen. Es gibt 2 Optionen:

  • Standardanmeldeinformationen: Sie müssen die Anmeldeinformationen nicht angeben, und die Runbooks werden innerhalb der VMs als System ausgeführt.
  • Spezifische Anmeldeinformationen: Sie müssen den Namen des Anmeldeinformationsobjekts im Automatisierungskonto angeben, das verwendet wird, um die Runbooks innerhalb der VMs auszuführen. Daher könnte es in diesem Fall möglich sein, gültige Anmeldeinformationen für die VMs zu stehlen.

Wenn Sie also wählen können, ein Runbook in einem hybriden Worker auszuführen, führen Sie willkürliche Befehle auf einer externen Maschine als System aus (schöne Pivot-Technik).

Darüber hinaus, wenn der hybride Worker in Azure mit anderen verwalteten Identitäten ausgeführt wird, hat das Runbook Zugriff auf die verwaltete Identität des Runbooks und alle verwalteten Identitäten der VM aus dem Metadatenservice.

tip

Denken Sie daran, dass der Metadatenservice eine andere URL hat (http://169.254.169.254) als der Dienst, von dem das Token der verwalteten Identität des Automatisierungskontos abgerufen wird (IDENTITY_ENDPOINT).

Statuskonfiguration (SC)

warning

Wie in den Dokumenten angegeben, wird die Azure Automation Statuskonfiguration am 30. September 2027 eingestellt und durch Azure Machine Configuration 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, was potenziell zu neuen Netzwerken führen könnte... 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
az 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>

# Get hybrid worker groups for an automation account
az automation hrwg list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>

# Get hybrid worker group details
az automation hrwg show --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME> --name <HYBRID-WORKER-GROUP>

# Get more details about a hybrid worker group (like VMs inside it)
az rest --method GET --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/hybridRunbookWorkerGroups/<hybrid-worker-group-name>/hybridRunbookWorkers?&api-version=2021-06-22"
bash
# 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>

Privilegienerweiterung & Nachausnutzung

Az - Automation Accounts Privesc

Referenzen

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks