AWS - S3, Athena & Glacier 枚举
Tip
学习并练习 AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 subscription plans!
- 加入 💬 Discord group 或者 telegram group 或 关注 我们的 Twitter 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud github 仓库 提交 PRs 来分享 hacking tricks。
S3
Amazon S3 是一项服务,允许你存储大量数据。
Amazon S3 提供多种选项来实现数据在静态时的保护。这些选项包括 Permission (Policy)、Encryption (Client and Server Side)、Bucket Versioning 和 MFA based delete。用户可以启用这些选项中的任意一个来实现数据保护。Data replication 是 AWS 的一项内部功能,S3 automatically replicates each object across all the Availability Zones,组织在这种情况下无需启用它。
使用基于资源的权限,可以为 bucket 的子目录单独定义权限。
Bucket Versioning and MFA based delete
当启用 Bucket Versioning 时,任何试图更改桶内文件的操作都会生成该文件的新版本,同时保留之前的内容。因此,不会覆盖原有内容。
此外,MFA based delete 会阻止 S3 bucket 中的文件版本被删除,也会阻止禁用 Bucket Versioning,因此攻击者将无法修改这些文件。
S3 Access logs
可以为某个 bucket 启用 S3 access login(默认禁用),并将日志保存到另一个 bucket,以便知道谁在访问该 bucket(两个 bucket 必须在同一 region)。
S3 Presigned URLs
可以生成 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
presigned URL 可以 从 cli 使用具有对该对象访问权限的主体的凭证创建(如果你使用的账号没有访问权限,会创建一个更短的 presigned URL,但它将无法使用)
aws s3 presign --region <bucket-region> 's3://<bucket-name>/<file-name>'
Note
生成预签名 URL 唯一需要的权限是被授予的权限,所以对于前面的命令,主体唯一需要的权限是
s3:GetObject
也可以使用其他权限创建预签名 URL:
import boto3
url = boto3.client('s3').generate_presigned_url(
ClientMethod='put_object',
Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'},
ExpiresIn=3600
)
S3 加密机制
DEK 意味着 Data Encryption Key(数据加密密钥),是始终生成并用于加密数据的密钥。
使用 S3 托管密钥的服务端加密, SSE-S3
此选项需要最少的配置,且所有用于加密的密钥由 AWS 管理。你所需做的只是上传数据,S3 会处理所有其余部分。每个 S3 账号中的 bucket 都会被分配一个 bucket key。
- 加密:
- Object Data + 创建的明文 DEK –> 加密数据(存储在 S3 中)
- 创建的明文 DEK + S3 Master Key –> 加密后的 DEK(存储在 S3 中),并从内存中删除明文
- 解密:
- 加密后的 DEK + S3 Master Key –> 明文 DEK
- 明文 DEK + 加密数据 –> Object Data
请注意,在此情况下 密钥由 AWS 管理(默认仅每 3 年轮换一次)。如果你使用自己的密钥,则可以进行轮换、禁用以及应用访问控制。
使用 KMS 管理密钥的服务端加密, SSE-KMS
该方法允许 S3 使用 KMS 来生成你的数据加密密钥。KMS 提供了更大的密钥管理灵活性。例如,你可以禁用、轮换并对 CMK 应用访问控制,并使用 AWS CloudTrail 对其使用情况进行审计。
- 加密:
- S3 向 KMS 请求数据密钥(data key)
- KMS 使用 CMK 生成 DEK 的明文和已加密版本,并将两者返回给 S3
- S3 使用明文 DEK 来加密数据,存储加密数据和加密后的 DEK,并从内存中删除明文 DEK
- 解密:
- S3 向 KMS 请求解密对象的已加密数据密钥
- KMS 使用 CMK 解密该数据密钥并将其返回给 S3
- S3 使用该明文密钥解密对象数据
使用客户提供密钥的服务端加密, SSE-C
此选项允许你提供自己在 AWS 外部可能已经使用的主密钥。客户提供的密钥会随数据一起发送到 S3,S3 将替你执行加密操作。
- 加密:
- 用户将对象数据 + 客户密钥发送到 S3
- 使用客户密钥对数据进行加密,并保存加密后的数据
- 同时存储该客户密钥的带盐 HMAC 值以便将来验证密钥
- 客户密钥从内存中删除
- 解密:
- 用户发送客户密钥
- 密钥与存储的 HMAC 值进行验证
- 然后使用客户提供的密钥解密数据
使用 KMS 的客户端加密, CSE-KMS
与 SSE-KMS 类似,此方式也使用 KMS 来生成数据加密密钥。但这次是由客户端而非 S3 调用 KMS。加密在客户端进行,然后将加密后的数据发送到 S3 存储。
- 加密:
- 客户端向 KMS 请求数据密钥
- KMS 返回明文 DEK 以及用 CMK 加密的 DEK
- 两个密钥都会返回给客户端
- 客户端使用明文 DEK 加密数据,并将加密数据 + 已加密的 DEK(作为加密数据在 S3 中的元数据)发送到 S3
- 解密:
- 带有已加密 DEK 的加密数据被发送回客户端
- 客户端请求 KMS 使用 CMK 解密已加密的密钥,KMS 返回明文 DEK
- 客户端随后使用该明文 DEK 解密数据
使用客户提供密钥的客户端加密, CSE-C
使用此机制,你可以利用自己提供的密钥并使用 AWS-SDK 客户端在将数据发送到 S3 存储之前对其进行加密。
- 加密:
- 客户端生成 DEK 并加密明文数据
- 然后使用自身的自定义 CMK 对 DEK 进行加密
- 将加密的数据 + 已加密的 DEK 提交到 S3 存储
- 解密:
- S3 返回加密的数据和 DEK
- 由于客户端已持有用于加密 DEK 的 CMK,客户端解密 DEK,然后使用明文 DEK 解密数据
枚举
传统上,攻破 AWS 组织的一种主要途径是先入侵公开可访问的 S3 bucket。您可以在此找到 public buckets enumerators in this page.
# Get buckets ACLs
aws s3api get-bucket-acl --bucket <bucket-name>
aws s3api get-object-acl --bucket <bucket-name> --key flag
# Get policy
aws s3api get-bucket-policy --bucket <bucket-name>
aws s3api get-bucket-policy-status --bucket <bucket-name> #if it's public
# list S3 buckets associated with a profile
aws s3 ls
aws s3api list-buckets
# list content of bucket (no creds)
aws s3 ls s3://bucket-name --no-sign-request
aws s3 ls s3://bucket-name --recursive --no-sign-request
# list content of bucket (with creds)
aws s3 ls s3://bucket-name
aws s3api list-objects-v2 --bucket <bucket-name>
aws s3api list-objects --bucket <bucket-name>
aws s3api list-object-versions --bucket <bucket-name>
# copy local folder to S3
aws s3 cp MyFolder s3://bucket-name --recursive
# delete
aws s3 rb s3://bucket-name –-force
# download a whole S3 bucket
aws s3 sync s3://<bucket>/ .
# move S3 bucket to different location
aws s3 sync s3://oldbucket s3://newbucket --source-region us-west-1
# list the sizes of an S3 bucket and its contents
aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"
# Update Bucket policy
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>
##JSON policy example
{
"Id": "Policy1568185116930",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1568184932403",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome",
"Principal": "*"
},
{
"Sid": "Stmt1568185007451",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome/*",
"Principal": "*"
}
]
}
# Update bucket ACL
aws s3api get-bucket-acl --bucket <bucket-name> # Way 1 to get the ACL
aws s3api put-bucket-acl --bucket <bucket-name> --access-control-policy file://acl.json
aws s3api get-object-acl --bucket <bucket-name> --key flag #Way 2 to get the ACL
aws s3api put-object-acl --bucket <bucket-name> --key flag --access-control-policy file://objacl.json
##JSON ACL example
## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved.
{
"Owner": {
"DisplayName": "<DisplayName>",
"ID": "<ID>"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
## An ACL should give you the permission WRITE_ACP to be able to put a new ACL
dual-stack
您可以通过使用 virtual hosted-style 或 path-style 端点名称,通过 dual-stack 端点 访问 S3 存储桶。这些端点对于通过 IPv6 访问 S3 很有用。
Dual-stack 端点使用以下语法:
bucketname.s3.dualstack.aws-region.amazonaws.coms3.dualstack.aws-region.amazonaws.com/bucketname
Privesc
在下面的页面中,您可以查看如何 滥用 S3 权限 以 提权:
Unauthenticated Access
S3 Post Exploitation
Persistence
Other S3 vulns
S3 HTTP Cache Poisoning Issue
According to this research ,可以将任意 bucket 的响应缓存成看起来属于另一个 bucket 的响应。这可以被滥用来篡改例如 JavaScript 文件的响应,从而危及使用 S3 存储静态代码的任意页面。
Amazon Athena
Amazon Athena 是一个交互式查询服务,可让您使用标准 SQL 直接在 Amazon Simple Storage Service (Amazon S3) 中 分析数据。
您需要准备一个关系型数据库表,其格式与将出现在被监控的 S3 bucket 中的内容相匹配。然后,Amazon Athena 可以从日志中填充该数据库,以便您进行查询。
Amazon Athena 支持查询已加密的 S3 数据,如果配置为这样,Athena 还可以加密查询结果,这些结果随后可以存储在 S3 中。
查询结果的加密与被查询的底层 S3 数据的加密是相互独立的,这意味着即使 S3 数据未被加密,查询结果也可以被加密。需要注意的是,Amazon Athena 仅支持使用以下 S3 加密方法加密的数据:SSE-S3、SSE-KMS 和 CSE-KMS。
SSE-C 和 CSE-C 不受支持。此外,重要的是要理解 Amazon Athena 只会对与查询本身位于相同 region 的加密对象运行查询。如果您需要查询使用 KMS 加密的 S3 数据,则 Athena 用户需要具备特定权限才能执行该查询。
Enumeration
# Get catalogs
aws athena list-data-catalogs
# Get databases inside catalog
aws athena list-databases --catalog-name <catalog-name>
aws athena list-table-metadata --catalog-name <catalog-name> --database-name <db-name>
# Get query executions, queries and results
aws athena list-query-executions
aws athena get-query-execution --query-execution-id <id> # Get query and meta of results
aws athena get-query-results --query-execution-id <id> # This will rerun the query and get the results
# Get workgroups & Prepared statements
aws athena list-work-groups
aws athena list-prepared-statements --work-group <wg-name>
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://docs.aws.amazon.com/AmazonS3/latest/userguide/dual-stack-endpoints.html
Tip
学习并练习 AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 subscription plans!
- 加入 💬 Discord group 或者 telegram group 或 关注 我们的 Twitter 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud github 仓库 提交 PRs 来分享 hacking tricks。
HackTricks Cloud

