Az - App Services
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
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>ouaz 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
# 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
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.
# 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.gzne 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.
- Forkez le dépÎt msdocs-python-flask-webapp-quickstart dans votre compte Github.
- Créez une nouvelle application Web Python dans Azure.
- Dans
Deployment Center, changez la source, connectez-vous avec Github, sélectionnez le dépÎt forké et cliquez surSave.
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.gzet relancer un dĂ©ploiement ne suffit pas Ă changer le code exĂ©cutĂ© par lâapplication web.
ĂlĂ©vation de privilĂšges
Références
- https://learn.microsoft.com/en-in/azure/app-service/overview
- https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

