Az - Statische Web-Apps

Reading time: 8 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Grundinformationen zu Statischen Web-Apps

Azure Static Web Apps ist ein Cloud-Dienst zum Hosten von statischen Web-Apps mit automatischem CI/CD aus Repositories wie GitHub. Es bietet globale Inhaltsbereitstellung, serverlose Backends und integriertes HTTPS, was es sicher und skalierbar macht. Allerdings bedeutet der Name "statisch" nicht, dass es völlig sicher ist. Risiken umfassen falsch konfigurierte CORS, unzureichende Authentifizierung und Inhaltsmanipulation, die Apps Angriffen wie XSS und Datenlecks aussetzen können, wenn sie nicht ordnungsgemäß verwaltet werden.

Bereitstellungsauthentifizierung

tip

Wenn eine Statische App erstellt wird, können Sie die Bereitstellungsautorisierungspolitik zwischen Bereitstellungstoken und GitHub Actions-Workflow wählen.

  • Bereitstellungstoken: Ein Token wird generiert und verwendet, um den Bereitstellungsprozess zu authentifizieren. Jeder mit diesem Token kann eine neue Version der App bereitstellen. Eine Github Action wird automatisch im Repo mit dem Token in einem Geheimnis bereitgestellt, um jedes Mal eine neue Version der App bereitzustellen, wenn das Repo aktualisiert wird.
  • GitHub Actions-Workflow: In diesem Fall wird eine sehr ähnliche Github Action ebenfalls im Repo bereitgestellt und das Token wird ebenfalls in einem Geheimnis gespeichert. Diese Github Action hat jedoch einen Unterschied, sie verwendet die actions/github-script@v6 Action, um das IDToken des Repositories zu erhalten und es zur Bereitstellung der App zu verwenden.
  • Selbst wenn in beiden Fällen die Action Azure/static-web-apps-deploy@v1 mit einem Token im azure_static_web_apps_api_token-Parameter verwendet wird, reicht in diesem zweiten Fall ein zufälliges Token mit einem gültigen Format wie 12345cbb198a77a092ff885781a62a15d51ef5e3654ca11234509ab54547270704-4140ccee-e04f-424f-b4ca-3d4dd123459c00f0702071d12345 aus, um die App bereitzustellen, da die Autorisierung mit dem IDToken im github_id_token-Parameter erfolgt.

Grundlegende Authentifizierung für Web-Apps

Es ist möglich, ein Passwort zu konfigurieren, um auf die Web-App zuzugreifen. Die Web-Konsole ermöglicht es, es so zu konfigurieren, dass nur Staging-Umgebungen oder sowohl Staging- als auch Produktionsumgebungen geschützt werden.

So sieht eine passwortgeschützte Web-App zum Zeitpunkt des Schreibens aus:

Es ist möglich zu sehen, ob ein Passwort verwendet wird und welche Umgebungen geschützt sind mit:

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"

Allerdings wird das das Passwort nicht im Klartext anzeigen, sondern nur etwas wie: "password": "**********************".

Routen & Rollen

Routen definieren wie eingehende HTTP-Anfragen innerhalb einer statischen Webanwendung behandelt werden. Konfiguriert in der staticwebapp.config.json-Datei, steuern sie URL-Umschreibungen, Weiterleitungen, Zugriffsrestriktionen und rollenbasierte Autorisierung, um eine ordnungsgemäße Ressourcenverwaltung und Sicherheit zu gewährleisten.

Einige Beispiele:

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/*"]
}
}

Beachten Sie, wie es möglich ist, einen Pfad mit einer Rolle zu schützen. Benutzer müssen sich dann bei der App authentifizieren und diese Rolle erhalten, um auf den Pfad zuzugreifen. Es ist auch möglich, Einladungen zu erstellen, die bestimmten Benutzern, die sich über EntraID, Facebook, GitHub, Google, Twitter anmelden, spezifische Rollen gewähren, was nützlich sein könnte, um Privilegien innerhalb der App zu eskalieren.

tip

Beachten Sie, dass es möglich ist, die App so zu konfigurieren, dass Änderungen an der staticwebapp.config.json-Datei nicht akzeptiert werden. In diesem Fall könnte es nicht ausreichen, die Datei nur von Github zu ändern, sondern auch die Einstellung in der App zu ändern.

Die Staging-URL hat dieses Format: https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain> wie: https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net

Verwaltete Identitäten

Azure Static Web Apps können so konfiguriert werden, dass sie verwaltete Identitäten verwenden. Wie in dieser FAQ erwähnt, werden sie jedoch nur unterstützt, um Geheimnisse aus Azure Key Vault für Authentifizierungszwecke zu extrahieren, nicht um auf andere Azure-Ressourcen zuzugreifen.

Für weitere Informationen finden Sie in einem Azure-Leitfaden, wie Sie ein Vault-Geheimnis in einer statischen App verwenden, unter https://learn.microsoft.com/en-us/azure/static-web-apps/key-vault-secrets.

Aufzählung

{% 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 %}

Beispiele zur Erstellung von Webanwendungen

Sie finden ein schönes Beispiel zur Erstellung einer Webanwendung unter folgendem Link: https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github

  1. Forken Sie das Repository https://github.com/staticwebdev/react-basic/generate in Ihr GitHub-Konto und benennen Sie es in my-first-static-web-app
  2. Erstellen Sie im Azure-Portal eine Static Web App, indem Sie den Zugriff auf GitHub konfigurieren und das zuvor geforkte neue Repository auswählen
  3. Erstellen Sie es, warten Sie einige Minuten und überprüfen Sie Ihre neue Seite!

Privilegieneskalation und Post-Exploitation

Alle Informationen zur Privilegieneskalation und Post-Exploitation in Azure Static Web Apps finden Sie unter folgendem Link:

Az - Static Web App Privesc

Referenzen

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks