Az - Automation Accounts
Reading time: 12 minutes
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
Informazioni di base
Gli Azure Automation Accounts sono servizi basati sul cloud in Microsoft Azure che aiutano a automatizzare i compiti come la gestione delle risorse, la configurazione e gli aggiornamenti in ambienti Azure e on-premises. Forniscono Runbooks (script per l'automazione che vengono eseguiti), programmazioni e gruppi di lavoratori ibridi per eseguire lavori di automazione, abilitando l'infrastruttura come codice (IaC) e l'automazione dei processi per migliorare l'efficienza e la coerenza nella gestione delle risorse cloud.
Impostazioni
- Credenziali: La password è accessibile solo all'interno di un runbook all'interno dell'account di automazione, e viene utilizzata per memorizzare in modo sicuro nomi utente e password.
- Variabili: Utilizzate per memorizzare dati di configurazione che possono essere utilizzati nei runbook. Questo potrebbe includere anche informazioni sensibili come le chiavi API. Se la variabile è memorizzata crittografata, è disponibile solo all'interno di un runbook nell'account di automazione.
- Certificati: Utilizzati per memorizzare certificati che possono essere utilizzati nei runbook.
- Connessioni: Utilizzate per memorizzare informazioni di connessione a servizi esterni. Questo potrebbe contenere informazioni sensibili.
- Accesso alla rete: Può essere impostato su pubblico o privato.
Runbooks & Lavori
Un Runbook in Azure Automation è uno script che esegue automaticamente compiti all'interno del tuo ambiente cloud. I runbook possono essere scritti in PowerShell, Python o editor grafici. Aiutano ad automatizzare compiti amministrativi come la gestione delle VM, la patching o i controlli di conformità.
Nel codice situato all'interno dei Runbooks potrebbero esserci informazioni sensibili (come credenziali).
Un Lavoro è un'istanza di esecuzione di un Runbook. Quando esegui un Runbook, viene creato un Lavoro per tracciare quell'esecuzione. Ogni lavoro include:
- Stato: In coda, In esecuzione, Completato, Fallito, Sospeso.
- Output: Il risultato dell'esecuzione del Runbook.
- Orario di inizio e fine: Quando il lavoro è iniziato e completato.
Un lavoro contiene l'output dell'esecuzione del Runbook. Se puoi leggere i lavori, fallo poiché contengono l'output dell'esecuzione (potenziali informazioni sensibili).
Programmazioni & Webhook
Ci sono 3 modi principali per eseguire un Runbook:
- Programmazioni: Queste vengono utilizzate per attivare i Runbooks a un orario specifico o a intervalli.
- Webhook: Questi sono endpoint HTTP che possono essere utilizzati per attivare i Runbooks da servizi esterni. Nota che l'URL del webhook non è visibile dopo la creazione.
- Attivazione manuale: Puoi attivare manualmente un Runbook dal Portale Azure e dalla CLI.
Controllo del codice sorgente
Consente di importare Runbooks da Github, Azure Devops (Git) e Azure Devops (TFVC). È possibile indicare di pubblicare i Runbooks del repository nell'account di automazione Azure ed è anche possibile indicare di sincronizzare le modifiche dal repository all'account di automazione Azure.
Quando la sincronizzazione è abilitata, nel repository Github viene creato un webhook per attivare la sincronizzazione ogni volta che si verifica un evento di push. Esempio di un URL webhook: https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d
Nota che questi webhook non saranno visibili quando si elencano i webhook nei runbooks associati al repository Github. Inoltre, nota che non è possibile cambiare l'URL del repository di un controllo del codice sorgente una volta creato.
Affinché il controllo del codice sorgente configurato funzioni, l'Azure Automation Account deve avere un'identità gestita (di sistema o utente) con il ruolo di Contributor
. Inoltre, per assegnare un'identità gestita a un'Automation Account, è necessario indicare l'ID client dell'utente MI nella variabile AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID
.
Ambienti di esecuzione
Quando si crea un Runbook è possibile selezionare l'ambiente di esecuzione. Per impostazione predefinita, i seguenti ambienti di esecuzione sono disponibili:
- Powershell 5.1
- Powershell 7.1
- PowerShell 7.2
- Python 3.10
- Python 3.8
- Python 2.7
Tuttavia, è anche possibile creare i propri ambienti, utilizzando uno di questi come base. Nel caso di Python, è possibile caricare pacchetti .whl
nell'ambiente che verrà utilizzato. Nel caso di PowerShell, è possibile caricare pacchetti .zip
con i moduli da avere nell'esecuzione.
Gruppi di lavoratori ibridi
In Azure Automation, l'ambiente di esecuzione predefinito per i runbook è il Azure Sandbox, una piattaforma basata sul cloud gestita da Azure, adatta per compiti che coinvolgono risorse Azure. Tuttavia, questo sandbox ha limitazioni, come l'accesso ristretto alle risorse on-premises e vincoli sul tempo di esecuzione e sull'uso delle risorse. Per superare queste limitazioni, vengono impiegati i Gruppi di Lavoratori Ibridi. Un Gruppo di Lavoratori Ibridi è composto da uno o più Hybrid Runbook Workers installati sulle proprie macchine, sia on-premises, in altri ambienti cloud o VM Azure. Questa configurazione consente ai runbook di essere eseguiti direttamente su queste macchine, fornendo accesso diretto alle risorse locali, la possibilità di eseguire compiti più lunghi e intensivi in termini di risorse, e la flessibilità di interagire con ambienti al di là della portata immediata di Azure.
Quando viene creato un gruppo di lavoratori ibridi, è necessario indicare le credenziali da utilizzare. Ci sono 2 opzioni:
- Credenziali predefinite: Non è necessario fornire le credenziali e i runbook verranno eseguiti all'interno delle VM come Sistema.
- Credenziali specifiche: È necessario fornire il nome dell'oggetto credenziali all'interno dell'account di automazione, che verrà utilizzato per eseguire i runbook all'interno delle VM. Pertanto, in questo caso, potrebbe essere possibile rubare credenziali valide per le VM.
Pertanto, se puoi scegliere di eseguire un Runbook in un Lavoratore Ibrido, eseguirai comandi arbitrari all'interno di una macchina esterna come Sistema (ottima tecnica di pivot).
Inoltre, se il lavoratore ibrido è in esecuzione in Azure con altre identità gestite collegate, il runbook sarà in grado di accedere all'identità gestita del runbook e a tutte le identità gestite della VM dal servizio di metadata.
tip
Ricorda che il servizio di metadata ha un URL diverso (http://169.254.169.254
) rispetto al servizio da cui ottenere il token delle identità gestite dell'account di automazione (IDENTITY_ENDPOINT
).
Configurazione dello stato (SC)
warning
Come indicato nella documentazione, la Configurazione dello Stato di Azure Automation sarà ritirata il 30 settembre 2027 e sostituita da Azure Machine Configuration.
Gli Automation Accounts supportano anche la Configurazione dello Stato (SC), che è una funzionalità che aiuta a configurare e mantenere lo stato delle tue VM. È possibile creare e applicare configurazioni DSC a macchine Windows e Linux.
Dal punto di vista di un attaccante, questo era interessante perché consentiva di eseguire codice PS arbitrario in tutte le VM configurate, consentendo di elevare i privilegi alle identità gestite di queste VM, potenzialmente pivotando verso nuove reti... Inoltre, le configurazioni potrebbero contenere informazioni sensibili.
Enumerazione
# 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"
# 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>
Escalation dei privilegi e Post Exploitation
Az - Automation Accounts Privesc
Riferimenti
- https://learn.microsoft.com/en-us/azure/automation/overview
- https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview
- https://github.com/rootsecdev/Azure-Red-Team#runbook-automation
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.