diff --git a/src/SUMMARY.md b/src/SUMMARY.md index feae5163c..f14f299ff 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -408,7 +408,7 @@ - [Az - ARM Templates / Deployments](pentesting-cloud/azure-security/az-services/az-arm-templates.md) - [Az - Automation Account](pentesting-cloud/azure-security/az-services/az-automation-account/README.md) - [Az - State Configuration RCE](pentesting-cloud/azure-security/az-services/az-automation-account/az-state-configuration-rce.md) - - [Az - Azure App Service & Function Apps](pentesting-cloud/azure-security/az-services/az-app-service.md) + - [Az - Azure App Services](pentesting-cloud/azure-security/az-services/az-app-services.md) - [Az - Intune](pentesting-cloud/azure-security/az-services/intune.md) - [Az - File Shares](pentesting-cloud/azure-security/az-services/az-file-shares.md) - [Az - Function Apps](pentesting-cloud/azure-security/az-services/az-function-apps.md) diff --git a/src/pentesting-cloud/azure-security/az-services/az-app-services.md b/src/pentesting-cloud/azure-security/az-services/az-app-services.md new file mode 100644 index 000000000..ebde0f0ce --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-services/az-app-services.md @@ -0,0 +1,286 @@ +# Az - App Services + +{{#include ../../../banners/hacktricks-training.md}} + +## Podstawowe informacje o usłudze App + +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 bezpłatnych 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 **żadne** 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ądzająca**, 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 montowań z kont Storage, które mogą być Azure Blob (tylko do odczytu) lub Azure Files. Konfiguracja przechowa klucz dostępu w koncie Storage. + +## 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 oraz dane uwierzytelniające. + +**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:///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**, aby uzyskać tokeny z przypisanych tożsamości zarządzających. +- `/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ś open source w [https://github.com/projectkudu/kudu](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 --resource-group ` lub `az rest --method POST --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//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, uruchamiając `az webapp deployment source show --name --resource-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 -n ` + +## 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ądzających. + +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 + +{{#tabs }} +{{#tab name="az" }} +```bash +# 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 --resource-group + +# Get instances of a webapp +az webapp list-instances --name --resource-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 --resource-group + +# Remove access restrictions +az webapp config access-restriction remove --resource-group -n --rule-name + +# Get connection strings of a webapp +az webapp config connection-string list --name --resource-group + +# Get appsettings of an app +az webapp config appsettings list --name --resource-group + +# Get SCM and FTP credentials +az webapp deployment list-publishing-profiles --name --resource-group + +# Get configured Auth information +az webapp auth show --name --resource-group + +# Get backups of a webapp +az webapp config backup list --webapp-name --resource-group + +# Get backups scheduled for a webapp +az webapp config backup show --webapp-name --resource-group + +# Get snapshots +az webapp config snapshot list --resource-group -n + +# Restore snapshot +az webapp config snapshot restore -g -n --time 2018-12-11T23:34:16.8388367 + +# Get slots +az webapp deployment slot list --name --resource-group --output table +az webapp show --slot --name --resource-group + +# Get traffic-routing +az webapp traffic-routing show --name --resource-group + +# Get used container by the app +az webapp config container show --name --resource-group + +# Get storage account configurations of a webapp (contains access key) +az webapp config storage-account list --name --resource-group + +# Get configured container (if any) in the webapp, it could contain credentials +az webapp config container show --name --resource-group + +# Get Webjobs +az webapp webjob continuous list --resource-group --name +az webapp webjob triggered list --resource-group --name + +# Read webjobs logs with Azure permissions +az rest --method GET --url "/vfs/data/jobs//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 ':' -v + +# Get connections of a webapp +az webapp conection list --name --resource-group + +# Get hybrid-connections of a webapp +az webapp hybrid-connections list --name --resource-group +``` +{{#endtab }} + +{{#tab name="Az Powershell" }} +```powershell +# Get App Services and Function Apps +Get-AzWebApp +# Get only App Services +Get-AzWebApp | ?{$_.Kind -notmatch "functionapp"} +``` +{{#endtab }} + +{{#tab name="az get all" }} +```bash +#!/bin/bash + +# Get all App Service and Function Apps + +# Define Azure subscription ID +azure_subscription="your_subscription_id" + +# Log in to Azure +az login + +# Select Azure subscription +az account set --subscription $azure_subscription + +# Get all App Services in the specified subscription +list_app_services=$(az appservice list --query "[].{appServiceName: name, group: resourceGroup}" -o tsv) + +# Iterate over each App Service +echo "$list_app_services" | while IFS=$'\t' read -r appServiceName group; do +# Get the type of the App Service +service_type=$(az appservice show --name $appServiceName --resource-group $group --query "kind" -o tsv) + +# Check if it is a Function App and print its name +if [ "$service_type" == "functionapp" ]; then +echo "Function App Name: $appServiceName" +fi +done +``` +{{#endtab }} +{{#endtabs }} + +#### Uzyskaj poświadczenia i uzyskaj dostęp do kodu aplikacji webowej +```bash +# Get connection strings that could contain credentials (with DBs for example) +az webapp config connection-string list --name --resource-group +## Check how to use the DBs connection strings in the SQL page + +# Get credentials to access the code and DB credentials if configured. +az webapp deployment list-publishing-profiles --resource-group -n + + +# Get git URL to access the code +az webapp deployment source config-local-git --resource-group -n + +# Access/Modify the code via git +git clone 'https://:@name.scm.azurewebsites.net/repo-name.git' +## In my case the username was: $nameofthewebapp and the password some random chars +## If you change the code and do a push, the app is automatically redeployed +``` +{{#ref}} +../az-privilege-escalation/az-app-services-privesc.md +{{#endref}} + +## 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](https://learn.microsoft.com/en-us/azure/app-service/quickstart-python?tabs=flask%2Cwindows%2Cazure-cli%2Cazure-cli-deploy%2Cdeploy-instructions-azportal%2Cterminal-bash%2Cdeploy-instructions-zip-azcli). +```bash +# 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 logując się 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.gz` nie 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. + +1. Forkuj repozytorium msdocs-python-flask-webapp-quickstart w swoim koncie Github. +2. Utwórz nową aplikację Web App w Azure. +3. W `Deployment Center` zmień źródło, zaloguj się do Github, wybierz forkowane repozytorium i kliknij `Save`. + +Podobnie jak w poprzednim przypadku, logując się do portalu SCM lub logując się 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.gz` oraz ponowne uruchomienie wdrożenia nie wystarczy, aby zmienić kod wykonywany przez aplikację webową. + +## Eskalacja Uprawnień + +{{#ref}} +../az-privilege-escalation/az-app-services-privesc.md +{{#endref}} + +## Odniesienia + +- [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview) +- [https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans](https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans) + +{{#include ../../../banners/hacktricks-training.md}}