译者:興趣使然的小胃
预估稿费:160RMB
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
一、前言
亚马逊云服务平台(AWS,Amazon Web Services)面向现代Web应用提供了一套非常强大又非常可靠的基础架构。随着Web服务不断涌现新的功能,我们也需要更新安全理念。对于渗透测试人员来说,有时候某些AWS服务可能会给渗透测试带来挑战。
在这一系列文章中,我们会详细分析AWS服务、常见的漏洞以及错误配置情况,也会介绍如何使用自动化工具对每个服务进行全方位的安全测试。希望渗透测试人员阅读本文后,可以使用我们研发的AWS BurpSuite扩展来评估AWS S3 buckets的安全性。
我们研发了一个BurpSuite插件:AWS Extender,这个插件可以从代理流量中识别并评估S3 buckets。此外,该插件也可以识别身份池(identity pools)、Google Cloud以及微软Azure服务。
工具下载地址为:
二、Amazon Simple Storage Service (S3)
自2006年3月推出以来,亚马逊S3(简单云存储服务)已经成为非常受欢迎的对象(object)存储服务,S3提供了可扩展的存储架构,目前正托管数万亿个对象。尽管S3可以托管静态网站,但它本身并不支持代码执行或者任何编程功能。S3只能通过REST、SOAP以及BitTorrent web接口来提供存储服务,支持静态文件的读取、上传以及删除。
亚马逊为S3 bucket提供了多种不同的访问控制机制,包括访问控制列表(ACL)、bucket策略以及IAM(Identity and Access Management)策略。默认情况下,亚马逊在创建S3 bucket时会为它设置一个默认ACL,以便bucket所有者掌握该bucket的所有权限。
三、S3渗透测试基础
每个web应用渗透测试人员都应该注意以下几个要点:
所有的S3 bucket都共享一个全局命名方案,因此无法阻止对bucket的枚举遍历。
所有的S3 bucket都有一个DNS入口,形式为[bucketname].s3.amazonaws.com。
我们可以通过bucket的HTTP 接口(https://[bucketname].s3.amazonaws.com)来访问bucket,当然也可以使用非常强大的AWS CLI来访问:
apt-get install awscli
aws s3 ls s3://mybucket
四、常见的S3漏洞
如果你是AWS或者S3的新手,你需要注意以下几种常见漏洞:
Bucket未授权访问:顾名思义,经过错误配置后,匿名用户就可以列出、读取或者写入S3 bucket。
Bucket半公开访问:经过配置后,“通过身份认证的用户”就可以访问S3 bucket。这就意味着只要经过AWS的认证,任何人都可以访问这些资源。我们需要拥有有效的AWS access key以及secret才能测试这种情况。
ACL权限错误:Bucket的ACL也有相应的权限,然而许多情况下所有人都可以读取这个信息。这并不代表bucket本身出现错误配置情况,然而我们可以借此了解哪些用户拥有什么类型的访问权限。
五、访问控制列表(ACL)
S3访问控制列表(ACL)可以应用在bucket层以及对象层。ACL通常支持如下几种权限:
读取(READ)
在bucket层,该权限允许用户列出bucket中的对象。在对象层,该权限允许用户读取对象的内容及元数据。
写入(WRITE)
在bucket层,该权限允许用户创建、覆盖以及删除bucket中的对象。
读取访问控制策略(READ_ACP)
在bucket层,该权限允许用户读取bucket的访问控制列表。在对象层,该权限允许用户读取对象的访问控制列表。
写入访问控制策略(WRITE_ACP)
在bucket层,该权限允许用户设置bucket的ACL。在对象层,该权限允许用户设置对象的ACL。
完全控制(FULL_CONTROL)
在bucket层,该权限等同于向用户许可“READ”、“WRITE”、“READACP”以及“WRITEACP”权限。在对象层,该权限等同于向用户许可“READ”、“READACP”以及“WRITEACP”权限。
在这里,待授权的用户可以是独立的AWS用户,由用户ID以及邮箱来标识,也可以是如下某个预定义的组:
认证用户组(The Authenticated Users Group)
该组代表所有的AWS用户,对应“http://acs.amazonaws.com/groups/global/AuthenticatedUsers” 这个URI。
所有用户组(The All Users Group)
代表所有用户(包括匿名用户),对应“http://acs.amazonaws.com/groups/global/AllUsers” 这个URI。
日志传输组(The Log Delivery Group)
仅用于访问日志记录,对应“http://acs.amazonaws.com/groups/s3/LogDelivery” 这个URI。
ACL示例如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<ID>*** Owner-Canonical-User-ID ***</ID>
<DisplayName>owner-display-name</DisplayName>
</Owner>
<AccessControlList>
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="Canonical User">
<ID>*** Owner-Canonical-User-ID ***</ID>
<DisplayName>display-name</DisplayName>
</Grantee>
<Permission>FULL_CONTROL</Permission>
</Grant>
</AccessControlList>
</AccessControlPolicy>
AWS Extender Burp扩展可以处理前面提到过的所有权限。也就是说,当识别出某个S3 bucket后,该扩展可以执行如下测试:
1、尝试列出bucket中托管的对象(READ)。
2、尝试将一个“test.txt”文件上传到bucket中(WRITE)。
3、尝试读取bucket的访问控制列表(READ_ACP)。
4、在不修改bucket的访问控制列表的前提下,尝试设置bucket的访问控制列表(WRITE_ACP)。
注意:对于识别出来的每个S3对象,该扩展也执行了类似的测试。
六、Bucket策略
Bucket所有者可以通过bucket策略来设定操作主体(principal)能够在某个资源上执行什么操作。这里的principal可以为任意AWS用户或组,也可以是包含匿名用户在内的所有用户;action可以是bucket策略支持的任何预定义权限;而resource可以为整个bucket,也可以是某个特定的对象。bucket策略以JSON格式表示,如下所示:
{
"Version":"2012-10-17",
"Statement": [
{
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::examplebucket/*"]
}
]
}
上面这个策略允许在“arn:aws:s3:::examplebucket/*”资源上执行“s3:GetObject”操作,principal使用通配符“*”来表示。这实际上等同于使用访问控制列表(ACL)来赋予所有用户组拥有“examplebucket”这个S3 bucket的“READ”权限。
AWS Extender Burp扩展目前支持如下权限:
s3:ListBucket
s3:ListMultipartUploadParts
s3:GetBucketAcl
s3:PutBucketAcl
s3:PutObject
s3:GetBucketNotification
s3:PutBucketNotification
s3:GetBucketPolicy
s3:PutBucketPolicy
s3:GetBucketTagging
s3:PutBucketTagging
s3:GetBucketWebsite
s3:PutBucketWebsite
s3:GetBucketCORS
s3:PutBucketCORS
s3:GetLifecycleConfiguration
s3:PutLifecycleConfiguration
s3:PutBucketLogging
在第二篇文章中,我们会介绍S3权限方面的更多内容,包括IAM、访问令牌(access token)以及EC2、Cognito认证等等。读者可以继续阅读本系列的第二篇文章。