0x00 Concept
在“云安全(一)”中简单的介绍过对象存储的概念,本篇章中将详细的说明对象存储相关的概念,以及其存在的安全风险。个人才疏学浅,有未阐述清楚或遗漏的地方,还请谅解,相关的内容可自行搜索。注:以下所有的内容都是以阿里云为例。
1. 对象存储
对象存储的官方介绍:阿里云对象存储 OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务。可以简单的理解为,将要存储的数据以对象的形式来存储在远程服务器集群上(也就是所谓的云端),那么问题来了,什么是对象、对象由哪些部分组成以及为什么要以对象的形式存储?
首先,什么是对象?在对象存储的服务模式中,数据被抽象为一个个对象,以对象为单位进行处理、存储和检索,也就说对象是一种数据存储单元,可能是图片、视频、文件等。对象由三部分组成:Data(数据本身)、Metadata(元数据,包含了对象的描述信息,包括:类型、大小、校验值、自定义信息等)以及 Key(全局唯一标识符,用于对象的快速检索)。并且在处理大量非结构化的数据是,对象存储具有很明显的优势,对象存储可以说是非常适合云环境。
2. 存储桶
不同于传统的层级目录结构,对象存储在一个扁平化的地址空间中,比如:image/1.png
和 2.png
在同一个目录中,没有层级关系。这个扁平化的地方就是存储桶,也叫 Bucket。数据以对象的形式上传到 Bucket 中,并指定 Key 作为其唯一的标识。Bucket 具有各种属性,包括:地域、访问权限、存储类型等。Bucket 在 OSS 范围内必须是全局唯一的,且创建后,名称将无法修改。
全局唯一表示在阿里云所有用户创建的 Bucket 名称都不能相同,比如 A 用户创建 example 的 Bucket,其他用户就无法在创建名为 example 的 Bucket。
3. AK/SK
AccessKey ID 和 AccessKey Secret 简称为 AK/SK,当访问对象时,通过使用 AccessKey ID 和 AccessKey Secret 对称加密的方法来验证某个请求的发送者身份。
-
AccessKey ID 用于标识用户 -
AccessKey Secret 是用于加密签名字符串和 OSS 用来验证签名字符串的密钥
0x01 Usage
简单的介绍了对象存储的相关概念,如下会具体演示怎么创建 Bucket,并且在 Bucket 中存储对象。OSS 控制台:https://oss.console.aliyun.com/
1. 创建 Bucket
首先点击“Bucket 列表”->“创建 Bucket”。
填写“Bucket 名称”,这里的名称必须是全局唯一的。选择“地域属性”,这里选择的地域表示 OSS 数据中心的物理位置,一般而言,距离越近访问越快,创建后无法修改。Endpoint
表示 OSS 对外服务的访问域名,根据不同的地理位置、内外网环境,域名也有所不同。比如下图中的 cn-hangzhou
表示数据中心在中国杭州。
其他暂时用不到,默认即可。在“完成创建”后,就可以在“Bucket”列表中看到了。
2. 上传对象
在“Bucket 列表”中选择新建的 Bucket,然后在“文件列表”中“上传文件”。
点击上传的文件,即可看到详情。
直接访问文件会被拒绝(默认是私有权限),可以修改其访问权限来实现“公共读”。
首先关闭“阻止公共访问”。
点击详情右边的三个点来“设置读写权限”,修改为“公共读”即可。注:这里设置的只是单个文件的权限。
除此之外,还可以在“读写权限”中将 Bucket 的访问权限设置为“公共读”。注:这里设置的 Bucket 的权限。
3. 创建 AK/SK
将鼠标移至头像处,随后点击“AccessKey”来创建密钥。
0x02 Vulnerability
TerraformGoat 是一个支持多云的云场景漏洞靶场搭建工具,目前支持阿里云、腾讯云、华为云、Amazon Web Services、Google Cloud Platform、Microsoft Azure 六个云厂商的云场景漏洞搭建。如下所有案例都以阿里云为主。靶场下载地址:https://github.com/HXSecurity/TerraformGoat
1. 环境搭建
TerraformGoat 使用 Docker 部署,需要 Docker Engine 的支持,所以首先得安装 Docker Engine。安装参考:https://docs.docker.com/engine/install/,如下以 Ubuntu 来进行演示。
# 设置 Docker 的 apt 存储库for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt remove $pkg; donesudo apt updatesudo apt install ca-certificates curlsudo install -m 0755 -d /etc/apt/keyringssudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.ascsudo chmod a+r /etc/apt/keyrings/docker.ascecho"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt update# 安装 Dockersudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin# 验证 Docker 是否成功安装,如下图所示sudo docker run hello-world
安装完 Docker 以及 Docker Engine 后,可以通过如下命令来拉取 TerraformGoat 镜像(如下以阿里云为例)。
# 拉取镜像sudo docker pull registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_aliyun:0.0.7# 创建容器sudo docker run -itd --name terraformgoat_aliyun_0.0.7 registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_aliyun:0.0.7# 开启容器sudo docker start ID# 进入容器sudo docker exec -it terraformgoat_aliyun_0.0.7 /bin/bash# 停止容器sudo docker stop ID
进入对应容器后,再次进入对应的靶场,这里以“unrestricted_file_upload”为例。
在开启靶场的第一步,需要配置 AK/SK(配置一次即可)。首先输入命令:aliyun configure
配置好 AK/SK 后,通过 terraform 工具(后续文章会详细介绍)来搭建靶场。
terraform initterraform apply
提示 Enter a value:
,输入 yes
并回车,成功后会返回 Bucket 的链接,如此靶场搭建成功。
为避免云服务持续产生费用,在复现完后及时销毁靶场。销毁靶场命令:terraform destroy
2. 任意文件上传
如果 Bucket 的权限配置为“公共读写”,那么就可以通过 PUT 方法覆盖或上传任意文件。
如果支持 HTML 解析,那么就可以利用文化上传进行钓鱼、暗链等操作。除此之外,如果其他机器与当前 Bucket 存在数据的交互,那么可以构造恶意内容来实现投毒。
3. Bucket 对象遍历
如果目标策略配置了 ListObject
策略,会造成 Bucket 的目录遍历,泄露 Bucket 的相关信息。
搭建完成后,直接访问 Bucket,可以看到列出了当前 Bucket 下的所有对象。
4. Object ACL 可读
如果在“Bucket 授权策略”配置了 GetObjectAcl
的权限,则可以通过 ?acl
来查看对象的 ACL 权限。
5. Object ACL 可写
如果在“Bucket 授权策略”配置了 PutObjectAcl
权限,那么修改对象的 ACL 来实现未授权访问。
直接访问 flag.txt 会被拒绝。
由于目标配置了 GetObjectAcl
的权限,可以通过 ?acl
来查看对象的 ACL 权限,显示是私有。
通过 PUT 方法将对象的 ACL 修改为“公共读”,添加头部 x-oss-object-acl: public-read
6. Bucket 策略可读
如果在“Bucket 授权策略”配置了 GetBucketPolicy
权限,那么可以通过 ?policy
来列出支持的策略。
7. Bucket 策略可写
如果在“Bucket 授权策略”配置了 PutBucketPolicy
策略,表示可以通过 PUT 方式修改 Bucket 的 policy。
直接访问被拒绝。
查看支持的策略,发现目标支持 PutBucketPolicy
策略。
通过 PUT 方法来添加 ListObjects
策略,实现目录遍历。
8. 特殊的 Bucket 策略
如果设置了某些特定的 IP 或 UA 才能访问 Bucket,且错误的配置了 GetBucketPolicy
策略,那么可以先通过官方工具 aliyun cli
来查看存储桶的特定配置,然后构造请求以绕过限制实现访问 Bucket。要想使用 aliyun cli
工具来获取 Bucket 相关信息,需要配置 AK/SK,当然如果有了 AK/SK 可使用相关工具直接接管存储桶,这里只是为了演示 aliyun cli
工具的使用。
直接访问被拒绝。
首先,通过官方工具 aliyun cli
来查看 Bucket 的策略。命令:aliyun oss bucket-policy --method get oss://hx-cloud-security-vspsf
可以看到,只要 UA 头部为 HxSecurityLab
可以列出所有对象。
9. 存储桶爆破
当存储桶存在时,会返回“AccessDenied”,如下:
而存储桶不存在时,会返回“InvalidBucketName”或“NoSuchBucket”,如下:
返回“InvalidBucketName”,表示存储桶的命名不符合规范。
如此,当不知道 Bucket 的名称时,可通过爆破并根据其返回内容来判断 Bucket 是否存在。除此之外,还可以爆破 Bucket 对应的 Key 来获取目标的数据和资源,也就是所谓的目录爆破。
10 存储桶接管
具体可以参考链接:
https://blog.vidocsecurity.com/blog/aws-s3-bucket-takeover/
https://wiki.teamssix.com/CloudService/S3/bucket-takeover.html
0x03 Reference
https://help.aliyun.com/zh/oss/
https://zone.huoxian.cn/d/918-oss
https://github.com/HXSecurity/TerraformGoat/blob/main/README_CN.md
https://x1lys.github.io/2024/07/16/%E6%B5%85%E6%9E%90OSS%E5%AD%98%E5%82%A8%E6%A1%B6%E6%BC%8F%E6%B4%9E/index.html
原文始发于微信公众号(JJ1ng):云安全(二):对象存储
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论