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

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

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

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

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

Категории

Все категории
Loading categories
Fortigate-SSL-VPN-Exploit-Kit — The FortiGate SSL-VPN pot of gold. CVE-2024-21762 и CVE-2023-27997. 79 рабочих эксплойт-клиентов. 53 аппаратных SKU. 55 сборок FortiOS. | Kitploit
Инструменты/GitHubGitHub/abraxas/fortigate-ssl-vpn-exploit-kit
Фреймворки для эксплойтовАнализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийЭксфильтрация данныхСетевая безопасностьТестирование на ПроникновениеКомандование и УправлениеRed Teaming
Разработка Полезной Нагрузки
GitHubabraxas/fortigate-ssl-vpn-exploit-kit

Fortigate-SSL-VPN-Exploit-Kit

The FortiGate SSL-VPN pot of gold. CVE-2024-21762 и CVE-2023-27997. 79 рабочих эксплойт-клиентов. 53 аппаратных SKU. 55 сборок FortiOS.

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

Популярное

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

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

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

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

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

FortiGate SSL-VPN kit (восстановлен в дикой природе)

Исследовательский архив. Восстановлен в том виде, в каком был найден. Я не писал эти файлы.
Опубликовано: 1 сентября 2026 года

Этот репозиторий — оркестратор, полезные нагрузки второй стадии и операторские слушатели, которые работают поверх каталога эксплойтов FortiGate SSL-VPN для каждой SKU. Полная история, статистика и заметки по охоте находятся в серии The SSL-VPN pot of gold на Abraxas Labs.

  • Сайт: abraxaslabs.tech
  • Серия: The SSL-VPN pot of gold
  • GitHub: github.com/abraxas
  • Twitter / X: @abraxas_null

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


Что это такое

Я нашёл частный набор инструментов FortiGate SSL-VPN в дикой природе. Первая выгрузка представляла собой каталог рабочих клиентов: файлы вроде и . Каждый файл — это . Два публичных n-day, перештампованных по всему железу и прошивкам, пока папка не стала похожа на каталог запчастей.

exp/exp_60E-v6.4.7.py
exp/exp_1000D-v7.4.0.py
клиент повреждения памяти для конкретной SKU и конкретной FortiOS

Золото — это матрица смещений, а не новая уязвимость. Этот аргумент изложен в Фазе 0 серии. Фаза 1 рассматривает два примитива как поведение. Фаза 2 — это поисковая карта SKU / train / CPU. Фаза 3 — охота.

Этот репозиторий — остальная часть того же набора, а не второе семейство эксплойтов.

  • Программы из exp/ — это клиенты для каждого образа, уже описанные в серии.
  • Файлы родительского каталога и shellcode/ — это загрузчик, получение импланта и слушатели кражи конфигурации, для вызова которых были написаны эти клиенты.
  • Файлы exp_*.py никогда не содержали имплант. Они знали только, как (1) получить сырые байты с «сервера шеллкода» или (2) выполнить GET /s.js и eval. Эти недостающие части находятся здесь.

Примитивы:

СемействоCVEКонсультация FortinetПубличный статус
ACVE-2024-21762FG-IR-24-015Assetnote — Two Bytes is Plenty
BCVE-2023-27997FG-IR-23-097Lexfo — XORtigate, Bishop Fox

Оба находятся в каталоге известных эксплуатируемых уязвимостей CISA. poc.py не реализует ни одну из этих CVE. Он выбирает и оборачивает два уже классифицированных семейства (chunked-write 21762; enc= heap overflow 27997).


Структура

root@kitploit:~
.
├── poc.py                     # загрузчик pocsuite3 / снятие отпечатка / менеджер процессов
├── s.js                       # вторая стадия на Node (кража конфигурации)
├── send_cmd.py                # обработчик обратного вызова для пути stager
├── init.sh                    # установка пакетов на рабочую станцию оператора
├── requirements.txt           # pwntools
├── exp/
│   └── exp_<SKU>-v<FortiOS>.py
└── shellcode/
    ├── shellcode_server.py    # передача блоба с префиксом длины
    ├── shellcode_arm          # ~2.0 МБ сырой второй стадии
    └── shellcode_amd64        # ~2.7 МБ сырой второй стадии

