Az - Automation Accounts
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Basic Information
Οι Azure Automation Accounts είναι υπηρεσίες cloud της Microsoft Azure που βοηθούν στην αυτοματοποίηση εργασιών όπως η διαχείριση πόρων, η διαμόρφωση και οι ενημερώσεις σε περιβάλλοντα Azure και τοπικά. Παρέχουν Runbooks (σενάρια για αυτοματοποίηση που εκτελούνται), προγράμματα και ομάδες υβριδικών εργαζομένων για την εκτέλεση αυτοματοποιημένων εργασιών, επιτρέποντας την υποδομή ως κώδικα (IaC) και την αυτοματοποίηση διαδικασιών για βελτιωμένη αποδοτικότητα και συνέπεια στη διαχείριση πόρων cloud.
Settings
- Credentials: Ο κωδικός πρόσβασης είναι προσβάσιμος μόνο μέσα σε ένα runbook εντός του λογαριασμού αυτοματοποίησης, χρησιμοποιούνται για να αποθηκεύουν ονόματα χρηστών και κωδικούς πρόσβασης με ασφάλεια.
- Variables: Χρησιμοποιούνται για να αποθηκεύουν δεδομένα διαμόρφωσης που μπορούν να χρησιμοποιηθούν σε runbooks. Αυτό θα μπορούσε επίσης να είναι ευαίσθητες πληροφορίες όπως κλειδιά API. Εάν η μεταβλητή είναι αποθηκευμένη κρυπτογραφημένα, είναι διαθέσιμη μόνο μέσα σε ένα runbook εντός του λογαριασμού αυτοματοποίησης.
- Certificates: Χρησιμοποιούνται για να αποθηκεύουν πιστοποιητικά που μπορούν να χρησιμοποιηθούν σε runbooks.
- Connections: Χρησιμοποιούνται για να αποθηκεύουν πληροφορίες σύνδεσης σε εξωτερικές υπηρεσίες. Αυτό θα μπορούσε να περιέχει ευαίσθητες πληροφορίες.
- Network Access: Μπορεί να ρυθμιστεί σε δημόσιο ή ιδιωτικό.
Runbooks & Jobs
Ένα Runbook στην Azure Automation είναι ένα σενάριο που εκτελεί εργασίες αυτόματα μέσα στο περιβάλλον cloud σας. Τα Runbooks μπορούν να γραφούν σε PowerShell, Python ή γραφικούς επεξεργαστές. Βοηθούν στην αυτοματοποίηση διοικητικών εργασιών όπως η διαχείριση VM, η εφαρμογή ενημερώσεων ή οι έλεγχοι συμμόρφωσης.
Στον κώδικα που βρίσκεται μέσα στα Runbooks μπορεί να περιέχονται ευαίσθητες πληροφορίες (όπως κωδικοί).
Μια εργασία είναι μια περίπτωση εκτέλεσης ενός Runbook. Όταν εκτελείτε ένα Runbook, δημιουργείται μια εργασία για να παρακολουθεί την εκτέλεση αυτή. Κάθε εργασία περιλαμβάνει:
- Status: Σε αναμονή, Εκτελείται, Ολοκληρώθηκε, Απέτυχε, Ανασταλεί.
- Output: Το αποτέλεσμα της εκτέλεσης του Runbook.
- Start and End Time: Πότε ξεκίνησε και ολοκληρώθηκε η εργασία.
Μια εργασία περιέχει την έξοδο της εκτέλεσης του Runbook. Εάν μπορείτε να διαβάσετε τις εργασίες, κάντε το καθώς περιέχουν την έξοδο της εκτέλεσης (πιθανές ευαίσθητες πληροφορίες).
Schedules & Webhooks
Υπάρχουν 3 κύριοι τρόποι για να εκτελέσετε ένα Runbook:
- Schedules: Αυτά χρησιμοποιούνται για να ενεργοποιούν Runbooks σε συγκεκριμένο χρόνο ή διάστημα.
- Webhooks: Αυτά είναι HTTP endpoints που μπορούν να χρησιμοποιηθούν για να ενεργοποιούν Runbooks από εξωτερικές υπηρεσίες. Σημειώστε ότι το URL του webhook δεν είναι ορατό μετά τη δημιουργία.
- Manual Trigger: Μπορείτε να ενεργοποιήσετε χειροκίνητα ένα Runbook από το Azure Portal και από το cli.
Source Control
Επιτρέπει την εισαγωγή Runbooks από Github, Azure Devops (Git) και Azure Devops (TFVC). Είναι δυνατή η ένδειξη για να δημοσιευτούν τα Runbooks του repo στον λογαριασμό Azure Automation και είναι επίσης δυνατή η ένδειξη για να συγχρονιστούν οι αλλαγές από το repo στον λογαριασμό Azure Automation.
Όταν η συγχρονισμός είναι ενεργοποιημένος, στο αποθετήριο Github δημιουργείται ένα webhook για να ενεργοποιεί τη συγχρονισμό κάθε φορά που συμβαίνει ένα γεγονός push. Παράδειγμα URL webhook: https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d
Σημειώστε ότι αυτά τα webhooks δεν θα είναι ορατά όταν καταχωρείτε webhooks στα συσχετιζόμενα runbooks με το repo Github. Επίσης, σημειώστε ότι δεν είναι δυνατή η αλλαγή του URL του repo ενός source control μόλις δημιουργηθεί.
Για να λειτουργήσει το ρυθμισμένο source control, ο Azure Automation Account πρέπει να έχει μια διαχειριζόμενη ταυτότητα (σύστημα ή χρήστη) με τον ρόλο Contributor. Επιπλέον, για να ανατεθεί μια διαχειριζόμενη ταυτότητα χρήστη στον λογαριασμό Automation, είναι απαραίτητο να δηλωθεί το client ID της διαχειριζόμενης ταυτότητας χρήστη στη μεταβλητή AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID.
Runtime Environments
Κατά τη δημιουργία ενός Runbook είναι δυνατή η επιλογή του περιβάλλοντος εκτέλεσης. Από προεπιλογή, τα εξής περιβάλλοντα εκτέλεσης είναι διαθέσιμα:
- Powershell 5.1
- Powershell 7.1
- PowerShell 7.2
- Python 3.10
- Python 3.8
- Python 2.7
Ωστόσο, είναι επίσης δυνατή η δημιουργία των δικών σας περιβαλλόντων, χρησιμοποιώντας ένα από αυτά ως βάση. Στην περίπτωση του python, είναι δυνατή η μεταφόρτωση πακέτων .whl στο περιβάλλον που θα χρησιμοποιηθεί. Στην περίπτωση του PowerShell, είναι δυνατή η μεταφόρτωση πακέτων .zip με τα modules που θα υπάρχουν στην εκτέλεση.
Hybrid Worker Groups
Στην Azure Automation, το προεπιλεγμένο περιβάλλον εκτέλεσης για τα runbooks είναι το Azure Sandbox, μια πλατφόρμα cloud που διαχειρίζεται η Azure, κατάλληλη για εργασίες που περιλαμβάνουν πόρους Azure. Ωστόσο, αυτό το sandbox έχει περιορισμούς, όπως περιορισμένη πρόσβαση σε τοπικούς πόρους και περιορισμούς στον χρόνο εκτέλεσης και τη χρήση πόρων. Για να ξεπεραστούν αυτοί οι περιορισμοί, χρησιμοποιούνται οι Υβριδικές Ομάδες Εργαζομένων. Μια Υβριδική Ομάδα Εργαζομένων αποτελείται από ένα ή περισσότερους Υβριδικούς Εργαζόμενους Runbook εγκατεστημένους στους δικούς σας υπολογιστές, είτε τοπικά, σε άλλα περιβάλλοντα cloud ή σε Azure VMs. Αυτή η ρύθμιση επιτρέπει στα runbooks να εκτελούνται απευθείας σε αυτούς τους υπολογιστές, παρέχοντας άμεση πρόσβαση σε τοπικούς πόρους, τη δυνατότητα εκτέλεσης μεγαλύτερων και πιο απαιτητικών εργασιών, και την ευελιξία να αλληλεπιδρούν με περιβάλλοντα πέρα από την άμεση εμβέλεια της Azure.
Όταν δημιουργείται μια υβριδική ομάδα εργαζομένων, είναι απαραίτητο να δηλωθούν τα credentials που θα χρησιμοποιηθούν. Υπάρχουν 2 επιλογές:
- Default credentials: Δεν χρειάζεται να παρέχετε τα credentials και τα runbooks θα εκτελούνται μέσα στα VMs ως System.
- Specific credentials: Πρέπει να παρέχετε το όνομα του αντικειμένου credentials μέσα στον λογαριασμό αυτοματοποίησης, το οποίο θα χρησιμοποιηθεί για την εκτέλεση των runbooks μέσα στα VMs. Επομένως, σε αυτή την περίπτωση, θα μπορούσε να είναι δυνατό να κλέψετε έγκυρα credentials για τα VMs.
Επομένως, εάν μπορείτε να επιλέξετε να εκτελέσετε ένα Runbook σε έναν Υβριδικό Εργαζόμενο, θα εκτελέσετε τυχαίες εντολές μέσα σε έναν εξωτερικό υπολογιστή ως System (καλή τεχνική pivot).
Επιπλέον, εάν ο υβριδικός εργαζόμενος εκτελείται στην Azure με άλλες διαχειριζόμενες ταυτότητες συνδεδεμένες, το runbook θα μπορεί να έχει πρόσβαση στη διαχειριζόμενη ταυτότητα του runbook και σε όλες τις διαχειριζόμενες ταυτότητες του VM από την υπηρεσία μεταδεδομένων.
Tip
Θυμηθείτε ότι η υπηρεσία μεταδεδομένων έχει διαφορετικό URL (
http://169.254.169.254) από την υπηρεσία από όπου αποκτάτε το token διαχειριζόμενης ταυτότητας του λογαριασμού αυτοματοποίησης (IDENTITY_ENDPOINT).
State Configuration (SC)
Warning
Όπως αναφέρεται στα έγγραφα, η Azure Automation State Configuration θα αποσυρθεί στις 30 Σεπτεμβρίου 2027 και θα αντικατασταθεί από Azure Machine Configuration.
Οι Automation Accounts υποστηρίζουν επίσης State Configuration (SC), η οποία είναι μια δυνατότητα που βοηθά στη διαμόρφωση και διατήρηση της κατάστασης των VMs σας. Είναι δυνατή η δημιουργία και εφαρμογή DSC διαμορφώσεων σε Windows και Linux μηχανές.
Από την οπτική γωνία των επιτιθέμενων, αυτό ήταν ενδιαφέρον γιατί επέτρεπε την εκτέλεση τυχαίου κώδικα PS σε όλα τα ρυθμισμένα VMs, επιτρέποντας την κλιμάκωση προνομίων στις διαχειριζόμενες ταυτότητες αυτών των VMs, πιθανώς μεταπηδώντας σε νέα δίκτυα… Επίσης, οι διαμορφώσεις θα μπορούσαν να περιέχουν ευαίσθητες πληροφορίες.
Enumeration
# 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>
Ανάβαση Προνομίων & Μετά την Εκμετάλλευση
Az - Automation Accounts Privesc
Επιμονή
Az - Automation Accounts Persistence
Αναφορές
- 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
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks Cloud

