CloudGoat(云端山羊)
CloudGoat 是 Rhino Security Labs 的"故意设计为易受攻击"的 AWS 部署工具。
快速参考
-
维护者: CloudGoat 社区
CloudGoat 2.0 现已发布!
CloudGoat 是 Rhino Security Labs 的"故意设计为易受攻击"的 AWS 部署工具。它允许您通过创建和完成多个"夺旗"式场景来磨练云网络安全技能。每个场景由 AWS 资源组合而成,创建一个结构化的学习体验。有些场景简单,有些困难,许多场景提供多种通关路径。作为攻击者,您的任务是探索环境、识别漏洞并利用它们达成场景目标。
以下是我们对 CloudGoat 的主要目标:
- 专注、精心策划、高质量的学习体验 - CloudGoat 的每个场景都应提供实验、探索和培养实践云安全技能的机会。
- 完善的文档 - 我们尽最大努力确保 CloudGoat 的场景有良好的文档,易于理解,并可以从难度、内容、结构和所需技能方面进行评估。
- 易于安装和使用 - 我们理解 CloudGoat 是达到目的的手段 - 学习和实践云安全渗透测试。因此,我们致力于保持简单、直接和可靠。
- 模块化 - 每个场景都是一个独立的学习环境,有明确的目标(或目标集),CloudGoat 能够独立启动、重置或关闭每个场景。
- 可扩展性 - CloudGoat 的核心组件(Python 应用和场景)设计为允许我们或社区轻松独立扩展。
在继续之前,请注意以下警告!
警告 #1: CloudGoat 会在您的账户中创建故意易受攻击的 AWS 资源。不要在生产环境或任何敏感的 AWS 资源旁边部署 CloudGoat。
警告 #2: CloudGoat 只能管理它创建的资源。如果您在场景过程中自行创建任何资源,应在运行
destroy
命令前手动删除它们。
要求
- Linux 或 MacOS。不官方支持 Windows。
- 参数 Tab 补全需要 bash 4.2+ (Linux,或在 OSX 上有一些困难)。
- 需要 Python3.6+。
- Terraform >= 0.14 已安装并在您的 $PATH 中。
- AWS CLI 已安装并在您的 $PATH 中,以及具有足够权限创建和销毁资源的 AWS 账户。
- jq
快速开始
要安装 CloudGoat,请确保您的系统满足上述要求,然后运行以下命令:
git clone https://github.com/RhinoSecurityLabs/cloudgoat.git
cd cloudgoat
python3 -m venv .venv
source .venv/bin/activate
pip3 install -r ./requirements.txt
chmod +x cloudgoat.py
您可能还想运行一些快速配置命令 - 这将为您节省一些时间:
$ ./cloudgoat.py config profile
$ ./cloudgoat.py config whitelist --auto
现在,您可以使用 CloudGoat 在云中 create
一个场景实例。当环境准备就绪时,项目根目录中将创建一个以场景名称命名并附加唯一场景 ID 的新文件夹。该文件夹内将有一个名为 start.txt
的文件,其中包含开始场景所需的所有资源,尽管这些信息也会在 create
命令完成时打印到控制台。有时还会创建一个名为 cloudgoat
/cloudgoat.pub
的 SSH 密钥对。
注意: 不要删除或修改场景实例文件夹或其中的文件,因为这可能会阻止 CloudGoat 管理您的场景资源。
在完成场景时,如果需要指导,可以参考场景的自述文件。如果遇到困难,每个路线的演练底部都有链接到作弊表。
完成场景后,删除您自己创建的任何资源(请记住:CloudGoat 只能管理它创建的资源),然后运行 destroy
命令。事后快速浏览一下 AWS Web 控制台总是个好主意 - 以防有什么没有被删除。
您可以在使用指南部分阅读 CloudGoat 命令的完整文档。
如何使用 CloudGoat 的 Docker 镜像
选项 1: 使用默认入口点运行
$ docker run -it rhinosecuritylabs/cloudgoat:latest
选项 2: 使用 AWS 配置和凭证运行
警告:运行此命令将在启动 Docker 容器时将您本地的 AWS 配置文件挂载到容器中。这意味着任何能访问容器的用户都将有权访问您主机计算机的 AWS 凭证。
$ docker run -it -v ~/.aws:/root/.aws/ rhinosecuritylabs/cloudgoat:latest
可用场景
vulnerable_lambda (小型 / 简单)
$ ./cloudgoat.py create vulnerable_lambda
在这个场景中,您从 'bilbo' 用户开始。您将承担一个具有更多权限的角色,发现一个应用策略到用户的 lambda 函数,并利用该函数中的漏洞来提升 bilbo 用户的权限,以便搜索机密。
vulnerable_cognito (小型 / 中等)
$ ./cloudgoat.py create vulnerable_cognito
在这个场景中,您会看到一个使用 AWS Cognito 作为后端的注册和登录页面。您需要绕过限制并利用 Amazon Cognito 中的错误配置来提升权限并获取 Cognito Identity Pool 凭证。
由 TrustOnCloud 贡献。
iam_privesc_by_key_rotation (小型 / 简单)
$ ./cloudgoat.py create iam_privesc_by_key_rotation
利用不安全的 IAM 权限来提升您的访问权限。从管理其他用户凭证的角色开始,找到设置中的弱点以访问"admin"角色。使用 admin 角色从 secretsmanager 检索标志。
由 infrasec.sh 贡献。
iam_privesc_by_rollback (小型 / 简单)
$ ./cloudgoat.py create iam_privesc_by_rollback
从一个高度受限的 IAM 用户开始,攻击者能够审查之前的 IAM 策略版本并恢复一个允许完全管理员权限的版本,从而实现权限提升漏洞。
lambda_privesc (小型 / 简单)
$ ./cloudgoat.py create lambda_privesc
从 IAM 用户 Chris 开始,攻击者发现他们可以承担一个具有完全 Lambda 访问权限和传递角色权限的角色。然后,攻击者可以使用这些新权限执行权限提升,以获得完全的管理员权限。
注意: 此场景可能要求您创建一些 AWS 资源,由于 CloudGoat 只能管理它创建的资源,您应该在运行
./cloudgoat destroy
之前手动删除这些资源。
sqs_flag_shop (小型 / 简单)
$ ./cloudgoat.py create sqs_flag_shop
首先,从可以购买 FLAG 的商店页面开始。该网站有多个页面,您可以看到源代码是公开的。攻击者分析代码以找到漏洞,并利用他们的权限购买 FLAG。 访问场景页面。
cloud_breach_s3(小型/中等)
$ ./cloudgoat.py create cloud_breach_s3
从一个没有访问权限或特权的匿名外部人员开始,利用配置错误的反向代理服务器查询EC2元数据服务并获取实例配置文件密钥。然后,使用这些密钥发现、访问并窃取S3存储桶中的敏感数据。
iam_privesc_by_attachment(中等/中等)
$ ./cloudgoat.py create iam_privesc_by_attachment
从一组非常有限的权限开始,攻击者能够利用实例配置文件附加权限创建一个权限远高于自身的新EC2实例。通过访问这个新的EC2实例,攻击者获得了目标账户内的完全管理权限,并能够完成场景目标 - 删除cg-super-critical-security-server,为进一步的恶意行动铺平道路。
注意: 此场景可能需要你创建一些AWS资源,由于CloudGoat只能管理它创建的资源,你应该在运行
./cloudgoat destroy
之前手动删除这些资源。
ec2_ssrf(中等/中等)
$ ./cloudgoat.py create ec2_ssrf
从IAM用户Solus开始,攻击者发现他们对Lambda函数有只读权限,其中硬编码的秘密信息引导他们到一个运行着易受服务器端请求伪造(SSRF)攻击的Web应用程序的EC2实例。在利用易受攻击的应用程序并从EC2元数据服务获取密钥后,攻击者获得了对私有S3存储桶的访问权限,其中包含一组允许他们调用Lambda函数并完成场景的密钥。
ecs_takeover(中等/中等)
$ ./cloudgoat.py create ecs_takeover
从访问外部网站开始,攻击者需要找到一个远程代码执行漏洞。通过使用RCE,攻击者可以获取网站容器可用的资源访问权限。利用几个ECS配置错误,攻击者获得了允许他们强制ECS将目标容器重新调度到受损实例的IAM权限。
rds_snapshot(中等/中等)
$ ./cloudgoat.py Create rds_snapshot
在这个场景中,我们从用户"David"开始。通过David,你可以利用权限窃取凭证。使用窃取的凭证,攻击者可以利用RDS漏洞访问数据库并检索标志。
注意: 此场景可能需要你创建一些AWS资源,由于CloudGoat只能管理它创建的资源,你应该在运行
./cloudgoat destroy
之前手动删除这些资源。
rce_web_app(中等/困难)
$ ./cloudgoat.py create rce_web_app
从IAM用户Lara开始,攻击者探索负载均衡器和S3存储桶寻找漏洞线索,导致在易受攻击的Web应用程序上进行RCE攻击,暴露机密文件,最终访问场景的目标:一个高度安全的RDS数据库实例。
或者,攻击者可以从IAM用户McDuck开始,枚举S3存储桶,最终找到SSH密钥,直接访问EC2服务器和后面的数据库。
codebuild_secrets(大型/困难)
$ ./cloudgoat.py create codebuild_secrets
从IAM用户Solo开始,攻击者首先枚举和探索CodeBuild项目,在其中找到IAM用户Calrissian的不安全IAM密钥。然后作为Calrissian操作,攻击者发现了一个RDS数据库。无法直接访问数据库的内容,攻击者可以巧妙地使用RDS快照功能来获取场景的目标:一对秘密字符串。
或者,攻击者可以探索SSM参数并找到EC2实例的SSH密钥。使用元数据服务,攻击者可以获取EC2实例配置文件的密钥,并更深入地进入目标环境,最终通过更迂回的路线访问原始数据库和其中的场景目标(一对秘密字符串)。
注意: 此场景可能需要你创建一些AWS资源,由于CloudGoat只能管理它创建的资源,你应该在运行
./cloudgoat destroy
之前手动删除这些资源。
cicd(中等/中等)
$ ./cloudgoat.py create cicd
FooCorp是一家提供公共API的公司。FooCorp的客户每分钟都会向API提交敏感数据。该API作为Lambda函数实现,通过API网关暴露。由于FooCorp实施了DevOps,它有一个持续部署管道,可以在几分钟内自动将Lambda函数的新版本从源代码部署到生产环境。
你的目标:窃取FooCorp客户提交的敏感数据!
由Datadog贡献。
detection_evasion(中等/困难)
$ ./cloudgoat.py create detection_evasion
这个场景的目标是在不被检测到的情况下读取两个秘密的值。这两个秘密都存储在Secrets Manager中,它们的值格式如下(cg-secret-XXXXXX-XXXXXX)。
这个场景与其他CloudGoat场景有显著不同。在detection_evasion中,你的目标会更清晰地列出,挑战在于在不触发警报的情况下完成它们。这个场景涉及更多的设置,需要更长的时间来玩(你可能想/需要多次尝试)。
ecs_efs_attack(大型/困难)
$ ./cloudgoat.py create ecs_efs_attack
从访问"ruse" EC2开始,用户利用实例配置文件后门入侵运行中的ECS容器。使用被入侵的容器,攻击者可以从容器元数据API中检索凭证。这些凭证允许攻击者在任何设置了适当标签的EC2上启动会话。攻击者使用他们的权限更改Admin EC2的标签并启动会话。一旦进入Admin EC2,攻击者将扫描子网以寻找开放的EFS进行挂载。一旦挂载,攻击者就可以从弹性文件系统中检索标志。
glue_privesc(大型/中等)
$ ./cloudgoat.py create glue_privesc
这个场景从一个上传CSV文件并通过Glue服务执行数据可视化的网页开始。 攻击者通过SQL注入攻击窃取网页上存在的凭证,并上传一个反向shell来创建Glue Job以获取秘密字符串。
注意: 此场景可能需要你创建一些AWS资源,由于CloudGoat只能管理它创建的资源,你应该在运行
./cloudgoat destroy
之前手动删除这些资源。
使用指南
CloudGoat命令的基本结构如下:
$ ./cloudgoat.py [ 命令 ] [ 子命令 ] [ --参数名 ] [ 参数值 ]
CloudGoat的五个主要命令概述如下:
create
create [ 场景名 ]
将场景部署到你选择的AWS账户。你也可以对现有场景运行create
- CloudGoat将简单地销毁并重新创建指定的场景。
提示: 你可以在名称中使用
/scenarios
,这允许bash的原生tab补全。
请注意,出于安全原因,--profile
是必需的 - 我们不希望有人意外地将CloudGoat场景部署到生产环境中 - CloudGoat不会使用系统的"默认"AWS CLI配置文件或通过环境变量指定为默认的配置文件。但是,你可以通过config profile
设置它,以避免每次都必须提供。
list
list
显示有关all
、undeployed
或deployed
场景的一些信息,或者甚至显示已部署的[ 场景名 ]
的大量信息。
destroy
destroy
关闭并删除[ 场景名 ]
的云资源,然后将场景实例文件夹移动到./trash
- 以防你需要恢复Terraform状态文件或其他场景文件。你也可以指定all
而不是场景名来销毁所有活跃的场景。
提示: CloudGoat只能管理它创建的资源。如果你在场景过程中自己创建了任何资源,你应该在运行
destroy
命令之前手动删除它们。
配置
config
允许您管理 CloudGoat 安装的各个方面,特别是 IP 白名单
、默认的 AWS 配置文件
以及通过 argcomplete
实现的 Tab 自动补全。值得简要描述一下每个子命令的功能。
白名单
CloudGoat 需要知道在云中部署潜在易受攻击的资源时应该将哪些 IP 地址列入白名单,这些 IP 地址会被记录在项目根目录下的 ./whitelist.txt
文件中。您提供的用于白名单的 IP 地址不一定要是 CIDR 格式,但 CloudGoat 会为您提供的任何单独 IP 地址添加 /32
。您也可以添加 --auto
参数,CloudGoat 将自动使用 curl 向 ifconfig.co 发送网络请求以获取您的 IP 地址,然后用结果创建白名单文件。
配置文件
虽然 CloudGoat 永远不会使用系统的"默认" AWS CLI 配置文件或通过环境变量指定的默认配置文件,但您可以使用 config profile
命令指示 CloudGoat 使用特定名称的 AWS 配置文件。这将提示您输入并保存配置文件名称到项目根目录下的 config.yml
文件中。只要该文件存在,CloudGoat 就会使用其中列出的配置文件名来执行创建和销毁命令,而不需要 --profile
标志。您可以随时运行 config profile
命令来查看 CloudGoat 默认配置文件的名称并验证 config.yml
的格式。如果您愿意,也可以手动创建 config.yml
,只要使用正确的格式即可。
argcomplete
我们真的希望 CloudGoat 能有原生的 Tab 自动补全功能,但事实证明在 REPL 之外实现这一点有些困难。对于 Linux 用户来说,这应该可以正常工作,对于那些勇于将 bash 版本升级到 4.2+ 的 OSX 用户来说也是如此。CloudGoat 确实包含并支持 Python 库 "argcomplete"。下面简要概述了如何安装 argcomplete,但如需更详细的步骤,您应该参考该库 GitHub 页面 上的官方文档。
- 使用 CloudGoat 的 requirements.txt 文件安装 argcomplete Python 包:
$ pip3 install -r core/python/requirements.txt
- 在 bash 中,运行 argcomplete 包提供的全局 Python 参数补全脚本:
$ activate-global-python-argcomplete
- 在上一个激活命令打印的位置处引用补全脚本,或重启您的 shell 会话:
$ source [ /path/to/the/completion/script ]
对于那些无法或不希望配置 argcomplete 的用户,CloudGoat 还支持使用目录路径作为场景名称,这意味着场景名称的 Tab 补全将正常工作。只需使用 /scenario/[ scenario-name ]
或 ./[ scenarioinstance-name ]
,您的 shell 就会完成剩下的工作。
帮助
help
提供关于命令的上下文帮助。help
可以在相关命令之前或之后使用,所以在您需要时随时可用。以下是一些示例:
$ ./cloudgoat.py create help
$ ./cloudgoat.py destroy help
$ ./cloudgoat.py list help
$ ./cloudgoat.py config help
另一个值得注意的用法:$ ./cloudgoat.py [ scenario-name ] help
可用于在控制台打印场景的简要摘要,该摘要由场景作者定义。
功能请求和错误报告
如果您有功能请求或需要报告错误,请在此提交。
对于错误,请确保包含足够的描述以重现您发现的错误,包括回溯和复现步骤,并在提交新的错误报告之前检查是否有其他人报告了相同的错误。
对于功能,同样适用!请在您的请求中具体说明,并确保没有其他人已经请求了相同的功能。
贡献指南
我们非常感谢对 CloudGoat 的贡献。如果您想帮助改进这个项目,请继续阅读。
- CloudGoat 中的 Python 代码通常应遵循 Python 的风格约定,首要考虑可读性和可维护性。
- 遵循良好的 git 实践:使用拉取请求,优先使用功能分支,始终写清晰的提交消息。
- CloudGoat 使用
black
和flake8
- Python 语法和风格检查工具 - 如果您要提交 CloudGoat 的代码,请确保首先在core/python/
目录下的所有 Python 文件和cloudgoat.py
上运行flake8
,然后运行black
。black
的决定优先于flake8
。这两个工具都在core/python/requirements.txt
文件中被注释掉了,因为普通用户不需要它们。 - CloudGoat 代码应始终使用 BSD 3-clause 许可证。
最后,感谢您的贡献!
更新日志
- 2019年6月24日: CloudGoat 2.0 发布!
免责声明
CloudGoat 是一款不附带任何担保的软件。使用 CloudGoat 即表示您对使用它所产生的任何和所有结果承担全部责任。