1. How to find the AWS account ID of any S3 bucket (tracebit.com)
如何查找任何S3存储桶的AWS账户ID
本文介绍了一种用于查找任何(包括私有和公有)S3存储桶所属AWS账户ID的技术方法,该方法基于Ben Bridts在2021年提出并广为人知的技术,并进行了重要扩展。
核心原理
该技术依赖于三个关键要素的结合:
- 向请求应用IAM策略:通过使用S3的VPC接口端点,可以在请求上应用IAM策略。
- 推断策略是否允许了请求:由于目标存储桶为第三方私有存储桶,任何请求都会收到
AccessDenied响应。但我们可以通过检查我们自己的AWS CloudTrail日志来推断VPC端点策略是允许还是拒绝了请求:- 若请求出现在CloudTrail中,表示VPC端点策略允许了请求(但被存储桶策略拒绝)。
- 若请求未出现在CloudTrail中,表示VPC端点策略拒绝了请求。
- 在
s3:ResourceAccount条件键上使用通配符匹配:VPC端点策略支持使用StringLike通配符匹配s3:ResourceAccount条件键,从而可以逐位、逐步地探测账户ID,将搜索空间从万亿级降低到百级。
详细步骤
- 确定存储桶区域:通过向存储桶端点发送HTTP请求(如
curl),查看响应头x-amz-bucket-region获取其所在区域。 - 部署基础设施:在确定的区域内,创建一个专用的VPC和一个接口类型的S3 VPC端点。
- 启动EC2实例:在该VPC内启动一个EC2实例,确保其S3请求通过VPC端点。
- 编写VPC端点策略:策略中使用
Condition块,对s3:ResourceAccount应用StringLike通配符匹配。例如,要测试账户ID是否以0开头,策略条件为"s3:ResourceAccount": "0*"。 - 发起S3请求:通过EC2实例向目标存储桶发送一个“管理”请求(如
GetBucketAcl),该请求预期会被拒绝。 - 检查CloudTrail:等待几分钟后,检查是否在CloudTrail中找到了该请求事件。根据结果判断账户ID的第一位数字。
- 迭代与推导:根据上一步结果,修改VPC端点策略条件(例如,第一位是
0则测试"00*",第一位是1则测试"10*"),重复步骤5-6,逐步推导出后续每一位数字。 - 自动化脚本:作者编写了Python脚本
find-s3-account.py来自动化上述迭代过程。
性能优化
上述逐步探测的方法速度较慢(可能需要数小时),因为每次测试都需要等待策略生效和CloudTrail日志记录。为此,作者提出了一个并行测试的优化方案:
- 在单个VPC端点策略中编写120条语句(对应12位账户ID中每一位的0-9数字可能性)。
- 通过在STS AssumeRole调用中指定不同的
RoleSessionName参数(例如0-----------,1-----------等),将特定请求与策略中特定的条件语句关联。 - 这样,一次发出多个不同会话名称的请求,然后批量检查CloudTrail日志,即可在不到10分钟内确定完整的账户ID。
备注与影响
- 作者在发布前已咨询AWS安全团队。
- 该技术还可能适用于其他支持类似资源条件键的服务,或用于发现存储桶的其他条件键信息。
- 技术可行性归因于能够在策略中对
s3:ResourceAccount使用StringLike通配符匹配。 - 对于被VPC端点策略拒绝的请求,若能在CloudTrail中记录可能更为有益。
- 该技术展示了即使存储桶是私有的,通过巧妙地结合IAM策略、VPC端点行为和日志分析,仍可能推断出敏感元数据。