Az - Automation Accounts

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Temel Bilgiler

Azure Automation Hesapları, Microsoft Azure’da kaynak yönetimi, yapılandırma ve güncellemeler gibi görevleri otomatikleştirmeye yardımcı olan bulut tabanlı hizmetlerdir. Runbook’lar (çalıştırılan otomasyon için betikler), takvimler ve otomasyon işlerini çalıştırmak için hibrit işçi grupları sağlar, bu da kod olarak altyapı (IaC) ve süreç otomasyonu ile bulut kaynaklarını yönetmede verimlilik ve tutarlılığı artırır.

Ayarlar

  • Kimlik Bilgileri: Şifre, otomasyon hesabındaki bir runbook içinde yalnızca erişilebilir, kullanıcı adlarını ve şifreleri güvenli bir şekilde saklamak için kullanılır.
  • Değişkenler: Runbook’larda kullanılabilecek yapılandırma verilerini saklamak için kullanılır. Bu, API anahtarları gibi hassas bilgiler de olabilir. Değişken şifreli olarak saklanıyorsa, yalnızca otomasyon hesabındaki bir runbook içinde erişilebilir.
  • Sertifikalar: Runbook’larda kullanılabilecek sertifikaları saklamak için kullanılır.
  • Bağlantılar: Harici hizmetlere ait bağlantı bilgilerini saklamak için kullanılır. Bu, hassas bilgiler içerebilir.
  • Ağ Erişimi: Herkese açık veya özel olarak ayarlanabilir.

Runbook’lar & İşler

Azure Automation’daki bir Runbook, bulut ortamınızda görevleri otomatik olarak yerine getiren bir betiktir. Runbook’lar PowerShell, Python veya Grafik editörlerde yazılabilir. VM yönetimi, yamanlama veya uyumluluk kontrolleri gibi idari görevleri otomatikleştirmeye yardımcı olurlar.

Runbook’lar içindeki kod, hassas bilgileri içerebilir (örneğin kimlik bilgileri).

Bir İş, bir Runbook yürütme örneğidir. Bir Runbook çalıştırdığınızda, o yürütmeyi izlemek için bir İş oluşturulur. Her iş şunları içerir:

  • Durum: Kuyrukta, Çalışıyor, Tamamlandı, Başarısız, Askıya Alındı.
  • Çıktı: Runbook yürütmesinin sonucu.
  • Başlangıç ve Bitiş Zamanı: İşin ne zaman başladığı ve tamamlandığı.

Bir iş, Runbook yürütmesinin çıktısını içerir. İşleri okuyabiliyorsanız, bunu yapın çünkü çıkta çalışmanın çıktısını içerir (potansiyel hassas bilgi).

Takvimler & Webhook’lar

Bir Runbook’u çalıştırmanın 3 ana yolu vardır:

  • Takvimler: Bunlar, Runbook’ları belirli bir zamanda veya aralıkta tetiklemek için kullanılır.
  • Webhook’lar: Bunlar, harici hizmetlerden Runbook’ları tetiklemek için kullanılabilecek HTTP uç noktalarıdır. Webhook URL’sinin oluşturulduktan sonra görünür olmadığını unutmayın.
  • Manuel Tetikleme: Azure Portal’dan ve cli’dan bir Runbook’u manuel olarak tetikleyebilirsiniz.

Kaynak Kontrolü

Runbook’ları Github, Azure Devops (Git) ve Azure Devops (TFVC)’den içe aktarmayı sağlar. Repo’daki Runbook’ları Azure Automation hesabına yayınlamak için belirtmek mümkündür ve ayrıca repo’daki değişiklikleri Azure Automation hesabına senkronize etmek için belirtmek de mümkündür.

Senkronizasyon etkinleştirildiğinde, Github deposunda bir webhook oluşturulur ve her push olayı gerçekleştiğinde senkronizasyonu tetikler. Bir webhook URL’sinin örneği: https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d

Bu webhook’ların, Github deposuna bağlı runbook’larda listelenirken görünmeyeceğini unutmayın. Ayrıca, bir kaynak kontrolü oluşturulduktan sonra repo URL’sinin değiştirilemeyeceğini unutmayın.

Yapılandırılan kaynak kontrolünün çalışabilmesi için, Azure Automation Hesabı’nın Katkıda Bulunan rolüne sahip bir yönetilen kimliğe (sistem veya kullanıcı) sahip olması gerekir. Ayrıca, Kullanıcı Yönetilen Kimliğini Automation Hesabına atamak için, AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID değişkeninde kullanıcı MI’nin istemci kimliğini belirtmek gerekir.

