文章首发于:火线Zone社区
作者:高鹏
高鹏,火线云安全实验室成员,今天分享的主题是《浅析云存储的攻击利用方式》。
本次的议题,关于云存储的一个攻击利用方式,在SRC漏洞挖掘,或在火线安全平台的众测项目中,我们也会收到很多关于对象存储的一个劫持和权限配置的一些问题,对象存储在安全这一块也是一个不可忽略的方向。
我们总共把议题分为四个部分。
首先第一个部分是什么是对象存储,第二个部分对象存储利用方式,在这一环节中,我们举例了大概有十种利用对象存储利用方式,然后最后我们再对它进行一个总结,然后我们在第二第三部分,我们精心挑选了火线后台安全众测项目中真实的几个漏洞,并且奖金较高的,与对象存储有关的漏洞进行举例,最后就是我们的问答与讨论。
先看一下什么是对象存储。可能没有了解过的,对这个东西没有一个概念,就好像对象存储是把自己的对象存储在云上,把自己的女朋友存在云上?或者说跟开发一样,自己new一个对象,其实并不是。
我们在国内常见,比较大的对象存储提供商,还有包括国外的一些提供商,我们首先看一下,第一个就是腾讯云,然后第二个就是华为云,第三个就是阿里云,到国外的话,第一个肯定就是。亚马逊,然后就是微软的Azure,然后还有谷歌的Google cloud。
我们首先来看一下这六大云的一个对象存储的一个利用方式。
1、Bucket公开访问
首先第一个就是bucket的一个公开的一个访问,管理员在创建bucket的时候,默认的是priavte的一个权限,如果在错误的一个配置下,例如说给了一个ListObject的一个权限,会导致存储桶的遍历。
这是左边是aws的,然后右边是阿里云的。但是这里就存在两个问题1、如果首先第一个问题是,如果我们只配置公有读或者公有读写的情况下,其实我们是无法正常的列出他所下面的一些Key,造成遍历存储桶的情况,我们正常访问一个我们设置了公有读或公有读写的一个存储桶。但是这个存储桶我们访问的时候,他会告诉我们是Access Denied,但是我们可以通过访问它下面的一个key,或者对应就是我们通俗点来讲,就是访问它对应的一个文件,我们就能下载到这个文件。
如果想列出Object,那么就需要在Bucket的授权策略中,我们设置ListObject,我们在右边的图片就可以看到,它可以把这个所有的东西给列出来。
2、Bucket桶爆破
Bucket桶的爆破,我们在常规的渗透中,扫描目录,是通过返回的状态码来进行判断,而这里是通过页面返回不同的报错信息来进行判断,如下图
不过值得注意的是,在微软的Azure中,如果我们访问一个存在的存储账户下的一个容器,首先会提示我们,InvalidQueryParameterValue,但是如果不存在的话,会显示无法访问该网站。
也可以通过CNAME,DNS解析的方式去获取域名的CNAME。
3、特定的Bucket策略配置
我们访问一个bucket,如果存在某种限制,例如,UserAgent,IP等,管理员错误的配置了GetBucketPolicy的权限,我们可以通过获取Bucket的策略配置来获取存储桶中的内容。
4、Bucket Object遍历
Bucket的遍历也就是如果设置了ListObject权限,然后我们就可以看到它上面所存在的东西,其实是在SRC,或者说在众测项目中是非常多的,我们可以通过curl get的方式去下载张图片。
5、任意文件上传与覆盖
将任意文件上传至存储桶,或者说也可以覆盖存储桶上已经有的一个文件。这里主要关系到一个错误的配置策略,PutObject。
6、AccessKeyId,SecretAccessKey泄露
可以通过反编译APK,小程序,查看JS代码中来获取泄露的AK等,稍后在第三个环节,我们也会通过实战案例来看AK泄露的问题。
在JS代码中也可以找到泄露的Key
下图中提供了一款工具HaE
https://github.com/gh0stkey/HaE
这里我们推荐一款Burp的插件,HaE,能够有效的在测试中帮助测试人员快速的发现存在泄露的AK,身份证,电话号码,邮箱等。
7、Bucket劫持与子域接管
这是比较常见的,也是众测项目中比较多的,原理也很简单,bucket的名称只能有一个,如果管理员将Bucket设置了自定义域名,比如在域名中添加DNS解析,CNAME指向存储桶的域名,但是有一天管理员将存储桶删掉,但是并没有删掉在域名中的DNS解析,这种情况就会导致我们可以去注册同样的存储桶名称来劫持该域名,我们只需要上传任意的文件,就可以让这个域名或者存储桶显示我们想要的东西。
不过需要注意的是,在腾讯云的对象存储中,我们无法造成以上的操作,因为在腾讯云的对象存储域名中,有一个APPID,这个APPID来自我们的账户信息中。
随后我们再举例AWS下的存储桶劫持,原理同上。
然后aws下是有一个比较有意思的地方,就是我们来判断aws存储桶的域名地址的时候,其实我们是可以直接很直接的来判断出来的,就比如说它的域名是http://huoxian.cn,那么后面加上.s3.地区.http://amazon.com就可以了,原因是因为,在AWS下,配置存储桶的时候,想使用自定义的域名,存储桶的名称必须跟域名的名称一样。
我们再来看一下微软的Azure下的劫持,原理也同上。
8、存储桶的配置可写
存储桶的配置可写,我们访问一个存储桶时,如果提示我们Access Denied的话,如下图。
我们发现,该存储桶错误的配置了PutBucketPolicy和GetBucketPolicy,此时我们就可以获取存储桶的配置,然后再修改写入配置即可。
9、修改Bucket策略为Deny使业务瘫痪
当策略可写的时候,除了以上的一些操作,例如网站引入了某个S3上的资源,图片,JS等,我们可以通过修改Effect为Deny,导致网站无法获取这些资源随之瘫痪。
10、修改网站引用的S3资源进行钓鱼
这里比较好理解,我们既然拥有上传的权限了,我们可以通过修改里面的资源,进行一个钓鱼或污染。
11、六大公有云攻击方式统计表
我们总结了六大公有云的存储桶利用方式。
12、Lambda函数执行命令
首先我们先创建一个Lambda函数,然后在选择触发器的时候选择我们创建的存储桶,并且触发事件,我们选择所有事件都会触发。
我们使用Python编写函数,首先我们使用print将event中的信息输出到Cloud Watch我们需要注意Object中的Key,假设一种情况,这里的KEY来自存储桶的文件名,如果管理员在编写代码时将文件夹当成命令或其他的方式进行处理,能否造成命令执行。
很显然,是可以的,并且我们可以使用curl命令将信息外带出来。
在本环节中,我们挑选了,在火线安全众测项目中,漏洞奖金比较高的一些漏洞进行举例。
1、反编译小程序泄露AccessKey
该漏洞的奖金为6500,我们在图片中的IDEA中可以看到,这里通过ABD获取小程序的包反编译后在JS代码中找到的存储桶的KEY,随后连接上去,在存储桶中获取到了大量的敏感数据。
2、JS文件中存在的AccessKey泄露
该漏洞的奖金为7000,在上图中可以看到,在JS代码中,找到了泄露的KEY,随后使用OSS浏览器连接上去,发现了大量的用户身份证图片等。
3、阿里云存储桶劫持
该漏洞的奖金为2500,在第二张图我们可以看到,访问域名显示NoSuckBucket,在HostID中我们可以看到存储桶的域名,随后创建了一个跟这个名称一样的存储桶,并上传一个1.txt中包含test by huoxian,再次访问该域名可以发现成功劫持了该域名。
4、GitHubAccessKey泄露
在上图中我们可以看到,通过关键字的搜索,可以在github中发现上传的AK,导致泄露敏感信息。