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