Az Static Web Apps

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks

Podstawowe informacje o statycznych aplikacjach internetowych

Azure Static Web Apps to usługa chmurowa do hostowania statycznych aplikacji internetowych z automatycznym CI/CD z repozytoriów takich jak GitHub. Oferuje globalną dostawę treści, bezserwerowe zaplecza i wbudowane HTTPS, co czyni ją bezpieczną i skalowalną. Jednak nawet jeśli usługa nazywa się “statyczna”, nie oznacza to, że jest całkowicie bezpieczna. Ryzyka obejmują źle skonfigurowany CORS, niewystarczającą autoryzację i manipulację treścią, co może narażać aplikacje na ataki takie jak XSS i wyciek danych, jeśli nie są odpowiednio zarządzane.

Autoryzacja wdrożenia

Tip

Gdy tworzona jest aplikacja statyczna, możesz wybrać politykę autoryzacji wdrożenia pomiędzy tokenem wdrożenia a workflow GitHub Actions.

  • Token wdrożenia: Generowany jest token, który jest używany do autoryzacji procesu wdrożenia. Każdy, kto ma ten token, wystarczy, aby wdrożyć nową wersję aplikacji. Github Action jest automatycznie wdrażany w repozytorium z tokenem w sekrecie, aby wdrożyć nową wersję aplikacji za każdym razem, gdy repozytorium jest aktualizowane.
  • Workflow GitHub Actions: W tym przypadku bardzo podobna akcja GitHub jest również wdrażana w repozytorium, a token jest również przechowywany w sekrecie. Jednak ta akcja GitHub ma różnicę, używa akcji actions/github-script@v6, aby uzyskać IDToken repozytorium i użyć go do wdrożenia aplikacji.
  • Nawet jeśli w obu przypadkach używana jest akcja Azure/static-web-apps-deploy@v1 z tokenem w parametrze azure_static_web_apps_api_token, w tym drugim przypadku losowy token o formacie ważnym jak 12345cbb198a77a092ff885781a62a15d51ef5e3654ca11234509ab54547270704-4140ccee-e04f-424f-b4ca-3d4dd123459c00f0702071d12345 wystarczy, aby wdrożyć aplikację, ponieważ autoryzacja odbywa się za pomocą IDToken w parametrze github_id_token.

Podstawowa autoryzacja aplikacji internetowej

Możliwe jest skonfigurowanie hasła do uzyskania dostępu do aplikacji internetowej. Konsola internetowa pozwala na skonfigurowanie jej w celu ochrony tylko środowisk stagingowych lub zarówno stagingowych, jak i produkcyjnych.

Tak wygląda aplikacja internetowa chroniona hasłem w momencie pisania:

Możliwe jest sprawdzenie czy jakiekolwiek hasło jest używane i które środowiska są chronione za pomocą:

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"

Jednak to nie pokaże hasła w postaci czystego tekstu, tylko coś takiego: "password": "**********************".

### Trasy i Role

Trasy definiują jak obsługiwane są przychodzące żądania HTTP w ramach statycznej aplikacji webowej. Skonfigurowane w pliku staticwebapp.config.json, kontrolują przepisywanie URL, przekierowania, ograniczenia dostępu oraz autoryzację opartą na rolach, zapewniając odpowiednie zarządzanie zasobami i bezpieczeństwo.

Kilka przykładów:

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

Zauważ, że możliwe jest ochronienie ścieżki za pomocą roli, wtedy użytkownicy będą musieli uwierzytelnić się w aplikacji i otrzymać tę rolę, aby uzyskać dostęp do ścieżki. Możliwe jest również tworzenie zaproszeń przyznających określone role konkretnym użytkownikom logującym się przez EntraID, Facebook, GitHub, Google, Twitter, co może być przydatne do eskalacji uprawnień w aplikacji.

Tip

Zauważ, że możliwe jest skonfigurowanie aplikacji tak, aby zmiany w pliku staticwebapp.config.json nie były akceptowane. W takim przypadku może nie wystarczyć tylko zmiana pliku z Githuba, ale także zmiana ustawienia w aplikacji.

URL staging ma ten format: https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain> jak: https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net

Snippets

Możliwe jest przechowywanie fragmentów HTML w statycznej aplikacji webowej, które będą ładowane w aplikacji. Może to być użyte do wstrzykiwania złośliwego kodu do aplikacji, jak kod JS do kradzieży poświadczeń, keylogger… Więcej informacji w sekcji eskalacji uprawnień.

Managed Identities

Azure Static Web Apps mogą być skonfigurowane do używania managed identities, jednak, jak wspomniano w tym FAQ, są one wspierane tylko do wyciągania sekretów z Azure Key Vault w celach uwierzytelniania, a nie do uzyskiwania dostępu do innych zasobów Azure.

Aby uzyskać więcej informacji, możesz znaleźć przewodnik Azure dotyczący używania sekretu z vault w statycznej aplikacji pod adresem https://learn.microsoft.com/en-us/azure/static-web-apps/key-vault-secrets.

Enumeration

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

Przykłady generowania aplikacji webowych

Możesz znaleźć ładny przykład generowania aplikacji webowej pod tym linkiem: https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github

  1. Forkuj repozytorium https://github.com/staticwebdev/react-basic/generate do swojego konta GitHub i nazwij je my-first-static-web-app
  2. W portalu Azure utwórz Static Web App, konfigurując dostęp do GitHub i wybierając wcześniej forkowane nowe repozytorium
  3. Utwórz je, poczekaj kilka minut i sprawdź swoją nową stronę!

Eskalacja uprawnień i post eksploitacja

Wszystkie informacje na temat eskalacji uprawnień i post eksploitacji w Azure Static Web Apps można znaleźć pod tym linkiem:

Az - Static Web App Privesc

Odniesienia

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks