Az - Konta Automatyzacji
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
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 ramach runbooka w koncie 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 ramach runbooka w koncie 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).
Zadanie to instancja wykonania Runbooka. Gdy uruchamiasz Runbook, tworzone jest Zadanie, aby śledzić to wykonanie. Każde zadanie zawiera:
- Status: W kolejce, W trakcie, Zakończone, Niepowodzenie, Wstrzymane.
- Wynik: Rezultat wykonania Runbooka.
- Czas rozpoczęcia i zakończenia: Kiedy zadanie się rozpoczęło i zakończyło.
Zadanie zawiera wynik wykonania Runbooka. Jeśli możesz czytać zadania, rób to, ponieważ zawierają wynik uruchomienia (potencjalnie wrażliwe informacje).
Harmonogramy i Webhooki
Istnieją 3 główne sposoby na wykonanie Runbooka:
- Harmonogramy: Służą do wyzwalania Runbooków w określonym czasie lub interwale.
- Webhooki: To punkty końcowe HTTP, które mogą być używane do wyzwalania Runbooków z zewnętrznych usług. Należy pamiętać, że adres URL webhooka jest niewidoczny po utworzeniu.
- Ręczne wyzwolenie: Możesz ręcznie wyzwolić Runbook z portalu Azure i z CLI.
Kontrola Źródła
Pozwala na importowanie Runbooków z Github, Azure Devops (Git) i Azure Devops (TFVC). Możliwe jest wskazanie, aby publikować Runbooki z repozytorium do konta automatyzacji Azure, a także możliwe jest wskazanie, aby synchronizować zmiany z repozytorium do konta automatyzacji Azure.
Gdy synchronizacja jest włączona, w repozytorium Github tworzony jest webhook do wyzwalania synchronizacji za każdym razem, gdy występuje zdarzenie push. Przykład adresu URL webhooka: https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d
Należy pamiętać, że te webhooki nie będą widoczne podczas wyświetlania webhooków w powiązanych runbookach z repozytorium Github. Należy również pamiętać, że nie ma możliwości zmiany adresu URL repozytorium kontroli źródła po jego utworzeniu.
Aby skonfigurowana kontrola źródła działała, Konto Automatyzacji Azure musi mieć zarządzaną tożsamość (systemową lub użytkownika) z rolą Contributor. Ponadto, aby przypisać zarządzaną tożsamość użytkownika do Konta Automatyzacji, należy wskazać identyfikator klienta zarządzanej tożsamości użytkownika w zmiennej AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID.
Środowiska Uruchomieniowe
Podczas tworzenia Runbooka można wybrać środowisko uruchomieniowe. Domyślnie dostępne są następujące środowiska uruchomieniowe:
- Powershell 5.1
- Powershell 7.1
- PowerShell 7.2
- Python 3.10
- Python 3.8
- Python 2.7
Jednak możliwe jest również utworzenie własnych środowisk, używając jednego z tych jako bazy. W przypadku Pythona możliwe jest przesyłanie pakietów .whl do środowiska, które będą używane. W przypadku PowerShell możliwe jest przesyłanie pakietów .zip z modułami, które mają być w runtime.
Grupy Pracowników Hybrydowych
W Azure Automation domyślnym środowiskiem wykonawczym dla runbooków jest Azure Sandbox, platforma w chmurze zarządzana przez Azure, odpowiednia do zadań związanych z zasobami Azure. Jednak to środowisko ma ograniczenia, takie jak ograniczony dostęp do zasobów lokalnych oraz ograniczenia dotyczące czasu wykonania i wykorzystania zasobów. Aby przezwyciężyć te ograniczenia, stosuje się Grupy Pracowników Hybrydowych. Grupa Pracowników Hybrydowych składa się z jednego lub więcej Hybrydowych Pracowników Runbooków zainstalowanych na Twoich własnych maszynach, czy to lokalnych, w innych środowiskach chmurowych, czy na VM Azure. Taka konfiguracja pozwala na wykonywanie runbooków bezpośrednio na tych maszynach, zapewniając bezpośredni dostęp do lokalnych zasobów, możliwość uruchamiania dłuższych i bardziej zasobożernych zadań oraz elastyczność w interakcji z środowiskami poza bezpośrednim zasięgiem Azure.
Gdy tworzona jest grupa pracowników hybrydowych, należy wskazać poświadczenia do użycia. Istnieją 2 opcje:
- Domyślne poświadczenia: Nie musisz podawać poświadczeń, a runbooki będą wykonywane wewnątrz VM jako System.
- Specyficzne poświadczenia: Musisz podać nazwę obiektu poświadczeń w ramach konta automatyzacji, które będzie używane do wykonywania runbooków wewnątrz VM. W związku z tym w tym przypadku możliwe jest kradzież ważnych poświadczeń dla VM.
Dlatego, jeśli możesz wybrać uruchomienie Runbooka w Hybrydowym Pracowniku, wykonasz dowolne polecenia wewnątrz zewnętrznej maszyny jako System (fajna technika pivotowania).
Ponadto, jeśli hybrydowy pracownik działa w Azure z innymi zarządzanymi tożsamościami, runbook będzie mógł uzyskać dostęp do zarządzanej tożsamości runbooka oraz wszystkich zarządzanych tożsamości VM z usługi metadanych.
Tip
Pamiętaj, że usługa metadanych ma inny adres URL (
http://169.254.169.254) niż usługa, z której uzyskuje się token zarządzanych tożsamości konta automatyzacji (IDENTITY_ENDPOINT).
Konfiguracja Stanu (SC)
Warning
Jak wskazano w dokumentacji, Konfiguracja Stanu Automatyzacji Azure zostanie wycofana 30 września 2027 roku i zastąpiona przez Konfigurację Maszyn Azure.
Konta Automatyzacji wspierają również Konfigurację Stanu (SC), która jest funkcją pomagającą w konfigurowaniu i utrzymywaniu stanu Twoich VM. Możliwe jest tworzenie i stosowanie konfiguracji DSC do maszyn Windows i Linux.
Z perspektywy atakującego to było interesujące, ponieważ pozwalało na wykonywanie dowolnego kodu PS we wszystkich skonfigurowanych VM, co pozwalało na eskalację uprawnień do zarządzanych tożsamości tych VM, potencjalnie pivotując do nowych sieci… Ponadto konfiguracje mogły zawierać wrażliwe informacje.
Enumeracja
# 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
az 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>
# Get hybrid worker groups for an automation account
az automation hrwg list --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME>
# Get hybrid worker group details
az automation hrwg show --automation-account-name <AUTOMATION-ACCOUNT> --resource-group <RG-NAME> --name <HYBRID-WORKER-GROUP>
# Get more details about a hybrid worker group (like VMs inside it)
az rest --method GET --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/hybridRunbookWorkerGroups/<hybrid-worker-group-name>/hybridRunbookWorkers?&api-version=2021-06-22"
# Check user right for automation
az extension add --upgrade -n automation
az automation account list # if it doesn't return anything the user is not a part of an Automation group
# Gets Azure Automation accounts in a resource group
Get-AzAutomationAccount
# List & get DSC configs
Get-AzAutomationAccount | Get-AzAutomationDscConfiguration
Get-AzAutomationAccount | Get-AzAutomationDscConfiguration | where {$_.name -match '<name>'} | Export-AzAutomationDscConfiguration -OutputFolder . -Debug
## Automation Accounts named SecurityBaselineConfigurationWS... are there by default (not interesting)
# List & get Run books code
Get-AzAutomationAccount | Get-AzAutomationRunbook
Get-AzAutomationAccount | Get-AzAutomationRunbook | Export-AzAutomationRunbook -OutputFolder /tmp
# List credentials & variables & others
Get-AzAutomationAccount | Get-AzAutomationCredential
Get-AzAutomationAccount | Get-AzAutomationVariable
Get-AzAutomationAccount | Get-AzAutomationConnection
Get-AzAutomationAccount | Get-AzAutomationCertificate
Get-AzAutomationAccount | Get-AzAutomationSchedule
Get-AzAutomationAccount | Get-AzAutomationModule
Get-AzAutomationAccount | Get-AzAutomationPython3Package
## Exfiltrate credentials & variables and the other info loading them in a Runbook and printing them
# List hybrid workers
Get-AzAutomationHybridWorkerGroup -AutomationAccountName <AUTOMATION-ACCOUNT> -ResourceGroupName <RG-NAME>
Eskalacja Uprawnień i Po Eksploatacji
Az - Automation Accounts Privesc
Utrzymywanie Dostępu
Az - Automation Accounts Persistence
Odnośniki
- https://learn.microsoft.com/en-us/azure/automation/overview
- https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview
- https://github.com/rootsecdev/Azure-Red-Team#runbook-automation
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

