Az Static Web Apps

Reading time: 8 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Static Web Apps Basic Information

Azure Static Web Apps è un servizio cloud per l'hosting di app web statiche con CI/CD automatico da repository come GitHub. Offre distribuzione globale dei contenuti, backend serverless e HTTPS integrato, rendendolo sicuro e scalabile. Tuttavia, anche se il servizio è chiamato "statico", non significa che sia completamente sicuro. I rischi includono CORS mal configurati, autenticazione insufficiente e manomissione dei contenuti, che possono esporre le app ad attacchi come XSS e data leakage se non gestiti correttamente.

Deployment Authentication

tip

Quando viene creata un'App Statica, puoi scegliere la politica di autorizzazione per il deployment tra Token di deployment e workflow di GitHub Actions.

  • Token di deployment: Viene generato un token utilizzato per autenticare il processo di deployment. Chiunque con questo token è sufficiente per distribuire una nuova versione dell'app. Un Github Action viene distribuito automaticamente nel repo con il token in un segreto per distribuire una nuova versione dell'app ogni volta che il repo viene aggiornato.
  • Workflow di GitHub Actions: In questo caso, viene distribuito anche un Github Action molto simile nel repo e il token è anche memorizzato in un segreto. Tuttavia, questo Github Action ha una differenza, utilizza l'azione actions/github-script@v6 per ottenere l'IDToken del repository e usarlo per distribuire l'app.
  • Anche se in entrambi i casi viene utilizzata l'azione Azure/static-web-apps-deploy@v1 con un token nel parametro azure_static_web_apps_api_token, in questo secondo caso un token casuale con un formato valido come 12345cbb198a77a092ff885781a62a15d51ef5e3654ca11234509ab54547270704-4140ccee-e04f-424f-b4ca-3d4dd123459c00f0702071d12345 è sufficiente per distribuire l'app poiché l'autorizzazione avviene con l'IDToken nel parametro github_id_token.

Web App Basic Authentication

È possibile configurare una password per accedere all'App Web. La console web consente di configurarla per proteggere solo gli ambienti di staging o sia l'ambiente di staging che quello di produzione.

Questo è come appare un'app web protetta da password al momento della scrittura:

È possibile vedere se viene utilizzata una password e quali ambienti sono protetti con:

bash
az rest --method GET \
--url "/subscriptions/<subscription-id>/resourceGroups/Resource_Group_1/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2024-04-01"

Tuttavia, questo non mostrerà la password in chiaro, solo qualcosa come: "password": "**********************".

Routes e Ruoli

Le route definiscono come vengono gestite le richieste HTTP in entrata all'interno di un'app web statica. Configurate nel file staticwebapp.config.json, controllano la riscrittura degli URL, i reindirizzamenti, le restrizioni di accesso e l'autorizzazione basata sui ruoli, garantendo una corretta gestione delle risorse e sicurezza.

Alcuni esempi:

json
{
"routes": [
{
"route": "/",
"rewrite": "/index.html"
},
{
"route": "/about",
"rewrite": "/about.html"
},
{
"route": "/api/*",
"allowedRoles": ["authenticated"]
},
{
"route": "/admin",
"redirect": "/login",
"statusCode": 302
},
{
"route": "/google",
"redirect": "https://google.com",
"statusCode": 307
}
],
"navigationFallback": {
"rewrite": "/index.html",
"exclude": ["/api/*", "/assets/*"]
}
}

Nota come sia possibile proteggere un percorso con un ruolo, quindi, gli utenti dovranno autenticarsi nell'app e ricevere quel ruolo per accedere al percorso. È anche possibile creare inviti che concedono ruoli specifici a utenti specifici che accedono tramite EntraID, Facebook, GitHub, Google, Twitter, il che potrebbe essere utile per elevare i privilegi all'interno dell'app.

tip

Nota che è possibile configurare l'App in modo che le modifiche al file staticwebapp.config.json non vengano accettate. In questo caso, potrebbe non essere sufficiente cambiare il file da Github, ma anche cambiare l'impostazione nell'App.

L'URL di staging ha questo formato: https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain> come: https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net

Snippets

È possibile memorizzare snippet HTML all'interno di un'app web statica che verranno caricati all'interno dell'app. Questo può essere utilizzato per iniettare codice malevolo nell'app, come un codice JS per rubare credenziali, un keylogger... Maggiori informazioni nella sezione sull'elevazione dei privilegi.

Managed Identities

Azure Static Web Apps può essere configurato per utilizzare managed identities, tuttavia, come menzionato in questa FAQ, sono supportate solo per estrarre segreti da Azure Key Vault per scopi di autenticazione, non per accedere ad altre risorse Azure.

Per ulteriori informazioni, puoi trovare una guida di Azure su come utilizzare un segreto del vault in un'app statica su https://learn.microsoft.com/en-us/azure/static-web-apps/key-vault-secrets.

Enumeration

bash
# List Static Webapps
az staticwebapp list --output table

# Get Static Webapp details
az staticwebapp show --name <name> --resource-group <res-group> --output table

# Get appsettings
az staticwebapp appsettings list --name <name>

# Get env information
az staticwebapp environment list --name <name>
az staticwebapp environment functions --name <name>

# Get API key
az staticwebapp secrets list --name <name>

# Get invited users
az staticwebapp users list --name <name>

# Get current snippets
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/trainingdemo/snippets?api-version=2022-03-01"

# Get database connections
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/databaseConnections?api-version=2021-03-01"

## Once you have the database connection name ("default" by default) you can get the connection string with the credentials
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/databaseConnections/default/show?api-version=2021-03-01"

# Check connected backends
az staticwebapp backends show --name <name> --resource-group <res-group>

Esempi per generare Web App

Puoi trovare un bel esempio per generare un'app web al seguente link: https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github

  1. Forka il repository https://github.com/staticwebdev/react-basic/generate nel tuo account GitHub e chiamalo my-first-static-web-app
  2. Nel portale Azure crea una Static Web App configurando l'accesso a GitHub e selezionando il nuovo repository forkato
  3. Crealo, aspetta qualche minuto e controlla la tua nuova pagina!

Escalation dei privilegi e Post Exploitation

Tutte le informazioni sull'escalation dei privilegi e sul post exploitation in Azure Static Web Apps possono essere trovate al seguente link:

Az - Static Web App Privesc

Riferimenti

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks