Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2022-46169 — Cacti 1.2.22 — неаутентифицированная инъекция команд | Kitploit
Инструменты/GitHubGitHub/k4pxd/cve-2022-46169
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеОбучение и ОбразованиеRed Teaming
GitHubk4pxd/cve-2022-46169

CVE-2022-46169

Cacti 1.2.22 — неаутентифицированная инъекция команд

Репозиторий
8 ч 51 мин назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2022-46169 — Cacti 1.2.22 Неаутентифицированная инъекция команд


ПолеДетали
ПродуктCacti
Затронутая версия1.2.22
УязвимостьНеаутентифицированная инъекция OS-команд
CVECVE-2022-46169
CWECWE-77 — Инъекция команд
СерьёзностьКритическая
CVSS v3.19.8
Вектор атакиСеть
АутентификацияНе требуется
Взаимодействие с пользователемНе требуется
ВоздействиеКонфиденциальность / Целостность / Доступность
Исправленная версия1.2.23
Уязвимый компонентremote_agent.php
Дополнительный компонентlib/functions.php
Основное уязвимое действиеpolldata

Опубликованный вектор CVSS:

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Официальный бюллетень оценивает её в 9.8 Критическая. (GitHub)

1. Корневая причина

На самом деле здесь две ошибки, объединённые в цепочку.

Этап 1 — Обход авторизации

remote_agent.php в Cacti принимает запросы без обычной аутентификации, но пытается определить, является ли запрашивающая сторона авторизованным поллером.

Поток авторизации фактически выглядит так:

root@kitploit:~
HTTP-запрос
     │
     ▼
remote_agent.php
     │
     ▼
remote_client_authorized()
     │
     ▼
get_client_addr()
     │
     ▼
gethostbyaddr()
     │
     ▼
сравнение имени хоста с таблицей poller

Проблема в get_client_addr().

В версии 1.2.22 она проверяет множество серверных переменных, производных от HTTP, включая заголовки forwarded-client-IP. Бюллетень объясняет, что управляемые атакующим значения HTTP_* могут влиять на IP, возвращаемый этой функцией. (GitHub)

Это означает, что приложение можно обмануть, заставив его поверить:

root@kitploit:~
Атакующий
   ↓
"мой IP — это сервер Cacti"
   ↓
gethostbyaddr()
   ↓
имя хоста сервера Cacti
   ↓
совпадает с таблицей poller
   ↓
АВТОРИЗОВАН

Таким образом, атакующему не нужна легитимная учётная запись Cacti.


2. Вторая уязвимость — инъекция команд

После обхода проверки авторизации интересующая функциональность конечной точки — это действие polldata.

Соответствующий путь выполнения примерно таков:

root@kitploit:~
remote_agent.php
      │
      ▼
    polldata
      │
      ▼
 poll_for_data()
      │
      ├── host_id
      ├── local_data_ids
      └── poller_id
              │
              ▼
       поиск poller_item
              │
              ▼
 POLLER_ACTION_SCRIPT_PHP
              │
              ▼
          proc_open()
              │
              ▼
       выполнение OS-команды

Важная ошибка — обработка poller_id.

Приложение получает его с помощью:

root@kitploit:~
get_nfilter_request_var()

вместо того чтобы обеспечивать его целочисленность.

Это управляемое атакующим значение в конечном итоге становится частью команды, передаваемой в PHP-функцию proc_open(). Официальный бюллетень прямо называет это примитивом инъекции команд. (GitHub)

Концептуально:

root@kitploit:~
управляемый атакующим ввод
        ↓
     poller_id
        ↓
 конкатенация строк
        ↓
     proc_open()
        ↓
 команда операционной системы

Это критическая часть уязвимости.


3. Почему это превращается в RCE

Интересный момент для вашего анализа PoC в том, что ни одна из ошибок по отдельности не является всей историей.

Это цепочка уязвимостей:

root@kitploit:~
        ┌──────────────────────────┐
        │ Неаутентифицированный    │
        │ атакующий                │
        └────────────┬─────────────┘
                     │
                     ▼
          remote_agent.php
                     │
                     ▼
        Обход авторизации
          через логику IP клиента
                     │
                     ▼
              polldata
                     │
                     ▼
            поиск poller_item
                     │
                     ▼
       POLLER_ACTION_SCRIPT_PHP
                     │
                     ▼
             ввод атакующего
              → poller_id
                     │
                     ▼
                proc_open()
                     │
                     ▼
              Выполнение команд
                     │
                     ▼
                    RCE

Это очень важное различие, которое стоит сделать в вашем отчёте:

CVE-2022-46169 — это не просто "плохой параметр в remote_agent.php". Это объединённая в цепочку уязвимость обхода авторизации + инъекции команд.

Официальный бюллетень подтверждает, что уязвимое условие выполнения требует poller_item, действие которого — POLLER_ACTION_SCRIPT_PHP. (GitHub)


4. Предварительное условие среды

Ваш PoC должен явно документировать это, поскольку это важная аналитическая деталь.

Целевой системе нужен подходящий poller_item, настроенный с:

root@kitploit:~
POLLER_ACTION_SCRIPT_PHP

Бюллетень Cacti отмечает, что это распространено на производственных установках, поскольку предопределённые шаблоны, такие как Device - Uptime и Device - Polling Time, могут создавать такие записи. (GitHub)

Поэтому не пишите:

