Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >AWS S3 对象存储攻防

AWS S3 对象存储攻防

作者头像
火线安全
发布于 2022-03-01 07:26:25
发布于 2022-03-01 07:26:25
3.6K00
代码可运行
举报
文章被收录于专栏:云安全社区云安全社区
运行总次数:0
代码可运行

文章来源:火线Zone社区,链接:https://zone.huoxian.cn/d/907-aws-s3

文章作者:TeamsSix

0x00 前言

对象存储(Object-Based Storage),也可以叫做面向对象的存储,现在也有不少厂商直接把它叫做云存储

说到对象存储就不得不提 Amazon,Amazon S3 (Simple Storage Service) 简单存储服务,是 Amazon 的公开云存储服务,与之对应的协议被称为 S3 协议,目前 S3 协议已经被视为公认的行业标准协议,因此目前国内主流的对象存储厂商基本上都会支持 S3 协议。

在 Amazon S3 标准下中,对象存储中可以有多个桶(Bucket),然后把对象(Object)放在桶里,对象又包含了三个部分:Key、Data 和 Metadata

  • Key 是指存储桶中的唯一标识符,例如一个 URL 为:https://teamssix.s3.ap-northeast-2.amazonaws.com/flag,这里的 teamssix 是存储桶 Bucket 的名称,/flag 就是 Key
  • Data 就很容易理解,就是存储的数据本体
  • Metadata 即元数据,可以简单的理解成数据的标签、描述之类的信息,这点不同于传统的文件存储,在传统的文件存储中这类信息是直接封装在文件里的,有了元数据的存在,可以大大的加快对象的排序、分类和查找。

操作使用 Amazon S3 的方式也有很多,主要有以下几种:

  • AWS 控制台操作
  • AWS 命令行工具操作
  • AWS SDK 操作
  • REST API 操作,通过 REST API,可以使用 HTTP 请求创建、提取和删除存储桶和对象。

关于对象存储就介绍到这里,下面来看看在对象存储下的一些攻防手法。

0x01 Bucket 公开访问

在 Bucket 的 ACL 处,可以选择允许那些人访问

如果设置为所有人可列出对象,那么只要知道 URL 链接就能访问,对于设置为私有的情况下,则需要有签名信息才能访问,例如 https://teamssix.s3.ap-northeast-2.amazonaws.com/flag?response-content-disposition=xxx&X-Amz-Security-Token=xxx&X-Amz-Algorithm=xxx&X-Amz-Date=xxx&X-Amz-SignedHeaders=xxx&X-Amz-Expires=xxx&X-Amz-Credential=xxx&X-Amz-Signature=xxx

对于敏感文件,建议权限设置为私有,并培养保护签名信息的安全意识。

理论上,如果公开权限文件的名称设置的很复杂,也能在一定程度上保证安全,但不建议这样做,对于敏感文件,设置为私有权限的安全性要更高。

0x02 Bucket 爆破

当不知道 Bucket 名称的时候,可以通过爆破获得 Bucket 名称,这有些类似于目录爆破,只不过目录爆破一般通过状态码判断,而这个通过页面的内容判断。

当 Bucket 不存在有两种返回情况,分别是 InvalidBucketName 和 NoSuchBucket

当 Bucket 存在时也会有两种情况,一种是列出 Object

另一种是返回 AccessDenied

这样通过返回内容的不同,就可以进行 Bucket 名称爆破了,知道 Bucket 名称后,Key 的爆破也就很容易了。

0x03 Bucket Object 遍历

在 s3 中如果在 Bucket 策略处,设置了 s3:ListBucket 的策略,就会导致 Bucket Object 遍历

在使用 MinIO 的时候,如果 Bucket 设置为公开,那么打开目标站点默认就会列出 Bucket 里所有的 Key

将 Key 里的值拼接到目标站点后,就能访问该 Bucket 里相应的对象了

0x04 任意文件上传与覆盖

如果对象存储配置不当,比如公共读写,那么可能就会造成任意文件上传与文件覆盖。

如果目标的对象存储支持 html 解析,那就可以利用任意文件上传进行 XSS 钓鱼、挂暗链、挂黑页、供应链投毒等操作。

0x05 AccessKeyId、SecretAccessKey 泄露

如果目标的 AccessKeyId、SecretAccessKey 泄露,那么就能获取到目标对象存储的所有权限,一般可以通过以下几种方法进行收集:

  • Github 敏感信息搜索
  • 反编译目标 APK
  • 目标网站源代码泄露

