簡(jiǎn)述使用asp建設(shè)動(dòng)態(tài)網(wǎng)站頁(yè)面優(yōu)化
文章目錄
- 信息泄露
- 漏洞利用
- 漏洞分析
- 漏洞修復(fù)
- RCE
- 漏洞分析
- 參考文章
信息泄露
漏洞利用
如果MinIO以集群方式部署,存在信息泄露漏洞,攻擊者可以通過(guò)HTTP請(qǐng)求獲取目標(biāo)進(jìn)程的所有環(huán)境變量,包括MINIO_SECRET_KEY
和MINIO_ROOT_PASSWORD
.
vulhub有環(huán)境可以復(fù)現(xiàn)
payload:
POST: /minio/bootstrap/v1/verify
拿到預(yù)存的用戶名和密碼可以直接登錄了
漏洞分析
根據(jù)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請(qǐng)求的方法只有兩個(gè)

line133,代碼新建上下文對(duì)象,用于傳遞HTTP請(qǐng)求和響應(yīng)。 line135,用于輸出錯(cuò)誤日志。 line134作為則是獲取服務(wù)器系統(tǒng)配置。
跟進(jìn)line134的getServerSystemCfg()

在getServerSystemCfg()方法中獲取所有以MINIO_
開(kāi)頭的環(huán)境變量
將環(huán)境變量存儲(chǔ)在envValues里面,其中envValues采用遍歷的方式獲取了skipEnvs[envK]的value
然后,函數(shù)返回一個(gè)名為ServerSystemConfig
的結(jié)構(gòu)體,其中包含了全局變量和環(huán)境變量。
跟進(jìn)skipEnvs

包含一些敏感信息,有預(yù)先設(shè)置的密碼MINIO_CERT_PASSWD
bootstrap-peer-server.go也定義了Verify的路由


cmd/routers.go:75 判斷了一下是集群才會(huì)注冊(cè)上述路由

漏洞修復(fù)
環(huán)境變量進(jìn)行了加密處理
https://github.com/minio/minio/commit/3b5dbf90468b874e99253d241d16d175c2454077?diff=split
RCE
漏洞分析
當(dāng)通過(guò)信息泄漏獲得賬號(hào)密碼之后,可以登陸MinIO更新惡意升級(jí)URL,并且執(zhí)行update觸發(fā)RCE
驗(yàn)證管理員權(quán)限→獲取最新版本→獲取最新版本的sha256sum信息→下載并驗(yàn)證sha256sum→驗(yàn)證無(wú)誤后替換自身并重啟。
cmd/admin-handlers.go ,ServerUpdateHandler函數(shù)
在/minio/admin/v3/update?updateURL={updateURL}
這個(gè)路由的功能中,可以從遠(yuǎn)程加載二進(jìn)制文件,下載并更新。
func (a adminAPIHandlers) ServerUpdateHandler(w http.ResponseWriter, r *http.Request) {// 驗(yàn)證是否是admin權(quán)限objectAPI, _ := validateAdminReq(ctx, w, r, iampolicy.ServerUpdateAdminAction)// 從POST /minio/admin/v3/update?updateURL={updateURL}取updateURL參數(shù)vars := mux.Vars(r)updateURL := vars["updateURL"]mode := getMinioMode()// 解析urlu, err := url.Parse(updateURL)// 下載Release信息并解析出對(duì)應(yīng)的更新信息content, err := downloadReleaseURL(u, updateTimeout, mode)sha256Sum, lrTime, releaseInfo, err := parseReleaseData(content)// 指定二進(jìn)制文件的下載路徑u.Path = path.Dir(u.Path) + SlashSeparator + releaseInfo// 下載二進(jìn)制文件reader, err := downloadBinary(u, mode)// 驗(yàn)證簽名err = verifyBinary(u, sha256Sum, releaseInfo, mode, reader)// 提交二進(jìn)制文件err = commitBinary()// 發(fā)送重啟信號(hào)給channelglobalServiceSignalCh <- serviceRestart
}
驗(yàn)證簽名用的verifyBinary()
,跟進(jìn)后是

由于envMinisignPubKey為空,所以sha256sum失效了。所以我們可以構(gòu)造惡意升級(jí)包,最終形成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