Az - Automation Accounts

Reading time: 11 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

Basic Information

Azure Automation Accounts - це хмарні сервіси в Microsoft Azure, які допомагають автоматизувати завдання такі як управління ресурсами, конфігурація та оновлення в Azure та локальних середовищах. Вони надають Runbooks (скрипти для автоматизації, які виконуються), графіки та групи гібридних працівників для виконання автоматизаційних завдань, що дозволяє реалізувати інфраструктуру як код (IaC) та автоматизацію процесів для підвищення ефективності та узгодженості в управлінні хмарними ресурсами.

Settings

  • Credentials: Пароль доступний лише в рамках runbook всередині облікового запису автоматизації, вони використовуються для безпечного зберігання імен користувачів та паролів.
  • Variables: Використовуються для зберігання даних конфігурації, які можуть бути використані в runbooks. Це також може бути чутлива інформація, така як API ключі. Якщо змінна зберігається в зашифрованому вигляді, вона доступна лише в рамках runbook всередині облікового запису автоматизації.
  • Certificates: Використовуються для зберігання сертифікатів, які можуть бути використані в runbooks.
  • Connections: Використовуються для зберігання інформації про з'єднання з зовнішніми сервісами. Це може містити чутливу інформацію.
  • Network Access: Може бути встановлено на публічний або приватний.

Runbooks & Jobs

Runbook в Azure Automation - це скрипт, який автоматично виконує завдання у вашому хмарному середовищі. Runbooks можуть бути написані на PowerShell, Python або графічних редакторах. Вони допомагають автоматизувати адміністративні завдання, такі як управління ВМ, патчинг або перевірки відповідності.

У коді, розташованому всередині Runbooks, можуть міститися чутливі дані (такі як креденціали).

Job - це екземпляр виконання Runbook. Коли ви запускаєте Runbook, створюється Job для відстеження цього виконання. Кожен job включає:

  • Status: У черзі, Виконується, Завершено, Не вдалося, Призупинено.
  • Output: Результат виконання Runbook.
  • Start and End Time: Коли job почався і завершився.

Job містить вихідні дані виконання Runbook. Якщо ви можете читати jobs, робіть це, оскільки вони містять вихідні дані виконання (можливу чутливу інформацію).

Schedules & Webhooks

Існує 3 основні способи виконання Runbook:

  • Schedules: Використовуються для тригера Runbooks у визначений час або інтервал.
  • Webhooks: Це HTTP кінцеві точки, які можуть бути використані для тригера Runbooks з зовнішніх сервісів. Зверніть увагу, що URL вебхука не видимий після створення.
  • Manual Trigger: Ви можете вручну запустити Runbook з Azure Portal та з CLI.

Source Control

Це дозволяє імпортувати Runbooks з Github, Azure Devops (Git) та Azure Devops (TFVC). Можна вказати, щоб опублікувати Runbooks з репозиторію в обліковий запис автоматизації Azure, а також можна вказати, щоб синхронізувати зміни з репозиторію в обліковий запис автоматизації Azure.

Коли синхронізація увімкнена, у репозиторії Github створюється вебхук для тригера синхронізації щоразу, коли відбувається подія push. Приклад URL вебхука: https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d

Зверніть увагу, що ці вебхуки не будуть видимі при переліку вебхуків у відповідних runbooks до репозиторію Github. Також зверніть увагу, що не можна змінити URL репозиторію джерела контролю після його створення.

Для того, щоб налаштований контроль джерела працював, Azure Automation Account повинен мати керовану ідентичність (системну або користувацьку) з роллю Contributor. Більше того, щоб призначити користувацьку керовану ідентичність обліковому запису автоматизації, потрібно вказати ідентифікатор клієнта користувацької MI в змінній 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 з модулями, які потрібно мати в середовищі виконання.

Hybrid Worker Groups

В Azure Automation стандартним середовищем виконання для runbooks є Azure Sandbox, хмарна платформа, керована Azure, що підходить для завдань, пов'язаних з ресурсами Azure. Однак цей пісочниця має обмеження, такі як обмежений доступ до локальних ресурсів та обмеження на час виконання та використання ресурсів. Щоб подолати ці обмеження, використовуються Групи гібридних працівників. Група гібридних працівників складається з одного або кількох Гібридних працівників Runbook, встановлених на ваших власних машинах, будь то локально, в інших хмарних середовищах або ВМ Azure. Ця конфігурація дозволяє runbooks виконуватися безпосередньо на цих машинах, надаючи прямий доступ до локальних ресурсів, можливість виконувати триваліші та більш ресурсомісткі завдання, а також гнучкість для взаємодії з середовищами, які виходять за межі безпосереднього доступу Azure.

Коли створюється група гібридних працівників, потрібно вказати креденціали для використання. Є 2 варіанти:

  • Default credentials: Вам не потрібно надавати креденціали, і runbooks будуть виконуватися всередині ВМ як System.
  • Specific credentials: Вам потрібно вказати ім'я об'єкта креденціалів всередині облікового запису автоматизації, який буде використовуватися для виконання runbooks всередині ВМ. Тому в цьому випадку може бути можливим викрасти дійсні креденціали для ВМ.

Отже, якщо ви можете вибрати виконання Runbook в Hybrid Worker, ви будете виконувати произвольні команди всередині зовнішньої машини як System (гарна техніка повороту).

Більше того, якщо гібридний працівник працює в Azure з іншими прикріпленими керованими ідентичностями, runbook зможе отримати доступ до керованої ідентичності runbook та всіх керованих ідентичностей ВМ з метаданих сервісу.

tip

Пам'ятайте, що сервіс метаданих має інший URL (http://169.254.169.254), ніж сервіс, з якого отримують токен керованих ідентичностей облікового запису автоматизації (IDENTITY_ENDPOINT).

State Configuration (SC)

warning

Як зазначено в документації, Azure Automation State Configuration буде виведено з експлуатації 30 вересня 2027 року і замінено на Azure Machine Configuration.

Облікові записи автоматизації також підтримують State Configuration (SC), що є функцією, яка допомагає конфігурувати та підтримувати стан ваших ВМ. Можливо створити та застосувати конфігурації DSC до Windows та Linux машин.

З точки зору атакуючого це було цікаво, оскільки це дозволяло виконувати произвольний PS код у всіх налаштованих ВМ, що дозволяло підвищувати привілеї до керованих ідентичностей цих ВМ, потенційно переходячи до нових мереж... Також конфігурації могли містити чутливу інформацію.

Enumeration

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

Посилання

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks