Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/

This commit is contained in:
Translator
2025-01-06 17:11:40 +00:00
parent f71b110582
commit 94560eaee4
5 changed files with 73 additions and 56 deletions

1
.gitignore vendored
View File

@@ -34,3 +34,4 @@ Temporary Items
book
book/*
hacktricks-preprocessor.log
hacktricks-preprocessor-error.log

View File

@@ -7,7 +7,14 @@ from os import path
from urllib.request import urlopen, Request
logger = logging.getLogger(__name__)
logging.basicConfig(filename='hacktricks-preprocessor.log', filemode='w', encoding='utf-8', level=logging.DEBUG)
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler(filename='hacktricks-preprocessor.log', mode='w', encoding='utf-8')
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
handler2 = logging.FileHandler(filename='hacktricks-preprocessor-error.log', mode='w', encoding='utf-8')
handler2.setLevel(logging.ERROR)
logger.addHandler(handler2)
def findtitle(search ,obj, key, path=(),):
@@ -45,19 +52,29 @@ def ref(matchobj):
try:
if href.endswith("/"):
href = href+"README.md" # Fix if ref points to a folder
chapter, _path = findtitle(href, book, "source_path")
logger.debug(f'Recursive title search result: {chapter["name"]}')
title = chapter['name']
if "#" in href:
chapter, _path = findtitle(href.split("#")[0], book, "source_path")
title = " ".join(href.split("#")[1].split("-")).title()
logger.debug(f'Ref has # using title: {title}')
else:
chapter, _path = findtitle(href, book, "source_path")
logger.debug(f'Recursive title search result: {chapter["name"]}')
title = chapter['name']
except Exception as e:
try:
dir = path.dirname(current_chapter['source_path'])
logger.debug(f'Error getting chapter title: {href} trying with relative path {path.normpath(path.join(dir,href))}')
chapter, _path = findtitle(path.normpath(path.join(dir,href)), book, "source_path")
logger.debug(f'Recursive title search result: {chapter["name"]}')
title = chapter['name']
if "#" in href:
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
title = " ".join(href.split("#")[1].split("-")).title()
logger.debug(f'Ref has # using title: {title}')
else:
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
title = chapter["name"]
logger.debug(f'Recursive title search result: {chapter["name"]}')
except Exception as e:
logger.debug(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
print(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
logger.debug(e)
logger.error(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
sys.exit(1)
@@ -85,13 +102,11 @@ def files(matchobj):
except Exception as e:
logger.debug(e)
logger.debug(f'Error searching file: {href}')
print(f'Error searching file: {href}')
logger.error(f'Error searching file: {href}')
sys.exit(1)
if title=="":
logger.debug(f'Error searching file: {href}')
print(f'Error searching file: {href}')
logger.error(f'Error searching file: {href}')
sys.exit(1)
template = f"""<a class="content_ref" href="/files/{href}"><span class="content_ref_label">{title}</span></a>"""
@@ -134,10 +149,11 @@ if __name__ == '__main__':
for chapter in iterate_chapters(book['sections']):
logger.debug(f"Chapter: {chapter['path']}")
current_chapter = chapter
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
# regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n#]*(?:#(.*))?)(?:\n)?{{[\s]*#endref[\s]*}}'
new_content = re.sub(regex, ref, chapter['content'])
regex = r'{{[\s]*#file[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endfile[\s]*}}'
new_content = re.sub(regex, files, chapter['content'])
new_content = re.sub(regex, files, new_content)
new_content = add_read_time(new_content)
chapter['content'] = new_content

View File

@@ -50,7 +50,7 @@ Pacu模块 [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/
- 如果 EC2 实例将**用户数据存储在 S3 存储桶**中,攻击者可以修改它以**在 EC2 实例内执行任意代码**。
### `s3:PutObject`, `s3:GetObject`(可选) terraform 状态文件
### `s3:PutObject`, `s3:GetObject`(可选)通过 terraform 状态文件
很常见的是,[terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html) 状态文件被保存到云提供商的 blob 存储中,例如 AWS S3。状态文件的文件后缀为 `.tfstate`,而存储桶名称通常也会透露它们包含 terraform 状态文件。通常,每个 AWS 账户都有一个这样的存储桶来存储显示账户状态的状态文件。\
此外,通常在现实世界的账户中,几乎所有开发人员都有 `s3:*`,有时甚至商业用户也有 `s3:Put*`
@@ -60,12 +60,12 @@ Pacu模块 [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/
请按照 *Terraform Security* 页面中 *Abusing Terraform State Files* 部分的描述获取可直接使用的利用代码:
{{#ref}}
terraform-security.md#abusing-terraform-state-files
pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files
{{#endref}}
### `s3:PutBucketPolicy`
攻击者需要**来自同一账户**,否则将触发错误`The specified method is not allowed`,具有此权限将能够授予自己对存储桶的更多权限,使其能够读取、写入、修改、删除和暴露存储桶。
攻击者需要**来自同一账户**,否则将触发错误`The specified method is not allowed`,具有此权限将能够授予自己对存储桶的更多权限,允许他读取、写入、修改、删除和暴露存储桶。
```bash
# Update Bucket policy
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>

View File

@@ -7,7 +7,7 @@
有关 Azure App 服务的更多信息,请查看:
{{#ref}}
../az-services/az-app-service.md
../az-services/az-app-services.md
{{#endref}}
### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read
@@ -126,12 +126,12 @@ az webapp deployment user set \
```
然后,您可以使用这些凭据来**访问SCM和FTP平台**。这也是保持持久性的好方法。
请记住,要从**网访问SCM平台您需要访问`<SCM-URL>/BasicAuth`**。
请记住,要从**网访问SCM平台您需要访问`<SCM-URL>/BasicAuth`**。
> [!WARNING]
> 请注意每个用户都可以通过调用之前的命令来配置自己的凭据但如果用户没有足够的权限访问SCM或FTP则凭据将无效。
- 如果您看到这些凭据是**REDACTED**,那是因为您**需要启用SCM基本身份验证选项**,为此您需要第二个权限(`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`
- 如果您看到这些凭据是**已编辑的**,那是因为您**需要启用SCM基本身份验证选项**,为此您需要第二个权限(`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`
```bash
# Enable basic authentication for SCM
az rest --method PUT \
@@ -155,7 +155,7 @@ az rest --method PUT \
仅凭有效的 SCM 凭据,就可以 **发布代码** 到应用服务。这可以通过以下命令完成。
对于这个 Python 示例,您可以从 https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart 下载仓库,进行您想要**更改**,然后 **运行:`zip -r app.zip .`** 进行压缩。
对于这个 Python 示例,您可以从 https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart 下载仓库,进行您希望**更改**,然后 **运行:`zip -r app.zip .`** 进行压缩。
然后,您可以使用以下命令在 Web 应用中 **发布代码**
```bash
@@ -175,7 +175,7 @@ az rest --method GET --url "https://lol-b5fyaeceh4e9dce0.scm.canadacentral-01.az
curl "<SCM-URL>/vfs/data/jobs/continuous/job_name/job_log.txt" \
--user '<username>:<password>' -v
```
- 阅读 **Webjobs** 源代码
- 阅读 **Webjobs** 源代码:
```bash
# Using SCM username and password:
# Find all the webjobs inside:
@@ -186,7 +186,7 @@ curl "<SCM-URL>/wwwroot/App_Data/jobs/" \
curl "https://nodewebapp-agamcvhgg3gkd3hs.scm.canadacentral-01.azurewebsites.net/wwwroot/App_Data/jobs/continuous/job_name/rev.js" \
--user '<username>:<password>'
```
- 创建 **续 Webjob**
- 创建 **续 Webjob**
```bash
# Using Azure permissions
az rest \
@@ -225,7 +225,7 @@ az rest --method GET \
```
此命令返回 Github、Bitbucket、Dropbox 和 OneDrive 的令牌。
以下是一些检查令牌的命令示例
在这里有一些命令示例来检查令牌
```bash
# GitHub List Repositories
curl -H "Authorization: token <token>" \
@@ -263,7 +263,7 @@ https://graph.microsoft.com/v1.0/me/drive/root/children
- **`Microsoft.Web/sites/config/list/action`**: 然后运行 `az webapp deployment list-publishing-credentials --name <name> --resource-group <res-group>`
> [!WARNING]
> 请注意,拥有权限 `Microsoft.Web/sites/config/list/action` 和 SCM 凭据始终可以部署到 webapp即使它被配置为使用第三方提供商如前面一节中提到的
> 请注意,拥有权限 `Microsoft.Web/sites/config/list/action` 和 SCM 凭据始终可以部署到 webapp即使它被配置为使用第三方提供商如前面部分所述
> [!WARNING]
> 请注意,拥有以下权限也**可以执行任意容器**,即使 webapp 的配置不同。

View File

@@ -4,31 +4,31 @@
## 基本信息
**Azure Function Apps** 是一种 **无服务器计算服务**,允许您运行小段代码,称为 **函数**,而无需管理底层基础设施。它们旨在响应各种触发器执行代码,例如 **HTTP 请求、定时器或来自其他 Azure 服务的事件**如 Blob 存储或事件中心。Function Apps 支持多种编程语言,包括 C#、Python、JavaScript 和 Java使其在构建 **事件驱动应用程序**、自动化工作流或集成服务方面具有多功能性。它们具有成本效益,因为您通常只需为代码运行时使用的计算时间付费。
**Azure Function Apps** 是一种 **无服务器计算服务**,允许您运行称为 **函数** 的小段代码,而无需管理底层基础设施。它们旨在响应各种触发器执行代码,例如 **HTTP 请求、定时器或来自其他 Azure 服务**如 Blob 存储或事件中心)的事件。Function Apps 支持多种编程语言,包括 C#、Python、JavaScript 和 Java使其在构建 **事件驱动应用程序**、自动化工作流或集成服务方面具有多功能性。它们具有成本效益,因为您通常只需为代码运行时使用的计算时间付费。
> [!NOTE]
> 请注意,**Functions 是 App Services 的一个子集**,因此,这里讨论的许多功能也将被作为 Azure Apps 创建的应用程序使用(在 cli 中为 `webapp`)。
> 请注意,**Functions 是 App Services 的一个子集**,因此,这里讨论的许多功能也将被作为 Azure Apps在 cli 中为 `webapp`创建的应用程序使用
### 不同计划
- **灵活消费计划**:提供 **动态、事件驱动的扩展**,采用按需付费定价,根据需求添加或删除函数实例。它支持 **虚拟网络****预配置实例** 以减少冷启动,使其适合 **不需要容器支持的可变工作负载**
- **传统消费计划**:默认的无服务器选项,您 **仅在函数运行时为计算资源付费**。它根据传入事件自动扩展,并包括 **冷启动优化**,但不支持容器部署。适合需要自动扩展的 **间歇性工作负载**
- **高级计划**:旨在提供 **一致的性能**,具有 **预热工作者** 以消除冷启动。它提供 **延长的执行时间、虚拟网络**,并支持 **自定义 Linux 镜像**,非常适合需要高性能和高级功能的 **关键任务应用程序**
- **专用计划**:在专用虚拟机上运行,具有 **可预测的计费**,支持手动或自动扩展。它允许在同一计划上运行多个应用程序,提供 **计算隔离**,并通过应用服务环境确保 **安全网络访问**,非常适合需要一致资源分配的 **长时间运行的应用程序**
- **容器应用**:允许在受管理的环境中部署 **容器化函数应用**,与微服务和 API 一起使用。它支持自定义库、遗留应用迁移和 **GPU 处理**,消除了 Kubernetes 集群管理。非常适合 **事件驱动、可扩展的容器化应用程序**
- **Flex Consumption Plan**:提供 **动态、事件驱动的扩展**,采用按需付费定价,根据需求添加或删除函数实例。它支持 **虚拟网络****预配置实例** 以减少冷启动,使其适合 **不需要容器支持的可变工作负载**
- **Traditional Consumption Plan**:默认的无服务器选项,您 **仅在函数运行时为计算资源付费**。它根据传入事件自动扩展,并包括 **冷启动优化**,但不支持容器部署。适合需要自动扩展的 **间歇性工作负载**
- **Premium Plan**:旨在提供 **一致的性能**,具有 **预热工作者** 以消除冷启动。它提供 **延长的执行时间、虚拟网络**,并支持 **自定义 Linux 镜像**,非常适合需要高性能和高级功能的 **关键任务应用程序**
- **Dedicated Plan**:在专用虚拟机上运行,具有 **可预测的计费**,支持手动或自动扩展。它允许在同一计划上运行多个应用程序,提供 **计算隔离**,并通过应用服务环境确保 **安全网络访问**,非常适合需要一致资源分配的 **长时间运行的应用程序**
- **Container Apps**:允许在受管理的环境中部署 **容器化函数应用**,与微服务和 API 一起使用。它支持自定义库、遗留应用迁移和 **GPU 处理**,消除了 Kubernetes 集群管理。非常适合 **事件驱动、可扩展的容器化应用程序**
### **存储桶**
在创建一个新的非容器化的 Function App 时(但提供要运行的代码),**代码和其他与函数相关的数据将存储在存储帐户中**。默认情况下Web 控制台将为每个函数创建一个新的存储桶以存储代码。
在创建一个容器化的 Function App 时(但提供要运行的代码),**代码和其他与函数相关的数据将存储在存储帐户中**。默认情况下Web 控制台将为每个函数创建一个新的存储桶以存储代码。
此外,修改存储桶中的代码(以不同格式存储),**应用的代码将被修改为新的代码并在下次调用函数时执行**。
此外,修改存储桶中的代码(以不同格式存储**应用的代码将被修改为新的代码并在下次调用函数时执行**。
> [!CAUTION]
> 从攻击者的角度来看,这非常有趣,因为 **对该存储桶的写入访问** 将允许攻击者 **破坏代码并提升权限** 到 Function App 内的托管身份。
>
> 更多信息请参见 **权限提升部分**。
还可以在存储帐户中找到存储在容器 **`azure-webjobs-secrets`** 中的 **主密钥和函数密钥**位于 **`<app-name>`** 文件夹中的 JSON 文件
还可以在存储帐户容器 **`azure-webjobs-secrets`** 中找到存储**主密钥和函数密钥** **`<app-name>`** 文件夹中的 JSON 文件中可以找到
请注意Functions 还允许将代码存储在远程位置,只需指明其 URL。
@@ -42,11 +42,11 @@
> [!CAUTION]
> 从攻击者的角度来看,这非常有趣,因为可能可以从暴露于互联网的脆弱函数 **转移到内部网络**。
### **Function App 设置环境变量**
### **Function App 设置环境变量**
可以在应用内配置环境变量,这些变量可能包含敏感信息。此外,默认情况下会创建环境变量 **`AzureWebJobsStorage`** 和 **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**(以及其他变量)。这些变量特别有趣,因为它们 **包含控制存储帐户的帐户密钥,具有完全权限**,该存储帐户包含应用程序的数据。这些设置在从存储帐户执行代码时也很重要。
可以在应用内配置环境变量,这些变量可能包含敏感信息。此外,默认情况下会创建环境变量 **`AzureWebJobsStorage`** 和 **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**(以及其他变量)。这些变量特别有趣,因为它们 **包含控制存储帐户的帐户密钥,具有完全权限**,该存储帐户包含应用程序的数据。这些设置在从存储帐户执行代码时也很重要。
这些环境变量或配置参数还控制函数如何执行代码,例如如果 **`WEBSITE_RUN_FROM_PACKAGE`** 存在,它将指示应用程序代码所在的 URL。
这些环境变量或配置参数还控制函数如何执行代码,例如如果存在 **`WEBSITE_RUN_FROM_PACKAGE`**,则会指示应用程序代码所在的 URL。
### **Function 沙箱**
@@ -54,18 +54,18 @@
在使用 NodeJS 的 **Windows** 函数中,代码位于 **`C:\home\site\wwwroot\HttpTrigger1\index.js`**,用户名是 **`mawsFnPlaceholder8_f_v4_node_20_x86`**,并属于以下 **组**`Mandatory Label\High Mandatory Level Label``Everyone``BUILTIN\Users``NT AUTHORITY\INTERACTIVE``CONSOLE LOGON``NT AUTHORITY\Authenticated Users``NT AUTHORITY\This Organization``BUILTIN\IIS_IUSRS``LOCAL``10-30-4-99\Dwas Site Users`
### **托管身份元数据**
### **托管身份元数据**
与 [**虚拟机**](vms/) 类似Functions 可以具有 **托管身份**,分为两种类型:系统分配和用户分配。
与 [**VMs**](vms/index.html) 一样Functions 可以具有 **托管身份**,分为两种类型:系统分配和用户分配。
**系统分配** 的身份将是一个托管身份,**只有分配了该身份的函数** 可以使用,而 **用户分配** 的托管身份是 **任何其他 Azure 服务都可以使用的托管身份**
> [!NOTE]
> 与 [**虚拟机**](vms/) 类似Functions 可以具有 **1 个系统分配** 的托管身份和 **多个用户分配** 的托管身份,因此如果您妥协了该函数,始终重要的是尝试找到所有托管身份,因为您可能能够从一个函数提升到多个托管身份。
> 与 [**VMs**](vms/index.html) 一样Functions 可以具有 **1 个系统分配** 的托管身份和 **多个用户分配** 的托管身份,因此如果您破坏了该函数,始终重要的是尝试找到所有托管身份,因为您可能能够从一个函数提升到多个托管身份。
>
> 如果未使用系统托管身份,但一个或多个用户托管身份附加到函数,默认情况下您将无法获取任何令牌。
> 如果未使用系统托管身份,但一个或多个用户托管身份附加到函数,默认情况下您将无法获取任何令牌。
可以使用 [**PEASS 脚本**](https://github.com/peass-ng/PEASS-ng) 从元数据端点获取默认托管身份的令牌。或者您可以 **手动** 获取它们,如下所述:
可以使用 [**PEASS 脚本**](https://github.com/peass-ng/PEASS-ng) 从元数据端点获取默认托管身份的令牌。或者您可以 **手动** 获取,如下所述:
{% embed url="https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm" %}
@@ -74,9 +74,9 @@
## 访问密钥
> [!NOTE]
> 请注意,没有 RBAC 权限可以授予用户调用函数的访问权限。**函数调用取决于创建时选择的触发器**,如果选择了 HTTP 触发器,可能需要使用 **访问密钥**。
> 请注意,没有 RBAC 权限可以授予用户调用函数的访问权限。**函数调用取决于创建时选择的触发器**,如果选择了 HTTP 触发器,可能需要使用 **访问密钥**。
在使用 **HTTP 触发器** 创建函数内的端点时,可以指明触发函数所需的 **访问密钥授权级别**。提供三种选项:
在使用 **HTTP 触发器** 创建函数内的端点时,可以指明触发函数所需的 **访问密钥授权级别**。提供三种选项:
- **ANONYMOUS****每个人**都可以通过 URL 访问该函数。
- **FUNCTION**:端点仅对使用 **函数、主机或主密钥** 的用户可访问。
@@ -84,10 +84,10 @@
**密钥类型:**
- **函数密钥**:函数密钥可以是默认的或用户定义的,旨在仅授予对 Function App **特定函数端点** 的访问权限,从而允许对端点进行更细粒度的访问。
- **主机密钥**:主机密钥也可以是默认的或用户定义的,提供对 Function App **所有函数端点的访问,具有 FUNCTION 访问级别**
- **主密钥**:主密钥 (`_master`) 作为管理密钥,提供提升的权限,包括所有函数端点的访问(包括 ADMIN 访问级别)。此 **密钥无法被撤销**
- **系统密钥**:系统密钥由 **特定扩展管理**,并且在访问内部组件使用的 webhook 端点时是必需的。示例包括事件网格触发器和可耐久函数,它们利用系统密钥与各自的 API 安全交互。
- **函数密钥**:函数密钥可以是默认的或用户定义的,旨在仅授予对 Function App **特定函数端点** 的访问权限,从而允许对端点进行更细粒度的访问。
- **主机密钥**:主机密钥也可以是默认的或用户定义的,提供对 Function App **所有函数端点的访问,具有 FUNCTION 访问级别**
- **主密钥**:主密钥 (`_master`) 作为管理密钥,提供提升的权限,包括访问所有函数端点(包括 ADMIN 访问级别)。此 **密钥无法被撤销**
- **系统密钥**:系统密钥由 **特定扩展管理**,并且在访问内部组件使用的 webhook 端点时是必需的。示例包括事件网格触发器和可持久化函数,它们利用系统密钥与各自的 API 安全交互。
> [!TIP]
> 使用密钥访问函数 API 端点的示例:
@@ -96,15 +96,15 @@
### 基本身份验证
与应用服务一样Functions 也支持基本身份验证,以通过 **用户名和密码在 URL 中** 连接到 **SCM****FTP** 部署代码。有关更多信息,请参见:
与应用服务一样Functions 也支持基本身份验证,以通过 **用户名和密码在 URL 中** 连接到 **SCM****FTP** 部署代码。有关更多信息,请参见:
{{#ref}}
az-app-service.md
az-app-services.md
{{#endref}}
### 基于 Github 的部署
当函数从 Github 仓库生成时Azure Web 控制台允许 **在特定仓库中自动创建 Github 工作流**因此每当该仓库更新时函数的代码也会更新。实际上Python 函数的 Github Action yaml 看起来是这样的
当函数从 Github 仓库生成时Azure Web 控制台允许在特定仓库中 **自动创建 Github 工作流**因此每当该仓库更新时函数的代码也会更新。实际上Python 函数的 Github Action yaml 如下所示
<details>
@@ -192,16 +192,16 @@ package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
```
</details>
此外,**托管身份**也会被创建以便来自仓库的Github Action能够使用它登录到Azure。这是通过在**托管身份**上生成一个联凭证来完成的,允许**发行者** `https://token.actions.githubusercontent.com` 和**主题标识符** `repo:<org-name>/<repo-name>:ref:refs/heads/<branch-name>`
此外,**托管身份**也会被创建以便来自仓库的Github Action能够使用它登录到Azure。这是通过在**托管身份**上生成一个联凭证来完成的,允许**发行者** `https://token.actions.githubusercontent.com` 和**主题标识符** `repo:<org-name>/<repo-name>:ref:refs/heads/<branch-name>`
> [!CAUTION]
> 因此,任何妥协该仓库的人都将能够妥协该功能及其附加的托管身份。
### 基于容器的部署
并非所有计划都允许部署容器但对于允许的计划配置将包含容器的URL。在API中**`linuxFxVersion`**设置将类似于:`DOCKER|mcr.microsoft.com/...`而在Web控制台中配置将显示**镜像设置**。
并非所有计划都允许部署容器但对于允许的计划配置将包含容器的URL。在API中**`linuxFxVersion`** 设置将类似于: `DOCKER|mcr.microsoft.com/...`而在Web控制台中配置将显示**镜像设置**。
此外,**与该功能相关的存储帐户中不会存储任何源代码**,因为不需要。
此外,**不会在与该功能相关的存储**帐户中存储源代码,因为这不是必需的。
## 枚举
```bash