Çalışma Ortamları

Bir Runbook oluştururken çalışma ortamını seçmek mümkündür. Varsayılan olarak, aşağıdaki çalışma ortamları mevcuttur:

  • Powershell 5.1
  • Powershell 7.1
  • PowerShell 7.2
  • Python 3.10
  • Python 3.8
  • Python 2.7

Ancak, bunlardan birini temel alarak kendi ortamlarınızı oluşturmak da mümkündür. Python durumunda, kullanılacak ortama .whl paketleri yüklemek mümkündür. PowerShell durumunda, çalışma zamanında sahip olunacak modüllerle birlikte .zip paketleri yüklemek mümkündür.

Hibrit İşçi Grupları

Azure Automation’da, runbook’lar için varsayılan yürütme ortamı Azure Sandbox’dır, bu Azure tarafından yönetilen bulut tabanlı bir platformdur ve Azure kaynaklarıyla ilgili görevler için uygundur. Ancak, bu sandbox’ın, yerel kaynaklara erişim kısıtlamaları ve yürütme süresi ile kaynak kullanımı üzerinde kısıtlamalar gibi sınırlamaları vardır. Bu sınırlamaları aşmak için Hibrit İşçi Grupları kullanılır. Bir Hibrit İşçi Grubu, kendi makinelerinizde kurulu bir veya daha fazla Hibrit Runbook İşçisi içerir; bu makineler yerel, diğer bulut ortamlarında veya Azure VM’lerinde olabilir. Bu yapı, runbook’ların doğrudan bu makinelerde yürütülmesine olanak tanır, yerel kaynaklara doğrudan erişim sağlar, daha uzun ve daha kaynak yoğun görevleri çalıştırma yeteneği sunar ve Azure’un hemen erişim alanının ötesindeki ortamlarla etkileşimde bulunma esnekliği sağlar.

Bir hibrit işçi grubu oluşturulduğunda, kullanılacak kimlik bilgilerini belirtmek gerekir. İki seçenek vardır:

  • Varsayılan kimlik bilgileri: Kimlik bilgilerini sağlamanıza gerek yoktur ve runbook’lar Sistem olarak VM’ler içinde yürütülecektir.
  • Belirli kimlik bilgileri: Otomasyon hesabındaki kimlik bilgileri nesnesinin adını sağlamanız gerekir; bu, VM’ler içindeki runbook’ları yürütmek için kullanılacaktır. Bu nedenle, bu durumda VM’ler için geçerli kimlik bilgilerini çalmak mümkün olabilir.

Bu nedenle, bir Runbook’u bir Hibrit İşçi’de çalıştırmayı seçerseniz, Sistem olarak bir dış makinede rastgele komutlar çalıştıracaksınız (güzel bir pivot tekniği).

Ayrıca, hibrit işçi Azure’da diğer Yönetilen Kimliklerle çalışıyorsa, runbook, runbook’un yönetilen kimliğine ve VM’nin metadata hizmetinden tüm yönetilen kimliklerine erişebilecektir.

Tip

Metadata hizmetinin, otomasyon hesabının yönetilen kimlikleri token’ını almak için kullanılan hizmetten (IDENTITY_ENDPOINT) farklı bir URL’si olduğunu unutmayın (http://169.254.169.254).

Durum Yapılandırması (SC)

Warning

Belgelerde belirtildiği gibi, Azure Automation Durum Yapılandırması 30 Eylül 2027’de emekliye ayrılacak ve Azure Makine Yapılandırması ile değiştirilecektir.

Otomasyon Hesapları ayrıca Durum Yapılandırması (SC)’yı destekler; bu, VM’lerinizin durumunu yapılandırmaya ve korumaya yardımcı olan bir özelliktir. Windows ve Linux makinelerine DSC yapılandırmaları oluşturmak ve uygulamak mümkündür.

Saldırganlar açısından bu, tüm yapılandırılmış VM’lerde rastgele PS kodu çalıştırma olanağı sağladığı için ilginçti; bu da bu VM’lerin yönetilen kimliklerine ayrıcalıkları yükseltme olanağı sunuyordu, potansiyel olarak yeni ağlara geçiş yapma… Ayrıca, yapılandırmalar hassas bilgiler içerebilir.

Sayım

# 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>

Yetki Yükseltme & Sonrası İstismar

Az - Automation Accounts Privesc

Süreklilik

Az - Automation Accounts Persistence

Referanslar

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin