Translated ['', 'src/pentesting-cloud/aws-security/aws-services/aws-s3-a

This commit is contained in:
Translator
2026-02-12 13:06:27 +00:00
parent e971405fe9
commit 0ac675ab83
@@ -1,39 +1,39 @@
# AWS - S3, Athena & Glacier Enum
# AWS - S3Athena Glacier 枚举
{{#include ../../../banners/hacktricks-training.md}}
## S3
Amazon S3 是一允许 **存储大量数据** 的服务
Amazon S3 是一项服务,允许 **存储大量数据**
Amazon S3 提供多种选项实现数据在静态时**保护**。这些选项包括 **权限**(策略)、**加密**(客户端和服务端)、**桶版本控制** **基于 MFA 的删除**。**用户可以启用** 这些选项中的任何一个来实现数据保护。**数据复制** 是 AWS 的一项内部功能,**S3 自动在所有可用区复制每个对象**组织在这种情况下无需启用它。
Amazon S3 提供多种选项实现静态数据(data at REST**保护**。这些选项包括 **Permission**Policy)、**Encryption**(客户端和服务端)、**Bucket Versioning** 以及 **MFA** **based delete**。**用户可以启用** 这些选项中的任意一项来实现数据保护。**Data replication** 是 AWS 的一项内部功能,**S3 自动在所有 Availability Zones 之间复制每个对象**,在这种情况下组织无需手动启用它。
通过基于资源的权限,可以单独为存储桶的子目录定义权限。
使用基于资源的权限,可以为 bucket 的子目录单独定义权限。
### 桶版本控制和基于 MFA 的删除
### Bucket Versioning and MFA based delete
启用桶版本控制时,任何试图更改文件的操作都会生成该文件的新版本,同时保留相同文件的先前内容。因此,不会覆盖内容。
bucket versioning 被启用时,任何尝试修改桶内文件的操作都会生成该文件的新版本,同时保留先前内容。因此,不会覆盖原有内容。
此外,基于 MFA 的删除将防止 S3 存储桶中的文件版本被删除,也将防止桶版本控制被禁用,因此攻击者无法更改这些文件。
此外,MFA based delete 会阻止 S3 bucket 中的文件版本被删除,并阻止 Bucket Versioning 被禁用,因此攻击者无法更改这些文件。
### S3 访问日志
### S3 Access logs
可以 **启用 S3 访问日志**(默认情况下是禁用的)到某个存储桶,并将日志保存另一个存储桶中,以了解谁在访问该存储桶(两个存储桶必须在同一区域)。
可以 **启用 S3 access logging**(默认情况下关闭)到某个 bucket,并将日志保存另一个 bucket,以便知道谁在访问该 bucket(两个 bucket 必须位于相同区域)。
### S3 预签名 URL
### S3 Presigned URLs
可以生成一个预签名 URL,通常用于 **访问存储桶中的指定文件**。一个 **预签名 URL 看起来像这样**
可以生成 presigned URL,通常用于 **访问 bucket 中指定文件**。一个 **presigned URL 看起来像这样**:
```
https://<bucket-name>.s3.us-east-1.amazonaws.com/asd.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAUUE8GZC4S5L3TY3P%2F20230227%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230227T142551Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=IQoJb3JpZ2luX2VjELf%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJHMEUCIBhQpdETJO3HKKDk2hjNIrPWwBE8gZaQccZFV3kCpPCWAiEAid3ueDtFFU%2FOQfUpvxYTGO%2BHoS4SWDMUrQAE0pIaB40qggMIYBAAGgwzMTgxNDIxMzg1NTMiDJLI5t7gr2EGxG1Y5CrfAioW0foHIQ074y4gvk0c%2B%2Fmqc7cNWb1njQslQkeePHkseJ3owzc%2FCwkgE0EuZTd4mw0aJciA2XIbJRCLPWTb%2FCBKPnIMJ5aBzIiA2ltsiUNQTTUxYmEgXZoJ6rFYgcodnmWW0Et4Xw59UlHnCDB2bLImxPprriyCzDDCD6nLyp3J8pFF1S8h3ZTJE7XguA8joMs4%2B2B1%2FeOZfuxXKyXPYSKQOOSbQiHUQc%2BFnOfwxleRL16prWk1t7TamvHR%2Bt3UgMn5QWzB3p8FgWwpJ6GjHLkYMJZ379tkimL1tJ7o%2BIod%2FMYrS7LDCifP9d%2FuYOhKWGhaakPuJKJh9fl%2B0vGl7kmApXigROxEWon6ms75laXebltsWwKcKuYca%2BUWu4jVJx%2BWUfI4ofoaGiCSaKALTqwu4QNBRT%2BMoK6h%2BQa7gN7JFGg322lkxRY53x27WMbUE4unn5EmI54T4dWt1%2Bg8ljDS%2BvKfBjqmAWRwuqyfwXa5YC3xxttOr3YVvR6%2BaXpzWtvNJQNnb6v0uI3%2BTtTexZkJpLQYqFcgZLQSxsXWSnf988qvASCIUhAzp2UnS1uqy7QjtD5T73zksYN2aesll7rvB80qIuujG6NOdHnRJ2M5%2FKXXNo1Yd15MtzPuSjRoSB9RSMon5jFu31OrQnA9eCUoawxbB0nHqwK8a43CKBZHhA8RoUAJW%2B48EuFsp3U%3D&X-Amz-Signature=3436e4139e84dbcf5e2e6086c0ebc92f4e1e9332b6fda24697bc339acbf2cdfa
```
可以**使用具有访问对象权限的主体凭据从cli创建预签名URL**(如果使用的帐户没有访问权限,创建一个短的预签名URL,但它将无用)
presigned URL 可以 **从 cli 使用具有对该 object 访问权限的 principal 的 credentials 创建**(如果使用的 account 没有访问权限,创建一个短的 presigned URL,但它将无用)
```bash
aws s3 presign --region <bucket-region> 's3://<bucket-name>/<file-name>'
```
> [!NOTE]
> 生成预签名 URL 所需的唯一权限是所授予的权限,因此对于之前的命令,主体所需的唯一权限是 `s3:GetObject`
> 生成 presigned URL 所需的唯一权限就是被授予的权限,所以在前面的命令,主体唯一需要的权限是 `s3:GetObject`
也可以使用 **其他权限** 创建预签名 URL
也可以使用 **其他权限** 创建 presigned URLs
```python
import boto3
url = boto3.client('s3').generate_presigned_url(
@@ -42,24 +42,24 @@ Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'},
ExpiresIn=3600
)
```
### S3 加密机制
### S3 Encryption Mechanisms
**DEK 表数据加密密钥**,是始终生成并用于加密数据的密钥。
**DEK 表示 Data Encryption Key数据加密密钥**,是始终生成并用于加密数据的密钥。
<details>
<summary><strong>使用 S3 管理密钥的服务器端加密,SSE-S3</strong></summary>
此选项需最少配置,所有使用的加密密钥管理由 AWS 管理。您只需 **上传的数据,S3 处理所有其他方面**。每个 S3 账户中的存储桶都分配一个存储桶密钥
此选项需最少配置,使用的加密密钥的所有管理由 AWS 负责。你只需 **上传的数据,S3 处理其他所有方面**。每个 S3 账户中的 bucket 都分配一个 bucket key
- 加密:
- 对象数据 + 创建的明文 DEK --> 加密数据(存储在 S3
- 创建的明文 DEK + S3 主密钥 --> 加密 DEK(存储在 S3 ),明文从内存中删除
- Object Data + 创建的明文 DEK --> 加密数据(存储在 S3
- 创建的明文 DEK + S3 Master Key --> 加密 DEK(存储在 S3 ),明文从内存中删除
- 解密:
- 加密 DEK + S3 主密钥 --> 明文 DEK
- 加密 DEK + S3 Master Key --> 明文 DEK
- 明文 DEK + 加密数据 --> 对象数据
请注意,在这种情况下 **密钥由 AWS 管理**(每 3 年轮换一次)。如果使用自己的密钥,将能够轮换、禁用并应用访问控制。
请注意,在情况下 **密钥由 AWS 管理**每 3 年轮换一次)。如果使用自己的密钥,将能够轮换、禁用并应用访问控制。
</details>
@@ -67,15 +67,15 @@ ExpiresIn=3600
<summary><strong>使用 KMS 管理密钥的服务器端加密,SSE-KMS</strong></summary>
此方法允许 S3 使用密钥管理服务生成的数据加密密钥。KMS 为您提供更大的密钥管理灵活性。例如,可以禁用、轮换并对 CMK 应用访问控制,并使用 AWS Cloud Trail 监控其使用情况。
此方法允许 S3 使用 KMS 来生成的数据加密密钥。KMS 在密钥管理方面提供更大的灵活性。例如,可以禁用、轮换并对 CMK 应用访问控制,并使用 AWS CloudTrail 其使用情况进行审计
- 加密:
- S3 向 KMS CMK 请求数据密钥
- KMS 使用 CMK 生成明文 DEK 和加密 DEK 对并将发送 S3
- S3 使用明文密钥加密数据,存储加密数据和加密密钥,并从内存中删除明文密钥
- S3 向 KMS CMK 请求数据密钥
- KMS 使用 CMK 生成 DEK 明文和加密 DEK 对并将它们发送 S3
- S3 使用明文密钥加密数据,存储加密数据和加密密钥,并从内存中删除明文密钥
- 解密:
- S3 请求 KMS 解密对象的加密数据密钥
- KMS 使用 CMK 解密数据密钥并将其发送回 S3
- S3 请求 KMS 解密对象的加密数据密钥
- KMS 使用 CMK 解密数据密钥并将其返回给 S3
- S3 解密对象数据
</details>
@@ -84,17 +84,17 @@ ExpiresIn=3600
<summary><strong>使用客户提供密钥的服务器端加密,SSE-C</strong></summary>
此选项使您能够提供您可能已经在 AWS 之外使用的主密钥。您的客户提供的密钥将与您的数据一起发送到 S3S3 将为您执行加密。
此选项允许你提供在 AWS 之外可能已经使用的主密钥。客户提供的密钥会随数据一起发送到 S3S3 为你执行加密。
- 加密:
- 用户将对象数据 + 客户密钥发送到 S3
- 客户密钥用于加密数据,且加密数据被存储
- 还存储客户密钥的盐 HMAC 值以将来密钥验证
- 使用客户密钥对数据进行加密,并存储加密后的数据
-存储客户密钥的盐 HMAC 值以便将来验证密钥
- 客户密钥从内存中删除
- 解密:
- 用户发送客户密钥
- 密钥与存储的 HMAC 值进行验证
- 然后使用客户提供的密钥解密数据
- 然后使用客户提供的密钥解密数据
</details>
@@ -102,16 +102,16 @@ ExpiresIn=3600
<summary><strong>使用 KMS 的客户端加密,CSE-KMS</strong></summary>
与 SSE-KMS 类似,这也使用密钥管理服务生成的数据加密密钥。然而,这次是通过客户端而不是 S3 调用 KMS。加密在客户端进行,后将加密数据发送到 S3 进行存储。
与 SSE-KMS 类似,此方式也使用 KMS 来生成的数据加密密钥。这次是通过客户端调用 KMS而不是 S3。加密在客户端进行,后将加密后的数据发送到 S3 存储。
- 加密:
- 客户端请求 KMS 数据密钥
- KMS 返回明文 DEK 和 CMK 加密 DEK
- 两个密钥都被发送回
- 客户端使用明文 DEK 加密数据,并将加密数据 + 加密 DEK 发送到 S3(加密 DEK 作为加密数据的元数据存在 S3 中)
- 客户端 KMS 请求数据密钥
- KMS 返回明文 DEK 和使用 CMK 加密 DEK
- 两个密钥都会返回给客户端
- 客户端使用明文 DEK 对数据进行加密,然后将加密数据 + 加密 DEK 发送到 S3加密 DEK 作为加密数据的元数据存在 S3 中)
- 解密:
- 带有加密 DEK 的加密数据发送到客户端
- 客户端请求 KMS 使用 CMK 解密加密密钥,KMS 返回明文 DEK
- 带有加密 DEK 的加密数据发送到客户端
- 客户端请求 KMS 使用 CMK 解密加密密钥,KMS 明文 DEK 返回
- 客户端现在可以解密加密数据
</details>
@@ -120,21 +120,21 @@ ExpiresIn=3600
<summary><strong>使用客户提供密钥的客户端加密,CSE-C</strong></summary>
使用此机制,可以用自己提供的密钥,并使用 AWS-SDK 客户端在将数据发送到 S3 存储之前对其进行加密。
使用此机制,可以使用自己的密钥并通过 AWS-SDK 客户端在将数据发送到 S3 存储之前对其进行加密。
- 加密:
- 客户端生成 DEK 并加密明文数据
- 然后使用自己的自定义 CMK 加密 DEK
- 提交加密数据 + 加密 DEK 到 S3 进行存储
- 然后使用自己的自定义 CMK DEK 进行加密
- 加密数据 + 加密 DEK 提交到 S3 存储
- 解密:
- S3 发送加密数据和 DEK
- 由于客户端已经拥有用于加密 DEK 的 CMK,因此它解密 DEK,然后使用明文 DEK 解密数据
- S3 发送加密数据和 DEK
- 由于客户端已经拥有用于加密 DEK 的 CMK,它解密 DEK,然后使用明文 DEK 解密数据
</details>
### **枚举**
妥协 AWS 组织的传统主要方式之一是从妥协公共可访问的存储桶开始**可以在此页面找到** [**公共存储桶枚举工具**](../aws-unauthenticated-enum-access/#s3-buckets)****
渗透 AWS 组织的传统主要方式之一是入侵公开可访问的 buckets**可以在此页面找到** [**public buckets enumerators in this page**](../aws-unauthenticated-enum-access/index.html#s3-buckets)**.**
```bash
# Get buckets ACLs
aws s3api get-bucket-acl --bucket <bucket-name>
@@ -229,16 +229,16 @@ aws s3api put-object-acl --bucket <bucket-name> --key flag --access-control-poli
```
### dual-stack <a href="#dual-stack-endpoints-description" id="dual-stack-endpoints-description"></a>
可以通过使用虚拟托管样式或路径样式的端点名称,通过双栈端点访问 S3 存储桶。这些对于通过 IPv6 访问 S3 很有用。
可以通过 dual-stack 终端节点访问 S3 bucket,方法是使用 virtual hosted-style 或 path-style 的 endpoint 名称。这些对于通过 IPv6 访问 S3 很有用。
双栈端点使用以下语法:
Dual-stack endpoints 使用以下语法:
- `bucketname.s3.dualstack.aws-region.amazonaws.com`
- `s3.dualstack.aws-region.amazonaws.com/bucketname`
### Privesc
下页面中,您可以查看如何 **滥用 S3 权限以提升权限**
在下面的页面中可以查看如何 **abuse S3 permissions to escalate privileges**
{{#ref}}
../aws-privilege-escalation/aws-s3-privesc/README.md
@@ -266,19 +266,19 @@ aws s3api put-object-acl --bucket <bucket-name> --key flag --access-control-poli
### S3 HTTP Cache Poisoning Issue <a href="#heading-s3-http-desync-cache-poisoning-issue" id="heading-s3-http-desync-cache-poisoning-issue"></a>
[**根据这项研究**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies#heading-s3-http-desync-cache-poisoning-issue)可以将任意存储桶的响应缓存为属于不同的存储桶。这可被滥用来改例如 JavaScript 文件的响应,并利用 S3 存储静态代码来妥协任意页面。
[**According to this research**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies#heading-s3-http-desync-cache-poisoning-issue) 可以将任意 bucket 的响应缓存为好像属于另一个 bucket。这可被滥用来改例如 javascript 文件的响应,从而破坏使用 S3 存储静态代码任意页面。
## Amazon Athena
Amazon Athena 是一交互式查询服务,使可以直接在 Amazon Simple Storage Service (Amazon **S3**) 中 **分析数据**,使用标准 **SQL**
Amazon Athena 是一交互式查询服务,使可以使用标准 **SQL** 直接在 Amazon Simple Storage Service (Amazon **S3**) 中 **使用** **分析数据**
需要 **准备一个关系数据库表**,其格式与将出现在监控 S3 存储桶中的内容相。然后,Amazon Athena 将能够从日志中填充数据库,以便您可以查询
需要**准备一个关系型 DB 表**,该表的格式与将出现在监控 S3 buckets 中的内容相匹配。然后,Amazon Athena 将能够从日志中填充该 DB,以便你进行查询。
Amazon Athena 支持 **查询已加密的 S3 数据**如果配置为这样,**Athena 可以加密查询结果,然后将其存储 S3 中**。
Amazon Athena 支持**查询已加密的 S3 数据**的能力,并且如果配置为这样,**Athena 可以加密查询结果,然后将其存储 S3 中**。
**结果的加密被查询的 S3 数据无关**,这意味着即使 S3 数据未加密,查询结果也可以加密。需要注意的几点是,Amazon Athena 仅支持使用 **以下 S3 加密方法** **加密** 的数据**SSE-S3、SSE-KMS 和 CSE-KMS**。
**查询结果的加密独立于被查询的底层 S3 数据**,这意味着即使 S3 数据未加密,查询结果也可以加密。需要注意的是,Amazon Athena 仅支持使用**以下 S3 加密方法**进行**加密**的数据**SSE-S3、SSE-KMS 和 CSE-KMS**。
SSE-C 和 CSE-E 不受支持。此外,重要的是要理解,Amazon Athena 会对 **与查询本身在同一区域的加密对象** 运行查询。如果需要查询使用 KMS 加密的 S3 数据,则 Athena 用户需要特定权限以使其能够执行查询。
SSE-C 和 CSE-C 不受支持。此外,需要理解的是 Amazon Athena 会对**已加密且位于与查询本身相同 region 的对象**运行查询。如果需要查询使用 KMS 加密的 S3 数据,则 Athena 用户需要特定权限才能执行查询。
### Enumeration
```bash
@@ -302,7 +302,7 @@ aws athena get-prepared-statement --statement-name <name> --work-group <wg-name>
# Run query
aws athena start-query-execution --query-string <query>
```
## 参考文献
## 参考资料
- [https://cloudsecdocs.com/aws/defensive/tooling/cli/#s3](https://cloudsecdocs.com/aws/defensive/tooling/cli/#s3)
- [https://docs.aws.amazon.com/AmazonS3/latest/userguide/dual-stack-endpoints.html](https://docs.aws.amazon.com/AmazonS3/latest/userguide/dual-stack-endpoints.html)