0x06 Bucket 接管

假如在进行渗透时,发现目标的一个子域显示如下内容

通过页面特征,可以判断出这是一个 Amazon 的 S3,而且页面显示 NoSuchBucket,说明这个 Bucket 可以接管的,同时 Bucket 的名称在页面中也告诉了我们,为 test.teamssix.com

那么我们就直接在 AWS 控制台里创建一个名称为 test.teamssix.com 的 Bucket 就可以接管了

创建完 Bucket 后,再次访问发现就显示 AccessDenied 了,说明该 Bucket 已经被我们接管了。

将该 Bucket 设置为公开,并上传个文件试试

在该子域名下访问这个 test.txt 文件

可以看到通过接管 Bucket 成功接管了这个子域名的权限

0x07 Bucket ACL 可写

列出目标 Bucket 提示被拒绝

查看目标 Bucket ACL 策略发现是可读的,且策略如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
aws s3api get-bucket-acl --bucket teamssix

查询官方文档,内容如下:

通过官方文档,可以分析出这个策略表示任何人都可以访问、写入当前 Bucket 的 ACL

那么也就是说如果我们把权限修改为 FULL_CONTROL 后,就可以控制这个 Bucket 了,最后修改后的策略如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "Owner": {
        "ID": "d24***5"
    },
    "Grants": [
	{
            "Grantee": {
                "Type": "Group", 
                "URI": "http://acs.amazonaws.com/groups/global/AllUsers"
            }, 
            "Permission": "FULL_CONTROL"
        } 
    ]
}

将该策略写入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
aws s3api put-bucket-acl --bucket teamssix --access-control-policy file://acl.json

再次尝试,发现就可以列出对象了

0x08 Object ACL 可写

读取 Object 时提示被禁止

查看目标 Object 策略发现是可读的,且内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
aws s3api get-object-acl --bucket teamssix --key flag

这个策略和上面的 Bucket ACL 策略一样,表示任何人都可以访问、写入当前 ACL,但是不能读取、写入对象

将权限修改为 FULL_CONTROL 后,Object ACL 策略如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "Owner": {
        "ID": "d24***5"
    },
    "Grants": [
	{
            "Grantee": {
                "Type": "Group", 
                "URI": "http://acs.amazonaws.com/groups/global/AllUsers"
            }, 
            "Permission": "FULL_CONTROL"
        } 
    ]
}

将该策略写入后,就可以读取对象了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
aws s3api put-object-acl --bucket teamssix --key flag --access-control-policy file://acl.json

0x09 特定的 Bucket 策略配置

有些 Bucket 会将策略配置成只允许某些特定条件才允许访问,当我们知道这个策略后,就可以访问该 Bucket 的相关对象了。

例如下面这个策略:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "TeamsSixFlagPolicy",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::teamssix/flag",
            "Condition": {
                "StringLike": {
                    "aws:UserAgent": "TeamsSix"
                }
            }
        }
    ]
}

当直接访问 teamssix/flag 的时候会提示 AccessDenied

而加上对应的 User-Agent 时,就可以正常访问了

在实战中,可以去尝试读取对方的策略,如果对方策略没做读取的限制,也许就能读到。

其次在进行信息收集的时候,可以留意一下对方可能会使用什么策略,然后再去尝试访问看看那些原本是 AccessDenied 的对象是否能够正常访问。

0x10 Bucket 策略可写

修改策略获得敏感文件

现有以下 Bucket 策略

可以看到根据当前配置,我们可以对 Bucket 策略进行读写,但如果想读取 s3://teamssix/flag 是被禁止的

因为当前策略允许我们写入 Bucket 策略,因此可以将策略里原来的 Deny 改为 Allow,这样就能访问到原来无法访问的内容了。

修改后的策略如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "*"
                ]
            },
            "Action": [
                "s3:GetBucketPolicy",
                "s3:PutBucketPolicy"
            ],
            "Resource": [
                "arn:aws:s3:::teamssix"
            ]
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "*"
                ]
            },
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::teamssix/flag"
            ]
        }
    ]
}

这里将第 20 行由原来的 Deny 改成了 Allow

当策略写入后,可以看到成功获取到了原本 Deny 的内容

修改网站引用的 s3 资源进行钓鱼

