RhinoSecurityLabs/cloudgoat
GitHub: RhinoSecurityLabs/cloudgoat
CloudGoat是一款由Rhino Security Labs开发的「天生易受攻击」云靶场部署工具,通过在AWS和Azure上创建CTF风格的实战场景,帮助安全从业者学习和练习云安全渗透测试技术。
Stars: 3584 | Forks: 747
# CloudGoat (☁️🐐)
[](https://rhinosecuritylabs.com) [](https://github.com/RhinoSecurityLabs/cloudgoat) [](https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/LICENSE) [](https://github.com/RhinoSecurityLabs/cloudgoat/pulls)
_CloudGoat 是 Rhino Security Labs 的“天生易受攻击”云部署工具。_
## 使用指南
CloudGoat 命令的基本解剖结构如下:
CloudGoat 中的五个主要命令总结如下:
### 创建
`create [ scenario-name ]` 将场景部署到你选择的 AWS 账户中。你也可以对现有场景运行 `create`——CloudGoat 会简单地销毁并重新创建指定的场景。
请注意,出于安全原因,`--profile` 是必需的——我们不希望任何人意外地将 CloudGoat 场景部署到生产环境中——并且 CloudGoat 不会使用系统的“default”AWS CLI 配置文件或通过环境变量指定为默认值的配置文件。但是,你可以通过 `config aws` 进行设置,以避免每次都提供它。
### 列表
`list` 显示有关 `all`(所有)、`undeployed`(未部署)或 `deployed`(已部署)场景的一些信息,甚至显示有关已部署的 `[ scenario-name ]` 的大量信息。你还可以按云平台过滤场景:`list aws` 或 `list azure`。
### 销毁
`destroy` 关闭并删除 `[ scenario-name ]` 的云资源,然后将场景实例文件夹移动到 `./trash`——以防你需要恢复 Terraform 状态文件或其他场景文件。你也可以指定 `all` 而不是场景名称来销毁所有活动场景。
### config
`config` 允许你管理 CloudGoat 安装的各个方面,特别是 IP `whitelist`(白名单)、你默认的 AWS `profile` 以及通过 `argcomplete` 实现的 Tab 补全。这里简要介绍一下每个子命令的作用。
#### 白名单
CloudGoat 需要知道在云中部署潜在易受攻击的资源时应将哪些 IP 地址列入白名单,并且这些 IP 会在项目根目录下的 `./whitelist.txt` 文件中进行跟踪。你提供的用于白名单的 IP 地址不必是 CIDR 格式,但 CloudGoat 会为你提供的任何裸 IP 添加 `/32`。或者,你可以添加 `--auto` 参数,CloudGoat 将自动发出网络请求(使用 curl 访问 ifconfig.co 以查找你的 IP 地址),然后使用该结果创建白名单文件。
#### aws
虽然 CloudGoat 永远不会使用系统的“default”AWS CLI 配置文件或通过环境变量指定为默认值的配置文件,但你可以使用 `config aws` 命令指示 CloudGoat 按名称使用特定的 AWS 配置文件。这将提示并在项目根目录的 `config.yml` 文件中保存你的配置文件名称。只要该文件存在,CloudGoat 就会将其中的配置文件名称用于 create 和 destroy 命令,而不需要 `--profile` 标志。你可以随时运行 `config aws` 命令以查看你的 CloudGoat 默认配置文件的名称并验证 `config.yml` 的格式。如果你愿意,也可以手动创建 `config.yml`,前提是你使用了正确的格式。
#### azure
较新版本的 Azure Terraform provider 需要 subscription ID 才能应用资源。虽然 CloudGoat 使用与 `az` 工具相同的凭证配置,但必须明确告诉 CloudGoat 要部署到哪个订阅。配置通过 `cloudgoat config azure` 完成,订阅存储在 `config.yml` 中,与 AWS 配置放在一起。如果你愿意,也可以手动创建 `config.yml`,前提是你使用了正确的格式。
#### argcomplete
我们非常希望在 CloudGoat 中拥有原生的 Tab 补全功能,但事实证明在 REPL 之外实现这一点有些困难。它对 Linux 用户来说应该能相当好地工作,对于那些勇于想办法将 bash 版本升级到 4.2+ 的 OSX 用户也是如此。CloudGoat 确实包含并支持 [Python 库 "argcomplete"](https://github.com/kislyuk/argcomplete)。下面简要介绍了如何安装 argcomplete,不过有关更详细的步骤,你应该参考该库 [github 页面](https://github.com/kislyuk/argcomplete) 上的官方文档。
1. 使用 CloudGoat 的 requirements.txt 文件安装 argcomplete Python 包:`$ pip3 install -r core/python/requirements.txt`
2. 在 bash 中,运行由 argcomplete 包提供的全局 Python 参数补全脚本:`$ activate-global-python-argcomplete`
3. 在先前激活命令打印出的路径下执行(source)补全脚本,或者重新启动你的 shell 会话:`$ source [ /path/to/the/completion/script ]`
对于那些无法或不想配置 argcomplete 的人,CloudGoat 也支持使用目录路径作为场景名称,这意味着 Tab 补全将对场景名称生效。只需使用 `/scenario/[ scenario-name ]` 或 `./[ scenarioinstance-name ]`,你的 shell 就会自动完成剩下的工作。
### 帮助
`help` 提供有关命令的上下文帮助。`help` 可以放在相关命令之前或之后,因此当你需要时它总是触手可及。以下是一些示例:
* `cloudgoat create help`
* `cloudgoat destroy help`
* `cloudgoat list help`
* `cloudgoat config help`
另一个值得注意的用法:可以使用 `cloudgoat [ scenario-name ] help` 将场景作者定义的简短摘要打印到控制台。
## 功能请求与错误报告
如果你有功能请求或需要报告 Bug,请[在此处提交](https://github.com/RhinoSecurityLabs/cloudgoat/issues/new)。
对于 Bug,请确保包含足以复现你发现的 Bug 的描述,包括 tracebacks 和复现步骤,并在提交新的 Bug 报告之前检查是否已有其他人报告过相同的 Bug。
对于功能请求,也同理!请在请求中尽量具体,并确保没有其他人已经请求过相同的功能。
## 贡献指南
我们非常感谢对 CloudGoat 的贡献。如果你希望帮助改进项目,请继续阅读。
1. **创建新场景**:
- 我们提供了一个场景模板来帮助你快速入门。该模板包含 CloudGoat 场景的基本结构和必要文件。你可以[在此处](/scenarios/scenario_template)找到场景模板。
- **创建新场景的步骤**:
- **复制模板**:将场景模板的内容复制到一个以你的场景命名的新目录中。
- **修改模板**:用你的新场景的具体内容替换模板中的占位符内容。
- **测试场景**:通过彻底测试来确保你的场景按预期工作。
2. **编码标准**:
- **代码风格**:遵循项目中现有的代码风格。保持一致性是关键。
- **注释**:在必要的地方给你的代码添加注释,以解释复杂的逻辑或重要的决定。
- **文档**:更新 README.md 和其他相关文档,以包含有关你的新场景或更改的详细信息。
3. **白名单**:
- 在创建或修改场景时,请记住以下几点:
- **白名单**:确保安全组规则和其他访问控制被配置为仅白名单来自 CloudGoat 配置的 IP。
- **审查**:在贡献之前仔细检查你的配置,查看是否存在任何可能易受攻击的公共资源(即,不要创建可从互联网访问的易受攻击的 EC2)。
4. **Python 代码风格**:
- CloudGoat 中的 Python 代码通常应遵循 Python 的风格约定,将可读性和可维护性置于首位。
- 遵循良好的 git 实践:使用 pull requests,优先使用功能分支,始终编写清晰的 commit 消息。
- CloudGoat 使用 `black` 和 `flake8`——Python 语法和风格检查工具。在提交代码之前,确保对 `core/python/` 和 `cloudgoat.py` 中的所有 Python 文件都运行了 `flake8` 和 `black`。`black` 的决定优先于 `flake8`。由于普通用户不需要它们,这两项都在 `core/python/requirements.txt` 文件中被注释掉了。
5. **许可**:
- CloudGoat 代码应始终使用 BSD 3-clause 许可证。
最后,感谢你的贡献!
## 更新日志
- **19/6/24:** CloudGoat 2.0 发布!
## 免责声明
CloudGoat 是一款绝对不提供任何保证的软件。使用 CloudGoat,即表示你对由此产生的所有结果承担全部责任。
简单
### iam_enum_basics (简单) `cloudgoat create iam_enum_basics` 在这个场景中,你最初获得的是一个名为 Bob 的低级别 IAM 用户的访问密钥。你的任务是使用 AWS CLI 执行全面的 IAM 枚举。通过调查托管策略、内联策略、组成员身份和可担任的角色,你将发现五个不同的 flag。 [访问场景页面。](cloudgoat/scenarios/aws/iam_enum_basics/README.md) 由 Tyler Ramsbey 贡献 ### data_secrets (简单) `cloudgoat create data_secrets` 在这个场景中,你最初获得的是一个权限受限的 IAM 用户。你的任务是识别在其 User Data 中泄漏凭证且配置错误的 EC2 实例,从而获得 SSH 访问权限。从那里开始,你必须通过利用实例元数据服务 (IMDS) 窃取角色,枚举 Lambda 函数以查找隐藏的环境变量,并最终 compromise(妥协)一个有权访问场景目标的用户:存储在 AWS Secrets Manager 中的秘密。 [访问场景页面。](cloudgoat/scenarios/aws/data_secrets/README.md) 由 Tyler Ramsbey 贡献 ### beanstalk_secrets (简单) `cloudgoat create beanstalk_secrets` 在这个场景中,你将获得授予对 Elastic Beanstalk 有限访问权限的低权限 AWS 凭证。你的任务是枚举 Elastic Beanstalk 环境并发现包含辅助凭证且配置错误的的环境变量。使用这些辅助凭证,你可以枚举 IAM 权限,最终为管理员用户创建访问密钥。利用这些管理员权限,你可以检索存储在 AWS Secrets Manager 中的最终 flag。 [访问场景页面。](cloudgoat/scenarios/aws/beanstalk_secrets/README.md) 由 Tyler Ramsbey 贡献 ### sns_secrets (简单) `cloudgoat create sns_secrets` 在这个场景中,你从一个对 AWS 账户具有基本访问权限的身份开始。你需要枚举你的权限,发现你可以订阅的 SNS Topic,检索泄漏的 API Key,最后使用 API Key 访问 API Gateway 以获取最终 flag。 [访问场景页面。](cloudgoat/scenarios/aws/sns_secrets/README.md) 由 Tyler Ramsbey 贡献 ### iam_privesc_by_key_rotation (简单) `cloudgoat create iam_privesc_by_key_rotation` 利用不安全的 IAM 权限提升你的访问级别。从一个管理其他用户凭证的角色开始,找出设置中的弱点以访问“admin”角色。使用管理员角色,从 Secrets Manager 中检索 flag。 [访问场景页面。](cloudgoat/scenarios/aws/iam_privesc_by_key_rotation/README.md) 由 Infrasec.sh 贡献 ### iam_privesc_by_rollback (简单) `cloudgoat create iam_privesc_by_rollback` 从一个受到高度限制的 IAM 用户开始,攻击者能够查看以前的 IAM policy 版本并恢复其中一个允许完全管理员权限的版本,从而实现权限提升利用。 [访问场景页面。](cloudgoat/scenarios/aws/iam_privesc_by_rollback/README.md) ### lambda_privesc (简单) `cloudgoat create lambda_privesc` 从 IAM 用户 Chris 开始,攻击者发现他们可以担任一个拥有完全 Lambda 访问权限和传递角色权限的角色。然后,攻击者可以利用这些新权限执行权限提升,以获取完全的管理员权限。 [访问场景页面。](cloudgoat/scenarios/aws/lambda_privesc/README.md) ### sqs_flag_shop (简单) `cloudgoat create sqs_flag_shop` 首先,从可以购买 FLAG 的 SHOP 页面开始。该网站有多个页面,你可以看到其源代码被暴露了。攻击者分析代码以寻找漏洞,并利用他们的特权购买 FLAG。 [访问场景页面。](cloudgoat/scenarios/aws/sqs_flag_shop/README.md)中等
### static (中等) `cloudgoat create static` 在这个场景中,你扮演访问企业门户的外部攻击者。通过分析 Web 应用程序,你发现它从公共 S3 存储桶加载关键的 JavaScript 库。你必须发现存储桶权限中的配置错误,通过使用恶意代码覆盖该库来执行“供应链攻击”,并等待内部管理员机器人登录。你的目标是捕获该机器人的凭证并将其渗回存储桶。 [访问场景页面。](cloudgoat/scenarios/aws/static/README.md) ### vulnerable_cognito (中等) `cloudgoat create vulnerable_cognito` 在这个场景中,你将看到一个带有注册和登录页面的应用程序,其后端使用了 AWS Cognito。你需要绕过限制并利用 Amazon Cognito 中的配置错误来提升你的权限并获取 Cognito Identity Pool 凭证。 [访问场景页面。](cloudgoat/scenarios/aws/vulnerable_cognito/README.md) 由 TrustOnCloud 贡献 ### vulnerable_lambda (中等) `cloudgoat create vulnerable_lambda` 在这个场景中,你作为 'bilbo' 用户开始。你将担任一个拥有更多权限的角色,发现一个将策略应用于用户的 Lambda 函数,并利用该函数中的漏洞提升 bilbo 用户的权限以寻找秘密。 [访问场景页面。](cloudgoat/scenarios/aws/vulnerable_lambda/README.md) ### cloud_breach_s3 (中等) `cloudgoat create cloud_breach_s3` 作为一个没有任何访问权限或特权的匿名外部人员开始,利用配置错误的反向代理服务器查询 EC2 元数据服务并获取实例配置文件密钥。然后,使用这些密钥发现、访问和渗出 S3 存储桶中的敏感数据。 [访问场景页面。](cloudgoat/scenarios/aws/cloud_breach_s3/README.md) ### iam_privesc_by_attachment (中等) `cloudgoat create iam_privesc_by_attachment` 从极其有限的权限开始,攻击者能够利用 instance-profile-attachment 权限创建一个拥有比其自身特权高得多的新 EC2 实例。凭借对这个新 EC2 实例的访问权,攻击者获得了目标账户内的完全管理权限,并能够达成场景目标——删除 cg-super-critical-security-server 并为进一步的恶意行动铺平道路。 [访问场景页面。](cloudgoat/scenarios/aws/iam_privesc_by_attachment/README.md) ### ec2_ssrf (中等) `cloudgoat create ec2_ssrf` 从 IAM 用户 Solus 开始,攻击者发现他们拥有对 Lambda 函数的只读权限,其中的硬编码秘密将引导他们找到一个运行着易受服务器端请求伪造 (SSRF) 攻击的 Web 应用程序的 EC2 实例。在利用易受攻击的应用程序并从 EC2 元数据服务获取密钥后,攻击者获得了对一个私有 S3 存储桶的访问权,其中包含一组允许他们调用 Lambda 函数并完成场景的密钥。 [访问场景页面。](cloudgoat/scenarios/aws/ec2_ssrf/README.md) ### ecs_takeover (中等) `cloudgoat create ecs_takeover` 从访问外部网站开始,攻击者需要找到一个远程代码执行漏洞。通过使用 RCE,攻击者可以访问网站容器可用的资源。滥用多个 ECS 的配置错误,攻击者获得了允许他们强制 ECS 将目标容器重新调度到受感染实例的 IAM 权限。 [访问场景页面。](cloudgoat/scenarios/aws/ecs_takeover/README.md) ### rds_snapshot (中等) `cloudgoat create rds_snapshot` 在这个场景中,我们从用户 'David' 开始。通过 David,你可以利用特权窃取凭证。 利用窃取的凭证,攻击者可以利用 RDS 漏洞访问数据库并检索 flag。 [访问场景页面。](cloudgoat/scenarios/aws/rds_snapshot/README.md) ### glue_privesc (中等) `cloudgoat create glue_privesc` 该场景从一个上传 CSV 文件并通过 Glue 服务执行数据可视化的网页开始。 攻击者通过 SQL 注入攻击窃取网页上的凭证,并上传一个反向 shell 以创建一个 Glue Job 来获取秘密字符串。 [访问场景页面。](cloudgoat/scenarios/aws/glue_privesc/README.md) ### agentcore_identity_confusion (中等) `cloudgoat create agentcore_identity_confusion` 在这个场景中,你将获得能够管理 bedrock agentcore 代码解释器的 AWS 凭证。你的任务是利用这一点获取对其他 agentcore 运行时代理所使用的敏感数据的访问权限。找出如何访问存储在 bedrock 知识库中的 flag。 [访问场景页面。](cloudgoat/scenarios/aws/agentcore_identity_confusion/README.md) 由 Sonrai Security 贡献 ### bedrock_agent_hijacking (中等) `cloudgoat create bedrock_agent_hijacking` 在这个场景中,你将能够调用 Bedrock Agent 和更新 Lambda 函数的 AWS 凭证。你的任务是分析代理并了解它如何访问实时信息。挖掘这一流程以定位并提取存储在 S3 中的 flag。 [访问场景页面。](cloudgoat/scenarios/aws/bedrock_agent_hijacking/README.md) 由 Sonrai Security 贡献困难
### rce_web_app (困难) `cloudgoat create rce_web_app` 从 IAM 用户 Lara 开始,攻击者通过探索 Load Balancer 和 S3 存储桶寻找漏洞线索,最终导致对易受攻击的 Web 应用程序进行 RCE 利用,从而暴露机密文件,并最终获得访问场景目标的权限:一个高度安全的 RDS 数据库实例。 或者,攻击者也可以作为 IAM 用户 McDuck 开始,枚举 S3 存储桶,最终找到 SSH 密钥,从而获得对 EC2 服务器及其背后数据库的直接访问权限。 [访问场景页面。](cloudgoat/scenarios/aws/rce_web_app/README.md) ### codebuild_secrets (困难) `cloudgoat create codebuild_secrets` 从 IAM 用户 Solo 开始,攻击者首先枚举并探索 CodeBuild 项目,在其中找到了 IAM 用户 Calrissian 的不安全 IAM 密钥。然后作为 Calrissian 操作时,攻击者发现了一个 RDS 数据库。由于无法直接访问数据库的内容,攻击者可以巧妙地利用 RDS 快照功能来获取场景目标:一对秘密字符串。 或者,攻击者可以探索 SSM 参数并找到 EC2 实例的 SSH 密钥。使用元数据服务,攻击者可以获取 EC2 实例配置文件的密钥并更深地渗透到目标环境中,最终通过一条更迂回的路线获得对原始数据库及其内部场景目标(一对秘密字符串)的访问权。 [访问场景页面。](cloudgoat/scenarios/aws/codebuild_secrets/README.md) ### detection_evasion (困难) `cloudgoat create detection_evasion` 此场景的目标是在不被检测到的情况下读出这两个秘密的值。秘密都存储在 Secrets Manager 中,其值格式如下。 这个场景与其他 CloudGoat 场景有很大不同。在 detection_evasion 中,你的目标会被更清晰地列出,挑战在于在不触发警报的情况下完成它们。这个场景涉及的设置更多,游玩时间也更长(你可能想要/需要玩多次)。 [访问场景页面。](cloudgoat/scenarios/aws/detection_evasion/README.md) ### ecs_efs_attack (困难) `cloudgoat create ecs_efs_attack` 从访问 "ruse" EC2 开始,用户利用实例配置文件对正在运行的 ECS 容器进行后门操作。使用被植入后门的容器,攻击者可以从容器元数据 API 中检索凭证。这些凭证允许攻击者在任何设置了适当标签的 EC2 上启动会话。攻击者利用其权限更改 Admin EC2 上的标签并启动会话。一旦进入 Admin EC2,攻击者将对子网进行端口扫描,以找到一个开放的 EFS 进行挂载。挂载成功后,攻击者就可以从弹性文件系统中检索 flag。 [访问场景页面。](cloudgoat/scenarios/aws/ecs_efs_attack/README.md) ### ecs_privesc_evade_protection (中等) `cloudgoat create ecs_privesc_evade_protection` 用户首先访问 EC2 内容器中运行的一个 Web 服务。攻击者可以利用 Web 服务漏洞从 EC2 中的元数据 API 获取凭证,或者控制该容器。此凭证允许攻击者使用特定角色启动一个新容器并对其进行控制。基于此操作,进行权限提升,并读取 S3 中的 FLAG。 [访问场景页面。](cloudgoat/scenarios/aws/ecs_privesc_evade_protection/README.md) ### secrets_in_the_cloud (困难) `cloudgoat create secrets_in_the_cloud` 作为一个拥有有限特权的 IAM 用户,攻击者通过检查 AWS 资源以揭开线索和隐藏信息来开始他们的旅程。这项调查最终导致获得一个有权访问场景主要目标的 role:从 Secrets Manager 中检索最终的秘密。 [访问场景页面。](cloudgoat/scenarios/aws/secrets_in_the_cloud/README.md)标签:AWS, DPI, Modbus, OPA, Rhino Security Labs, StruQ, 云基础设施, 云攻防, 云渗透, 云环境部署, 安全培训, 安全测试, 攻击性安全, 故意设计漏洞, 数据展示, 漏洞演练, 紫队, 红队, 请求拦截, 逆向工具, 靶场