Az - App Services

Reading time: 15 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Informations de base sur App Service

Azure App Services permet aux développeurs de créer, déployer et mettre à l'échelle des applications web, des backends d'applications mobiles et des API de maniÚre transparente. Il prend en charge plusieurs langages de programmation et s'intÚgre à divers outils et services Azure pour une fonctionnalité et une gestion améliorées.

Chaque application s'exécute dans un bac à sable, mais l'isolation dépend des plans App Service :

  • Les applications dans les niveaux Gratuit et PartagĂ© s'exĂ©cutent sur des VM partagĂ©es
  • Les applications dans les niveaux Standard et Premium s'exĂ©cutent sur des VM dĂ©diĂ©es partagĂ©es uniquement par des applications dans le mĂȘme plan App Service.
  • Les niveaux IsolĂ©s s'exĂ©cutent sur des VM dĂ©diĂ©es sur des rĂ©seaux virtuels dĂ©diĂ©s, amĂ©liorant l'isolation des applications.

warning

Notez que aucune de ces isolations ne prĂ©vient d'autres vulnĂ©rabilitĂ©s web courantes (comme le tĂ©lĂ©chargement de fichiers ou les injections). Et si une identitĂ© de gestion est utilisĂ©e, elle pourrait ĂȘtre capable de faire une Ă©lĂ©vation de privilĂšges.

Les applications ont quelques configurations intéressantes :

  • Always On : Assure que l'application est toujours en cours d'exĂ©cution. Si ce n'est pas activĂ©, l'application cessera de fonctionner aprĂšs 20 minutes d'inactivitĂ© et redĂ©marrera lorsqu'une demande est reçue.
  • Cela est essentiel si vous avez un webjob qui doit s'exĂ©cuter en continu, car le webjob s'arrĂȘtera si l'application s'arrĂȘte.
  • SSH : Si activĂ©, un utilisateur ayant suffisamment de permissions peut se connecter Ă  l'application en utilisant SSH.
  • DĂ©bogage : Si activĂ©, un utilisateur ayant suffisamment de permissions peut dĂ©boguer l'application. Cependant, cela est dĂ©sactivĂ© automatiquement toutes les 48 heures.
  • Web App + Base de donnĂ©es : La console web permet de crĂ©er une application avec une base de donnĂ©es. Dans ce cas, il est possible de sĂ©lectionner la base de donnĂ©es Ă  utiliser (SQLAzure, PostgreSQL, MySQL, MongoDB) et cela vous permet Ă©galement de crĂ©er un Azure Cache pour Redis.
  • L'URL contenant les informations d'identification pour la base de donnĂ©es et Redis sera stockĂ©e dans les appsettings.
  • Conteneur : Il est possible de dĂ©ployer un conteneur sur l'App Service en indiquant l'URL du conteneur et les informations d'identification pour y accĂ©der.
  • Montages : Il est possible de crĂ©er 5 montages Ă  partir de comptes de stockage, qu'il s'agisse d'Azure Blob (Lecture seule) ou d'Azure Files. La configuration stockera la clĂ© d'accĂšs sur le compte de stockage.
  • RĂ©seautage : Peut ĂȘtre accessible publiquement ou uniquement via des points de terminaison privĂ©s d'un VNet.

Authentification de base

Lors de la création d'une application web (et d'une fonction Azure généralement), il est possible d'indiquer si vous souhaitez activer l'authentification de base (désactivée par défaut). Cela active essentiellement SCM (Source Control Manager) et FTP (File Transfer Protocol) pour l'application, ce qui permettra de déployer l'application en utilisant ces technologies.

Pour accéder aux serveurs SCM et FTP, un nom d'utilisateur et un mot de passe sont requis. Par conséquent, Azure fournit certaines API pour obtenir les URL vers ces plateformes et les informations d'identification.

Le serveur FTP n'a pas de magie spéciale, avec l'URL valide, le nom d'utilisateur et le mot de passe, il est possible de se connecter et d'obtenir des permissions de lecture et d'écriture sur l'environnement de l'application.

Le SCM Il est possible de se connecter au SCM en utilisant un navigateur web à https://<SMC-URL>/BasicAuth et de vérifier tous les fichiers et déploiements qui s'y trouvent.

Kudu

Kudu est la plateforme qui gÚre à la fois le SCM et une interface web et API pour gérer un App Service, et fournit des déploiements basés sur Git, un débogage à distance et des capacités de gestion de fichiers. Il est accessible via l'URL SCM définie dans l'application web.

Notez que les versions de Kudu utilisées par les App Services et par les Function Apps sont différentes, la version des Function Apps étant beaucoup plus limitée.

Certains points de terminaison intéressants que vous pouvez trouver dans Kudu sont :

  • /BasicAuth : Vous devez accĂ©der Ă  ce chemin pour vous connecter Ă  Kudu.
  • /DebugConsole : Une console qui vous permet d'exĂ©cuter des commandes dans l'environnement oĂč Kudu s'exĂ©cute.
  • Notez que cet environnement n'a pas accĂšs au service de mĂ©tadonnĂ©es pour obtenir des jetons.
  • /webssh/host : Un client SSH basĂ© sur le web qui vous permet de vous connecter Ă  l'intĂ©rieur du conteneur oĂč l'application s'exĂ©cute.
  • Cet environnement a accĂšs au service de mĂ©tadonnĂ©es afin d'obtenir des jetons des identitĂ©s gĂ©rĂ©es assignĂ©es.
  • /Env : Obtenez des informations sur le systĂšme, les paramĂštres de l'application, les variables d'environnement, les chaĂźnes de connexion et les en-tĂȘtes HTTP.
  • /wwwroot/ : Le rĂ©pertoire racine de l'application web. Vous pouvez tĂ©lĂ©charger tous les fichiers d'ici.

