CloudGoat is Rhino Security Labs' "Vulnerable by Design" AWS deployment tool
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 5 个月前 | ||
| 5 个月前 | ||
| 1 年前 | ||
| 5 个月前 | ||
| 5 个月前 | ||
| 7 年前 | ||
| 5 个月前 | ||
| 6 年前 | ||
| 5 个月前 | ||
| 5 个月前 |
CloudGoat (☁️🐐)
CloudGoat 是 Rhino Security Labs 推出的“设计即漏洞”云部署工具。
快速参考
-
获取帮助的途径: Rhino Security Labs Discord,或 Stack Overflow
-
提交问题的位置: https://github.com/RhinoSecurityLabs/cloudgoat/issues
-
维护者: CloudGoat 社区
CloudGoat 2.0 现已发布!
CloudGoat 是 Rhino Security Labs 推出的“设计即脆弱”云部署工具。它允许您通过创建和完成多个“夺旗”风格的场景来磨练您的云网络安全技能。每个场景都由云资源组合而成,旨在提供结构化的学习体验。有些场景简单,有些场景困难,许多场景还提供多种成功路径。作为攻击者,您的任务是探索环境、识别漏洞并通过漏洞利用达成场景目标。
以下是我们开发 CloudGoat 的主要目标:
- 专注、精选、高质量的学习体验 - CloudGoat 的每个场景都应提供实验、探索和培养实际云安全技能的机会。
- 完善的文档 - 我们已尽最大努力确保 CloudGoat 的场景文档详尽,并且在难度、内容、结构和所需技能方面易于理解和评估。
- 易于安装和使用 - 我们明白 CloudGoat 是实现学习和练习云安全渗透测试目标的一种手段。因此,我们致力于保持工具的简单、直观和可靠。
- 模块化 - 每个场景都是一个独立的学习环境,具有明确的目标(或一组目标),CloudGoat 能够独立启动、重置或关闭每个场景。
- 可扩展性 - CloudGoat 的核心组件(python 应用程序和场景)设计为允许我们或社区轻松且独立地进行扩展。
在继续之前,请注意以下警告!
警告 #1: CloudGoat 会在您的账户中创建故意设计的易受攻击资源。请勿在生产环境中或任何敏感资源旁边部署 CloudGoat。
警告 #2: CloudGoat 只能管理它创建的资源。如果您在场景过程中自行创建了任何资源,应在运行
destroy命令之前手动删除它们。
要求
- Linux 或 macOS。Windows 未获得官方支持。
- 参数自动补全功能需要 bash 4.2 或更高版本(Linux 系统,或 macOS 系统,可能需要额外配置)。
- 需要 Python 3.9 或更高版本。
- Terraform 1.5.0 或更高版本已安装并添加至环境变量 $PATH。
- AWS CLI已安装并添加至环境变量 $PATH,以及拥有足够权限创建和销毁资源的 AWS 账户。
- AZ CLI已安装并添加至环境变量 $PATH,以及拥有足够权限创建和销毁资源的 Azure 账户。
- jq
Linux
sudo apt install terraform awscli azure-cli jq -y
Mac
brew install terraform awscli azure-cli jq
快速开始
要安装 CloudGoat,请确保您的系统满足上述要求,然后运行以下命令:
pipx install cloudgoat
你可能还需要运行一些快速配置命令——这将为你节省后续的时间:
为 AWS 进行配置——告知 CloudGoat 使用哪个 AWS 配置文件。
cloudgoat config aws
为 Azure 进行配置 - 告知 CloudGoat 使用哪个 Azure 订阅。
cloudgoat config azure
登录 Azure - CloudGoat 使用活跃的 az 账户。
az login
配置白名单
cloudgoat config whitelist --auto
现在,在您的命令下,CloudGoat 可以通过 create 命令在云中创建一个场景实例。当环境准备就绪时,项目根目录下会创建一个新文件夹,该文件夹以场景名称命名,并附加一个唯一的场景 ID。此文件夹内会有一个名为 start.txt 的文件,其中包含您开始场景所需的所有资源,这些资源在 create 命令完成时也会打印到您的控制台。有时还会创建一个名为 cloudgoat/cloudgoat.pub 的 SSH 密钥对。
注意: 不要删除或修改场景实例文件夹及其内部文件,这可能会导致 CloudGoat 无法管理您场景的资源。
在您进行场景操作时,如果需要指导,可以随时参考场景的 readme 文件。如果遇到困难,每条路线的演练底部都链接了 cheat sheet。
当您完成场景后,请删除您自己创建的所有资源(请记住:CloudGoat 只能管理它自己创建的资源),然后运行 destroy 命令。之后,最好快速查看一下您的 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
可用场景
(按难度分组)
简单
iam_enum_basics(简单)
cloudgoat create iam_enum_basics
在此场景中,您将从一个名为 Bob 的低权限 IAM 用户的访问密钥开始。您的任务是使用 AWS CLI 执行全面的 IAM 枚举。通过调查托管策略、内联策略、组成员资格和可扮演角色,您将发现五个不同的 flag。
由 Tyler Ramsbey 贡献
data_secrets(简单)
cloudgoat create data_secrets
在此场景中,您将以一个具有有限权限的 IAM 用户身份开始。您的任务是识别一个在其用户数据中泄露凭据的配置错误的 EC2 实例,从而获得 SSH 访问权限。之后,您必须通过利用实例元数据服务(IMDS)窃取角色,枚举 Lambda 函数以查找隐藏的环境变量,并最终入侵一个有权访问场景目标(存储在 AWS Secrets Manager 中的密钥)的用户。
由 Tyler Ramsbey 贡献
beanstalk_secrets(简单)
cloudgoat create beanstalk_secrets
在此场景中,为您提供了低权限的 AWS 凭据,这些凭据仅授予对 Elastic Beanstalk 的有限访问权限。您的任务是枚举 Elastic Beanstalk 环境,并发现包含次要凭据的配置错误的环境变量。使用这些次要凭据,您可以枚举 IAM 权限,最终为管理员用户创建访问密钥。借助这些管理员权限,您可以检索存储在 AWS Secrets Manager 中的最终 flag。
由 Tyler Ramsbey 贡献
sns_secrets(简单)
cloudgoat create sns_secrets
在此场景中,您将以对 AWS 账户的基本访问权限开始。您需要枚举自己的权限,发现一个可以订阅的 SNS 主题,检索泄露的 API 密钥,最后使用该 API 密钥访问 API Gateway 以获取最终 flag。
由 Tyler Ramsbey 贡献
iam_privesc_by_key_rotation(简单)
cloudgoat create iam_privesc_by_key_rotation
利用不安全的 IAM 权限提升访问权限。从一个管理其他用户凭证的角色开始,找出设置中的漏洞以访问“admin”角色。使用 admin 角色从 Secrets Manager 中检索标志。
由 Infrasec.sh 提供
iam_privesc_by_rollback(简单)
cloudgoat create iam_privesc_by_rollback
从一个权限高度受限的 IAM 用户开始,攻击者能够查看以前的 IAM 策略版本并恢复一个允许完全管理员权限的版本,从而实现权限提升攻击。
lambda_privesc(简单)
cloudgoat create lambda_privesc
以 IAM 用户 Chris 的身份开始,攻击者发现他们可以承担一个具有完整 Lambda 访问权限和传递角色权限的角色。然后,攻击者可以使用这些新权限执行权限提升,以获得完整的管理员权限。
注意: 此场景可能需要您创建一些 AWS 资源,由于 CloudGoat 只能管理其创建的资源,因此在运行
./cloudgoat destroy之前,您应该手动删除这些资源。
sqs_flag_shop(简单)
cloudgoat create sqs_flag_shop
首先,从可以购买 FLAG 的 SHOP 页面开始。该网站有多个页面,并且您可以看到源代码已暴露。攻击者通过分析代码发现漏洞,并利用其权限购买 FLAG。
中等
static(中等)
cloudgoat create static
在此场景中,您扮演一名访问企业门户的外部攻击者。通过分析 Web 应用程序,您发现它从公共 S3 存储桶加载关键 JavaScript 库。您必须发现存储桶权限中的配置错误,通过覆盖库植入恶意代码来执行“供应链攻击”,并等待内部管理员机器人登录。您的目标是捕获机器人的凭证并将其泄露回存储桶。
vulnerable_cognito(中等)
cloudgoat create vulnerable_cognito
在此场景中,您将看到一个注册和登录页面,后端使用 AWS Cognito。您需要绕过限制并利用 Amazon Cognito 中的配置错误,以提升权限并获取 Cognito 身份池凭证。
由 TrustOnCloud 贡献
vulnerable_lambda(中等)
cloudgoat create vulnerable_lambda
在此场景中,您以“bilbo”用户身份开始。您将承担一个拥有更多权限的角色,发现一个为用户应用策略的 lambda 函数,并利用该函数中的漏洞来提升 bilbo 用户的权限,以便搜索密钥。
cloud_breach_s3(中等)
cloudgoat create cloud_breach_s3
以一名没有任何访问权限或特权的匿名外部人员身份开始,利用配置错误的反向代理服务器查询 EC2 元数据服务并获取实例配置文件密钥。然后,使用这些密钥发现、访问并从 S3 存储桶中窃取敏感数据。
iam_privesc_by_attachment(中等)
cloudgoat create iam_privesc_by_attachment
从一组非常有限的权限开始,攻击者能够利用实例配置文件附加权限创建一个拥有比自身权限高得多的新 EC2 实例。通过访问这个新的 EC2 实例,攻击者获得目标账户内的完全管理权限,并能够完成场景目标——删除 cg-super-critical-security-server,为进一步的恶意行为铺平道路。
注意: 此场景可能需要您创建一些 AWS 资源,由于 CloudGoat 只能管理其创建的资源,因此在运行
./cloudgoat destroy之前,您应手动删除这些资源。
ec2_ssrf(中等)
cloudgoat create ec2_ssrf
攻击者以 IAM 用户 Solus 身份开始,发现自己对某个 Lambda 函数拥有只读权限。该函数中硬编码的密钥引导他们找到了一台运行易受服务器端请求伪造(SSRF)攻击的 Web 应用程序的 EC2 实例。利用该易受攻击的应用程序并从 EC2 元数据服务获取密钥后,攻击者获得了对一个私有 S3 存储桶的访问权限,其中包含的一组密钥允许他们调用 Lambda 函数并完成该场景。
ecs_takeover(中等)
cloudgoat create ecs_takeover
攻击者从访问外部网站开始,需要找到远程代码执行漏洞。通过利用远程代码执行漏洞,攻击者可以访问网站容器可用的资源。通过滥用多项 ECS 错误配置,攻击者获得 IAM 权限,这些权限允许他们迫使 ECS 将目标容器重新调度到已被攻陷的实例上。
rds_snapshot(中等)
cloudgoat create rds_snapshot
在此场景中,我们以用户“David”身份开始。通过 David,你可以利用权限窃取凭证。 利用窃取的凭证,攻击者可以利用 RDS 漏洞访问数据库并检索标记。
注意: 此场景可能需要你创建一些 AWS 资源,由于 CloudGoat 只能管理其创建的资源,因此在运行
./cloudgoat destroy之前,你应手动删除这些资源。
glue_privesc(中等)
cloudgoat create glue_privesc
此场景从一个上传 CSV 文件并通过 Glue 服务执行数据可视化的网页开始。 攻击者通过 SQL 注入攻击窃取网页上存在的凭证,并上传反向 shell 以创建 Glue Job 来获取密钥字符串。
注意: 此场景可能需要你创建一些 AWS 资源,由于 CloudGoat 只能管理其创建的资源,因此在运行
./cloudgoat destroy之前,你应手动删除这些资源。
agentcore_identity_confusion(中等)
cloudgoat create agentcore_identity_confusion
在此场景中,为您提供了可管理bedrock agentcore代码解释器的AWS凭证。您的任务是利用这一点来访问其他agentcore运行时代理所使用的敏感数据。想办法获取存储在bedrock知识库中的flag。
注意: 此场景可能需要您创建一些AWS资源,由于CloudGoat只能管理其创建的资源,因此在运行
./cloudgoat destroy之前,您应手动删除这些资源。
由Sonrai Security提供
bedrock_agent_hijacking(中等)
cloudgoat create bedrock_agent_hijacking
在此场景中,为您提供了可调用Bedrock Agent并更新lambda函数的AWS凭证。您的任务是分析该代理并了解其如何访问实时信息。利用此流程定位并提取存储在S3中的flag。
由Sonrai Security提供
困难
rce_web_app(困难)
cloudgoat create rce_web_app
攻击者以IAM用户Lara身份开始,探索负载均衡器和S3存储桶以寻找漏洞线索,进而对易受攻击的Web应用实施RCE(远程代码执行)漏洞利用,从而获取机密文件,并最终访问场景目标:一个高度安全的RDS数据库实例。
或者,攻击者可能以IAM用户McDuck身份开始,枚举S3存储桶,最终找到SSH密钥,通过该密钥直接访问EC2服务器及更深处的数据库。
codebuild_secrets(困难)
cloudgoat create codebuild_secrets
攻击者以IAM用户Solo身份开始,首先枚举和探索CodeBuild项目,在其中发现IAM用户Calrissian的未受保护IAM密钥。然后以Calrissian身份操作,发现一个RDS数据库。由于无法直接访问数据库内容,攻击者可以巧妙利用RDS快照功能来获取场景目标:一对秘密字符串。
或者,攻击者可能探索SSM参数并找到EC2实例的SSH密钥。利用元数据服务,攻击者可以获取EC2实例配置文件的密钥,并深入目标环境,最终通过更迂回的路线访问原始数据库及其中的场景目标(一对秘密字符串)。
注意: 此场景可能需要您创建一些AWS资源,由于CloudGoat只能管理其创建的资源,因此在运行
./cloudgoat destroy之前,您应手动删除这些资源。
detection_evasion(困难)
cloudgoat create detection_evasion
本场景的目标是在不被检测到的情况下读取两个密钥的值。这两个密钥均存储在 Secrets Manager 中,其值格式如下(cg-secret-XXXXXX-XXXXXX)。
本场景与其他 CloudGoat 场景有显著区别。在 detection_evasion 中,你的目标会更清晰地呈现,挑战在于在不触发警报的前提下完成这些目标。此场景的设置步骤较多,完成所需时间也更长(你可能需要多次尝试)。
ecs_efs_attack(困难)
cloudgoat create ecs_efs_attack
从获取对“ruse” EC2 的访问权限开始,用户利用实例配置文件对正在运行的 ECS 容器植入后门。通过植入后门的容器,攻击者可以从容器元数据 API 中获取凭证。这些凭证允许攻击者在任何设置了适当标签的 EC2 上启动会话。攻击者利用其权限更改 Admin EC2 上的标签并启动会话。进入 Admin EC2 后,攻击者将对子网进行端口扫描,以寻找可挂载的开放 EFS。挂载成功后,攻击者即可从弹性文件系统中获取 flag。
ecs_privesc_evade_protection(中等)
cloudgoat create ecs_privesc_evade_protection
用户首先通过一个正常运行的 Web 服务访问 EC2 内部的容器。攻击者可利用 Web 服务漏洞从 EC2 的元数据 API 中获取凭证,或控制该容器。此凭证允许攻击者启动一个具有特定角色的新容器并对其进行控制。基于此操作进行权限提升,并读取 S3 中的 FLAG。
注意: 本场景要求在本地安装 Docker,因为在部署过程中需要构建容器镜像并推送到 ECR。
secrets_in_the_cloud(困难)
cloudgoat create secrets_in_the_cloud
作为一名权限有限的IAM用户,攻击者首先通过检查AWS资源来寻找线索和隐藏信息。经过一番调查,最终获取到一个角色,该角色能够访问场景的主要目标:从Secrets Manager中检索最终密钥。
使用指南
CloudGoat命令的基本结构如下:
cloudgoat [ 命令 ] [ 子命令 ] [ --参数名称 ] [ 参数值 ]
以下是CloudGoat的五个主要命令概述:
create
create [ scenario-name ] 会将场景部署到您选择的AWS账户中。如果您愿意,也可以对现有场景运行 create 命令——CloudGoat 会直接销毁并重新创建指定的场景。
提示: 您可以在名称中使用
/scenarios,这样就可以利用 bash 的原生制表符补全功能。
请注意,出于安全考虑,--profile 是必需的——我们不希望任何人意外地将 CloudGoat 场景部署到生产环境中——并且 CloudGoat 不会使用系统的“默认”AWS CLI 配置文件或通过环境变量指定为默认的配置文件。不过,您可以通过 config aws 进行设置,以避免每次都需要提供该参数。
list
list 命令用于显示 all(所有)、undeployed(未部署)或 deployed(已部署)场景的一些信息,甚至可以显示已部署的 [ scenario-name ](场景名称)的详细信息。您还可以按云平台筛选场景:list aws 或 list azure。
destroy
destroy 命令会关闭并删除 [ scenario-name ](场景名称)的云资源,然后将场景实例文件夹移动到 ./trash 目录——以防您需要恢复 Terraform 状态文件或其他场景文件。您也可以指定 all 而非具体场景名称,以销毁所有活动场景。
提示: CloudGoat 只能管理其创建的资源。如果您在场景过程中自行创建了任何资源,应在运行
destroy命令之前手动将其删除。
配置
config 命令允许您管理 CloudGoat 安装的各个方面,特别是 IP 白名单、默认 AWS 配置文件 以及通过 argcomplete 实现的选项卡补全功能。下面简要介绍每个子命令的作用。
白名单
CloudGoat 需要知道在云端部署存在潜在漏洞的资源时,哪些 IP 地址应被列入白名单,这些 IP 地址会记录在项目根目录下的 ./whitelist.txt 文件中。您提供的白名单 IP 地址不一定必须是 CIDR 格式,但 CloudGoat 会为您提供的任何独立 IP 地址自动添加 /32。您也可以选择添加 --auto 参数,CloudGoat 将自动通过 curl 访问 ifconfig.co 发送网络请求来获取您的 IP 地址,并使用该结果创建白名单文件。
AWS
CloudGoat 永远不会使用系统的“默认”AWS CLI 配置文件或通过环境变量指定为默认的配置文件,但您可以使用 config aws 命令指示 CloudGoat 按名称使用特定的 AWS 配置文件。这将提示您输入配置文件名称并将其保存在项目根目录下的 config.yml 文件中。只要该文件存在,CloudGoat 就会在执行创建和销毁命令时使用其中列出的配置文件名称,而无需 --profile 标志。您可以随时运行 config aws 命令来查看 CloudGoat 默认配置文件的名称并验证 config.yml 的格式。如果您愿意,也可以手动创建 config.yml,前提是使用正确的格式。
Azure
较新版本的 Terraform Azure 提供程序要求提供订阅 ID 才能应用资源。虽然 CloudGoat 使用与 az 工具相同的凭据配置,但必须明确告知 CloudGoat 要部署到哪个订阅。可通过 cloudgoat config azure 命令进行配置,订阅信息将与 AWS 配置一起存储在 config.yml 中。如果您愿意,也可以手动创建 config.yml,前提是使用正确的格式。
argcomplete
我们非常希望 CloudGoat 能支持原生的选项卡补全功能,但事实证明,在 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 - 从上述激活命令输出的位置获取补全脚本并执行
source命令,或重启您的 shell 会话:$ source [ /path/to/the/completion/script ]
对于无法或不希望配置 argcomplete 的用户,CloudGoat 还支持将目录路径用作场景名称,这意味着场景名称也能实现选项卡补全。只需使用 /scenario/[ scenario-name ] 或 ./[ scenarioinstance-name ],您的 shell 就会完成剩下的工作。
帮助
help 提供有关命令的上下文帮助。help 可以放在相关命令之前或之后,因此在您需要时它总能提供帮助。以下是一些示例:
cloudgoat create helpcloudgoat destroy helpcloudgoat list helpcloudgoat config help
另一个值得注意的用法:cloudgoat [场景名称] help 可用于在控制台打印由场景作者定义的场景简要摘要。
功能请求和错误报告
如果您有功能请求或错误报告,请在此提交。
对于错误,请确保包含足够详细的描述以重现您发现的错误,包括回溯信息和重现步骤,并在提交新的错误报告之前检查是否已有关于该错误的其他报告。
对于功能,基本要求相同!请在请求中明确说明,并确保其他人尚未请求相同的功能。
贡献指南
非常感谢您对 CloudGoat 的贡献。如果您想帮助改进此项目,请继续阅读。
- 创建新场景:
- 我们提供了一个场景模板,帮助您快速入门。该模板包含 CloudGoat 场景的基本结构和必要文件。您可以在此处找到场景模板。
- 创建新场景的步骤:
- 复制模板:将场景模板的内容复制到一个以您的场景命名的新目录中。
- 修改模板:将模板中的占位符内容替换为您新场景的具体内容。
- 测试场景:通过彻底测试确保您的场景按预期工作。
- 编码标准:
- 代码风格:遵循项目中现有的代码风格。保持一致性至关重要。
- 注释:在必要时为代码添加注释,以解释复杂逻辑或重要决策。
- 文档:更新 README.md 和其他相关文档,以包含有关您的新场景或更改的详细信息。
- 白名单设置:
- 创建或修改场景时,请记住以下几点:
- 白名单设置:确保安全组规则和其他访问控制配置仅将 CloudGoat 配置中的 IP 列入白名单。
- 审查:在贡献之前,仔细检查您的配置,确保没有潜在的易受攻击的公共资源(即不要创建可从互联网访问的易受攻击的 EC2 实例)。
- 创建或修改场景时,请记住以下几点:
- Python 代码风格:
- CloudGoat 中的 Python 代码通常应遵循 Python 的风格约定,最重要的是注重可读性和可维护性。
- 遵循良好的 git 实践:使用拉取请求,优先使用功能分支,始终编写清晰的提交消息。
- CloudGoat 使用
black和flake8- Python 语法和风格检查工具。提交代码之前,请确保对core/python/中的所有 Python 文件以及cloudgoat.py运行flake8和black。black的决策优先于flake8。由于普通用户不需要这些工具,它们在core/python/requirements.txt文件中已被注释掉。
- 许可:
- CloudGoat 代码应始终使用 BSD 3 条款许可。
最后,感谢您的贡献!
更新日志
- 2019年6月24日: CloudGoat 2.0 版本发布!
免责声明
CloudGoat 是一款不提供任何担保的软件。使用 CloudGoat,即表示您对由此产生的所有结果承担全部责任。
