MinIO从信息泄漏到RCE

信息泄露

漏洞利用

如果MinIO以集群方式部署,存在信息泄露漏洞,攻击者可以通过HTTP请求获取目标进程的所有环境变量,包括MINIO_SECRET_KEYMINIO_ROOT_PASSWORD.

vulhub有环境可以复现

payload:

POST:  /minio/bootstrap/v1/verify

image-20230408152805286

拿到预存的用户名和密码可以直接登录了

漏洞分析

根据main.go中的加载模块得知代码逻辑在minio/cmd中

package main // import "github.com/minio/minio"

import (
    "os"

    // MUST be first import.
    _ "github.com/minio/minio/internal/init"

    minio "github.com/minio/minio/cmd"
)

func main() {
    minio.Main(os.Args)
}

漏洞代码在minio/cmd/bootstrap-peer-server.go

接受HTTP请求的方法只有两个

image-20230408152821951

line133,代码新建上下文对象,用于传递HTTP请求和响应。 line135,用于输出错误日志。 line134作为则是获取服务器系统配置。

跟进line134的getServerSystemCfg()

image-20230408152835316

在getServerSystemCfg()方法中获取所有以MINIO_开头的环境变量

将环境变量存储在envValues里面,其中envValues采用遍历的方式获取了skipEnvs[envK]的value

然后,函数返回一个名为ServerSystemConfig的结构体,其中包含了全局变量和环境变量。

跟进skipEnvs

image-20230408152844359

包含一些敏感信息,有预先设置的密码MINIO_CERT_PASSWD

bootstrap-peer-server.go也定义了Verify的路由

image-20230408152851274 image-20230408152900101

cmd/routers.go:75 判断了一下是集群才会注册上述路由

image-20230408152915973

漏洞修复

环境变量进行了加密处理

https://github.com/minio/minio/commit/3b5dbf90468b874e99253d241d16d175c2454077?diff=split

image-20230408152928069

image-20230408152933961

RCE

漏洞分析

当通过信息泄漏获得账号密码之后,可以登陆MinIO更新恶意升级URL,并且执行update触发RCE

验证管理员权限→获取最新版本→获取最新版本的sha256sum信息→下载并验证sha256sum→验证无误后替换自身并重启。

cmd/admin-handlers.go ,ServerUpdateHandler函数

/minio/admin/v3/update?updateURL={updateURL}这个路由的功能中,可以从远程加载二进制文件,下载并更新。

func (a adminAPIHandlers) ServerUpdateHandler(w http.ResponseWriter, r *http.Request) {
    
    
    // 验证是否是admin权限
    objectAPI, _ := validateAdminReq(ctx, w, r, iampolicy.ServerUpdateAdminAction)

    // 从POST /minio/admin/v3/update?updateURL={updateURL}取updateURL参数
    vars := mux.Vars(r)
    updateURL := vars["updateURL"]
    mode := getMinioMode()

    // 解析url
    u, err := url.Parse(updateURL)

    // 下载Release信息并解析出对应的更新信息
    content, err := downloadReleaseURL(u, updateTimeout, mode)
    sha256Sum, lrTime, releaseInfo, err := parseReleaseData(content)

    // 指定二进制文件的下载路径
    u.Path = path.Dir(u.Path) + SlashSeparator + releaseInfo

    // 下载二进制文件
    reader, err := downloadBinary(u, mode)

    // 验证签名
    err = verifyBinary(u, sha256Sum, releaseInfo, mode, reader)

    // 提交二进制文件
    err = commitBinary()

    // 发送重启信号给channel
    globalServiceSignalCh <- serviceRestart
}

验证签名用的verifyBinary(),跟进后是

image-20230408153001674

由于envMinisignPubKey为空,所以sha256sum失效了。所以我们可以构造恶意升级包,最终形成RCE

具体利用可以参考https://github.com/AbelChe/evil_minio

参考文章

https://www.gksec.com/MinIO_RCE.html

https://y4er.com/posts/minio-cve-2023-28432/

https://ek1ng.com/CVE-2023-28432.html

猜你喜欢

转载自blog.csdn.net/qq_61768489/article/details/130029779
今日推荐