From dc0a09a09cff1dd8c4da7ea820544297e2027010 Mon Sep 17 00:00:00 2001 From: Translator Date: Sat, 4 Jan 2025 00:40:52 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/azure-security/az-services/az-app-serv --- src/SUMMARY.md | 2 +- .../az-services/az-app-services.md | 286 ++++++++++++++++++ 2 files changed, 287 insertions(+), 1 deletion(-) create mode 100644 src/pentesting-cloud/azure-security/az-services/az-app-services.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index feae5163c..f14f299ff 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -408,7 +408,7 @@ - [Az - ARM Templates / Deployments](pentesting-cloud/azure-security/az-services/az-arm-templates.md) - [Az - Automation Account](pentesting-cloud/azure-security/az-services/az-automation-account/README.md) - [Az - State Configuration RCE](pentesting-cloud/azure-security/az-services/az-automation-account/az-state-configuration-rce.md) - - [Az - Azure App Service & Function Apps](pentesting-cloud/azure-security/az-services/az-app-service.md) + - [Az - Azure App Services](pentesting-cloud/azure-security/az-services/az-app-services.md) - [Az - Intune](pentesting-cloud/azure-security/az-services/intune.md) - [Az - File Shares](pentesting-cloud/azure-security/az-services/az-file-shares.md) - [Az - Function Apps](pentesting-cloud/azure-security/az-services/az-function-apps.md) diff --git a/src/pentesting-cloud/azure-security/az-services/az-app-services.md b/src/pentesting-cloud/azure-security/az-services/az-app-services.md new file mode 100644 index 000000000..e82b789c6 --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-services/az-app-services.md @@ -0,0 +1,286 @@ +# Az - App Services + +{{#include ../../../banners/hacktricks-training.md}} + +## 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 Free et Shared 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 Isolated 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 monter les 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 identifiants 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 identifiants 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. + +## 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** de ces plateformes et les identifiants. + +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:///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. + +Quelques 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](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 identifiants pour le dépôt distant en exécutant `az webapp deployment source show --name --resource-group ` ou `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"` +- 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 --resource-group ` et ce sera l'URL SCM de l'application. +- Pour le cloner, vous aurez besoin des identifiants SCM que vous pouvez obtenir avec `az webapp deployment list-publishing-profiles --resource-group -n ` + +## 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 **escalader les privilèges** vers les 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 pour 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 + +{{#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 --resource-group + +# Get instances of a webapp +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 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 + +# Get backups scheduled for a webapp +az webapp config backup show --webapp-name --resource-group + +# Get snapshots +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 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 (contains access key) +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/" + +# 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 connections of a webapp +az webapp conection list --name --resource-group + +# Get hybrid-connections of a webapp +az webapp hybrid-connections list --name --resource-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 }} + +#### Obtenir des identifiants et accéder au code de l'application web +```bash +# Get connection strings that could contain credentials (with DBs for example) +az webapp config connection-string list --name --resource-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 -n + + +# Get git URL to access the code +az webapp deployment source config-local-git --resource-group -n + +# Access/Modify the code via git +git clone 'https://:@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}} + +## 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](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 +``` +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 + +{{#ref}} +../az-privilege-escalation/az-app-services-privesc.md +{{#endref}} + +## Références + +- [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}}