我有凭据,接下来呢?
CloudPrivs 是一款利用 Boto3 等 SDK 现有能力来暴力枚举所有云服务权限的工具,以确定给定凭据拥有哪些权限。
该工具适用于渗透测试人员、红队成员及其他安全专业人员。云服务通常不提供查看某组凭据拥有哪些权限的方法,而海量的服务和操作也让手动确认变得异常困难。这意味着凭据集可能存在权限提升的机会,但用户可能永远无法发现,因为他们根本不知道获取的 AWS 凭据可以执行 Lambda 函数。
目前尚未发布到 PyPi,但正在努力中
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
python -m pip install -e .
这种方式不使用虚拟环境,如果你运行许多 Python 程序则不建议使用。
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
python -m venv venv/
./venv/bin/activate # Windows 使用 activate.ps1
python -m pip install -e .
你也可以使用 Pyenv+virtualenv(如果可用):
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
pyenv virtualenv CloudPrivs
pyenv local CloudPrivs
python -m pip install -e .
cloudprivs [提供商] [参数]
目前唯一可用的提供商是 AWS,但 GCP 支持正在开发中。如果希望提供帮助,请参见#自定义。
选项:
-v, --verbose 在输出中显示失败和错误测试
-s, --services 文本 仅测试指定的服务,而不是所有可用服务
-p, --profile 文本 要扫描的 AWS 配置文件名称,若未指定则使用环境变量
-t, --custom-tests 文件名 自定义测试 YAML 文件的位置。阅读文档获取更多信息
-r, --regions 文本 用于匹配区域的一系列过滤器,例如 "us"、"eu-west"、"ap-north-1"
--help 显示此帮助信息并退出。
--region 和 --service 支持多个参数,但每次使用时都必须提供标志,例如 cloudprivs aws -r us -r eu -s ec2 -s lambda。我也不喜欢这样,但这是 Click 的一个限制,我目前尚未找到变通方法。
请注意,
region标志支持部分匹配,最常用的参数是-r us -r eu,仅覆盖常见区域。
结果按区域分组显示,每行包含一个测试用例及其测试结果。
如果工具在测试过程中遇到意外错误,错误信息会实时输出到 stderr,这可能会打断输出流。如果不想看到这些信息,可以重定向 stderr。
与其他需要手动编写每个测试用例的工具(如 WeirdAAL)不同,CloudPrivs 直接查询 Boto3 SDK 来动态生成所有可用服务以及每个服务的所有可用区域列表。
生成完整列表后,默认情况下会不带参数调用每个函数,但也支持为每个操作添加自定义参数(更多信息见#自定义)。
注意:某些 AWS 函数被调用时可能会产生费用。我仅允许以
get_、list_和describe_开头的操作,以降低意外成本的风险。这在我的测试中似乎是安全的,但请谨慎使用。其他工具(如 enumerate-iam)也采用了类似做法,但我不能保证调用所有这些函数(即使不带参数)不会意外产生费用。
CloudPrivs 支持在两个方面轻松扩展/自定义:
实现一个新的提供商(例如 GCP)很简单:
CloudPrivs/providers 文件夹下,为你的提供商创建一个新文件夹(例如 gcp)。CloudPrivs/providers/__init__.py 文件中,将你的提供商添加到 __all__ 变量中,名称必须与文件夹名一致。cli.py 的文件。cli(请参考 AWS 提供商)。cloudprivs <提供商> 现在应显示你的 CLI。AWS 提供商支持在调用 AWS 函数时注入参数。提供此功能是因为 AWS 函数通常需要参数才能调用,而且这些参数有时可以是固定变量。这意味着如果我们能提供虚拟变量,就可以增加测试覆盖率。在其他情况下,我们可以注入像 dryrun=true 这样的参数来加快调用速度。
自定义测试存储在位于 cloudprivs/providers/aws/CustomTests.yaml 的 YAML 文件中。
YAML 的结构如下:
---
<服务名称>:
- <函数名称>:
args:
- <参数1>
- <参数2>
kwargs:
arg1: val1
arg2: val2
注意:函数名称支持部分匹配,这意味着你可以使用像
describe_这样的函数名称,指定的参数将注入到所有包含describe_的函数中。规则按“最先找到”原则匹配,因此如果要覆盖通用规则,请将更具体的规则放在通用规则的上方。例如:
ec2:
- describe_instances
args:
kwargs:
DryRun: True
NoPaginate: True
- describe_
args:
kwargs:
DryRun: True
可以通过修改现有的 CustomTests.yaml 文件或创建一个新的 YAML 文件并使用 --custom-tests 标志指定它来添加新规则。新文件将与现有的测试文件合并,重复值将被覆盖,提供的文件优先。
AWS 提供商作为一个库编写,以便集成到其他工具中。可以按如下方式使用:
import boto3
from cloudprivs.providers.aws import service
from concurrent.futures import ThreadPoolExecutor
session = boto3.Session('default')
with ThreadPoolExecutor(15) as executor:
iam = service.Service('iam', session, executor=executor)
scan_results = iam.scan() # 将覆盖 executor 中列出的所有区域(默认是所有可用区域)
formatted_results = iam.pretty_print_scan(scan_results)
print(formatted_results)
所有内容均在代码中完整记录,应该很容易理解。
该工具功能可用,但远未完成。我正在积极开发新功能,并欢迎贡献。请随时提出 Issue/功能请求,并发送 PR。
计划中的功能