Az - Automation Accounts
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.
Informations de base
Les comptes dâautomatisation Azure sont des services basĂ©s sur le cloud dans Microsoft Azure qui aident Ă automatiser des tĂąches telles que la gestion des ressources, la configuration et les mises Ă jour dans les environnements Azure et sur site. Ils fournissent des Runbooks (scripts pour lâautomatisation qui sont exĂ©cutĂ©s), des horaires et des groupes de travailleurs hybrides pour exĂ©cuter des jobs dâautomatisation, permettant lâinfrastructure en tant que code (IaC) et lâautomatisation des processus pour amĂ©liorer lâefficacitĂ© et la cohĂ©rence dans la gestion des ressources cloud.
ParamĂštres
- Identifiants : Le mot de passe nâest accessible que dans un runbook Ă lâintĂ©rieur du compte dâautomatisation, ils sont utilisĂ©s pour stocker les noms dâutilisateur et les mots de passe en toute sĂ©curitĂ©.
- Variables : UtilisĂ©es pour stocker des donnĂ©es de configuration qui peuvent ĂȘtre utilisĂ©es dans les runbooks. Cela pourrait Ă©galement ĂȘtre des informations sensibles comme des clĂ©s API. Si la variable est stockĂ©e de maniĂšre chiffrĂ©e, elle nâest disponible que dans un runbook Ă lâintĂ©rieur du compte dâautomatisation.
- Certificats : UtilisĂ©s pour stocker des certificats qui peuvent ĂȘtre utilisĂ©s dans les runbooks.
- Connexions : Utilisées pour stocker des informations de connexion à des services externes. Cela pourrait contenir des informations sensibles.
- AccĂšs rĂ©seau : Il peut ĂȘtre dĂ©fini comme public ou privĂ©.
Runbooks & Jobs
Un Runbook dans Azure Automation est un script qui exĂ©cute des tĂąches automatiquement dans votre environnement cloud. Les runbooks peuvent ĂȘtre Ă©crits en PowerShell, Python ou Ă©diteurs graphiques. Ils aident Ă automatiser des tĂąches administratives comme la gestion des VM, le patching ou les vĂ©rifications de conformitĂ©.
Dans le code situĂ© Ă lâintĂ©rieur des Runbooks pourrait contenir des informations sensibles (comme des identifiants).
Un Job est une instance dâexĂ©cution dâun Runbook. Lorsque vous exĂ©cutez un Runbook, un Job est créé pour suivre cette exĂ©cution. Chaque job comprend :
- Statut : En attente, En cours, TerminĂ©, ĂchouĂ©, Suspendu.
- Sortie : Le rĂ©sultat de lâexĂ©cution du Runbook.
- Heure de dĂ©but et de fin : Quand le job a commencĂ© et sâest terminĂ©.
Un job contient la sortie de lâexĂ©cution du Runbook. Si vous pouvez lire les jobs, faites-le car ils contiennent la sortie de lâexĂ©cution (potentiellement des informations sensibles).
Horaires & Webhooks
Il existe 3 principales façons dâexĂ©cuter un Runbook :
- Horaires : Ceux-ci sont utilisés pour déclencher des Runbooks à un moment spécifique ou à un intervalle.
- Webhooks : Ce sont des points de terminaison HTTP qui peuvent ĂȘtre utilisĂ©s pour dĂ©clencher des Runbooks Ă partir de services externes. Notez que lâURL du webhook nâest pas visible aprĂšs sa crĂ©ation.
- Déclenchement manuel : Vous pouvez déclencher manuellement un Runbook depuis le portail Azure et depuis la CLI.
ContrĂŽle de version
Il permet dâimporter des Runbooks depuis Github, Azure Devops (Git) et Azure Devops (TFVC). Il est possible dâindiquer de publier les Runbooks du dĂ©pĂŽt vers le compte dâautomatisation Azure et il est Ă©galement possible dâindiquer de synchroniser les modifications du dĂ©pĂŽt vers le compte dâautomatisation Azure.
Lorsque la synchronisation est activĂ©e, dans le dĂ©pĂŽt Github, un webhook est créé pour dĂ©clencher la synchronisation chaque fois quâun Ă©vĂ©nement de push se produit. Exemple dâune URL de webhook : https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d
Notez que ces webhooks ne seront pas visibles lors de la liste des webhooks dans les runbooks associĂ©s au dĂ©pĂŽt Github. Notez Ă©galement quâil est impossible de changer lâURL du dĂ©pĂŽt dâun contrĂŽle de version une fois quâil est créé.
Pour que le contrĂŽle de version configurĂ© fonctionne, le compte dâautomatisation Azure doit avoir une identitĂ© gĂ©rĂ©e (systĂšme ou utilisateur) avec le rĂŽle Contributor. De plus, pour attribuer une identitĂ© gĂ©rĂ©e utilisateur au compte dâautomatisation, il est nĂ©cessaire dâindiquer lâID client de lâID utilisateur MI dans la variable AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID.
Environnements dâexĂ©cution
Lors de la crĂ©ation dâun Runbook, il est possible de sĂ©lectionner lâenvironnement dâexĂ©cution. Par dĂ©faut, les environnements dâexĂ©cution suivants sont disponibles :
- Powershell 5.1
- Powershell 7.1
- PowerShell 7.2
- Python 3.10
- Python 3.8
- Python 2.7
Cependant, il est Ă©galement possible de crĂ©er vos propres environnements, en utilisant lâun de ceux-ci comme base. Dans le cas de Python, il est possible de tĂ©lĂ©charger des packages .whl dans lâenvironnement qui sera utilisĂ©. Dans le cas de PowerShell, il est possible de tĂ©lĂ©charger des packages .zip avec les modules Ă avoir dans lâexĂ©cution.
Groupes de travailleurs hybrides
Dans Azure Automation, lâenvironnement dâexĂ©cution par dĂ©faut pour les runbooks est le bac Ă sable Azure, une plateforme basĂ©e sur le cloud gĂ©rĂ©e par Azure, adaptĂ©e aux tĂąches impliquant des ressources Azure. Cependant, ce bac Ă sable a des limitations, telles quâun accĂšs restreint aux ressources sur site et des contraintes sur le temps dâexĂ©cution et lâutilisation des ressources. Pour surmonter ces limitations, des groupes de travailleurs hybrides sont employĂ©s. Un groupe de travailleurs hybrides se compose de un ou plusieurs travailleurs de Runbook hybrides installĂ©s sur vos propres machines, que ce soit sur site, dans dâautres environnements cloud ou des VM Azure. Cette configuration permet aux runbooks de sâexĂ©cuter directement sur ces machines, offrant un accĂšs direct aux ressources locales, la capacitĂ© dâexĂ©cuter des tĂąches plus longues et plus intensives en ressources, et la flexibilitĂ© dâinteragir avec des environnements au-delĂ de la portĂ©e immĂ©diate dâAzure.
Lorsquâun groupe de travailleurs hybrides est créé, il est nĂ©cessaire dâindiquer les identifiants Ă utiliser. Il y a 2 options :
- Identifiants par dĂ©faut : Vous nâavez pas besoin de fournir les identifiants et les runbooks seront exĂ©cutĂ©s Ă lâintĂ©rieur des VM en tant que SystĂšme.
- Identifiants spĂ©cifiques : Vous devez fournir le nom de lâobjet dâidentifiants Ă lâintĂ©rieur du compte dâautomatisation, qui sera utilisĂ© pour exĂ©cuter les runbooks Ă lâintĂ©rieur des VM. Par consĂ©quent, dans ce cas, il pourrait ĂȘtre possible de voler des identifiants valides pour les VM.
Par consĂ©quent, si vous pouvez choisir dâexĂ©cuter un Runbook dans un Travailleur Hybride, vous exĂ©cuterez des commandes arbitraires Ă lâintĂ©rieur dâune machine externe en tant que SystĂšme (technique de pivot intĂ©ressante).
De plus, si le travailleur hybride sâexĂ©cute dans Azure avec dâautres identitĂ©s gĂ©rĂ©es attachĂ©es, le runbook pourra accĂ©der Ă lâidentitĂ© gĂ©rĂ©e du runbook et Ă toutes les identitĂ©s gĂ©rĂ©es de la VM depuis le service de mĂ©tadonnĂ©es.
Tip
Nâoubliez pas que le service de mĂ©tadonnĂ©es a une URL diffĂ©rente (
http://169.254.169.254) que le service dâoĂč obtenir le jeton dâidentitĂ© gĂ©rĂ©e du compte dâautomatisation (IDENTITY_ENDPOINT).
Configuration dâĂ©tat (SC)
Warning
Comme indiquĂ© dans la documentation, la configuration dâĂ©tat Azure Automation sera retirĂ©e le 30 septembre 2027 et remplacĂ©e par Azure Machine Configuration.
Les comptes dâautomatisation prennent Ă©galement en charge la Configuration dâĂ©tat (SC), qui est une fonctionnalitĂ© qui aide Ă configurer et Ă maintenir lâĂ©tat de vos VM. Il est possible de crĂ©er et dâappliquer des configurations DSC Ă des machines Windows et Linux.
Du point de vue des attaquants, cela Ă©tait intĂ©ressant car cela permettait dâexĂ©cuter du code PS arbitraire dans toutes les VM configurĂ©es, permettant dâescalader les privilĂšges aux identitĂ©s gĂ©rĂ©es de ces VM, potentiellement en pivotant vers de nouveaux rĂ©seaux⊠De plus, les configurations pourraient contenir des informations sensibles.
ĂnumĂ©ration
# 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>
Escalade de privilĂšges & Post-exploitation
Az - Automation Accounts Privesc
Persistance
Az - Automation Accounts Persistence
Références
- 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
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