当策略可写的时候,除了上面的将可原本不可访问的数据设置为可访问从而获得敏感数据外,如果目标网站引用了某个 s3 上的资源文件,而且我们可以对该策略进行读写的话,也可以将原本可访问的资源权限设置为不可访问,这样就会导致网站瘫痪了。

例如这样的一个页面

查看源代码可以看到引用了 s3 上的资源

查看 Bucket 策略,发现该 s3 的 Bucket 策略是可读可写的

这时我们可以修改 Bucket 的静态文件,使用户输入账号密码的时候,将账号密码传到我们的服务器

当用户输入账号密码时,我们的服务器就会收到请求了

修改 Bucket 策略为 Deny 使业务瘫痪

除了上面的利用手法外,也可以将策略设置为 Deny

当策略 PUT 上去后,网站业务就无法正常使用了

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【系统设计】S3 对象存储
在本文中,我们设计了一个类似于 Amazon Simple Storage Service (S3) 的对象存储服务。S3 是 Amazon Web Services (AWS) 提供的一项服务, 它通过基于 RESTful API 的接口提供对象存储。根据亚马逊的报告,到 2021 年,有超过 100 万亿个对象存储在 S3 中。
全球技术精选
2022/09/05
6.9K0
【系统设计】S3 对象存储
浅析云存储的攻击利用方式
本次的议题,关于云存储的一个攻击利用方式,在SRC漏洞挖掘,或在火线安全平台的众测项目中,我们也会收到很多关于对象存储的一个劫持和权限配置的一些问题,对象存储在安全这一块也是一个不可忽略的方向。
火线安全
2022/03/14
2.8K0
浅析云存储的攻击利用方式
对象存储基础概念
对象存储诞生之初 谈到为什么要有对象存储,必须聊聊对象存储诞生之前的两大存储模型:块存储和文件存储。 块存储主要是将存储介质的空间整个映射给主机使用的,主机如果需要对这些空间进行读写IO操作,需要先进行分区和格式化处理,形成可以被操作系统识别的逻辑命名空间,之后主机才能通过操作系统对这些存储介质进行读写操作。常见的块存储有磁盘,SSD,NAS、SAN等,这些物理设备都或多或少存在物理上的极限,比如存储空间、性能等都存在物理极限。 文件存储立足于物理存储介质之上,是操作系统对数据管理操作的抽象,这些抽象最终汇
用户1260683
2018/03/26
5.6K0
对象存储基础概念
对象存储入门
10.5.3 对象接口 对象存储系统(Object-BasedStorage System)是综合了NAS和SAN的优点,同时具有SAN的高速直接访问和NAS的数据共享等优势,提供了高可用性、跨平台性及安全性的数据共享的存储体系结构。 Object是对象存储的基本单元。每个Object都是数据和数据属性集的综合体。数据属性可以根据应用的需求进行设置,包括数据分布、服务质量等。在传统的存储中,块设备要记录每个存储数据块在设备上的位置。Object维护自己的属性,从而简化了存储系统的管理任务,增加了灵活性。O
大数据和云计算技术
2018/03/08
7.3K0
对象存储入门
AWS CLI入门教程
因为公司有用到S3,所以整理了一个S3的简单入门教程。当然,入门之后有其他更高级的用法需求,就靠自己去查文档了。入门的教程能让你快速上手,不至于翻阅一堆文档,容易被劝退。这里主要是介绍如何用cli去操作S3。
用户10002156
2023/08/07
4990
AWS CLI入门教程
云安全-常见漏洞学习笔记
面向对象的存储,也被称为云存储,云存储主要分为三部分,分别是 key、data 和 Metadata
hyyrent
2022/12/26
7930
云安全-常见漏洞学习笔记
Amazon S3 工具及使用
持续部署中需要将编译后的静态资源打包上传到S3服务中 ,就研究了下。 需要申请Amazon账号,得开通信用卡,可免费使用一年 然后开通S3服务,填写bucket名字,最后生成Access Key和Access Secret。
mafeifan
2019/02/25
6.4K0
Amazon S3 工具及使用
S3对象存储获取预签名URL | Golang
最近学习使用对象存储,自然要学习一下 Amazon S3,同时最近学了一下Golang,简单记录一下学习使用 AWS SDK for Go V2 生成文件预签名URL,
ZGGSONG
2022/09/09
2.4K1
S3对象存储获取预签名URL | Golang
最近学习使用对象存储,自然要学习一下 Amazon S3,同时最近学了一下Golang,简单记录一下学习使用 AWS SDK for Go V2 生成文件预签名URL,
ZGGSONG
2022/07/21
3.2K0
AWS S3 学习小结
1.首先,这个是AWS的开发资源使用文档:AWS开发文档,AWS官网 – S3教程
全栈程序员站长
2022/11/03
1.8K0
对象存储,了解一下
对象存储,通常指 S3 (Simple Storage Service) 服务,由AWS提供公有云服务,而 Ceph 也可以提供兼容 S3 协议的对象存储服务,使用起来跟 AWS 的 S3 体验几乎一样。 环境介绍 访问域名: tstack-s3.oa.com 后端物理环境: [ 64G/8Core/11TB*4/10GE*2 ] * 5台 Ceph 版本: Jewel 10.2.7 RGW 网关: 1个/台,共5个,HAProxy+KeepAlived 实现负载均衡。 测试秘钥: access_k
腾讯云TStack
2018/10/12
4K0
对象存储,了解一下
如何使用S3cret Scanner搜索公共S3 Bucket中的敏感信息
S3cret Scanner是一款针对S3 Bucket的安全扫描工具,在该工具的帮助下,广大研究人员可以轻松扫描上传到公共S3 Bucket中的敏感信息。
FB客服
2023/02/10
8550
如何使用S3cret Scanner搜索公共S3 Bucket中的敏感信息
【云原生攻防研究 】针对AWS Lambda的运行时攻击
笔者在上一篇文章《Serverless安全研究— Serverless安全风险》中介绍了责任划分原则。对于开发者而言, Serverless因其服务端托管云厂商安全能力强的特点,实际上降低了总体的安全风险。
绿盟科技研究通讯
2020/12/14
2.1K0
【云原生攻防研究 】针对AWS Lambda的运行时攻击
Ceph对象存储安装部署及验证
今天来玩下Ceph的对象存储,在开始之前呢,先扯会闲篇,我觉得生活中处处是非结构化数据,最简单的举例,下面两个行业,一个是直播,一个是摄影。
DevinGeng
2019/04/09
2.3K0
Ceph对象存储安装部署及验证
s3 aws 临时授权
https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/AuthUsingTempSessionToken.html
周杰伦本人
2022/10/25
1.3K0
腾讯云COS对象存储攻防
账户中的访问策略包括用户组策略、用户策略、存储桶访问控制列表(ACL)和存储桶策略(Policy)等不同的策略类型。
火线安全
2022/03/17
18.9K0
腾讯云COS对象存储攻防
nginx的一点小用法-代理国外s3对象存储加速
有一套环境部署在aws 新加坡区,资源使用s3对象存储,也用了cloudfront加速,但是but国内访问最近抽筋,也特意看了一下解析的地址IP....加速的地址在usa.....资源加速太慢了就想到了用nginx缓存加速一下!当然了还可以用国内腾讯云cos or 阿里云oss同步到国内?但是生命周期,同步成本估计会很高,就简单用nginx先尝试一下了!
对你无可奈何
2023/07/14
9010
开源分布式对象存储-MinIO 顶
Minio可能在国内知道和用的人不是很多,我第一次接触Minio是也是当时我们需要使用Spinnaker集群来管理和维护内部的Kubernetes集群,而Spinnaker的中的持久化存储就使用的是Minio Spinnaker集群搭建。
BGBiao
2020/02/18
4.4K3
开源分布式对象存储-MinIO
                                                                            顶
ceph-对象存储
作为文件系统的磁盘,操作系统不能直接访问对象存储。相反,它只能通过应用程序级别的API访问。ceph是一种分布式对象存储系统,通过ceph对象网关提供对象存储接口,也称为RADOS网关(RGW)接口,它构建在ceph RADOS层之上。RGW使用librgw(RADOS Gateway library)和librados,允许应用程序与ceph对象存储建立连接。RGW为应用程序提供了一个RESTful S3/swift兼容的接口,用于在ceph集群中以对象的形式存储数据。ceph还支持多租户对象存储,可以通过RESTful API访问。此外,RGW还支持ceph管理API,可以使用本机API调用来管理ceph存储集群。
yuezhimi
2020/09/30
3.9K0
Amazon S3 分布式存储的 python 接口实现
Amazon s3 是一种分布式的对象存储。用键值对的方式,来存储数据。其中,存入的所有数据都是一个对象(object),每一个对象都有一个键(key)存在。
用户2434869
2018/09/12
2.1K0
相关推荐
【系统设计】S3 对象存储
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档