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 db9d031d0..2d65884d1 100644
--- a/src/pentesting-cloud/azure-security/az-services/az-storage.md
+++ b/src/pentesting-cloud/azure-security/az-services/az-storage.md
@@ -4,27 +4,27 @@
## 基本信息
-Azure Storage Accounts 是 Microsoft Azure 中的基础服务,提供可扩展、安全且高可用的云端 **多种数据类型的 storage**,包括 blobs(binary large objects)、files、queues 和 tables。它们作为容器,将这些不同的 storage services 组合在一个单一命名空间下,便于管理。
+Azure Storage Accounts 是 Microsoft Azure 中的基础服务,提供可扩展、安全且高可用的云端 **storage for various data types**,包括 blobs (binary large objects)、files、queues 和 tables。它们作为容器,将这些不同的 storage services 组合在单一 namespace 下,便于管理。
**主要配置选项**:
-- 每个 storage account 在整个 Azure 中必须有唯一名称。
-- 每个 storage account 部署在一个 **region** 或 Azure extended zone 中
+- 每个 storage account 在整个 Azure 中必须有一个 **uniq name**。
+- 每个 storage account 都部署在一个 **region** 或 Azure extended zone 中
- 可以选择 storage account 的 **premium** 版本以获得更好的性能
-- 可以在 **4 种冗余类型** 中选择,以防护机架、磁盘和 datacenter **故障**
+- 可以在 **4 种冗余类型** 中进行选择,以防护 rack、drive 和 datacenter **failures**。
**安全配置选项**:
-- **Require secure transfer for REST API operations**:要求任何与 storage 的通信都使用 TLS
-- **Allows enabling anonymous access on individual containers**:如果不允许,将来就无法启用匿名访问
+- **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,或来自同一 virtual network 中具有 private endpoints 的 storage account
+- **Permitted scope for copy operations**:允许来自任何 storage account、来自同一 Entra tenant 的任何 storage account,或来自同一 virtual network 中带有 private endpoints 的 storage account。
**Blob Storage 选项**:
- **Allow cross-tenant replication**
-- **Access tier**:Hot(经常访问的数据)、Cool 和 Cold(很少访问的数据)
+- **Access tier**:Hot(频繁访问的数据)、Cool 和 Cold(很少访问的数据)
**网络选项**:
@@ -32,24 +32,24 @@ Azure Storage Accounts 是 Microsoft Azure 中的基础服务,提供可扩展
- 允许来自所有网络
- 允许来自选定的 virtual networks 和 IP addresses
- 禁用 public access 并使用 private access
-- **Private endpoints**:允许从 virtual network 到 storage account 的 private 连接
+- **Private endpoints**:允许从 virtual network 到 storage account 的 private connection
**数据保护选项**:
- **Point-in-time restore for containers**:允许将 containers 恢复到较早状态
-- 它需要启用 versioning、change feed 和 blob soft delete。
-- **Enable soft delete for blobs**:为已删除的 blobs(即使被覆盖)设置按天计算的保留期
-- **Enable soft delete for containers**:为已删除的 containers 设置按天计算的保留期
-- **Enable soft delete for file shares**:为已删除的 file shared 设置按天计算的保留期
+- 它要求启用 versioning、change feed 和 blob soft delete。
+- **Enable soft delete for blobs**:为被删除的 blobs(即使被覆盖)启用按天计算的 retention period
+- **Enable soft delete for containers**:为被删除的 containers 启用按天计算的 retention period
+- **Enable soft delete for file shares**:为被删除的 file shared 启用按天计算的 retention period
- **Enable versioning for blobs**:保留 blobs 的先前版本
-- **Enable blob change feed**:记录 blobs 的创建、修改和删除变更日志
-- **Enable version-level immutability support**:允许在 account-level 上设置基于时间的保留策略,并将其应用于所有 blob versions。
+- **Enable blob change feed**:保留对 blobs 的创建、修改和删除变更日志
+- **Enable version-level immutability support**:允许在 account-level 设置基于时间的 retention policy,并将其应用于所有 blob versions。
- Version-level immutability support 和 point-in-time restore for containers 不能同时启用。
**加密配置选项**:
- **Encryption type**:可以使用 Microsoft-managed keys (MMK) 或 Customer-managed keys (CMK)
-- **Enable infrastructure encryption**:允许对数据进行双重加密,以“提高安全性”
+- **Enable infrastructure encryption**:允许对数据进行双重加密,“for more security”
### Storage endpoints
@@ -66,17 +66,17 @@ Azure Storage Accounts 是 Microsoft Azure 中的基础服务,提供可扩展
如果启用了 "Allow Blob public access"(默认禁用),在创建 container 时可以:
-- 提供对 blobs 的 **public access 读取**(你需要知道名称)。
-- **列出 container blobs** 并 **读取** 它们。
+- 赋予 **public access to read blobs**(你需要知道名称)。
+- **List container blobs** 并读取它们。
- 设为完全 **private**
-### 静态 website (`$web`) 暴露 & 泄露的 secrets
+### Static website (`$web`) exposure & leaked secrets
-- **Static websites** 从特殊的 `$web` container 提供服务,使用按 region 区分的 endpoint,例如 `https://.z13.web.core.windows.net/`。
-- `$web` container 可能通过 blob API 返回 `publicAccess: null`,但文件仍可通过 static site endpoint 访问,因此把 config/IaC artifacts 放在那里可能会泄露 secrets。
-- 快速审计流程:
+- **Static websites** are served from the special `$web` container over a region-specific endpoint such as `https://.z13.web.core.windows.net/`.
+- The `$web` container may report `publicAccess: null` via the blob API, but files are still reachable through the static site endpoint, so dropping config/IaC artifacts there can leak secrets.
+- Quick audit workflow:
```bash
# Identify storage accounts with static website hosting enabled
az storage blob service-properties show --account-name --auth-mode login
@@ -87,21 +87,21 @@ az storage blob list --container-name '$web' --account-name --auth-mo
# Pull suspicious files directly (e.g., IaC tfvars containing secrets/SAS)
az storage blob download -c '$web' --name iac/terraform.tfvars --file /dev/stdout --account-name --auth-mode login
```
-### 审计匿名 blob 暴露
+### 审计 anonymous blob 暴露
-- **定位可能暴露数据的 storage accounts**:`az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`。如果 `allowBlobPublicAccess` 为 `false`,你就不能把 containers 设为 public。
-- **检查高风险 accounts**,确认该标志和其他弱配置:`az storage account show --name --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`。
-- **枚举已启用该标志的 container-level 暴露**:
+- **Locate storage accounts** that can expose data: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. If `allowBlobPublicAccess` is `false` you cannot turn containers public.
+- **Inspect risky accounts** to confirm the flag and other weak settings: `az storage account show --name --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
+- **Enumerate container-level exposure** where the flag is enabled:
```bash
az storage container list --account-name \
--query '[].{name:name, access:properties.publicAccess}'
```
-- `"Blob"`: 匿名读取仅在 **已知 blob 名称** 时允许(不能列出)。
+- `"Blob"`: 匿名读取仅在 **已知 blob 名称** 时允许(不允许列表)。
- `"Container"`: 匿名 **列出 + 读取** 每个 blob。
-- `null`: private; 需要 authentication。
-- **在没有 credentials 的情况下证明访问**:
-- 如果 `publicAccess` 是 `Container`,匿名 listing 可用:`curl "https://.blob.core.windows.net/?restype=container&comp=list"`.
-- 对于 `Blob` 和 `Container`,当名称已知时,匿名 blob download 可用:
+- `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
@@ -109,31 +109,31 @@ curl "https://.blob.core.windows.net//"
```
### Connect to Storage
-如果你发现任何可以连接的 **storage**,可以使用工具 [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) 来完成。
+If you find any **storage** you can connect to you could use the tool [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) to do so.
## Access to Storage
### RBAC
-可以使用带有 **RBAC roles** 的 Entra ID principals 来访问 storage accounts,这是推荐的方式。
+可以使用 Entra ID principals 配合 **RBAC roles** 访问 storage accounts,这是推荐方式。
### Access Keys
-storage accounts 有 access keys,可用于访问它。这会提供对 storage account 的**完整访问权限。**
+storage accounts 有可用于访问的 access keys。这会提供对 storage account 的 f**ull access.**
### **Shared Keys & Lite Shared Keys**
-可以通过 [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) 使用 access keys 签名,借助 signed URL 授权访问某些资源。
+可以通过使用 access keys 签名生成 [**Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key),借助 signed URL 来授权访问某些资源。
> [!NOTE]
-> 注意,`CanonicalizedResource` 部分表示 storage services resource (URI)。如果 URL 中的任何部分经过了编码,那么它也应该在 `CanonicalizedResource` 中进行编码。
+> 请注意,`CanonicalizedResource` 部分表示 storage services resource (URI)。如果 URL 中任何部分被编码,那么它也应该在 `CanonicalizedResource` 中被编码。
> [!NOTE]
-> 这会被 `az` cli 默认用于认证请求。要让它使用 Entra ID principal credentials,请指定参数 `--auth-mode login`。
+> 这是 **`az` cli 默认用于** 认证请求的方式。要让它使用 Entra ID principal credentials,请指定参数 `--auth-mode login`。
-- 可以通过签名以下信息来生成一个用于 blob、queue 和 file services 的 **shared key**:
+- 可以通过对以下信息签名,生成一个用于 blob、queue 和 file services 的 **shared key**:
```bash
StringToSign = VERB + "\n" +
Content-Encoding + "\n" +
@@ -150,7 +150,7 @@ Range + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
-- 可以通过签名以下信息来为 **table services** 生成一个 **shared key**:
+- 可以通过签名以下信息来生成一个 **shared key for table services**:
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
@@ -158,7 +158,7 @@ Content-Type + "\n" +
Date + "\n" +
CanonicalizedResource;
```
-- 可以为 blob、queue 和 file services 生成一个 **lite shared key**,用于签名以下信息:
+- 可以为 blob、queue 和 file services 生成一个 **lite shared key**,签名以下信息:
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
@@ -167,7 +167,7 @@ Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
-- 可以生成一个用于 table services 签名的 **lite shared key**,签名以下信息:
+- 可以通过签名以下信息来生成一个 **lite shared key for table services**:
```bash
StringToSign = Date + "\n"
CanonicalizedResource
@@ -186,20 +186,20 @@ Content-Length: 0
```
### **Shared Access Signature** (SAS)
-Shared Access Signatures (SAS) 是安全、限时的 URL,用于在不暴露账户 access keys 的情况下,**授予访问 Azure Storage account 中资源的特定权限**。虽然 access keys 提供对所有资源的完整管理访问权限,但 SAS 通过指定权限(如 read 或 write)并定义过期时间,实现了细粒度控制。
+Shared Access Signatures (SAS) 是安全的、限时的 URL,用于**授予访问 Azure Storage account 中资源的特定权限**,而不会暴露 account 的 access keys。虽然 access keys 提供对所有资源的完全管理访问权限,但 SAS 通过指定权限(如 read 或 write)并定义过期时间来实现细粒度控制。
#### SAS Types
-- **User delegation SAS**: 这是由 **Entra ID principal** 创建的,它会签名 SAS,并将权限从用户委派给 SAS。它只能用于 **blob 和 data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas))。可以 **revoke** 所有已生成的 user delegated SAS。
-- 即使可以生成比用户实际拥有的权限“更多”的 delegation SAS 也是如此。不过,如果该 principal 没有这些权限,它也不会生效(no privesc)。
-- **Service SAS**: 这是使用 storage account 的某个 **access keys** 签名的。它可用于授予对单个 storage service 中特定资源的访问权限。如果 key 被轮换,SAS 将停止工作。
-- **Account SAS**: 它也使用 storage account 的某个 **access keys** 签名。它授予跨 storage account services(Blob、Queue、Table、File)的资源访问权限,并且可以包含 service-level operations。
+- **User delegation SAS**: 这是从一个 **Entra ID principal** 创建的,由它来签名 SAS,并将权限从 user 委派给 SAS。它只能用于 **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas))。可以**revoke** 所有生成的 user delegated SAS。
+- 即使可以生成权限“更多”的 delegation SAS,也仍然如此。然而,如果 principal 本身没有这些权限,它也不会工作(no privesc)。
+- **Service SAS**: 这是使用 storage account 的某个 **access key** 签名的。它可以用于授予对单个 storage service 中特定资源的访问权限。如果 key 被续订,SAS 将停止工作。
+- **Account SAS**: 这同样是用 storage account 的某个 **access key** 签名的。它授予对 storage account 各项 services(Blob、Queue、Table、File)中的资源访问权限,并且可以包含 service-level 操作。
-由 **access key** 签名的 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`
-由 **user delegation** 签名的 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`
@@ -211,21 +211,21 @@ Shared Access Signatures (SAS) 是安全、限时的 URL,用于在不暴露账
#### SAS permissions
-在生成 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 Support for Azure Blob Storage
-Azure Blob Storage 现在支持 SSH File Transfer Protocol (SFTP),可直接对 Blob Storage 进行安全文件传输和管理,而无需自定义解决方案或第三方产品。
+Azure Blob Storage 现在支持 SSH File Transfer Protocol (SFTP),可以直接对 Blob Storage 进行安全的文件传输和管理,而无需自定义方案或第三方产品。
### Key Features
-- Protocol Support: SFTP 适用于配置了 hierarchical namespace (HNS) 的 Blob Storage accounts。这会将 blobs 组织为 directories 和 subdirectories,便于导航。
-- Security: SFTP 使用 local user identities 进行 authentication,并且不与 RBAC 或 ABAC 集成。每个 local user 可以通过以下方式进行 authentication:
+- Protocol Support: SFTP 适用于配置了 hierarchical namespace (HNS) 的 Blob Storage accounts。这会将 blobs 组织成 directories 和 subdirectories,便于导航。
+- Security: SFTP 可以使用 local user identities,也支持基于 Microsoft Entra ID 的访问,并结合 Azure RBAC 进行授权。这意味着可以使用常见的 Blob Storage data-plane roles 来授予访问权限,而不必创建本地 SFTP users。Local users 可以通过以下方式认证:
- Azure-generated passwords
- Public-private SSH key pairs
-- Granular Permissions: Read、Write、Delete 和 List 等 permissions 可以分配给 local users,最多可覆盖 100 个 containers。
+- Granular Permissions: 可以为 local users 分配 Read、Write、Delete 和 List 等权限,最多可作用于 100 个 containers。
- Networking Considerations: SFTP connections 通过 port 22 建立。Azure 支持 firewall、private endpoints 或 virtual networks 等网络配置来保护 SFTP traffic。
### Setup Requirements
@@ -234,20 +234,20 @@ Azure Blob Storage 现在支持 SSH File Transfer Protocol (SFTP),可直接对
- Supported Encryption: 需要 Microsoft Security Development Lifecycle (SDL) 批准的 cryptographic algorithms(例如 rsa-sha2-256、ecdsa-sha2-nistp256)。
- SFTP Configuration:
- 在 storage account 上启用 SFTP。
-- 创建具有适当 permissions 的 local user identities。
-- 配置 users 的 home directories,以定义它们在 container 中的起始位置。
+- 对于 local-user access,创建具有适当权限的 local user identities。
+- 对于 local users,配置 home directories,以定义其在 container 内的起始位置。
### Permissions
| Permission | Symbol | Description |
| ---------------------- | ------ | ------------------------------------ |
-| **Read** | `r` | Read file content. |
-| **Write** | `w` | Upload files and create directories. |
-| **List** | `l` | List contents of directories. |
-| **Delete** | `d` | Delete files or directories. |
-| **Create** | `c` | Create files or directories. |
-| **Modify Ownership** | `o` | Change the owning user or group. |
-| **Modify Permissions** | `p` | Change ACLs on files or directories. |
+| **Read** | `r` | 读取文件内容。 |
+| **Write** | `w` | 上传文件并创建目录。 |
+| **List** | `l` | 列出目录内容。 |
+| **Delete** | `d` | 删除文件或目录。 |
+| **Create** | `c` | 创建文件或目录。 |
+| **Modify Ownership** | `o` | 更改所有者用户或组。 |
+| **Modify Permissions** | `p` | 更改文件或目录上的 ACLs。 |
## Enumeration
@@ -442,35 +442,36 @@ New-AzStorageBlobSASToken `
{{#endtab }}
{{#endtabs }}
-### 文件共享
+### File Shares
{{#ref}}
az-file-shares.md
{{#endref}}
-## 权限提升
+## Privilege Escalation
{{#ref}}
../az-privilege-escalation/az-storage-privesc.md
{{#endref}}
-## 后渗透
+## Post Exploitation
{{#ref}}
../az-post-exploitation/az-blob-storage-post-exploitation.md
{{#endref}}
-## 持久化
+## Persistence
{{#ref}}
../az-persistence/az-storage-persistence.md
{{#endref}}
-## 参考资料
+## References
- [https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
- [https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview)
- [https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support](https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support)
+- [https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support-entra-id-based-access](https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support-entra-id-based-access)
- [Holiday Hack Challenge 2025 – Spare Key (Azure static website SAS leak)](https://0xdf.gitlab.io/holidayhack2025/act1/spare-key)
- [Holiday Hack Challenge 2025: Blob Storage (Storage Secrets)](https://0xdf.gitlab.io/holidayhack2025/act1/blob-storage)
- [https://learn.microsoft.com/en-us/cli/azure/storage/account](https://learn.microsoft.com/en-us/cli/azure/storage/account)