diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-s3-athena-and-glacier-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-s3-athena-and-glacier-enum.md index f14ba745a..af1103b27 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-s3-athena-and-glacier-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-s3-athena-and-glacier-enum.md @@ -1,39 +1,39 @@ -# AWS - S3, Athena & Glacier Enum +# AWS - S3、Athena 与 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://.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 's3:///' ``` > [!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(数据加密密钥)**,是始终生成并用于加密数据的密钥。
使用 S3 管理密钥的服务器端加密,SSE-S3 -此选项需要最少的配置,所有使用的加密密钥管理均由 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 年轮换一次)。如果你使用自己的密钥,你将能够轮换、禁用并应用访问控制。
@@ -67,15 +67,15 @@ ExpiresIn=3600 使用 KMS 管理密钥的服务器端加密,SSE-KMS -此方法允许 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 解密对象数据 @@ -84,17 +84,17 @@ ExpiresIn=3600 使用客户提供密钥的服务器端加密,SSE-C -此选项使您能够提供您可能已经在 AWS 之外使用的主密钥。您的客户提供的密钥将与您的数据一起发送到 S3,S3 将为您执行加密。 +此选项允许你提供在 AWS 之外可能已经使用的主密钥。客户提供的密钥会随数据一起发送到 S3,由 S3 为你执行加密。 - 加密: - 用户将对象数据 + 客户密钥发送到 S3 -- 客户密钥用于加密数据,且加密数据被存储 -- 还存储客户密钥的盐值 HMAC 值以供将来密钥验证 +- 使用客户密钥对数据进行加密,并存储加密后的数据 +- 还会存储客户密钥的带盐 HMAC 值以便将来验证密钥 - 客户密钥从内存中删除 - 解密: - 用户发送客户密钥 - 密钥与存储的 HMAC 值进行验证 -- 然后使用客户提供的密钥解密数据 +- 然后使用客户提供的密钥来解密数据 @@ -102,16 +102,16 @@ ExpiresIn=3600 使用 KMS 的客户端加密,CSE-KMS -与 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 返回 - 客户端现在可以解密加密数据 @@ -120,21 +120,21 @@ ExpiresIn=3600 使用客户提供密钥的客户端加密,CSE-C -使用此机制,您可以利用自己提供的密钥,并使用 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 解密数据 ### **枚举** -妥协 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 @@ -229,16 +229,16 @@ aws s3api put-object-acl --bucket --key flag --access-control-poli ``` ### dual-stack -您可以通过使用虚拟托管样式或路径样式的端点名称,通过双栈端点访问 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 --key flag --access-control-poli ### S3 HTTP Cache Poisoning Issue -[**根据这项研究**](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 --work-group # Run query aws athena start-query-execution --query-string ``` -## 参考文献 +## 参考资料 - [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)