"Каждая установка Cacti 1.2.22 автоматически эксплуатируема."

Более технически точное утверждение:

Cacti 1.2.22 уязвим, и успешное выполнение команд зависит от наличия соответствующей конфигурации poller_item.


5. Почему host_id и local_data_id важны

poll_for_data() не просто выполняет переданный poller_id.

Сначала она запрашивает poller_item, используя значения, соответствующие:

root@kitploit:~
host_id
local_data_id

Затем она проверяет действие полученного элемента.

Уязвимое условие фактически таково:

root@kitploit:~
host_id
   +
local_data_id
   ↓
poller_item
   ↓
action == POLLER_ACTION_SCRIPT_PHP
   ↓
уязвимый путь выполнения

Оригинальный бюллетень отмечает, что эти идентификаторы можно обнаружить, поскольку соответствующие записи существуют в базе данных приложения, и что подходящие записи, скорее всего, существуют на производственных установках. (GitHub)

Для публичного PoC я бы продемонстрировал это предварительное условие явно, а не скрывал его.


6. Безопасная методология PoC

Для публикуемого материала я рекомендую сделать PoC, демонстрирующий выполнение команд без предоставления читателям готового weaponized reverse-shell пейлоада.

Например, структурируйте демонстрацию так:

root@kitploit:~
1. Разверните Cacti 1.2.22 в изолированной ВМ
2. Настройте poller_item с POLLER_ACTION_SCRIPT_PHP
3. Подтвердите доступность remote_agent.php
4. Продемонстрируйте влияние на решение об авторизации
5. Достигните пути выполнения polldata
6. Используйте безвредный маркер выполнения команд
7. Зафиксируйте результирующие доказательства приложения/журналов
8. Обновитесь до 1.2.23
9. Повторите тест
10. Продемонстрируйте, что уязвимость больше не эксплуатируема

Это даёт легитимную демонстрацию уязвимости, не превращая отчёт в готовое интернет-оружие RCE.


7. Анализ исходного кода для вашего отчёта

Вы можете разделить уязвимый код на три области.

A. remote_agent.php

Отвечает за предоставление функциональности удалённого агента и диспетчеризацию запрошенного действия.

root@kitploit:~
remote_agent.php
      │
      └── action = polldata
                 │
                 ▼
            poll_for_data()

B. lib/functions.php

Содержит get_client_addr().

Проблемный дизайн заключается в доверии значениям, производным от HTTP, при определении фактического сетевого адреса запрашивающей стороны.

Официальный бюллетень перечисляет несколько связанных с HTTP переменных, которые проверяются перед возвратом к фактическому удалённому адресу. (GitHub)

C. proc_open()

Финальная опасная точка — конструирование PHP-команды, выполняемой через proc_open().

Бюллетень определяет уязвимый поток как:

root@kitploit:~
poller_id
    ↓
get_nfilter_request_var()
    ↓
конструирование команды
    ↓
proc_open()

(GitHub)


8. Почему патч это исправляет

Бюллетень Cacti определяет два важных изменения для устранения уязвимости.

Во-первых, poller_id следует обрабатывать как целое число:

root@kitploit:~
get_nfilter_request_var()
             ↓
get_filter_request_var()

Во-вторых, значение должно дополнительно экранироваться для оболочки перед включением в команду:

root@kitploit:~
escapeshellarg($poller_id)

Бюллетень конкретно рекомендует обе меры. (GitHub)

Сторона авторизации также должна перестать позволять атакующему произвольно влиять на IP клиента, используемый для авторизации. (GitHub)


9. Сравнение версий

root@kitploit:~
Cacti 1.2.22
     │
     ├── уязвима
     ├── обход авторизации
     ├── инъекция команд
     └── потенциальный неаутентифицированный RCE
     
Cacti 1.2.23
     │
     └── CVE-2022-46169 исправлена

Бюллетень вендора указывает 1.2.22 как затронутую и 1.2.23 как исправленный релиз 1.2.x. (GitHub)

Бюллетень безопасности Amazon независимо описывает проблему как позволяющую неаутентифицированному атакующему выполнять произвольные команды и присваивает ей оценку CVSS 9.8. (AWS Training and Certification)


10. Хорошее название для вашего опубликованного PoC

Я бы использовал что-то вроде:

CVE-2022-46169 — Неаутентифицированная инъекция команд / RCE в Cacti 1.2.22

Или более техническое:

CVE-2022-46169: Анализ цепочки обхода авторизации и инъекции команд в удалённом агенте Cacti 1.2.22

А сводка уязвимости может быть такой:

Cacti 1.2.22 содержит критическую цепочку уязвимостей в функциональности удалённого агента. Атакующий может манипулировать логикой определения адреса клиента, чтобы обойти проверку авторизации удалённого агента. После достижения функциональности polldata недостаточная проверка параметра poller_id позволяет данным, управляемым атакующим, достичь команды, выполняемой через proc_open(). При конфигурациях, содержащих элемент поллера POLLER_ACTION_SCRIPT_PHP, это может привести к неаутентифицированному удалённому выполнению команд. Проблема была исправлена в Cacti 1.2.23. (GitHub)

Одна важная поправка для вашего исследования: не путайте это с CVE-2023-39362. Эта более поздняя RCE в Cacti затрагивает 1.2.24 и была исправлена в 1.2.25, так что это не та уязвимость, которая нужна для PoC на 1.2.22. (NVD)

Скачать инструмент