前言
目前常见的云服务渗透手法,大都是基于目标权限的错配
本文将介绍,阿里云ECS元数据渗透的必要条件、具体方法,以及ram的相关基础概念
metadata
metadata可能是最广泛所熟知的一种云服务渗透方式,在利用上似乎非常简单,只需要访问对应元数据的地址,即可获得该服务器的元数据
在搭配常规渗透手法上,通常和ssrf、xxe等相结合
而元数据中,危害最大的莫过于能够获取到云服务器对应的sts(Security Token Service),通过sts最大危害能够接管控制台,如从云服务器 SSRF 漏洞到接管你的阿里云控制台
但在使用该攻击方法之前,我们需要知道,ecs本身是不存在ram
curl -ik -w "\n" http://100.100.100.200/latest/meta-data/ram/security-credentials/
大家可以随意创建一台云服务器来尝试一下
为什么会出现这种情况呢?
在解决这个问题之前,首先我们要知道ram是什么,干什么用的。
RAM&策略
这里我简单引用官方的介绍:
访问控制RAM(Resource Access Management)是阿里云提供的一项管理用户身份与资源访问权限的服务。
RAM分为用户跟角色,RAM用户简单理解就是子帐号,通常用AccessKey登录
RAM角色则是一个虚拟的用户,没有固定的AccessKey,使用临时凭证,一般而言是由资源来扮演,比如ECS
而策略policy则是指一组权限的集合,例如AdministratorAccess策略,包含了对所有资源任意操作的权限
回归主题
那么回到前面所说的ecs本身不存在ram,指得是不存在对应的RAM角色
如果我们需要让ecs拥有ram,并且让我们去利用metadata进行渗透,那么就首先需要去给对应的服务器授予一个RAM角色
我们访问阿里云控制台,搜索访问控制或直接访问https://ram.console.aliyun.com/roles,并点击创建角色,选择云服务角色
在配置角色上,选择普通服务角色,并选择受信服务为云服务器
点击完成,然后访问阿里云控制台,搜索ECS或访问直接https://ecs.console.aliyun.com/,点击实例,并且为服务器授予刚刚创建的RAM角色
我们再次访问元数据,就会发现已经存在a这个ram角色了
可以发现,成功拿到临时凭证。
但是,拿到临时凭证不意味着就可以直接控制什么。
我们回到访问控制页面,在角色栏中找到RAM角色a,可以发现,他是没权限的
这意味着如果RAM角色没有被授权,哪怕拿到了临时凭证也没有任何作用
反过来,只要RAM角色的权限足够大,即使他只是个STS凭证,也能够造成足够威力的破坏。
我们试着为这个角色a赋予一个AliyunECSReadOnlyAccess系统策略,看看会怎么样
在涉及具体策略的时候,强烈建议大家看看这个策略包含了哪些具体的权限
简单解读一下,就是任何资源只要执行ecs的Describe或List开头的权限,或者是vpc:DescribeVpcs、vpc:DescribeVSwitches都会被允许
这里我就简单用cf来操作一下:
同样的,为什么cf就能够枚举出他有AliyunECSReadOnlyAccess呢?如果让我们用aliyun-cli来操作的话,又应该怎么操作呢
使用原生aliyun-cli
使用原生的aliyun工具,首先需要去官网下载
下载好之后,开始配置ak
用aliyun-cli,最重要的是多用--help和多看官方文档
由于我们是sts,所以需要选择StsToken
官方工具在配置ak的时候都需要输入RengionId,直接填cn-hangzhou就好了,后期如果需要更改,大部分操作都支持RengionId参数进行修改
配置完毕之后,第一步是看此用户的信息
./aliyun sts GetCallerIdentity
sts GetCallerIdentity这个操作是不需要任何权限就能运行的,如果报错了,大概率是配置的时候填错了,多个空格也会报错
从arn号就能发现,我们是ram,并且是虚拟的ram(vm-ram),前面提过,虚拟ram就是ram角色
通常情况下,想要知道一个角色有什么权限是要用ram ListPoliciesForUser进行操作的
./aliyun ram ListPoliciesForUser --UserName username
但很显然,在这里我们会报错,因为没有ram访问权限,我们只有ecs访问权限
既然无法列举权限,那为什么cf就能确认是AliyunECSReadOnlyAccess呢?
回到最开始的策略内容图
这里告诉了我们能做什么
通过查找官方文档,我发现了DescribeInstances这个api方法可以查看ecs的数量
./aliyun ecs DescribeInstances
也可以通过DescribeInstanceAttribute列出ECS的具体信息
./aliyun ecs DescribeInstanceAttribute --InstanceId i-bp10gqwx1tksn8gsg3w4
如果是其他的系统策略的话,除了AdministratorAccess和AliyunECSFullAccess以外,是不能用ecs:DescribeInstanceAttribute的,继续排除即可确定策略。
所以,当没有RAM权限的时候,就需要去枚举权限,猜自己拿到的AK配置了什么策略,能做什么。
总结之前的,当使用metadata进行渗透时,成果取决于RAM角色的权限大小
接下来是一些需要大家思考的问题:
疑问1
前面的演示授权中,我们都是默认授予RAM角色帐号级别的权限
如果授权访问仅限于资源组,即使ecs都在这个资源组里面,仍然无法列出任何ecs,这是为什么?
疑问2
为什么前面在授予RAM角色的时候,要选择阿里云服务,选择阿里云角色行不行?
总结
metadata渗透方式需要被授予RAM角色
metadata渗透的成果取决于RAM角色的权限大小
对于无法列举权限的用户,则需要去枚举权限