GCPBucketBrute
一个枚举 Google 存储桶、确定您对它们的访问权限以及判断是否可以权限提升的脚本。
- 此脚本(可选)接受 GCP 用户/服务账号凭据和一个关键词。
- 然后,将根据该关键词生成一系列排列组合,并使用这些组合扫描 Google 存储桶名称是否存在。
- 如果提供了凭据,大部分枚举仍将以未认证方式执行,但对于任何通过未认证枚举发现的存储桶,它将尝试使用提供的凭据通过 TestIamPermissions API 枚举存储桶权限。这将有助于找到在认证状态下可访问但未认证状态下无法访问的存储桶。
- 无论是否提供凭据,脚本都会尝试在未认证状态下使用 TestIamPermissions API 枚举存储桶权限。这意味着如果您不输入凭据,您只会看到未认证用户拥有的权限;但如果您输入了凭据,您将看到认证用户与未认证用户相比拥有哪些访问权限。
- 警告: 如果提供了凭据,您的用户名可能会在您发现的任何存储桶的访问日志中被披露。
快速总结
- 给定一个关键词,此脚本根据该关键词生成的一系列排列组合枚举 Google 存储桶。
- 然后,输出任何发现的存储桶。
- 接着,输出您对任何已发现存储桶拥有的任何权限(如果有)。
- 最后,脚本会检查这些权限是否存在权限提升(storage.buckets.setIamPolicy),并输出任何有趣的信息(例如公开可列出、公开可写入、认证可列出、权限提升等)。
要求
- Linux/OS X
- Windows 仅适用于未认证扫描。脚本在使用认证 Google 客户端时,子进程模块运行存在问题。
- Python3
- Pip3
安装
git clone https://github.com/RhinoSecurityLabs/GCPBucketBrute.git
cd GCPBucketBrute/
pip3 install -r requirements.txt 或 python3 -m pip install -r requirements.txt
用法
首先,确定枚举时使用的认证类型:用户账号、服务账号或未认证。如果您使用服务账号,请通过 -f/--service-account-credential-file-path 参数提供私钥文件路径。如果您使用用户账号,则不要提供认证参数。系统将提示您输入用户账号的访问令牌以访问 GCP API。如果您希望完全未认证扫描,请传递 -u/--unauthenticated 参数以隐藏认证提示。
- 使用关键词 "test" 在完全未认证状态下扫描存储桶:
python3 gcpbucketbrute.py -k test -u
- 使用服务账号认证(私钥存储在 ../sa-priv-key.pem)扫描关键词 "test" 的存储桶,并将结果输出到当前目录的 out.txt 文件:
python3 gcpbucketbrute.py -k test -f ../sa-priv-key.pem -o ./out.txt
- 使用用户账号访问令牌扫描关键词 "test" 的存储桶,并使用 10 个子进程(而不是默认的 5 个)运行:
python3 gcpbucketbrute.py -k test -s 10
可用参数
-k/--keyword
- 该参数用于指定生成排列组合时使用的关键词。这些排列组合将被用于在 Google Storage 中搜索。
--check
- 该参数与
-k/--keyword 互斥,并接受单个字符串。它允许您检查特定存储桶的权限,而不是基于关键词生成排列组合列表。可以重复使用以检查多个存储桶。致谢:@BBerastegui
--check-list
- 该参数与
-k/--keyword 和 --check 互斥。它允许您检查文件中列出的多个存储桶的权限。存储桶名称应在文本文件中每行一个。要从标准输入读取,请将文件名指定为 -。
-s/--subprocesses
- 该参数指定用于存储桶枚举的子进程数量。默认值为 5。设置得越高,枚举速度越快,但向 Google 发出的请求每秒次数也会增加。这些本质上是线程,但脚本使用子进程而不是线程来实现并行执行。
-f/--service-account-credential-file-path
-u/--unauthenticated
- 该参数强制进行未认证枚举。使用此标志时,系统不会提示您输入凭据,也不会检查有效存储桶的认证权限。
-o/--out-file
- 该参数允许您指定一个(相对或绝对)文件路径,用于将结果输出到日志文件。如果文件不存在,则会创建;如果已存在,则会追加内容。
-w/--wordlist