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 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 gli ambienti 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 & Roles

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
}
],
"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 solo 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

Identità Gestite

Azure Static Web Apps può essere configurato per utilizzare identità gestite, 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.

Enumerazione

{% tabs %} {% tab title="az cli" %} {% code overflow="wrap" %}

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

{% endcode %} {% endtab %}

{% tab title="Az PowerShell" %} {% code overflow="wrap" %}

powershell
Get-Command -Module Az.Websites

# Retrieves details of a specific Static Web App in the specified resource group.
Get-AzStaticWebApp -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves the build details for a specific Static Web App.
Get-AzStaticWebAppBuild -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves the application settings for a specific build environment in a Static Web App.
Get-AzStaticWebAppBuildAppSetting -ResourceGroupName <ResourceGroupName> -Name <Name> -EnvironmentName <EnvironmentName>

# Retrieves functions for a specific build environment in a Static Web App.
Get-AzStaticWebAppBuildFunction -ResourceGroupName <ResourceGroupName> -Name <Name> -EnvironmentName <EnvironmentName>

# Retrieves function app settings for a specific build environment in a Static Web App.
Get-AzStaticWebAppBuildFunctionAppSetting -ResourceGroupName <ResourceGroupName> -Name <Name> -EnvironmentName <EnvironmentName>

# Retrieves the configured roles for a Static Web App.
Get-AzStaticWebAppConfiguredRole -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves the custom domains configured for a Static Web App.
Get-AzStaticWebAppCustomDomain -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves details of the functions associated with a Static Web App.
Get-AzStaticWebAppFunction -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves the app settings for the function app associated with a Static Web App.
Get-AzStaticWebAppFunctionAppSetting -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves the secrets for a Static Web App.
Get-AzStaticWebAppSecret -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves general app settings for a Static Web App.
Get-AzStaticWebAppSetting -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves user details for a Static Web App with a specified authentication provider.
Get-AzStaticWebAppUser -ResourceGroupName <ResourceGroupName> -Name <Name> -AuthProvider <AuthProvider>

# Retrieves user-provided function apps associated with a Static Web App.
Get-AzStaticWebAppUserProvidedFunctionApp -ResourceGroupName <ResourceGroupName> -Name <Name>

{% endcode %} {% endtab %} {% endtabs %}

Esempi per generare Web Apps

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