Az - App Services
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 o usłudze App Service
Azure App Services umożliwia deweloperom tworzenie, wdrażanie i skalowanie aplikacji internetowych, zaplecza aplikacji mobilnych i interfejsów API w sposób bezproblemowy. Obsługuje wiele języków programowania i integruje się z różnymi narzędziami i usługami Azure w celu zwiększenia funkcjonalności i zarządzania.
Każda aplikacja działa w piaskownicy, ale izolacja zależy od planów App Service:
- Aplikacje w darmowych i współdzielonych warstwach działają na współdzielonych VM
- Aplikacje w standardowych i premium warstwach działają na dedykowanych VM współdzielonych tylko przez aplikacje w tym samym planie App Service.
- Warstwy izolowane działają na dedykowanych VM w dedykowanych sieciach wirtualnych, co poprawia izolację aplikacji.
Warning
Należy pamiętać, że żadna z tych izolacji nie zapobiega innym powszechnym wrażliwościom internetowym (takim jak przesyłanie plików czy wstrzyknięcia). A jeśli używana jest tożsamość zarządzania, może ona eskalować uprawnienia do nich.
Aplikacje mają kilka interesujących konfiguracji:
- Always On: Zapewnia, że aplikacja zawsze działa. Jeśli nie jest włączona, aplikacja przestanie działać po 20 minutach bezczynności i uruchomi się ponownie, gdy zostanie odebrane żądanie.
- Jest to istotne, jeśli masz webjob, który musi działać nieprzerwanie, ponieważ webjob zatrzyma się, jeśli aplikacja przestanie działać.
- SSH: Jeśli włączone, użytkownik z wystarczającymi uprawnieniami może połączyć się z aplikacją za pomocą SSH.
- Debugowanie: Jeśli włączone, użytkownik z wystarczającymi uprawnieniami może debugować aplikację. Jednak jest to automatycznie wyłączane co 48 godzin.
- Aplikacja internetowa + Baza danych: Konsola internetowa umożliwia utworzenie aplikacji z bazą danych. W tym przypadku można wybrać bazę danych do użycia (SQLAzure, PostgreSQL, MySQL, MongoDB) i umożliwia również utworzenie Azure Cache dla Redis.
- URL zawierający dane uwierzytelniające do bazy danych i Redis będzie przechowywany w appsettings.
- Kontener: Możliwe jest wdrożenie kontenera do App Service, wskazując URL kontenera i dane uwierzytelniające do jego dostępu.
- Montowanie: Możliwe jest utworzenie 5 montażów z kont Storage, które mogą być Azure Blob (tylko do odczytu) lub Azure Files. Konfiguracja przechowa klucz dostępu w koncie Storage.
- Sieciowanie: Może być publicznie dostępne lub dostępne tylko przez prywatne punkty końcowe z VNet.
Podstawowa autoryzacja
Podczas tworzenia aplikacji internetowej (a zazwyczaj funkcji Azure) można wskazać, czy chcesz, aby podstawowa autoryzacja była włączona (domyślnie wyłączona). To zasadniczo włącza SCM (Source Control Manager) i FTP (File Transfer Protocol) dla aplikacji, dzięki czemu będzie możliwe wdrożenie aplikacji przy użyciu tych technologii.
Aby uzyskać dostęp do serwerów SCM i FTP, wymagane są nazwa użytkownika i hasło. Dlatego Azure udostępnia kilka API do uzyskania URL do tych platform i danych uwierzytelniających.
Serwer FTP nie ma żadnej specjalnej magii, wystarczy ważny URL, nazwa użytkownika i hasło, aby połączyć się i uzyskać uprawnienia do odczytu i zapisu w środowisku aplikacji.
SCM
Możliwe jest połączenie się z SCM za pomocą przeglądarki internetowej pod adresem https://<SMC-URL>/BasicAuth i sprawdzenie wszystkich plików i wdrożeń tam.
Kudu
Kudu to platforma, która zarządza zarówno SCM, jak i interfejsem internetowym i API do zarządzania App Service, oraz zapewnia wdrożenia oparte na Gicie, zdalne debugowanie i możliwości zarządzania plikami. Jest dostępna przez URL SCM zdefiniowany w aplikacji internetowej.
Należy pamiętać, że wersje Kudu używane przez App Services i przez Function Apps są różne, przy czym wersja aplikacji funkcji jest znacznie bardziej ograniczona.
Niektóre interesujące punkty końcowe, które można znaleźć w Kudu, to:
/BasicAuth: Musisz uzyskać dostęp do tej ścieżki, aby zalogować się do Kudu./DebugConsole: Konsola, która pozwala na wykonywanie poleceń w środowisku, w którym działa Kudu.- Należy pamiętać, że to środowisko nie ma dostępu do usługi metadanych w celu uzyskania tokenów.
/webssh/host: Klient SSH oparty na sieci, który pozwala na połączenie się wewnątrz kontenera, w którym działa aplikacja.- To środowisko ma dostęp do usługi metadanych w celu uzyskania tokenów z przypisanych tożsamości zarządzanych.
/Env: Uzyskaj informacje o systemie, ustawieniach aplikacji, zmiennych środowiskowych, ciągach połączeń i nagłówkach HTTP./wwwroot/: Katalog główny aplikacji internetowej. Możesz pobrać wszystkie pliki stąd.
Ponadto, Kudu był kiedyś otwartym źródłem w https://github.com/projectkudu/kudu, ale projekt został wycofany, a porównując zachowanie obecnego Kudu w Azure z jego starszą wersją, można zauważyć, że wiele rzeczy już się zmieniło.
Źródła
App Services domyślnie pozwala na przesyłanie kodu jako pliku zip, ale również umożliwia połączenie z usługą zewnętrzną i pobranie kodu stamtąd.
- Obecnie obsługiwane źródła zewnętrzne to Github i Bitbucket.
- Możesz uzyskać tokeny uwierzytelniające, uruchamiając
az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" - Azure domyślnie skonfiguruje Github Action, aby wdrożyć kod do App Service za każdym razem, gdy kod zostanie zaktualizowany.
- Możliwe jest również wskazanie zdalnego repozytorium git (z nazwą użytkownika i hasłem), aby pobrać kod stamtąd.
- Możesz uzyskać dane uwierzytelniające do zdalnego repozytorium, uruchamiając
az webapp deployment source show --name <app-name> --resource-group <res-group>lubaz 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" - Możliwe jest również użycie Azure Repository.
- Możliwe jest również skonfigurowanie lokalnego repozytorium git.
- Możesz uzyskać URL repozytorium git za pomocą
az webapp deployment source show --name <app-name> --resource-group <res-group>, a będzie to URL SCM aplikacji. - Aby je sklonować, będziesz potrzebować danych uwierzytelniających SCM, które możesz uzyskać za pomocą
az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>.
Webjobs
Azure WebJobs to zadania w tle, które działają w środowisku Azure App Service. Umożliwiają deweloperom wykonywanie skryptów lub programów obok ich aplikacji internetowych, co ułatwia obsługę asynchronicznych lub czasochłonnych operacji, takich jak przetwarzanie plików, obsługa danych czy zadania zaplanowane. Istnieją 2 typy web jobs:
- Ciągłe: Działa w nieskończoność w pętli i jest uruchamiane natychmiast po utworzeniu. Jest idealne do zadań, które wymagają stałego przetwarzania. Jednak jeśli aplikacja przestanie działać, ponieważ Always On jest wyłączone i nie otrzymała żądania w ciągu ostatnich 20 minut, web job również się zatrzyma.
- Wyzwalane: Działa na żądanie lub na podstawie harmonogramu. Najlepiej nadaje się do okresowych zadań, takich jak aktualizacje danych wsadowych lub rutyny konserwacyjne.
Webjobs są bardzo interesujące z perspektywy atakującego, ponieważ mogą być używane do wykonywania kodu w środowisku i eskalacji uprawnień do przypisanych tożsamości zarządzanych.
Ponadto zawsze warto sprawdzić logi generowane przez Webjobs, ponieważ mogą zawierać wrażliwe informacje.
Sloty
Sloty Azure App Service są używane do wdrażania różnych wersji aplikacji w tym samym App Service. Umożliwia to deweloperom testowanie nowych funkcji lub zmian w oddzielnym środowisku przed wdrożeniem ich do środowiska produkcyjnego.
Ponadto możliwe jest skierowanie procenta ruchu do konkretnego slotu, co jest przydatne do testów A/B oraz do celów backdoor.
Aplikacje funkcji Azure
Zasadniczo aplikacje funkcji Azure są podzbiorem Azure App Service w konsoli internetowej, a jeśli przejdziesz do konsoli internetowej i wyświetlisz wszystkie usługi aplikacji lub wykonasz az webapp list w az cli, będziesz mógł zobaczyć aplikacje funkcji również wymienione tam.
Dlatego obie usługi mają w rzeczywistości głównie te same konfiguracje, funkcje i opcje w az cli, chociaż mogą je konfigurować nieco inaczej (jak domyślne wartości appsettings lub użycie konta Storage w aplikacjach funkcji).
Enumeracja
# 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
Przykłady generowania aplikacji webowych
Python z lokalnego
Ten samouczek oparty jest na tym z https://learn.microsoft.com/en-us/azure/app-service/quickstart-python.
# 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
Logując się do portalu SCM lub przez FTP, można zobaczyć w /wwwroot skompresowany plik output.tar.gz, który zawiera kod aplikacji webowej.
Tip
Samo połączenie przez FTP i modyfikacja pliku
output.tar.gznie wystarczy, aby zmienić kod wykonywany przez aplikację webową.
Atakujący mógłby pobrać ten plik, zmodyfikować go i ponownie przesłać, aby wykonać dowolny kod w aplikacji webowej.
Python z Github
Ten samouczek oparty jest na poprzednim, ale wykorzystuje repozytorium Github.
- Forkuj repozytorium msdocs-python-flask-webapp-quickstart w swoim koncie Github.
- Utwórz nową aplikację Web App w Azure.
- W
Deployment Centerzmień źródło, zaloguj się do Github, wybierz forkowane repozytorium i kliknijSave.
Podobnie jak w poprzednim przypadku, logując się do portalu SCM lub przez FTP, można zobaczyć w /wwwroot skompresowany plik output.tar.gz, który zawiera kod aplikacji webowej.
Tip
Samo połączenie przez FTP i modyfikacja pliku
output.tar.gzoraz ponowne uruchomienie wdrożenia nie wystarczy, aby zmienić kod wykonywany przez aplikację webową.
Eskalacja Uprawnień
Odniesienia
- https://learn.microsoft.com/en-in/azure/app-service/overview
- https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans
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

