
Python-скрипт для обнаружения CVE-2024-23113, уязвимости форматной строки в сервисе FortiGate FGFM на TCP/541, использующий SSL-соединение и специально сформированный пейлоад для вызова повреждения памяти.
Скрипт предназначен для обнаружения CVE-2024-23113 — уязвимости форматной строки в сервисе FGFM FortiGate (протокол FortiGate to FortiManager), работающем на TCP-порту 541. Уязвимость возникает из-за того, что атакующий может управлять форматной строкой, что может привести к удалённому выполнению кода (RCE) или другим нежелательным последствиям. Сервис FGFM обеспечивает связь между устройствами FortiGate и FortiManager для управления конфигурацией, и в непропатченной версии неправильно обрабатываются входные данные, что делает её подверженной эксплуатации через форматную строку. Как работает скрипт
Настройка сетевого подключения:
Скрипт сначала устанавливает SSL/TLS-соединение с целевым устройством на порту 541.
Для установки соединения используется объект ssl.SSLContext с отключённой проверкой сертификата, так как устройство может использовать самоподписанные сертификаты.
Формирование полезной нагрузки:
После подключения скрипт создаёт вредоносную полезную нагрузку с использованием эксплуатации форматной строки (authip=%n). Директива %n указывает системе записать количество уже выведенных байт в переменную, что может привести к повреждению памяти.
Сформированная полезная нагрузка отправляется целевому устройству через установленное соединение.
Логика обнаружения:
Затем скрипт проверяет реакцию целевого устройства на полезную нагрузку.
Если соединение внезапно разрывается и возникает предупреждение SSL, это указывает на то, что цель уязвима, поскольку сработали механизмы защиты от уязвимости форматной строки (например, _FORTIFY_SOURCE в glibc).
Если соединение остаётся открытым, цель, скорее всего, пропатчена.
Инструкция по использованию
Запустите скрипт:
Запустите скрипт с помощью Python 3, выполнив:
sh
python check_vulnerability.py
Введите имя хоста/IP:
Вас попросят ввести имя хоста или IP-адрес для проверки на уязвимость.
Если хотите остановиться, введите exit.
Вывод:
Если цель уязвима, скрипт выведет:
[!] Предупреждение: <имя_хоста> уязвим!
Если цель пропатчена, будет выведено:
[+] <имя_хоста> выглядит пропатченным.
Требования
Установленный Python 3 на машине, запускающей скрипт.
Сетевой доступ к целевому устройству, с открытым портом 541.
На целевом устройстве должен быть запущен сервис FGFM.