
A scanner for the FortiNet vulnerability CVE-2025-64446
Простой вспомогательный скрипт на Python для проверки целей Fortinet/FortiWeb на наличие шаблона обхода аутентификации fwbcgi, о котором сообщила watchTowr Labs. Данные и детали запроса взяты из: https://labs.watchtowr.com/when-the-impersonation-function-gets-used-to-impersonate-users-fortinet-fortiweb-auth-bypass/
python3 scanner.py http://192.168.9.1:80
python3 scanner.py -f targets.txt --find-forti --follow-redirects
Цели должны явно содержать схему (http:// или https://). Если порт не указан, сканер использует 80 для HTTP или 443 для HTTPS. Выводит одну строку на цель с пометками [+] VULNERABLE, [+] MAY BE VULNERABLE, [+] PATCHED, [+] POSSIBLY PATCHED или [-] INDETERMINATE; опционально подсвечивает слова, содержащие «forti».
targets: одна или несколько записей вида <scheme>://<host>[:<port>] в командной строке (порты по умолчанию: 80 для HTTP или 443 для HTTPS).-f/--targets-file: чтение дополнительных целей из файла(ов); тот же формат <scheme>://<host>[:<port>].--timeout: таймаут сокета в секундах (по умолчанию 5).--find-forti: вывод уникальных токенов, содержащих «forti», которые появились в теле ответа.--follow-redirects: включение обработки перенаправлений для целей, возвращающих ответы 30x.--max-redirects: ограничение количества переходов при активном --follow-redirects (по умолчанию 3; отключает переходы, даже если флаг установлен).Из-за отсутствия нормальной инфраструктуры для тестирования вот наивный набор тестов, который я использовал.
PYTHONPYCACHEPREFIX=./.pycache python3 -m unittest discover -s tests
Сканер использует поддержку TLS 1.2+ для связи с современными сайтами Fortinet или защищёнными Cloudflare. Убедитесь, что используемый python3 собран с последней версией OpenSSL:
/usr/bin/python3) привязан к LibreSSL 2.8 и не может согласовать TLS 1.3, что вызывает ошибки TLSV1_ALERT_PROTOCOL_VERSION. Установите современный интерпретатор через Homebrew (brew install python) или pyenv и запускайте сканер с его бинарником (например, /opt/homebrew/bin/python3).python3 - <<'PY'\nimport ssl; print(ssl.OPENSSL_VERSION)\nPY. Если версия старая, установите обновлённый python (pyenv, бэкпорты дистрибутива и т.д.).ssl.OPENSSL_VERSION, если работаете в WSL или старой виртуальной среде.Если вам приходится работать на старом интерпретаторе, ожидайте, что HTTPS-цели, требующие TLS 1.3, будут выдавать ошибку; HTTP-цели продолжат работать независимо от этого.
0--validate-tls: принудительная проверка сертификатов для HTTPS-целей и перенаправлений (по умолчанию проверка отключена, чтобы избежать блокировки на самоподписанных сертификатах).--workers: количество параллельных сканирований через asyncio (по умолчанию 10).--user-agent: пользовательский HTTP-заголовок User-Agent (по умолчанию fwbcgi-scanner/1.0).--csv-output: запись строк вида <target>,<classification> в указанный CSV-файл в дополнение к выводу в консоль.