Az - Automation Accounts

Reading time: 12 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

Osnovne Informacije

Azure Automation Accounts su usluge zasnovane na oblaku u Microsoft Azure koje pomažu u automatizaciji zadataka kao što su upravljanje resursima, konfiguracija i ažuriranja širom Azure i lokalnih okruženja. Pružaju Runbooks (skripte za automatizaciju koje se izvršavaju), rasporede i hibridne radne grupe za pokretanje automatizovanih poslova, omogućavajući infrastrukturu kao kod (IaC) i automatizaciju procesa za poboljšanu efikasnost i doslednost u upravljanju resursima u oblaku.

Podešavanja

  • Akreditivi: Lozinka je dostupna samo unutar runbook-a unutar automatizovanog naloga, koriste se za sigurno čuvanje korisničkih imena i lozinki.
  • Promenljive: Koriste se za čuvanje konfiguracionih podataka koji se mogu koristiti u runbook-ima. Ovo može biti i osetljiva informacija kao što su API ključevi. Ako je promenljiva čuvana enkriptovana, dostupna je samo unutar runbook-a unutar automatizovanog naloga.
  • Sertifikati: Koriste se za čuvanje sertifikata koji se mogu koristiti u runbook-ima.
  • Konekcije: Koriste se za čuvanje informacija o konekciji ka spoljnim uslugama. Ovo može sadržati osetljive informacije.
  • Mrežni pristup: Može se postaviti na javne ili privatne.

Runbooks & Poslovi

Runbook u Azure Automation je skripta koja automatski obavlja zadatke unutar vašeg okruženja u oblaku. Runbook-i se mogu pisati u PowerShell-u, Python-u ili grafičkim uređivačima. Pomažu u automatizaciji administrativnih zadataka kao što su upravljanje VM-ovima, zakrčivanje ili provere usklađenosti.

U kod-u unutar Runbooks može se nalaziti osetljive informacije (kao što su akreditivi).

Posao je instanca izvršenja Runbook-a. Kada pokrenete Runbook, kreira se posao za praćenje tog izvršenja. Svaki posao uključuje:

  • Status: U redu, U toku, Završeno, Neuspešno, Suspendovano.
  • Izlaz: Rezultat izvršenja Runbook-a.
  • Vreme početka i završetka: Kada je posao započeo i završen.

Posao sadrži izlaz izvršenja Runbook-a. Ako možete pročitati poslove, uradite to jer sadrže izlaz izvršenja (potencijalno osetljive informacije).

Rasporedi & Webhook-ovi

Postoje 3 glavna načina za izvršavanje Runbook-a:

  • Rasporedi: Koriste se za pokretanje Runbook-a u određenom vremenu ili intervalu.
  • Webhook-ovi: Ovo su HTTP krajnje tačke koje se mogu koristiti za pokretanje Runbook-a iz spoljnih usluga. Imajte na umu da URL webhook-a nije vidljiv nakon kreiranja.
  • Ručno pokretanje: Možete ručno pokrenuti Runbook iz Azure Portala i iz CLI-a.

Kontrola Izvora

Omogućava uvoz Runbook-a iz Github, Azure Devops (Git) i Azure Devops (TFVC). Moguće je naznačiti da se objave Runbook-i iz repozitorijuma u Azure Automation nalog i takođe je moguće naznačiti da se sinhronizuju promene iz repozitorijuma u Azure Automation nalog.

Kada je sinhronizacija omogućena, u Github repozitorijumu se kreira webhook za pokretanje sinhronizacije svaki put kada se dogodi događaj push. Primer URL-a webhook-a: https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d

Imajte na umu da ovi webhook-ovi neće biti vidljivi prilikom listanja webhook-ova u povezanim runbook-ima sa Github repozitorijumom. Takođe, imajte na umu da nije moguće promeniti URL repozitorijuma kontrole izvora nakon što je kreiran.

Da bi konfigurisana kontrola izvora radila, Azure Automation Account treba da ima upravljanu identitet (sistemsku ili korisničku) sa Contributor ulogom. Štaviše, da bi se dodelila korisnička upravljana identitetu Automatizovanom nalogu, potrebno je naznačiti ID klijenta korisničkog MI u promenljivoj AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID.