exp/index.html и shellcode/index.html — обычные листинги каталогов Python http.server. Они лишь показывают, что это дерево в какой-то момент размещалось как веб-корень.

Эта копия exp/ — более ранний каталог плюс четыре дополнительных клиента: exp_30E-v6.2.4.py, exp_30E-v6.2.12.py, exp_30E-v6.2.14.py, exp_40F-v7.0.5.py.


Как части соединяются

root@kitploit:~
poc.py                          оркестратор (pocsuite3)
  │
  ├─ снятие отпечатка портала ─ VERSION_LIBS (hash → SKU + FortiOS)
  ├─ выбор файла ────────────── exp/exp_<SKU>-v<ver>.py
  │
  ├─ если клиент типа "stager" (Family A ARM / некоторые amd64)
  │     запуск shellcode/shellcode_server.py
  │           читает shellcode/shellcode_arm  или  shellcode_amd64
  │     запуск send_cmd.py                   (ожидание обратного вызова)
  │     запуск приёмника конфигурации на :9999
  │     запуск выбранного exp_*.py
  │
  └─ если клиент типа "Node /s.js" (большинство Family B + многие Family A)
        раздача s.js по HTTP
        запуск приёмника конфигурации на :9999
        запуск выбранного exp_*.py
              → межсетевой экран GET /s.js → eval → эксфильтрация

Конвейер одной строкой: идентификация → выбор файла смещений → повреждение sslvpnd → получение импланта → эксфильтрация /data/config/*.gz → архивирование на стороне оператора.

Последний шаг — суть. Попадание — это неаутентифицированное выполнение кода в sslvpnd на самом межсетевом экране — терминаторе TLS, политике маршрутизации, VPN-сессиях, часто привязках LDAP/RADIUS. FortiOS не предоставляет полезного /bin/sh. Публичные исследования и этот набор оба идут через внутренний помощник команд и/или /bin/node, который FortiOS действительно поставляет. Считайте подтверждённое попадание компрометацией сетевого периметра, а не падением демона. См. Что означает попадание.


Файл за файлом

poc.py — загрузчик

Операторский интерфейс (pocsuite3 POCBase). Он не реализует CVE-2024-21762 или CVE-2023-27997.

  1. Выполняет https://<target>/remote/login?lang=en (запасной вариант GB2312).
  2. Извлекает хэш для обхода кэша из /sslvpn/js/login.js?q=<md5>.
  3. Ищет этот хэш во встроенной таблице VERSION_LIBS (182 строки hash,SKU,version). Именно эта таблица позволяет набору выбирать среди 50+ устройств без указания SKU оператором. Те же SKU, что и в матрице, на основе публичного хэша ресурса SSL-VPN, а не SNMP или управляющего API.
  4. Разрешает exp/exp_<SKU>-v<version>.py.
  5. Классифицирует клиента, читая его исходный код:
    • содержит s.js → тип 2 (загрузчик Node)
    • в использовании упоминается Shellcode Server → тип 1 (stager); затем ищет arm или amd64 в скрипте
  6. Запускает соответствующие помощники и Popen для exp_*.py с аргументами host/port/callback.

Адрес оператора по умолчанию в этой копии: HOST_IP из окружения, иначе ATTACKER_HOST. Литеральные IPv4-адреса в этом дереве заменены ролевыми метками (порты не изменены):

МеткаРольГде встречалась
TARGET_HOSTАтакуемый FortiGateНикогда не захардкожен; rhost / target из argv (см. poc.py)
ATTACKER_HOSTРабочая станция оператораПо умолчанию HOST_IP в poc.py; адреса привязки в poc.py, send_cmd.py, shellcode/shellcode_server.py; заполнители s.js / TFTP в exp_*.py, заполняемые lhost
C2_HOSTЗапечённый обратный вызов в этой копии имплантаs.js — не lhost, передаваемый в эксплойт
ПортРоль
7777Обратный вызов / send_cmd.py
8888Сервер шеллкода
9999Приёмник конфигурации (совпадает с эксфильтрацией в s.js и send_cmd.py)

Если хэш портала отсутствует в VERSION_LIBS, он останавливается с сообщением «unknown target hash». Если хэш совпадает, но файл exp/ отсутствует — «no exp».

s.js — недостающая вторая стадия на Node

Это файл, который клиенты Family B / Node Family A получают после execute_cmd. Это не обычный обратный шелл.

  • Захардкоженный обратный вызов C2_HOST:9999 (хост C2, не TARGET_HOST и не lhost / ATTACKER_HOST, передаваемые в эксплойт — эта копия была запечена под один операторский обратный вызов).
  • Читает /data/config/ на межсетевом экране.
  • Берёт файлы *.gz, не являющиеся симлинками (сжатые объекты конфигурации FortiOS).
  • Распаковывает их и отправляет каждый по небольшому TCP-протоколу с префиксом длины, затем маркер конца.

Это кража конфигурации. Это объясняет, почему poc.py также слушает на 9999 и собирает файлы в результат base64. Ищите C2_HOST на порту 9999 из любого исходящего трафика FortiGate. Заметки по охоте: Фаза 3.

send_cmd.py — обработчик обратного вызова для пути stager

Используется, когда выбранный exp_*.py относится к типу шеллкода ARM/amd64 (в использовании упоминается сервер шеллкода).

  • Слушает на 7777.
  • При подключении записывает одну команду: cd /data/config и cat каждого *.gz в nc <LHOST> 9999.
  • Та же цель, что и у s.js (кража конфигурации), другой транспорт (обратный вызов шелла вместо Node).

Закомментированный вариант использовал фрейминг base64 вместо сырого cat.

shellcode/shellcode_server.py — передача байтов для stager'ов Family A

Соответствует протоколу, уже видимому в заглушках ARM32 exp_*.py:

  1. Привязка к выбранному оператором порту (poc.py использует 8888).
  2. Принятие одного соединения.
  3. Отправка 4-байтовой длины в little-endian.
  4. Отправка блоба shellcode_<arch> из того же каталога.

Stager'ы exp_*.py подключаются сюда, отображают память с правами записи и исполнения, получают блоб, затем подключаются обратно к lhost:lport (7777 → send_cmd.py).

shellcode/shellcode_arm и shellcode/shellcode_amd64

Сырые блобы второй стадии (~2.0 МБ ARM, ~2.7 МБ amd64). Это то, что загружает stager. Это не крошечная заглушка Thumb внутри Python-файлов; эти заглушки только получают эти файлы. Считайте их имплантом для пути, не использующего Node. Размер указывает на упакованные или статические полезные нагрузки, а не на несколько десятков инструкций.

init.sh — настройка рабочей станции оператора

Не используется против межсетевого экрана. Устанавливает build-essential, binutils-arm-linux-gnueabihf и gcc-aarch64-linux-gnu. Это для сборки компонентов ARM/AArch64 на атакующей машине на базе Debian. Соответствует автору, который компилирует stager'ы, а не только поставляет Python.

requirements.txt

Одна строка: pwntools. Файлы exp_*.py и shellcode_server.py импортируют его. poc.py также требует pocsuite3, python-dotenv, mmh3 и requests.


Связь с клиентами exp/

Уже описано в серииРоль в этом дереве
Family A ARM exp_*.py (аргументы stager)Первая стадия. Вызывает shellcode_server.py + shellcode_arm (или amd64), затем lhost:7777.
Family A/B Node exp_*.py (/s.js)Первая стадия. HTTP GET родительского s.js, затем eval.
Варианты 6.0 D-series TFTP / /tmp/sТа же цель s.js через TFTP; всё ещё ожидает этот файл на HTTP-корне оператора.

Ничто в родительском каталоге не реализует третью CVE. Статистика, тепловая карта SKU и выравнивание train (Family A до 7.4.0 / 7.4.1; Family B в окне 27997) находятся в Фазе 0 и Фазе 2. Наиболее интенсивная перенастройка в исходном каталоге: FortiGate-60E, 100E, 60F, 100F — оборудование филиалов.


Что это меняет

Первая выгрузка останавливалась на «получить обратный вызов». Тела второй стадии отсутствовали. Это дерево делает цель явной:

  1. Кража конфигурации FortiOS из /data/config/*.gz, а не «общий RCE». Это компрометация учётных данных и топологии (пользователи VPN, маршруты, секреты, хранящиеся в этих объектах).
  2. Набор IOC конкретен (см. ниже).
  3. VERSION_LIBS в poc.py — готовый список «какую SKU они считали этим хэшем».
  4. Набор — это полный конвейер кражи конфигурации, а не мешок несвязанных PoC.

Индикаторы (эта копия)

Разведка портала и URI первой стадии задокументированы в Hunting the kit. Отличительные, уже упомянутые в публичных отчётах и в этом дереве:

  • Разведка портала: GET /remote/login и /sslvpn/js/login.js?q=
  • URI первой стадии: /aaaa/bbbb, /remote/error, /remote/info, /remote/hostcheck_validate с enc=
  • Исходящий HTTP GET /s.js с межсетевого экрана
  • Исходящий TCP с межсетевого экрана на 7777 / 8888 / 9999
  • Запечённый C2 C2_HOST:9999 внутри этой копии s.js (хост C2)
  • Операторские слушатели на ATTACKER_HOST портах 7777 / 8888 / 9999 (хост атакующего)
  • Цель никогда не захардкожена: TARGET_HOST — это rhost, указанный во время выполнения

Ищите исходящий трафик с межсетевого экрана (TARGET_HOST) на C2_HOST:9999 и на любой ATTACKER_HOST, который раздавал /s.js в соответствующем окне.


Чего этот набор не доказывает

Из введения:

  • Новый 0-day. Примитивы — это n-day с публичными отчётами.
  • FortiProxy, FortiManager, FortiAnalyzer, FortiWeb. Здесь нет образцов.
  • SKU, отсутствующие в восстановленной матрице (многие устройства 70F / 90G / 120G, образы только для VM, шасси 6K / 7K). Нет скомпилированных смещений.
  • Сборки после опубликованных срезов Fortinet. Сверяйтесь с актуальной консультацией (FG-IR-24-015, FG-IR-23-097), а не с этой папкой.
  • Персистентность. Она жила бы в последующем этапе, который всё ещё не реализован как отдельная третья стадия в этих скриптах.

Публичный PoC против VM — это другой артефакт. Этот пакет — для того, кто ответил на разведку.


Серия

  1. Фаза 0 · Введение — находка, статистика, ставки.
  2. Фаза 1 · Две публичные двери — Family A и Family B как поведение, а не рецепт.
  3. Фаза 2 · Матрица — 53 SKU, train, CPU. С возможностью поиска.
  4. Фаза 3 · Охота за набором — отличительные URI, срезы патчей, что делать, если портал был доступен.

Если вы эксплуатируете FortiGate: инвентаризируйте модель, точную FortiOS, включён ли SSL-VPN, был ли портал доступен из недоверенных сетей. Затем прочитайте Фазу 2. Не инвентаризируйте только филиальные коробки серии 60, потому что эти имена файлов были самыми громкими.


Уведомление

Эти файлы были восстановлены в дикой природе в ходе независимого исследования безопасности. Я не создавал их. Они опубликованы в том виде, в каком были найдены, после того как соответствующие CVE были публично раскрыты и исправлены.

Только для исследовательских / образовательных целей. Не запускайте, не разворачивайте и не используйте этот материал против любого хоста без явного письменного разрешения как от стороны, разместившей этот репозиторий, так и от владельца целевых систем.

— @abraxas_null · abraxaslabs.tech · github.com/abraxas

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