0x01 原理
亚马逊S3对象存储,可以存放文件、图形等资源。通过api进行读写操作。近几年的网站开发存储资源文件如头像、上传文件等都基本开始采用对象存储的方式进行。
阿里云的对象存储对应简称为OSS,腾讯云的对象存储为COS。在使用对象存储时,首先会创建一个存储桶(bucket),在对应的存储桶中可以上传文件、创建文件夹等操作。同时还具备对应的权限管理。一般在开发过程中,创建好存储桶后,使用api接口对存储桶进行相关的操作。
生成新的存储桶时,系统会默认创建一个域名,类似于http://bscw-web-admin-prod.s3-website.us-east-2.amazonaws.com
和https://coding-pages-bucket.cos-website.ap-hongkong.myqcloud.com
,域名规则为子域为桶名称,然后加上对象存储的简称,然后加上地域的名字。例如,coding-pages-bucket
是桶的名称,cos-website
是对象存储的名称,ap-hongkong
为对象存储所在的区域。
一般情况下,会配置一个CNAME的域名映射,将自己的域名映射到存储桶默认分配的域名,这样存储桶就能通过静态页面对资源进行展示了。
根据以上原理描述,可以对对象存储进行劫持,原理可以按照如下理解
- 在存储桶不再使用后,一般厂家会删除对应的存储桶,因为云存储是要收费的,但是域名对应存储桶域名的映射一般不会删除
- 所以在访问域名时候,会提示404,并且显示
NoSuchBucket
- 这时候域名访问的则是对存储桶映射的域名的访问。劫持时,则是在对应的云存储厂商上面注册一样存储桶,那么则可以劫持对应的域名了。
- 注册存储桶一共有两个要点,一是注册同样名字的存储桶,二是注册同一个地域的存储桶,目的就是保持生成的存储桶域名一致
0x02 实战S3劫持
1. 搜索
可以通过fofa进行搜索,语法是body="BucketName"
,搜索结果404的页面基本为废弃的存储桶。
2. 注册存储桶并劫持
根据搜索结果得到BucketName
如果搜索出来的域名不为amazon自动分配的带有区域的域名,则需要通过域名查询CNAME的的映射,需要得到相关的区域。
创建存储桶时,输入对应的桶名称,选择对应的区域
将阻止公开访问的勾去掉,确保能够公开访问
在该存储桶内上传对应的文件,一般传入index.html
此时访问对应的域名,已经显示AccessDenied了,证明已经生效了。但是由于访问权限问题,导致在公开访问时,会显示访问拒绝,后面仅需要设置对应的权限即可。
在对应文件(index.html)的访问控制列表(ACL)
中,将访问权限打开
最后一步,因为是静态网站,需要在存储桶属性里面将静态网站托管的权限打开
最后即可劫持成功