Okruženja za Izvršavanje

Kada kreirate Runbook, moguće je odabrati okruženje za izvršavanje. Po defaultu, sledeća okruženja za izvršavanje su dostupna:

  • Powershell 5.1
  • Powershell 7.1
  • PowerShell 7.2
  • Python 3.10
  • Python 3.8
  • Python 2.7

Međutim, takođe je moguće kreirati svoja okruženja, koristeći jedno od ovih kao osnovu. U slučaju Pythona, moguće je učitati .whl pakete u okruženje koje će se koristiti. U slučaju PowerShell-a, moguće je učitati .zip pakete sa modulima koji će biti prisutni u izvršavanju.

Hibridne Radne Grupe

U Azure Automation, podrazumevano okruženje za izvršavanje za runbook-e je Azure Sandbox, platforma zasnovana na oblaku kojom upravlja Azure, pogodna za zadatke koji uključuju Azure resurse. Međutim, ovaj sandbox ima ograničenja, kao što su ograničen pristup lokalnim resursima i ograničenja u vremenu izvršavanja i korišćenju resursa. Da bi se prevazišla ova ograničenja, koriste se Hibridne Radne Grupe. Hibridna Radna Grupa se sastoji od jednog ili više Hibridnih Runbook Radnika instaliranih na vašim mašinama, bilo na lokaciji, u drugim okruženjima u oblaku ili Azure VM-ovima. Ova postavka omogućava runbook-ima da se izvršavaju direktno na ovim mašinama, pružajući direktan pristup lokalnim resursima, mogućnost izvršavanja dužih i resursno intenzivnijih zadataka, i fleksibilnost za interakciju sa okruženjima izvan neposrednog dometa Azure-a.

Kada se kreira hibridna radna grupa, potrebno je naznačiti akreditive koji će se koristiti. Postoje 2 opcije:

  • Podrazumevani akreditivi: Ne morate davati akreditive i runbook-i će se izvršavati unutar VM-ova kao Sistem.
  • Specifični akreditivi: Morate navesti naziv objekta akreditiva unutar automatizovanog naloga, koji će se koristiti za izvršavanje runbook-a unutar VM-ova. Stoga, u ovom slučaju, može biti moguće ukrasti važeće akreditive za VM-ove.

Dakle, ako možete odabrati da pokrenete Runbook u Hibridnom Radniku, izvršićete arbitrarne komande unutar spoljne mašine kao Sistem (dobar pivot tehnika).

Štaviše, ako hibridni radnik radi u Azure-u sa drugim upravljanim identitetima, runbook će moći da pristupi upravljanom identitetu runbook-a i svim upravljanim identitetima VM-a iz servisa za metapodatke.

tip

Zapamtite da servis za metapodatke ima drugačiji URL (http://169.254.169.254) od servisa sa kojeg se dobija token upravljanih identiteta automatizovanog naloga (IDENTITY_ENDPOINT).

Konfiguracija Stanja (SC)

warning

Kao što je navedeno u dokumentaciji, Azure Automation State Configuration će biti povučena 30. septembra 2027. i zamenjena sa Azure Machine Configuration.

Automatizovani Nalozi takođe podržavaju Konfiguraciju Stanja (SC), što je funkcija koja pomaže u konfigurisanju i održavanju stanja vaših VM-ova. Moguće je kreirati i primeniti DSC konfiguracije na Windows i Linux mašinama.

Iz perspektive napadača ovo je bilo zanimljivo jer je omogućilo izvršavanje arbitrarnih PS kodova u svim konfiguriranim VM-ovima, omogućavajući eskalaciju privilegija na upravljane identitete ovih VM-ova, potencijalno prelazeći na nove mreže... Takođe, konfiguracije bi mogle sadržati osetljive informacije.

Enumeracija

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>

Eskalacija privilegija i post eksploatacija

Az - Automation Accounts Privesc

Reference

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