De plus, Kudu était auparavant open source sur https://github.com/projectkudu/kudu mais le projet a été déprécié et en comparant le comportement de l'actuel Kudu dans Azure avec l'ancien, il est possible de voir que plusieurs choses ont déjà changé.

Sources

Les App Services permettent de télécharger le code sous forme de fichier zip par défaut, mais elles permettent également de se connecter à un service tiers et d'obtenir le code à partir de là.

  • Les sources tierces actuellement prises en charge sont Github et Bitbucket.
  • Vous pouvez obtenir les jetons d'authentification en exĂ©cutant az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
  • Azure configurera par dĂ©faut une action Github pour dĂ©ployer le code sur l'App Service chaque fois que le code est mis Ă  jour.
  • Il est Ă©galement possible d'indiquer un dĂ©pĂŽt git distant (avec nom d'utilisateur et mot de passe) pour obtenir le code Ă  partir de lĂ .
  • Vous pouvez obtenir les informations d'identification du dĂ©pĂŽt distant en exĂ©cutant az webapp deployment source show --name <app-name> --resource-group <res-group> ou 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"
  • Il est Ă©galement possible d'utiliser un dĂ©pĂŽt Azure.
  • Il est Ă©galement possible de configurer un dĂ©pĂŽt git local.
  • Vous pouvez obtenir l'URL du dĂ©pĂŽt git avec az webapp deployment source show --name <app-name> --resource-group <res-group> et ce sera l'URL SCM de l'application.
  • Pour le cloner, vous aurez besoin des informations d'identification SCM que vous pouvez obtenir avec az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>

Webjobs

Les Azure WebJobs sont des tùches d'arriÚre-plan qui s'exécutent dans l'environnement Azure App Service. Ils permettent aux développeurs d'exécuter des scripts ou des programmes aux cÎtés de leurs applications web, facilitant ainsi la gestion des opérations asynchrones ou intensives en temps telles que le traitement de fichiers, la gestion de données ou les tùches planifiées. Il existe 2 types de web jobs :

  • Continu : S'exĂ©cute indĂ©finiment dans une boucle et est dĂ©clenchĂ© dĂšs sa crĂ©ation. Il est idĂ©al pour les tĂąches nĂ©cessitant un traitement constant. Cependant, si l'application cesse de fonctionner parce que Always On est dĂ©sactivĂ© et qu'elle n'a pas reçu de demande au cours des 20 derniĂšres minutes, le web job s'arrĂȘtera Ă©galement.
  • DĂ©clenchĂ© : S'exĂ©cute Ă  la demande ou selon un calendrier. Il est mieux adaptĂ© aux tĂąches pĂ©riodiques, telles que les mises Ă  jour de donnĂ©es par lots ou les routines de maintenance.

Les webjobs sont trĂšs intĂ©ressants du point de vue des attaquants car ils pourraient ĂȘtre utilisĂ©s pour exĂ©cuter du code dans l'environnement et Ă©lever les privilĂšges aux identitĂ©s gĂ©rĂ©es attachĂ©es.

De plus, il est toujours intéressant de vérifier les journaux générés par les Webjobs car ils pourraient contenir des informations sensibles.

Slots

Les Azure App Service Slots sont utilisĂ©s pour dĂ©ployer diffĂ©rentes versions de l'application sur le mĂȘme App Service. Cela permet aux dĂ©veloppeurs de tester de nouvelles fonctionnalitĂ©s ou modifications dans un environnement sĂ©parĂ© avant de les dĂ©ployer dans l'environnement de production.

De plus, il est possible de diriger un pourcentage du trafic vers un slot spécifique, ce qui est utile pour les tests A/B, et à des fins de porte dérobée.

Azure Function Apps

Fondamentalement, les Azure Function apps sont un sous-ensemble d'Azure App Service dans la console web et si vous allez à la console web et listez tous les services d'application ou exécutez az webapp list dans az cli, vous pourrez voir les Function apps également listées là.

Par consĂ©quent, les deux services ont en fait principalement les mĂȘmes configurations, fonctionnalitĂ©s et options dans l'az cli, bien qu'ils puissent les configurer un peu diffĂ©remment (comme les valeurs par dĂ©faut des appsettings ou l'utilisation d'un compte de stockage dans les Function apps).

ÉnumĂ©ration

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 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

Az - App Services Privesc

Exemples pour générer des applications Web

Python depuis local

Ce tutoriel est basé sur celui de https://learn.microsoft.com/en-us/azure/app-service/quickstart-python.

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

Se connecter au portail SCM ou se connecter via FTP permet de voir dans /wwwroot le fichier compressé output.tar.gz qui contient le code de l'application web.

tip

Se connecter simplement via FTP et modifier le fichier output.tar.gz ne suffit pas à changer le code exécuté par l'application web.

Un attaquant pourrait télécharger ce fichier, le modifier et le télécharger à nouveau pour exécuter du code arbitraire dans l'application web.

Python depuis Github

Ce tutoriel est basé sur le précédent mais utilise un dépÎt Github.

  1. Forkez le dépÎt msdocs-python-flask-webapp-quickstart dans votre compte Github.
  2. Créez une nouvelle application Web Python dans Azure.
  3. Dans Deployment Center, changez la source, connectez-vous avec Github, sélectionnez le dépÎt forké et cliquez sur Save.

Comme dans le cas précédent, se connecter au portail SCM ou se connecter via FTP permet de voir dans /wwwroot le fichier compressé output.tar.gz qui contient le code de l'application web.

tip

Se connecter simplement via FTP et modifier le fichier output.tar.gz et relancer un déploiement ne suffit pas à changer le code exécuté par l'application web.

ÉlĂ©vation de privilĂšges

Az - App Services Privesc

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks