Az - App Services

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

App Service Temel Bilgileri

Azure App Services, geliştiricilerin web uygulamaları, mobil uygulama arka uçları ve API’leri sorunsuz bir şekilde oluşturmasını, dağıtmasını ve ölçeklendirmesini sağlar. Birden fazla programlama dilini destekler ve geliştirilmiş işlevsellik ve yönetim için çeşitli Azure araçları ve hizmetleri ile entegre olur.

Her uygulama bir kumanda alanında çalışır, ancak izolasyon App Service planlarına bağlıdır:

  • Ücretsiz ve Paylaşılan katmanlardaki uygulamalar paylaşılan VM’lerde çalışır.
  • Standart ve Premium katmanlardaki uygulamalar, yalnızca aynı App Service planındaki uygulamalar tarafından paylaşılan özel VM’lerde çalışır.
  • İzole katmanlar, uygulamaların izolasyonunu artırarak özel sanal ağlarda özel VM’lerde çalışır.

Warning

Bu izolasyonların hiçbiri diğer yaygın web güvenlik açıklarını (örneğin dosya yükleme veya enjeksiyonlar) önlemez. Ve bir yönetim kimliği kullanılıyorsa, bu kimlik yetkileri artırabilir.

Uygulamaların bazı ilginç yapılandırmaları vardır:

  • Her Zaman Açık: Uygulamanın her zaman çalışmasını sağlar. Eğer etkinleştirilmezse, uygulama 20 dakika boyunca etkinlik olmadığında duracak ve bir istek alındığında tekrar başlayacaktır.
  • Eğer sürekli çalışması gereken bir webjob’unuz varsa bu önemlidir, çünkü uygulama durursa webjob da duracaktır.
  • SSH: Etkinleştirildiğinde, yeterli izinlere sahip bir kullanıcı uygulamaya SSH ile bağlanabilir.
  • Hata Ayıklama: Etkinleştirildiğinde, yeterli izinlere sahip bir kullanıcı uygulamayı hata ayıklayabilir. Ancak, bu her 48 saatte bir otomatik olarak devre dışı bırakılır.
  • Web Uygulaması + Veritabanı: Web konsolu, bir veritabanı ile bir Uygulama oluşturmayı sağlar. Bu durumda kullanılacak veritabanını (SQLAzure, PostgreSQL, MySQL, MongoDB) seçmek mümkündür ve ayrıca bir Azure Cache for Redis oluşturmanıza da izin verir.
  • Veritabanı ve Redis için kimlik bilgilerini içeren URL, appsettings içinde saklanacaktır.
  • Konteyner: Konteynerin URL’sini ve erişim kimlik bilgilerini belirterek App Service’e bir konteyner dağıtmak mümkündür.
  • Mounts: Azure Blob (Salt Okunur) veya Azure Files olan Depolama hesaplarından 5 mount oluşturmak mümkündür. Yapılandırma, Depolama Hesabı üzerindeki erişim anahtarını saklayacaktır.
  • : Genel olarak erişilebilir veya yalnızca bir VNet’ten özel uç noktalarla erişilebilir olabilir.

Temel Kimlik Doğrulama

Bir web uygulaması (ve genellikle bir Azure işlevi) oluştururken, Temel Kimlik Doğrulama’nın etkinleştirilip etkinleştirilmeyeceğini belirtmek mümkündür (varsayılan olarak devre dışı). Bu, uygulama için SCM (Kaynak Kontrol Yöneticisi) ve FTP (Dosya Transfer Protokolü)’nü etkinleştirir, böylece bu teknolojileri kullanarak uygulamayı dağıtmak mümkün olacaktır.

SCM ve FTP sunucularına erişmek için bir kullanıcı adı ve şifre gereklidir. Bu nedenle, Azure bu platformlara ve kimlik bilgilerine erişmek için bazı API’ler sağlar.

FTP sunucusu özel bir sihir içermez, geçerli URL, kullanıcı adı ve şifre ile bağlanmak ve Uygulama ortamında okuma ve yazma izinleri almak mümkündür.

SCM SCM’ye bir web tarayıcısı kullanarak https://<SMC-URL>/BasicAuth adresinden bağlanabilir ve oradaki tüm dosyaları ve dağıtımları kontrol edebilirsiniz.

Kudu

Kudu, hem SCM’yi hem de bir web ve API arayüzünü yöneten platformdur ve Git tabanlı dağıtımlar, uzaktan hata ayıklama ve dosya yönetimi yetenekleri sağlar. Web uygulamasında tanımlanan SCM URL’si üzerinden erişilebilir.

Kudu’nun App Services ve Function Apps tarafından kullanılan sürümlerinin farklı olduğunu, Function uygulamalarının sürümünün çok daha sınırlı olduğunu unutmayın.

