Translated ['src/pentesting-cloud/azure-security/az-services/az-app-serv

This commit is contained in:
Translator
2025-01-04 00:40:45 +00:00
parent 1d78885350
commit a9180341c3
2 changed files with 287 additions and 1 deletions

View File

@@ -0,0 +1,286 @@
# Az - App Services
{{#include ../../../banners/hacktricks-training.md}}
## App Service Grundinformationen
Azure App Services ermöglicht Entwicklern, **Webanwendungen, mobile App-Backends und APIs nahtlos zu erstellen, bereitzustellen und zu skalieren**. Es unterstützt mehrere Programmiersprachen und integriert sich mit verschiedenen Azure-Tools und -Diensten für verbesserte Funktionalität und Verwaltung.
Jede App läuft in einer Sandbox, aber die Isolation hängt von den App Service-Plänen ab:
- Apps in den kostenlosen und gemeinsamen Stufen laufen auf **gemeinsamen VMs**
- Apps in den Standard- und Premium-Stufen laufen auf **dedizierten VMs, die nur von Apps** im selben App Service-Plan geteilt werden.
- Die isolierten Stufen laufen auf **dedizierten VMs in dedizierten virtuellen Netzwerken**, was die Isolation der Apps verbessert.
> [!WARNING]
> Beachten Sie, dass **keine** dieser Isolierungen **andere gängige** **Webanfälligkeiten** (wie Datei-Uploads oder Injektionen) **verhindert**. Und wenn eine **Verwaltungsidentität** verwendet wird, könnte sie in der Lage sein, **Berechtigungen auf diese** zu **eskalieren**.
Apps haben einige interessante Konfigurationen:
- **Always On**: Stellt sicher, dass die App immer läuft. Wenn nicht aktiviert, wird die App nach 20 Minuten Inaktivität gestoppt und startet wieder, wenn eine Anfrage eingeht.
- Dies ist entscheidend, wenn Sie einen Webjob haben, der kontinuierlich laufen muss, da der Webjob stoppt, wenn die App stoppt.
- **SSH**: Wenn aktiviert, kann ein Benutzer mit ausreichenden Berechtigungen über SSH eine Verbindung zur App herstellen.
- **Debugging**: Wenn aktiviert, kann ein Benutzer mit ausreichenden Berechtigungen die App debuggen. Dies wird jedoch automatisch alle 48 Stunden deaktiviert.
- **Web App + Datenbank**: Die Webkonsole ermöglicht es, eine App mit einer Datenbank zu erstellen. In diesem Fall ist es möglich, die zu verwendende Datenbank auszuwählen (SQLAzure, PostgreSQL, MySQL, MongoDB), und es ermöglicht auch die Erstellung eines Azure Cache für Redis.
- Die URL, die die Anmeldeinformationen für die Datenbank und Redis enthält, wird in den **appsettings** gespeichert.
- **Container**: Es ist möglich, einen Container in den App Service bereitzustellen, indem die URL des Containers und die Anmeldeinformationen zu dessen Zugriff angegeben werden.
- **Mounts**: Es ist möglich, 5 Mounts von Speicherkonten zu erstellen, wobei diese Azure Blob (schreibgeschützt) oder Azure Files sind. Die Konfiguration speichert den Zugriffsschlüssel über das Speicherkonto.
## Basisauthentifizierung
Beim Erstellen einer Webanwendung (und einer Azure-Funktion normalerweise) ist es möglich anzugeben, ob **Basisauthentifizierung aktiviert werden soll** (standardmäßig deaktiviert). Dies aktiviert im Wesentlichen **SCM (Source Control Manager) und FTP (File Transfer Protocol)** für die Anwendung, sodass die Anwendung mit diesen Technologien bereitgestellt werden kann.
Um auf die SCM- und FTP-Server zuzugreifen, sind ein **Benutzername und ein Passwort** erforderlich. Daher stellt Azure einige **APIs zur Verfügung, um die URLs** zu diesen Plattformen und die Anmeldeinformationen zu erhalten.
Der **FTP-Server hat keine besondere Magie**, mit der gültigen URL, dem Benutzernamen und dem Passwort ist es möglich, eine Verbindung herzustellen und Lese- und Schreibberechtigungen über die App-Umgebung zu erhalten.
Die SCM
Es ist möglich, sich über einen Webbrowser unter `https://<SMC-URL>/BasicAuth` mit der SCM zu verbinden und alle Dateien und Bereitstellungen dort zu überprüfen.
### Kudu
Kudu ist die Plattform, die **sowohl das SCM als auch eine Web- und API-Schnittstelle** zur Verwaltung eines App Service verwaltet und Git-basierte Bereitstellungen, Remote-Debugging und Dateiverwaltungsfunktionen bereitstellt. Es ist über die SCM-URL zugänglich, die in der Webanwendung definiert ist.
Beachten Sie, dass die von App Services und von Function Apps verwendeten Kudu-Versionen unterschiedlich sind, wobei die Version der Function Apps viel eingeschränkter ist.
Einige interessante Endpunkte, die Sie in Kudu finden können, sind:
- `/BasicAuth`: Sie müssen auf diesen Pfad zugreifen, um **sich in Kudu anzumelden**.
- `/DebugConsole`: Eine Konsole, die es Ihnen ermöglicht, Befehle in der Umgebung auszuführen, in der Kudu läuft.
- Beachten Sie, dass diese Umgebung **keinen Zugriff** auf den Metadatenservice hat, um Tokens zu erhalten.
- `/webssh/host`: Ein webbasiertes SSH-Client, das es Ihnen ermöglicht, sich in den Container zu verbinden, in dem die App läuft.
- Diese Umgebung **hat Zugriff auf den Metadatenservice**, um Tokens von den zugewiesenen verwalteten Identitäten zu erhalten.
- `/Env`: Informationen über das System, App-Einstellungen, Umgebungsvariablen, Verbindungszeichenfolgen und HTTP-Header abrufen.
- `/wwwroot/`: Das Stammverzeichnis der Webanwendung. Sie können alle Dateien von hier herunterladen.
Darüber hinaus war Kudu früher Open Source unter [https://github.com/projectkudu/kudu](https://github.com/projectkudu/kudu), aber das Projekt wurde eingestellt, und im Vergleich zum Verhalten des aktuellen Kudu in Azure mit dem alten ist es möglich zu sehen, dass **sich bereits mehrere Dinge geändert haben**.
## Quellen
App Services erlauben standardmäßig das Hochladen des Codes als Zip-Datei, ermöglichen jedoch auch die Verbindung zu einem Drittanbieterdienst und das Abrufen des Codes von dort.
- Die derzeit unterstützten Drittanbieterquellen sind **Github** und **Bitbucket**.
- Sie können die Authentifizierungstokens erhalten, indem Sie `az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"` ausführen.
- Azure wird standardmäßig eine **Github Action** einrichten, um den Code jedes Mal in den App Service bereitzustellen, wenn der Code aktualisiert wird.
- Es ist auch möglich, ein **remote git repository** (mit Benutzername und Passwort) anzugeben, um den Code von dort abzurufen.
- Sie können die Anmeldeinformationen für das Remote-Repo erhalten, indem Sie `az webapp deployment source show --name <app-name> --resource-group <res-group>` oder `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"` ausführen.
- Es ist auch möglich, ein **Azure Repository** zu verwenden.
- Es ist auch möglich, ein **lokales git repository** zu konfigurieren.
- Sie können die URL des git-Repos mit `az webapp deployment source show --name <app-name> --resource-group <res-group>` abrufen, und es wird die SCM-URL der App sein.
- Um es zu klonen, benötigen Sie die SCM-Anmeldeinformationen, die Sie mit `az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>` erhalten können.
## Webjobs
Azure WebJobs sind **Hintergrundaufgaben, die in der Azure App Service-Umgebung ausgeführt werden**. Sie ermöglichen Entwicklern, Skripte oder Programme neben ihren Webanwendungen auszuführen, was es einfacher macht, asynchrone oder zeitintensive Operationen wie Datei-Processing, Datenverarbeitung oder geplante Aufgaben zu handhaben.
Es gibt 2 Arten von Webjobs:
- **Continuous**: Läuft ununterbrochen in einer Schleife und wird sofort nach der Erstellung ausgelöst. Es ist ideal für Aufgaben, die eine ständige Verarbeitung erfordern. Wenn die App jedoch stoppt, weil Always On deaktiviert ist und sie in den letzten 20 Minuten keine Anfrage erhalten hat, wird auch der Webjob gestoppt.
- **Triggered**: Läuft auf Abruf oder basierend auf einem Zeitplan. Es eignet sich am besten für periodische Aufgaben, wie Batch-Datenaktualisierungen oder Wartungsroutinen.
Webjobs sind aus der Perspektive eines Angreifers sehr interessant, da sie verwendet werden könnten, um **Code** in der Umgebung auszuführen und **Berechtigungen** auf die angehängten verwalteten Identitäten zu **eskalieren**.
Darüber hinaus ist es immer interessant, die von den Webjobs generierten **Protokolle** zu überprüfen, da sie **sensible Informationen** enthalten könnten.
## Slots
Azure App Service Slots werden verwendet, um **verschiedene Versionen der Anwendung** im selben App Service bereitzustellen. Dies ermöglicht es Entwicklern, neue Funktionen oder Änderungen in einer separaten Umgebung zu testen, bevor sie in die Produktionsumgebung bereitgestellt werden.
Darüber hinaus ist es möglich, einen **Prozentsatz des Traffics** an einen bestimmten Slot weiterzuleiten, was nützlich für A/B-Tests und für **Hintertürzwecke** ist.
## Azure Function Apps
Im Grunde sind **Azure Function Apps eine Untergruppe von Azure App Service** in der Webkonsole, und wenn Sie zur Webkonsole gehen und alle App-Dienste auflisten oder `az webapp list` im az cli ausführen, werden Sie auch **die Function Apps dort aufgelistet sehen**.
Daher haben beide Dienste tatsächlich größtenteils die **gleichen Konfigurationen, Funktionen und Optionen im az cli**, obwohl sie diese möglicherweise etwas anders konfigurieren (wie Standardwerte von appsettings oder die Verwendung eines Speicherkontos in den Function Apps).
## Enumeration
{{#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 <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 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>
```
{{#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 }}
#### Anmeldeinformationen erhalten & Zugriff auf den Webanwendungscode erhalten
```bash
# Get connection strings that could contain credentials (with DBs for example)
az webapp config connection-string list --name <name> --resource-group <res-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 <res-group> -n <name>
# Get git URL to access the code
az webapp deployment source config-local-git --resource-group <res-group> -n <name>
# Access/Modify the code via git
git clone 'https://<username>:<password>@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}}
## Beispiele zur Erstellung von Webanwendungen
### Python von lokal
Dieses Tutorial basiert auf dem von [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
```
In das SCM-Portal einloggen oder über FTP einloggen, ist es möglich, in `/wwwroot` die komprimierte Datei `output.tar.gz` zu sehen, die den Code der Webanwendung enthält.
> [!TIP]
> Nur eine Verbindung über FTP herzustellen und die Datei `output.tar.gz` zu ändern, reicht nicht aus, um den von der Webanwendung ausgeführten Code zu ändern.
**Ein Angreifer könnte diese Datei herunterladen, sie modifizieren und sie erneut hochladen, um beliebigen Code in der Webanwendung auszuführen.**
### Python von Github
Dieses Tutorial basiert auf dem vorherigen, verwendet jedoch ein Github-Repository.
1. Forken Sie das Repo msdocs-python-flask-webapp-quickstart in Ihrem Github-Konto.
2. Erstellen Sie eine neue Python-Webanwendung in Azure.
3. Ändern Sie im `Deployment Center` die Quelle, melden Sie sich mit Github an, wählen Sie das geforkte Repo aus und klicken Sie auf `Speichern`.
Wie im vorherigen Fall ist es möglich, in `/wwwroot` die komprimierte Datei `output.tar.gz` zu sehen, die den Code der Webanwendung enthält.
> [!TIP]
> Nur eine Verbindung über FTP herzustellen und die Datei `output.tar.gz` zu ändern und eine Bereitstellung erneut auszulösen, reicht nicht aus, um den von der Webanwendung ausgeführten Code zu ändern.
## Privilegieneskalation
{{#ref}}
../az-privilege-escalation/az-app-services-privesc.md
{{#endref}}
## Referenzen
- [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}}