在我的最后一篇关于AWS渗透测试的文章中,我们讨论了一个渗透测试者在获取云服务器凭据后能做些什么。而在本文中,我将通过一个AWS的实例让大家看到即使没有获取相关凭据,我们依然可以利用其潜在的安全漏洞,来成功实施我们的渗透测试。与此同时,我们还将该方法应用于了Alexa前10,000个站点,而对于那些确认开放了S3权限的站点,我们已经向其发出了修复建议。

什么是AMAZON S3?

亚马逊简单存储服务(S3)是一种AWS服务,主要用以向用户提供一种安全的数据存储方式。默认方式下,创建于亚马逊简单存储服务(S3)的对象只能够为创建它们的人访问。所有者可以授权其他人以粗粒度和细粒度的方式访问。比如一位所有者可以让数据集公开使用,每一个人都可以用这个对象的URL来访问。或者所有者可以使用S3策略和身份及访问管理用户和群组,允许有限的用户集访问。S3策略也可以基于网络连接属性限制运行。如果你只希望企业网络的用户访问S3中的对象,指定所有的连接都从一个可信任的IP地址范围发出。其他地址尝试访问则会被拒绝。

然而,这对于那些经验不足的公司而言,创建新用户并进行相应的安全策略配置,就会显得复杂和耗时。甚至导致一些原本不该开放的权限被无意中打开,从而带来一系列的安全问题。相对于windows的策略错误,S3存储区上的宽松身份管理可能会有所不同,轻则只是部分信息的泄露,重则将导致所有的数据被窃取。例如,一些网站使用S3作为服务资源(如图像和Javascript)的平台。更有甚者,将完整的服务器备份也推送到云端。

因此,作为一名渗透测试人员,按时的检查S3 Bucket的安全配置等问题,是非常必要的!

被动侦察:区域确定

许多AWS应用程序都不会被部署在WAF后面。因此,我们只需通过简单的nslookup,就能快速识别目标服务器的区域。但是如果服务器位于WAF后面,则可能需要其他方法来确定目标的IP地址。

1.png

通过简单的nslookup查询,我们得知flaws.cloud的IP地址显示位于us-west-2。所有关于AWS安全性的flAWS CTF可以在这里找到:http://flaws.cloud/

主动侦察:针对BUCKET的探针

区域确定后,下面我们就可以进行一般查询和Bucket名称枚举了。事实上即便我们不事先确定区域,也能进行查询和枚举。但为了在后续查询AWS节省时间,因此我们提前做了区域确定。我们建议你使用子域,域和顶级域的组合来确定目标S3上是否有bucket。例如,如果我们要搜索属于www.rhinosecuritylabs.com的S3 bucket,我们可以尝试使用bucket名rhinosecuritylabs.com和 www.rhinosecuritylabs.com

为了确定bucket名称的有效性,我们可以使用浏览器打开Amazon提供的自动分配的S3 URL,格式为http://bucketname.s3.amazonaws.com或使用以下命令:

sudo aws s3 ls s3://$bucketname/ --region $region

如果命令返回了一个目录列表,则表明你已成功地找到了一个不受访问权限限制的bucket 。

active_recon-aws.png

从上图我们可以看到,每个S3 bucket都有一个Amazon的URL,格式为bucketname.s3.amazonaws.com

S3的权限利用

我们知道在实际生产中,一些S3 bucket常被用于存放一些静态资产,如图像和Javascript库。虽然,这些资产相对于一些重要数据并不敏感。但其开放式的上传策略,也将导致恶意攻击者有机会上传某些自定义的Javascript库,从而向所有用户间接的提供恶意的Javascript(例如BeEF Hook)。

此外,通过我们的研究发现,S3还可被利用来做许多其他的敏感操作,例如下载系统备份,源代码等。甚至可以下载到日志文件,其中还包含了用户名,密码,数据库查询等信息。

3.png

排在Alexa前10,000的某个站点,竟将压缩的日志文件存放在S3服务器上。

4.png

可以看到,有许多站点存在相同的问题。这表明,生产API日志存储并没有进行相关的验证。

5.png

Alexa前10,000的某个站点将.git子目录存储在Amazon S3上。这意味着,我们有机会直接获取到其源码。

6.png

Alexa前10,000的某个站点将整个服务器的备份存储在S3上。

Alexa前10,000的站点

确定Alexa前10,000个网站中,有哪些站点具有目录列表,下载和上传的S3 bucket。我们可以通过以下AWS CLI命令,来帮助我们查找:

aws s3 ls s3://$bucketname/ --region $region

$bucketname是目标域名,以及我们以前发现的任何子域(foo.com,www.foo.com,bar.foo.com等)。如果bucket存在,并且没有引发权限错误,则表示打开列表权限。

下载命令是否成功执行,取决于是否已经获取到非零大小的文件,并将其复制到了本地磁盘。如果文件成功传输,则表示打开下载权限。

上传权限

我们在多个被测试的S3 bucket中,发现了名为testupload.txt的文件。这表明在2016年11月之前,已经有人对这些S3进行了上传权限枚举测试。

7.png

结果

在这10,000个站点当中,我们发现有107个bucket(占比1.07%)。其中fips-gov-us-west-1(占36%)和us-east-1(占37%)是最受欢迎的。

8.png

这些bucket几乎包含了我之前所提到的所有问题,从整个git存储库,再到企业Redis服务器的备份文件。在这107个bucket中,其中有61个(占57%)已经向所有查看过的人员开放了下载权限。有13个(占12%),开放了上传权限。而还有8%,则全部中招。

9.png

总结

通过本文可以看到,尽管AWS向客户提供了强大的安全控制保障。但是,许多公司仍然松动其S3设置,允许未经授权的访问他们的数据。这势必会给企业带来巨大的安全隐患!因此,作为企业应当及时的掌握一些使用的技术知识,并定期的对服务器进行安全测试。只有这样,才能将损失降到最低!

*参考来源:rhinosecuritylabs,FB小编 secist 编译