前言 Minio这个东西也是之前在挖洞的时候碰到过几次了,上周在推特上看到没来得及复现,现在来分析下。
环境搭建 漏洞利用的前提是用户分布式部署
使用vulhub的docker环境
docker-compose.yml
version: '3' services: node1: image: vulhub/minio:2023-02-27T18-10-45Z environment: - MINIO_ROOT_USER=minioadmin - MINIO_ROOT_PASSWORD=minioadmin-vulhub command: - minio - server - --console-address - :9001 - http://node1:9000/mnt/data1 - http://node2:9000/mnt/data2 - http://node3:9000/mnt/data3 ports: - 9000 :9000 - 9001 :9001 hostname: node1 volumes: - ./mnt/data1:/mnt/data1 node2: image: vulhub/minio:2023-02-27T18-10-45Z environment: - MINIO_ROOT_USER=minioadmin - MINIO_ROOT_PASSWORD=minioadmin-vulhub command: - minio - server - http://node1:9000/mnt/data1 - http://node2:9000/mnt/data2 - http://node3:9000/mnt/data3 hostname: node2 volumes: - ./mnt/data2:/mnt/data2 node3: image: vulhub/minio:2023-02-27T18-10-45Z environment: - MINIO_ROOT_USER=minioadmin - MINIO_ROOT_PASSWORD=minioadmin-vulhub command: - minio - server - http://node1:9000/mnt/data1 - http://node2:9000/mnt/data2 - http://node3:9000/mnt/data3 hostname: node3 volumes: - ./mnt/data3:/mnt/data3
访问http://your-ip:9001
可以查看Web管理页面,访问http://your-ip:9000
是API服务。
漏洞分析 https://github.com/minio/minio/security/advisories/GHSA-6xvq-wj2x-3h3q
漏洞poc
curl -X POST http://127.0.0.1:9000/minio/bootstrap/v1/verify
看github的通告 可知主要代码问题出现在
func (b *bootstrapRESTServer) VerifyHandler(w http.ResponseWriter, r *http.Request) { ctx := newContext(r, w, "VerifyHandler" ) cfg := getServerSystemCfg() logger.LogIf(ctx, json.NewEncoder(w).Encode(&cfg)) } func getServerSystemCfg () ServerSystemConfig { envs := env.List("MINIO_" ) envValues := make (map [string ]string , len (envs)) for _, envK := range envs { if _, ok := skipEnvs[envK]; ok { continue } envValues[envK] = env.Get(envK, "" ) } return ServerSystemConfig{ MinioEndpoints: globalEndpoints, MinioEnv: envValues, } }
这个路由没有鉴权,然后直接返回所有的系统环境变量,之所以会包括管理员的账户密码
是因为根据官方的启动说明,在MinIO在启动时会从环境变量中读取用户预设的管理员账号和密码,如果省略则默认账号密码为minioadmin/minioadmin。所以如果没读出来账户密码,就可以说明使用的是默认的口令
而在routers.go中我们可以看到它需要是集群的条件下,才注册这个路由
verify的路由就是漏洞利用的地方
后续修复
diff看一下
发现账户密码还有key也加进了白名单,并在后面加了鉴权
利用工具 因为最近用go写项目,就顺便练习下(go语言两天半练习生)用go写了个检测工具
https://github.com/LHXHL/Minio-CVE-2023-28432
参考 https://mp.weixin.qq.com/s/GNhQLuzD8up3VcBRIinmgQ
https://y4er.com/posts/minio-cve-2023-28432/