mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-01-05 17:27:22 -08:00
Translated ['src/pentesting-cloud/azure-security/az-enumeration-tools.md
This commit is contained in:
@@ -14,35 +14,84 @@ Jede App läuft in einer Sandbox, aber die Isolation hängt von den App Service-
|
||||
> [!WARNING]
|
||||
> Beachten Sie, dass **keine** dieser Isolierungen **andere gängige** **Webanfälligkeiten** (wie Datei-Uploads oder Injektionen) **verhindert**. Und wenn eine **Verwaltungsidentität** verwendet wird, könnte sie in der Lage sein, **Berechtigungen zu ihnen zu eskalieren**.
|
||||
|
||||
### Azure Function Apps
|
||||
Apps haben einige interessante Konfigurationen:
|
||||
|
||||
Im Grunde sind **Azure Function Apps eine Untergruppe von Azure App Service** im Web, und wenn Sie zur Webkonsole gehen und alle App-Dienste auflisten oder `az webapp list` im az cli ausführen, werden Sie **auch die Function Apps hier aufgelistet sehen**.
|
||||
|
||||
Tatsächlich werden einige der **sicherheitsbezogenen Funktionen**, die App Services verwenden (`webapp` im az cli), **auch von Function Apps verwendet**.
|
||||
- **Always On**: Stellt sicher, dass die App immer läuft. Wenn nicht aktiviert, wird die App nach 20 Minuten Inaktivität gestoppt und startet wieder, wenn eine Anfrage eingeht.
|
||||
- Dies ist entscheidend, wenn Sie einen Webjob haben, der kontinuierlich laufen muss, da der Webjob stoppt, wenn die App stoppt.
|
||||
- **SSH**: Wenn aktiviert, kann ein Benutzer mit ausreichenden Berechtigungen über SSH eine Verbindung zur App herstellen.
|
||||
- **Debugging**: Wenn aktiviert, kann ein Benutzer mit ausreichenden Berechtigungen die App debuggen. Dies wird jedoch automatisch alle 48 Stunden deaktiviert.
|
||||
- **Web App + Datenbank**: Die Webkonsole ermöglicht es, eine App mit einer Datenbank zu erstellen. In diesem Fall ist es möglich, die zu verwendende Datenbank auszuwählen (SQLAzure, PostgreSQL, MySQL, MongoDB), und es ermöglicht auch die Erstellung eines Azure Cache für Redis.
|
||||
- Die URL, die die Anmeldeinformationen für die Datenbank und Redis enthält, wird in den **appsettings** gespeichert.
|
||||
- **Container**: Es ist möglich, einen Container im App Service bereitzustellen, indem die URL des Containers und die Anmeldeinformationen zugegriffen werden.
|
||||
|
||||
## Basisauthentifizierung
|
||||
|
||||
Beim Erstellen einer Webanwendung (und einer Azure-Funktion normalerweise) ist es möglich anzugeben, ob die Basisauthentifizierung aktiviert werden soll. Dies aktiviert im Grunde **SCM und FTP** für die Anwendung, sodass es möglich ist, die Anwendung mit diesen Technologien bereitzustellen.\
|
||||
Beim Erstellen einer Webanwendung (und normalerweise einer Azure-Funktion) ist es möglich anzugeben, ob die Basisauthentifizierung aktiviert werden soll. Dies aktiviert im Wesentlichen **SCM und FTP** für die Anwendung, sodass die Anwendung mit diesen Technologien bereitgestellt werden kann.\
|
||||
Darüber hinaus stellt Azure eine **API zur Verfügung, die es ermöglicht, den Benutzernamen, das Passwort und die URL** zum Verbinden mit den SCM- und FTP-Servern abzurufen.
|
||||
|
||||
- Authentifizierung: az webapp auth show --name lol --resource-group lol_group
|
||||
Es ist möglich, sich über einen Webbrowser mit dem SCM unter `https://<SMC-URL>/BasicAuth` zu verbinden und alle Dateien und Bereitstellungen dort zu überprüfen.
|
||||
|
||||
SSH
|
||||
### Kudu
|
||||
|
||||
Immer aktiv
|
||||
Kudu ist eine **Bereitstellungs-Engine und Management-Plattform für Azure App Service und Function Apps**, die Git-basierte Bereitstellungen, Remote-Debugging und Dateiverwaltungsfunktionen für Webanwendungen bietet. Es ist über die SCM-URL der Webanwendung zugänglich.
|
||||
|
||||
Debugging
|
||||
Beachten Sie, dass die von App Services und Function Apps verwendeten Kudu-Versionen unterschiedlich sind, wobei die Version der Function Apps viel eingeschränkter ist.
|
||||
|
||||
### Aufzählung
|
||||
Einige interessante Endpunkte, die Sie in Kudu finden können, sind:
|
||||
- `/DebugConsole`: Eine Konsole, die es Ihnen ermöglicht, Befehle in der Umgebung auszuführen, in der Kudu läuft.
|
||||
- Beachten Sie, dass diese Umgebung **keinen Zugriff** auf den Metadatenservice hat, um Tokens abzurufen.
|
||||
- `/webssh/host`: Ein webbasierter SSH-Client, der es Ihnen ermöglicht, sich innerhalb des Containers zu verbinden, in dem die App läuft.
|
||||
- Diese Umgebung **hat Zugriff auf den Metadatenservice**, um Tokens von den zugewiesenen verwalteten Identitäten zu erhalten.
|
||||
- `/Env`: Informationen über das System, App-Einstellungen, Umgebungsvariablen, Verbindungszeichenfolgen und HTTP-Header abrufen.
|
||||
- `/wwwroot/`: Das Stammverzeichnis der Webanwendung. Sie können alle Dateien von hier herunterladen.
|
||||
|
||||
## Quellen
|
||||
|
||||
App Services erlauben standardmäßig das Hochladen des Codes als Zip-Datei, ermöglichen jedoch auch die Verbindung zu einem Drittanbieterdienst und das Abrufen des Codes von dort.
|
||||
|
||||
- Die derzeit unterstützten Drittanbieterquellen sind **Github** und **Bitbucket**.
|
||||
- Sie können die Authentifizierungstokens abrufen, indem Sie `az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"` ausführen.
|
||||
- Azure wird standardmäßig eine **Github Action** einrichten, um den Code jedes Mal in den App Service bereitzustellen, wenn der Code aktualisiert wird.
|
||||
- Es ist auch möglich, ein **remote git repository** (mit Benutzername und Passwort) anzugeben, um den Code von dort abzurufen.
|
||||
- Sie können die Anmeldeinformationen für das Remote-Repo abrufen, indem Sie `az webapp deployment source show --name <app-name> --resource-group <res-group>` oder `az rest --method POST --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com"` ausführen.
|
||||
- Es ist auch möglich, ein **Azure Repository** zu verwenden.
|
||||
- Es ist auch möglich, ein **lokales git repository** zu konfigurieren.
|
||||
- Sie können die URL des git-Repos mit `az webapp deployment source show --name <app-name> --resource-group <res-group>` abrufen, und es wird die SCM-URL der App sein.
|
||||
- Um es zu klonen, benötigen Sie die SCM-Anmeldeinformationen, die Sie mit `az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>` abrufen können.
|
||||
|
||||
## Webjobs
|
||||
|
||||
Azure WebJobs sind **Hintergrundaufgaben, die in der Azure App Service-Umgebung ausgeführt werden**. Sie ermöglichen Entwicklern, Skripte oder Programme neben ihren Webanwendungen auszuführen, was es einfacher macht, asynchrone oder zeitintensive Operationen wie Datei-Processing, Datenverarbeitung oder geplante Aufgaben zu handhaben. Es gibt 2 Arten von Webjobs:
|
||||
- **Continuous**: Läuft unendlich in einer Schleife und wird sofort nach der Erstellung ausgelöst. Es ist ideal für Aufgaben, die eine ständige Verarbeitung erfordern. Wenn die App jedoch stoppt, weil Always On deaktiviert ist und sie in den letzten 20 Minuten keine Anfrage erhalten hat, stoppt auch der Webjob.
|
||||
- **Triggered**: Läuft auf Abruf oder basierend auf einem Zeitplan. Es eignet sich am besten für periodische Aufgaben, wie Batch-Datenaktualisierungen oder Wartungsroutinen.
|
||||
|
||||
Webjobs sind aus der Perspektive eines Angreifers sehr interessant, da sie verwendet werden könnten, um **Code** in der Umgebung auszuführen und **Berechtigungen** zu den angehängten verwalteten Identitäten zu eskalieren.
|
||||
|
||||
Darüber hinaus ist es immer interessant, die von den Webjobs generierten **Protokolle** zu überprüfen, da sie **sensible Informationen** enthalten könnten.
|
||||
|
||||
### Slots
|
||||
|
||||
Azure App Service Slots werden verwendet, um **verschiedene Versionen der Anwendung** im selben App Service bereitzustellen. Dies ermöglicht es Entwicklern, neue Funktionen oder Änderungen in einer separaten Umgebung zu testen, bevor sie in die Produktionsumgebung bereitgestellt werden.
|
||||
|
||||
Darüber hinaus ist es möglich, einen **Prozentsatz des Traffics** an einen bestimmten Slot weiterzuleiten, was nützlich für **A/B-Tests** und für Hintertürzwecke ist.
|
||||
|
||||
### Azure Function Apps
|
||||
|
||||
Im Grunde sind **Azure Function Apps ein Teil von Azure App Service** im Web, und wenn Sie zur Webkonsole gehen und alle App-Dienste auflisten oder `az webapp list` im az cli ausführen, werden Sie auch **die Function Apps hier aufgelistet sehen**.
|
||||
|
||||
Tatsächlich werden einige der **sicherheitsbezogenen Funktionen**, die App Services verwenden (`webapp` im az cli), **auch von Function Apps verwendet**.
|
||||
|
||||
### Enumeration
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="az" }}
|
||||
```bash
|
||||
# List webapps
|
||||
az webapp list
|
||||
|
||||
## Less information
|
||||
az webapp list --query "[].{hostName: defaultHostName, state: state, name: name, resourcegroup: resourceGroup}"
|
||||
az webapp list --query "[].{hostName: defaultHostName, state: state, name: name, resourcegroup: resourceGroup}" -o table
|
||||
## Get SCM URL of each webapp
|
||||
az webapp list | grep '"name"' | grep "\.scm\." | awk '{print $2}' | sed 's/"//g'
|
||||
|
||||
# Get info about 1 app
|
||||
az webapp show --name <name> --resource-group <res-group>
|
||||
@@ -51,18 +100,24 @@ az webapp show --name <name> --resource-group <res-group>
|
||||
az webapp list-instances --name <name> --resource-group <res-group>
|
||||
## If you have enough perm you can go to the "consoleUrl" and access a shell inside the instance form the web
|
||||
|
||||
# Get configured Auth information
|
||||
az webapp auth show --name <app-name> --resource-group <res-group>
|
||||
|
||||
# Get access restrictions of an app
|
||||
az webapp config access-restriction show --name <name> --resource-group <res-group>
|
||||
|
||||
# Remove access restrictions
|
||||
az webapp config access-restriction remove --resource-group <res-group> -n <name> --rule-name <rule-name>
|
||||
|
||||
# Get connection strings of a webapp
|
||||
az webapp config connection-string list --name <name> --resource-group <res-group>
|
||||
|
||||
# Get appsettings of an app
|
||||
az webapp config appsettings list --name <name> --resource-group <res-group>
|
||||
|
||||
# Get SCM and FTP credentials
|
||||
az webapp deployment list-publishing-profiles --name <name> --resource-group <res-group>
|
||||
|
||||
# Get configured Auth information
|
||||
az webapp auth show --name <app-name> --resource-group <res-group>
|
||||
|
||||
# Get backups of a webapp
|
||||
az webapp config backup list --webapp-name <name> --resource-group <res-group>
|
||||
|
||||
@@ -75,61 +130,39 @@ az webapp config snapshot list --resource-group <res-group> -n <name>
|
||||
# Restore snapshot
|
||||
az webapp config snapshot restore -g <res-group> -n <name> --time 2018-12-11T23:34:16.8388367
|
||||
|
||||
# Get connection strings of a webapp
|
||||
az webapp config connection-string list --name <name> --resource-group <res-group>
|
||||
# Get slots
|
||||
az webapp deployment slot list --name <AppName> --resource-group <ResourceGroupName> --output table
|
||||
az webapp show --slot <SlotName> --name <AppName> --resource-group <ResourceGroupName>
|
||||
|
||||
# Get traffic-routing
|
||||
az webapp traffic-routing show --name <AppName> --resource-group <ResourceGroupName>
|
||||
|
||||
# Get used container by the app
|
||||
az webapp config container show --name <name> --resource-group <res-group>
|
||||
|
||||
# Get storage account configurations of a webapp
|
||||
az webapp config storage-account list --name <name> --resource-gl_group
|
||||
az webapp config storage-account list --name <name> --resource-group <res-group>
|
||||
|
||||
# Get configured container (if any) in the webapp, it could contain credentials
|
||||
az webapp config container show --name <name> --resource-group <res-group>
|
||||
|
||||
# Get Webjobs
|
||||
az webapp webjob continuous list --resource-group <res-group> --name <app-name>
|
||||
az webapp webjob triggered list --resource-group <res-group> --name <app-name>
|
||||
|
||||
# Read webjobs logs with Azure permissions
|
||||
az rest --method GET --url "<SCM-URL>/vfs/data/jobs/<continuous | triggered>/rev5/job_log.txt" --resource "https://management.azure.com/"
|
||||
az rest --method GET --url "https://lol-b5fyaeceh4e9dce0.scm.canadacentral-01.azurewebsites.net/vfs/data/jobs/continuous/rev5/job_log.txt" --resource "https://management.azure.com/"
|
||||
|
||||
# List all the functions
|
||||
az functionapp list
|
||||
# Read webjobs logs with SCM credentials
|
||||
curl "https://windowsapptesting-ckbrg3f0hyc8fkgp.scm.canadacentral-01.azurewebsites.net/vfs/data/jobs/continuous/lala/job_log.txt" \
|
||||
--user '<username>:<password>' -v
|
||||
|
||||
# Get info of 1 funciton (although in the list you already get this info)
|
||||
az functionapp show --name <app-name> --resource-group <res-group>
|
||||
## If "linuxFxVersion" has something like: "DOCKER|mcr.microsoft.com/..."
|
||||
## This is using a container
|
||||
# Get connections of a webapp
|
||||
az webapp conection list --name <name> --resource-group <res-group>
|
||||
|
||||
# Get details about the source of the function code
|
||||
az functionapp deployment source show \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group>
|
||||
## If error like "This is currently not supported."
|
||||
## Then, this is probalby using a container
|
||||
|
||||
# Get more info if a container is being used
|
||||
az functionapp config container show \
|
||||
--name <name> \
|
||||
--resource-group <res-group>
|
||||
|
||||
# Get settings (and privesc to the sorage account)
|
||||
az functionapp config appsettings list --name <app-name> --resource-group <res-group>
|
||||
|
||||
# Check if a domain was assigned to a function app
|
||||
az functionapp config hostname list --webapp-name <app-name> --resource-group <res-group>
|
||||
|
||||
# Get SSL certificates
|
||||
az functionapp config ssl list --resource-group <res-group>
|
||||
|
||||
# Get network restrictions
|
||||
az functionapp config access-restriction show --name <app-name> --resource-group <res-group>
|
||||
|
||||
# Get more info about a function (invoke_url_template is the URL to invoke and script_href allows to see the code)
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions?api-version=2024-04-01"
|
||||
|
||||
# Get source code with Master Key of the function
|
||||
curl "<script_href>?code=<master-key>"
|
||||
## Python example
|
||||
curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=<master-key>" -v
|
||||
|
||||
# Get source code
|
||||
az rest --url "https://management.azure.com/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01"
|
||||
# Get hybrid-connections of a webapp
|
||||
az webapp hybrid-connections list --name <name> --resource-group <res-group>
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
@@ -196,6 +229,40 @@ git clone 'https://<username>:<password>@name.scm.azurewebsites.net/repo-name.gi
|
||||
../az-privilege-escalation/az-app-services-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## Beispiele zur Erstellung von Webanwendungen
|
||||
|
||||
### Python von lokal
|
||||
|
||||
Dieses Tutorial basiert auf dem von [https://learn.microsoft.com/en-us/azure/app-service/quickstart-python](https://learn.microsoft.com/en-us/azure/app-service/quickstart-python?tabs=flask%2Cwindows%2Cazure-cli%2Cazure-cli-deploy%2Cdeploy-instructions-azportal%2Cterminal-bash%2Cdeploy-instructions-zip-azcli).
|
||||
```bash
|
||||
# Clone repository
|
||||
git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart
|
||||
cd msdocs-python-flask-webapp-quickstart
|
||||
|
||||
# Create webapp from this code
|
||||
az webapp up --runtime PYTHON:3.9 --sku B1 --logs
|
||||
```
|
||||
In das SCM-Portal einloggen oder über FTP einloggen, ist es möglich, in `/wwwroot` die komprimierte Datei `output.tar.gz` zu sehen, die den Code der Webanwendung enthält.
|
||||
|
||||
> [!TIP]
|
||||
> Nur über FTP zu verbinden und die Datei `output.tar.gz` zu ändern, reicht nicht aus, um den von der Webanwendung ausgeführten Code zu ändern.
|
||||
|
||||
**Ein Angreifer könnte diese Datei herunterladen, sie ändern und sie erneut hochladen, um beliebigen Code in der Webanwendung auszuführen.**
|
||||
|
||||
### Python von Github
|
||||
|
||||
Dieses Tutorial basiert auf dem vorherigen, verwendet jedoch ein Github-Repository.
|
||||
|
||||
1. Forken Sie das Repo msdocs-python-flask-webapp-quickstart in Ihrem Github-Konto.
|
||||
2. Erstellen Sie eine neue Python-Webanwendung in Azure.
|
||||
3. Ändern Sie im `Deployment Center` die Quelle, melden Sie sich mit Github an, wählen Sie das geforkte Repo aus und klicken Sie auf `Speichern`.
|
||||
|
||||
Wie im vorherigen Fall ist es möglich, sich in das SCM-Portal einzuloggen oder über FTP einzuloggen und in `/wwwroot` die komprimierte Datei `output.tar.gz` zu sehen, die den Code der Webanwendung enthält.
|
||||
|
||||
> [!TIP]
|
||||
> Nur über FTP zu verbinden und die Datei `output.tar.gz` zu ändern und eine Bereitstellung erneut auszulösen, reicht nicht aus, um den von der Webanwendung ausgeführten Code zu ändern.
|
||||
|
||||
|
||||
## Referenzen
|
||||
|
||||
- [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)
|
||||
|
||||
Reference in New Issue
Block a user