Kudu’da bulabileceğiniz bazı ilginç uç noktalar:

  • /BasicAuth: Kudu’ya giriş yapmak için bu yolu erişmeniz gerekir.
  • /DebugConsole: Kudu’nun çalıştığı ortamda komutları çalıştırmanıza olanak tanıyan bir konsol.
  • Bu ortamın token almak için meta veri hizmetine erişimi yoktur.
  • /webssh/host: Uygulamanın çalıştığı konteynere bağlanmanıza olanak tanıyan web tabanlı bir SSH istemcisi.
  • Bu ortam, atanan yönetilen kimliklerden token almak için meta veri hizmetine erişime sahiptir.
  • /Env: Sistem, uygulama ayarları, çevre değişkenleri, bağlantı dizeleri ve HTTP başlıkları hakkında bilgi alır.
  • /wwwroot/: Web uygulamasının kök dizini. Buradan tüm dosyaları indirebilirsiniz.

Ayrıca, Kudu daha önce https://github.com/projectkudu/kudu adresinde açık kaynaklıydı, ancak proje kullanımdan kaldırıldı ve Azure’daki mevcut Kudu’nun eski ile karşılaştırıldığında birçok şeyin değiştiği görülebilir.

Kaynaklar

App Services, varsayılan olarak kodu bir zip dosyası olarak yüklemeye izin verir, ancak ayrıca bir üçüncü taraf hizmetine bağlanarak kodu oradan almayı da sağlar.

  • Şu anda desteklenen üçüncü taraf kaynaklar Github ve Bitbucket’dır.
  • Kimlik doğrulama tokenlerini almak için az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" komutunu çalıştırabilirsiniz.
  • Azure varsayılan olarak, kod güncellendiğinde her seferinde App Service’e dağıtmak için bir Github Action ayarlayacaktır.
  • Ayrıca, oradan kod almak için bir uzaktan git deposu (kullanıcı adı ve şifre ile) belirtmek de mümkündür.
  • Uzaktan depo için kimlik bilgilerini almak için az webapp deployment source show --name <app-name> --resource-group <res-group> veya az rest --method POST --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com" komutunu çalıştırabilirsiniz.
  • Ayrıca, bir Azure Repository kullanmak da mümkündür.
  • Bir yerel git deposu yapılandırmak da mümkündür.
  • Git deposunun URL’sini az webapp deployment source show --name <app-name> --resource-group <res-group> komutunu çalıştırarak alabilirsiniz ve bu, uygulamanın SCM URL’si olacaktır.
  • Klonlamak için az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name> komutuyla alabileceğiniz SCM kimlik bilgilerine ihtiyacınız olacaktır.

Webjobs

Azure WebJobs, Azure App Service ortamında çalışan arka plan görevleridir. Geliştiricilerin, web uygulamalarıyla birlikte betikler veya programlar çalıştırmasına olanak tanır ve dosya işleme, veri işleme veya planlı görevler gibi zaman alıcı veya asenkron işlemleri daha kolay yönetmelerini sağlar. İki tür web job vardır:

  • Sürekli: Sonsuz bir döngüde çalışır ve oluşturulur oluşturulmaz tetiklenir. Sürekli işleme gerektiren görevler için idealdir. Ancak, uygulama çalışmayı durdurursa ve son 20 dakikada bir istek almazsa, web job da duracaktır.
  • Tetiklenmiş: Talep üzerine veya bir programa göre çalışır. Periyodik görevler, örneğin toplu veri güncellemeleri veya bakım rutinleri için en uygun olanıdır.

Webjobs, ortamda kod çalıştırmak ve ekli yönetilen kimliklere yetki artırmak için kullanılabileceğinden, saldırganlar açısından oldukça ilginçtir.

Ayrıca, Webjobs tarafından üretilen logları kontrol etmek her zaman ilginçtir, çünkü bu loglar hassas bilgiler içerebilir.

Slots

Azure App Service Slots, uygulamanın farklı sürümlerini aynı App Service’e dağıtmak için kullanılır. Bu, geliştiricilerin yeni özellikleri veya değişiklikleri üretim ortamına dağıtmadan önce ayrı bir ortamda test etmelerini sağlar.

Ayrıca, belirli bir slota trafik yüzdesi yönlendirmek mümkündür, bu da A/B testleri ve arka kapı amaçları için faydalıdır.

Azure Function Apps

Temelde Azure Function uygulamaları, Azure App Service’in bir alt kümesidir ve web konsolunda, web konsoluna gidip tüm uygulama hizmetlerini listelediğinizde veya az cli’de az webapp list komutunu çalıştırdığınızda Function uygulamalarının da orada listelendiğini göreceksiniz.

Bu nedenle, her iki hizmet de aslında çoğunlukla aynı yapılandırmalara, özelliklere ve az cli’deki seçeneklere sahiptir, ancak bunları biraz farklı yapılandırabilirler (örneğin appsettings’in varsayılan değerleri veya Function uygulamalarında bir Depolama Hesabı kullanımı).

Enumeration

# List webapps
az webapp list
## Less information
az webapp list --query "[].{hostName: defaultHostName, state: state, name: name, resourcegroup: resourceGroup}" -o table
## Get SCM URL of each webapp
az webapp list | grep '"name"' | grep "\.scm\." | awk '{print $2}' | sed 's/"//g'

# Get info about 1 app
az webapp show --name <name> --resource-group <res-group>

# Get instances of a webapp
az webapp list-instances --name <name> --resource-group <res-group>
## If you have enough perm you can go to the "consoleUrl" and access a shell inside the instance form the web

# Get access restrictions of an app
az webapp config access-restriction show --name <name> --resource-group <res-group>

# Remove access restrictions
az webapp config access-restriction remove --resource-group <res-group> -n <name> --rule-name <rule-name>

# Get connection strings of a webapp
az webapp config connection-string list --name <name> --resource-group <res-group>

# Get appsettings of an app
az webapp config appsettings list --name <name> --resource-group <res-group>

# Get SCM and FTP credentials
az webapp deployment list-publishing-profiles --name <name> --resource-group <res-group>

# Get configured Auth information
az webapp auth show --name <app-name> --resource-group <res-group>

# Get backups of a webapp
az webapp config backup list --webapp-name <name> --resource-group <res-group>

# Get backups scheduled for a webapp
az webapp config backup show --webapp-name <name> --resource-group <res-group>

# Get snapshots
az webapp config snapshot list --resource-group <res-group> -n <name>

# Restore snapshot
az webapp config snapshot restore -g <res-group> -n <name> --time 2018-12-11T23:34:16.8388367

# Get slots
az webapp deployment slot list --name <AppName> --resource-group <ResourceGroupName> --output table
az webapp show --slot <SlotName> --name <AppName> --resource-group <ResourceGroupName>

# Get traffic-routing
az webapp traffic-routing show --name <AppName> --resource-group <ResourceGroupName>

# Get used container by the app
az webapp config container show --name <name> --resource-group <res-group>

# Get storage account configurations of a webapp (contains access key)
az webapp config storage-account list --name <name> --resource-group <res-group>

# Get configured container (if any) in the webapp, it could contain credentials
az webapp config container show --name <name> --resource-group <res-group>

# Get git URL to access the code
az webapp deployment source config-local-git --resource-group <res-group> -n <name>

# Get Webjobs
az webapp webjob continuous list --resource-group <res-group> --name <app-name>
az webapp webjob triggered list --resource-group <res-group> --name <app-name>

# Read webjobs logs with Azure permissions
az rest --method GET --url "<SCM-URL>/vfs/data/jobs/<continuous | triggered>/rev5/job_log.txt"  --resource "https://management.azure.com/"
az rest --method GET --url "https://lol-b5fyaeceh4e9dce0.scm.canadacentral-01.azurewebsites.net/vfs/data/jobs/continuous/rev5/job_log.txt"  --resource "https://management.azure.com/"

# Read webjobs logs with SCM credentials
curl "https://windowsapptesting-ckbrg3f0hyc8fkgp.scm.canadacentral-01.azurewebsites.net/vfs/data/jobs/continuous/lala/job_log.txt" \
--user '<username>:<password>' -v

# Get connections of a webapp
az webapp conection list --name <name> --resource-group <res-group>

# Get hybrid-connections of a webapp
az webapp hybrid-connections list --name <name> --resource-group <res-group>

# Get configured SMC users by your account
az webapp deployment user show
## If any user is created, the username should appear in the "publishingUserName" field

Az - App Services Privesc

Web Uygulamaları Oluşturma Örnekleri

Yerel Python

Bu eğitim, https://learn.microsoft.com/en-us/azure/app-service/quickstart-python adresindeki eğitimden alınmıştır.

# Clone repository
git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart
cd msdocs-python-flask-webapp-quickstart

# Create webapp from this code
az webapp up --runtime PYTHON:3.9 --sku B1 --logs

SCM portalına giriş yaparak veya FTP üzerinden bağlanarak /wwwroot dizininde web uygulamasının kodunu içeren output.tar.gz adlı sıkıştırılmış dosyayı görebilirsiniz.

Tip

Sadece FTP üzerinden bağlanmak ve output.tar.gz dosyasını değiştirmek, web uygulaması tarafından yürütülen kodu değiştirmek için yeterli değildir.

Bir saldırgan bu dosyayı indirebilir, değiştirebilir ve web uygulamasında rastgele kod yürütmek için tekrar yükleyebilir.

Github’dan Python

Bu eğitim, önceki eğitime dayanmaktadır ancak bir Github deposu kullanmaktadır.

  1. Github hesabınızda msdocs-python-flask-webapp-quickstart deposunu fork edin.
  2. Azure’da yeni bir Python Web Uygulaması oluşturun.
  3. Deployment Center’da kaynağı değiştirin, Github ile giriş yapın, fork edilmiş depoyu seçin ve Save butonuna tıklayın.

Önceki durumda olduğu gibi, SCM portalına giriş yaparak veya FTP üzerinden bağlanarak /wwwroot dizininde web uygulamasının kodunu içeren output.tar.gz adlı sıkıştırılmış dosyayı görebilirsiniz.

Tip

Sadece FTP üzerinden bağlanmak ve output.tar.gz dosyasını değiştirmek ve bir dağıtımı yeniden tetiklemek, web uygulaması tarafından yürütülen kodu değiştirmek için yeterli değildir.

Yetki Yükseltme

Az - App Services Privesc

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