0


MinIO从信息泄漏到RCE

文章目录

信息泄露

漏洞利用

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

MINIO_SECRET_KEY

MINIO_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-20230408152851274image-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

标签: 安全 服务器 网络

本文转载自: https://blog.csdn.net/qq_61768489/article/details/130029779
版权归原作者 ThnPkm 所有, 如有侵权,请联系我们删除。

“MinIO从信息泄漏到RCE”的评论:

还没有评论