本文章仅供学习使用,不能用于非法途径,否则后果自负
云上攻防分为两个部分
第一部分是云服务
第二部分是云原生
知识点:
1、云服务-对象存储-权限配置不当
2、云服务-对象存储-域名解析接管
3、云服务-对象存储-Accesskey泄漏
章节点:
云场景攻防:公有云、私有云、混合云、虚拟化集群、云桌面等
云厂商攻防:阿里云、腾讯云、华为云、亚马云、谷歌云、微软云等
云服务攻防:对象存储、云数据库、弹性计算服务器、VPC&RAM等
云原生攻防:Docker、Kubernetes(k8s)、容器逃逸、CI/CD等
演示案例
云服务-对象存储-权限配置不当
云服务-对象存储-域名解析接管
云服务-对象存储-AccessKey泄漏
云服务对象存储攻防挖掘案例
云服务,顾名思义就是云上服务,在云厂商上购买的产品服务
国内有阿里云、腾讯云、华为云、天翼云、Ucloud、金山云等
国外有亚马逊的AWS、Google的GCP、微软的Azure、IBM云等
各个云厂商对云服务的叫法都不统一,这里统一以AWS为例
S3 对象存储Simple Storage Services,简单的说就是一个类似网盘的东西
EC2 即弹性计算服务Elastic Compute Cloud,简单的说就是在云上的一台虚拟机
RDS 云数据库Relational Database Services,简单的说就是云上的一个数据库
IAM 身份和访问管理 Identity and Access Management,简单的说就是云控制台上的一套身份管理服务,可以用来管理每个子账号的权限
对象存储各大云名词
阿里云: OSS 腾讯云: COS 华为云: OBS
谷歌云: GCS 微软云: Blob 亚马逊云: S3
对象存储:
1、权限配置错误
- 公共读或公共读写: 可完整访问但不显示完整结构
- 权限 Bucket 授权策略: 设置Listobject显示完整结构
- 权限 Bucket 读写权限: 公共读写直接 PUT 文件任意上传
2、域名解析Bucket接管
Bucket存储桶绑定域名后,当存储桶被删除而域名解析未删除,可以尝试接管!
当Bucket显示NoSuchBucket说明是可以接管的,如果显示AccessDenied则不行。
原理:
正常情况:用户创建一个Bucket(存储桶),并将其与一个域名绑定,通过域名访问Bucket中的内容
漏洞产生:当Bucket被删除,但域名解析记录未删除时,域名仍指向该Bucket,攻击者可以尝试创建同名Bucket进行接管
接管流程:
1、确认域名绑定存储桶:通过ping命令或访问域名,查看是否返回对象存储的解析地址
2、获取关键信息:通过域名访问存储桶,若提示NoSuchBucket,则获取存储桶名称、云存储厂商和所在地域
3、创建同名存储桶:在对应厂商和地域创建同名存储桶
4、绑定域名:将新创建的存储桶与目标域名绑定,实现接管
防护措施:
1、及时更新域名解析记录:删除Bucket后,及时删除或更新对应的域名解析记录
2、定期审查DNS记录:检查DNS记录,确保无指向不存在资源的记录
3、启用多因素认证:在域名管理平台启用多因素认证,防止未经授权的更改
4、监控域名状态:使用自动化工具监控域名解析记录和状态,及时发现并修复问题
3、AccessKeyId,SecretAccessKey泄漏
-APP、小程序、JS中泄漏导致
AccessKey标识特征整理-查找
https://wiki.teamssix.com/CloudService/more/
以阿里云为例
首先进入到阿里云的对象存储OOS界面
然后点击Bucket,进入到Bucket列表,这个Bucket列表就相当于这个对象存储桶,也就是阿里云OOS存储对象的容器
然后点击创建Bucket
然后填写Bucket名称,注意创建成功后不能进行修改,然后去填写地域,然后就是读写权限,以及后面有一些高级功能
这是创建出来的Bucket列表,举个例子,如下图所示,然后点击确定
创建成功之后进入到我们所创建的Bucket列表
进入之后如下图所示
然后发现有上传文件的功能
既然有文件上传的功能,我们就可以上传任意文件,文件名为vpc5-8.txt,后面扫描文件成功,然后点击上传文件
点击上传文件之后,发现上传成功
进入到文件列表后,看见了我们上传文件,然后点击那个文件,里面有一个URL,也就是文件存储的路径
然后我们进行访问,发现权限不够,是因为我们设置的Bucket列表的读写属性是私有,所以一般的普通用户是无法进行访问的
然后点击读写权限,将读写权限修改公共读
然后我们再去访问,发现可以进行访问了
当然在我们创建的Bucket里面也有一些配置会造成一些问题
就是权限控制中的Bucket授权策略,如下图所示
ListObject操作就是目录显示操作
只读(不包含ListObject操作):允许用户对Bucket中的对象进行读取操作,但不允许用户列出Bucket中的所有对象
只读(包含ListObject操作):允许用户对Bucket中的对象进行读取操作,同时也允许用户列出Bucket中的所有对象
选择只读(包含ListObject操作),然后点击确定
之前访问这个目录是访问不到的,但现在可以访问到,意思就是可以访问到我们当前目录下的文件
同时,我们也可以创建一个新的目录,然后在该目录里面上传新的文件
上传成功之后我们可以去访问这个目录下的所有文件,包括我们上传的文件
我们也可以去测试一下它的任意文件上传,需要用到的工具就是bp
抓到数据包的时候将其发送到Reperter模块中
然后点击send,发现和我们访问的时候是一样的
接下来我们就进行一个简单的修改
我们回到我们的新创建的Bucket列表中,将读写权限设置为公共读写权限
设置完之后,我们在抓包的页面点击send
发现上传成功,返回到我们的Bucket列表中进行查看
现在我们来进行域名解析Bucket接管操作
我们先去找一个页面,就比如下图所示的这个页面
然后将其上传上去
当我们的访问的时候,发现是下载而非解析
原因是阿里云的OSS是不解析的,所以和传统的文件上传不一样,它本来的作用就是做存储的,一旦去访问就是下载下来
我们为其配置一个域名,如下图所示
成功绑定
然后进入到云解析->域名解析->解析设置,发现已经被记录下来了
解析得需要几分钟时间,所以我们等一会,然后使用ping命令去进行验证
我们去访问OSS下的那个index.html文件,发现访问之后提醒我们要下载
但是在域名底下访问就可以直接访问到
进行实际案例的操作
我们去ping一下我们刚刚绑定的域名,就会出现对象存储的解析地址
然后将对象存储的解析地址复制到数据包的Host那里,然后点击那个笔进行编辑,将我们复制的对象存储的解析地址复制到里面,然后点击OK
send之前我们先去访问一下我们所想要上传的那个文件,发现无法访问到
上传成功
然后我们再重新去访问一下,告诉我们要进行下载,说明上传成功
什么叫做Bucket接管呢,接下来进行操作来理解Bucket接管的概念
我们先去创建一个新的Bucket列表,列表名称叫做xiaodi8
然后我们为该Bucket列表绑定一个域名,也就达到了访问该域名就相当于去访问该Bucket列表的一个目的,域名为xiaodi8.xiaodi8.com
我们为其上传一个html文件
上传成功
我们去访问一下这个刚刚上传的文件
这个页面说明这个域名已经被解析了,但是用户没有权限去访问该存储桶
我们去将该Bucket桶给删除,但是提示我们要将该桶里的所有文件都删除才能将Bucket桶删除
所以我们现在要做的就是将Bucket桶中的文件都删除了
然后去删除这个存储桶
我们去ping一下这个xiaodi8.xiaodi8.com,然后会给我们指向xiaodi8.oss-cn-hongkong.aliyuncs.com这个地址
所以接管是什么意思呢,就是我们找到一个域名的时候,它就会请求到oss这个域名上去了
我们现在根据返回的OSS域名来新建一个Bucket列表,名称和地域都依照返回的域名进行填写
至于说为啥能够在删除的情况下还能访问到,是因为我们仅仅只是删除了Bucket列表,而并没有去删除其对应的解析记录,所以会导致此现象的发生
所以为了完全起见,如果要删除Bucket桶的话,我们就要连同其对应的解析记录也给删除,也能够有效防止信息泄漏
接下来我们进行AccessKey的学习
首先先找到AccessKey的入口,AccessKey也就是凭据
我们先来创建AccessKey
然后登入进去
然后就进入到了OSS浏览器里面,里面有我们所创建的Bucket桶,里面存储的东西我们都可以通过OSS浏览器看到
很多人为了让自己的程序接入到这个OSS里面去,目的是为了用到OSS这个服务,所以就会去创建一个AccessKey,然后在自己的程序里面配置AccessKeyID和AccessKeySecret,然后进行连接,这些东西一旦出现在程序里面就会出现信息泄漏,一旦这两个重要的东西泄漏,攻击者就会利用这两个重要条件去登入到OSS浏览器,从而达到了掌控了OSS资源的权限了
(?i)((access_key|access_token|admin_pass|admin_user|algolia_admin_key|algolia_api_key|alias_pass|alicloud_access_key|amazon_secret_access_key|amazonaws|ansible_vault_password|aos_key|api_key|api_key_secret|api_key_sid|api_secret|api.googlemaps AIza|apidocs|apikey|apiSecret|app_debug|app_id|app_key|app_log_level|app_secret|appkey|appkeysecret|application_key|appsecret|appspot|auth_token|authorizationToken|authsecret|aws_access|aws_access_key_id|aws_bucket|aws_key|aws_secret|aws_secret_key|aws_token|AWSSecretKey|b2_app_key|bashrc password|bintray_apikey|bintray_gpg_password|bintray_key|bintraykey|bluemix_api_key|bluemix_pass|browserstack_access_key|bucket_password|bucketeer_aws_access_key_id|bucketeer_aws_secret_access_key|built_branch_deploy_key|bx_password|cache_driver|cache_s3_secret_key|cattle_access_key|cattle_secret_key|certificate_password|ci_deploy_password|client_secret|client_zpk_secret_key|clojars_password|cloud_api_key|cloud_watch_aws_access_key|cloudant_password|cloudflare_api_key|cloudflare_auth_key|cloudinary_api_secret|cloudinary_name|codecov_token|config|conn.login|connectionstring|consumer_key|consumer_secret|credentials|cypress_record_key|database_password|database_schema_test|datadog_api_key|datadog_app_key|db_password|db_server|db_username|dbpasswd|dbpassword|dbuser|deploy_password|digitalocean_ssh_key_body|digitalocean_ssh_key_ids|docker_hub_password|docker_key|docker_pass|docker_passwd|docker_password|dockerhub_password|dockerhubpassword|dot-files|dotfiles|droplet_travis_password|dynamoaccesskeyid|dynamosecretaccesskey|elastica_host|elastica_port|elasticsearch_password|encryption_key|encryption_password|env.heroku_api_key|env.sonatype_password|eureka.awssecretkey)[a-z0-9_ .\-,]{0,25})(=|>|:=|\|\|:|<=|=>|:).{0,5}['\"]([0-9a-zA-Z\-_=]{8,64})['\"]
我们可以直接将上面的正则表达式添加到bp的插件规则里面
一旦我们进行抓包的时候,只要在源代码或者页面中发现了关键字的触发点,然后bp就会给我们进行提示,比如下图,接下来的操作就是去数据包里面去搜索
云服务对象存储攻防挖掘案例
案例1:对象存储任意文件上传
1、打开xxx.xxx.com 显示目录遍历一般肯定是公共可读写
2、尝试获取解析oos的url地址
3、尝试对oss的url地址进行put上传
案例2:对象存储解析域名劫持
1、访问该域名显示NoSuchBucket,那么只需要去阿里云存储桶重新创建一个与HostID一样的存储域名名称即可
2、随后只需要上传文件,就可以让该域名显示我们上传的任意文件
案例3:对象存储泄漏AccessKey
1、在JS文件中找到存在泄漏的AccessKey
2、在托管平台找到存在泄漏的AccessKey
3、在第三方组件配置不当导致泄漏AccessKey
常见场景:/actuator/heapdump 堆转储文件泄漏SecretId/SecretKey
4、在APP、小程序反编译中泄漏AccessKey
5、利用官方OOS工具连接