Az - App Services
Reading time: 15 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
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 geteilten 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 zu ihnen 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 sich ein Benutzer mit ausreichenden Berechtigungen über SSH mit der App verbinden.
- 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 im 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 sein können. Die Konfiguration speichert den Zugriffsschlüssel über das Speicherkonto.
- Netzwerk: Kann öffentlich verfügbar oder nur über private Endpunkte von einem VNet zugänglich sein.
Basisauthentifizierung
Beim Erstellen einer Webanwendung (und einer Azure-Funktion normalerweise) ist es möglich anzugeben, ob die 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 besonderen Funktionen, 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 mit 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 die SCM als auch eine Web- und API-Schnittstelle zur Verwaltung eines App Service verwaltet und Git-basierte Bereitstellungen, Remote-Debugging und Dateiverwaltungsmöglichkeiten bietet. 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, 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 zu erhalten.
- 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>
oderaz 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>
erhalten, 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, stoppt auch der Webjob.
- Triggered: Läuft auf Abruf oder basierend auf einem Zeitplan. Es eignet sich am besten für periodische Aufgaben, wie z.B. 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 zu den angehängten verwalteten Identitäten zu eskalieren.
Darüber hinaus ist es immer interessant, die Protokolle zu überprüfen, die von den Webjobs generiert werden, 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 zu leiten, 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
# 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
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.
# 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, im /wwwroot
die komprimierte Datei output.tar.gz
zu sehen, die den Code der Webanwendung enthält.
tip
Nur über FTP zu verbinden 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.
- Forken Sie das Repo msdocs-python-flask-webapp-quickstart in Ihrem Github-Konto.
- Erstellen Sie eine neue Python-Webanwendung in Azure.
- Ändern Sie im
Deployment Center
die Quelle, melden Sie sich mit Github an, wählen Sie das geforkte Repo aus und klicken Sie aufSpeichern
.
Wie im vorherigen Fall ist es möglich, im /wwwroot
die komprimierte Datei output.tar.gz
zu sehen, die den Code der Webanwendung enthält.
tip
Nur über FTP zu verbinden 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
Referenzen
- https://learn.microsoft.com/en-in/azure/app-service/overview
- https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.