Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
FUXAPWN — Exploit POC para CVE-2026-25895 FUXA: Path Traversal sin autenticación -> Escritura arbitraria de archivos -> RCE | Kitploit
Herramientas/GitHubGitHub/hann1bl3l3ct3r/fuxapwn
Escalada de PrivilegiosReconocimientoMecanismos de PersistenciaAnálisis de VulnerabilidadesExplotaciónMovimiento LateralSeguridad SCADA/ICSExplotación de Aplicaciones WebRecopilación de InformaciónPruebas de PenetraciónDesarrollo de Payloads
hace 2 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
GitHub
hann1bl3l3ct3r/fuxapwn

FUXAPWN

Exploit POC para CVE-2026-25895 FUXA: Path Traversal sin autenticación -> Escritura arbitraria de archivos -> RCE

Ver Repositorio
Compartir

CVE-2026-25895 — FUXA <= 1.2.9 Path Traversal no autenticado a Ejecución Remota de Código

Escritura arbitraria de archivos no autenticada (pre-auth) contra FUXA, una plataforma SCADA/HMI basada en Node.js. Encadena a ejecución remota de código mediante varias primitivas posteriores a la escritura. Funciona incluso cuando secureEnabled = true (autenticación activada) porque el endpoint vulnerable no tiene middleware asociado.

También disponible en ExploitDB: https://www.exploit-db.com/exploits/52568

CampoValor
ID CVECVE-2026-25895
AfectadoFUXA <= 1.2.9
ParcheadoFUXA 1.2.10
Proveedorfrangoteam / FUXA
Vector de ataqueRed (HTTP/HTTPS)
AutenticaciónNo se requiere
ImpactoEscritura arbitraria de archivos, ejecución remota de código
CVSS v3.19.8 (Crítico) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
InvestigadorAnthony Cihan (Hann1bl3L3ct3r)

Resumen

El endpoint POST /api/upload de FUXA (server/api/projects/index.js:193) está registrado sin middleware, omitiendo tanto la comprobación secureFnc de JWT / clave API como la compuerta de permisos de administrador aplicada a todos los demás endpoints de gestión de proyectos. Dentro del manejador, el campo destination del cuerpo JSON se concatena a una ruta del sistema de archivos con solo un guion bajo inicial y sin normalización ni comprobación de contención:

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

Un valor de destination con la forma a/../../../../../etc (donde a absorbe el prefijo de guion bajo inicial) hace que path.resolve de Node salga de appDir hacia cualquier ubicación en la que el proceso de FUXA pueda escribir. Debido a que fs.writeFileSync está precedido por un fs.mkdirSync(dir, { recursive: true }) condicional, el atacante también puede crear los directorios padre según sea necesario.

El resultado es una primitiva de escritura arbitraria de archivos no autenticada, accesible en el puerto HTTP por defecto (1881), explotable pre-auth independientemente de si el administrador de FUXA ha habilitado el inicio de sesión.

Impacto

Un atacante remoto no autenticado puede:

  • Escribir o sobrescribir cualquier archivo al que la cuenta de servicio de FUXA pueda acceder
  • Reemplazar settings.js para lograr ejecución de código en el siguiente reinicio de FUXA
  • Colocar una tarea cron (/etc/cron.d/<file>) para ejecución de código en menos de 60 segundos cuando FUXA se ejecuta como root (el valor por defecto en la imagen Docker del proveedor)
  • Instalar un listener de webshell HTTP vinculado dentro del proceso Node de FUXA
  • Colocar claves públicas SSH en /root/.ssh/authorized_keys o en el ~/.ssh/authorized_keys de cualquier usuario
  • Enumerar la cuenta de usuario local que ejecuta FUXA y otras cuentas presentes en el host mediante un canal lateral a nivel del sistema de archivos

Este es un hallazgo de severidad crítica pre-auth en una plataforma ICS/SCADA utilizada para operar procesos industriales.

Versiones Afectadas

VersiónEstado
<= 1.2.9Vulnerable
1.2.10+Parcheado

Explotación confirmada contra una instalación limpia de FUXA 1.2.9 en Ubuntu Server.

Prueba de Concepto

Script Python 3 de un solo archivo, con una única dependencia de terceros (requests).

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

Reconocimiento rápido no autenticado

Identifica el usuario del SO en ejecución, la exposición de Node-RED y cualquier otra cuenta en el host sin escribir nada inusual:

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

Demostrar la primitiva de escritura

Escribe un marcador neutral /tmp/healthcheck (sin IOCs específicos del CVE en el nombre del archivo ni en el contenido):

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

RCE de un solo disparo

Si FUXA se ejecuta como root, coloca un archivo cron que se active en menos de 60 segundos sin necesidad de reiniciar FUXA:

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

Webshell persistente mediante el reemplazo de settings.js

Instala un listener de webshell HTTP dentro del proceso Node de FUXA (se activa en el siguiente arranque en frío, ya que require() almacena en caché los módulos) y luego inicia un REPL interactivo cuando FUXA se reinicie:

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

Modos de Funcionamiento

Referencia completa de flags por modo: python3 fuxapwn.py --help.

Notas Técnicas

Fuga de configuración no autenticada

GET /api/settings (server/api/index.js:103) está registrado sin middleware y devuelve la configuración de runtime en vivo, ligeramente depurada (el servidor elimina secretCode y smtp.password antes de enviarla). Los campos restantes filtran rutas absolutas (appDir, workDir, userSettingsFile, logsDir, uploadFileDir) que normalmente identifican al usuario del servicio, además de nodeRedEnabled, que es un indicador directo de una vía secundaria de RCE no autenticada (ver más abajo).

Enumeración del usuario en ejecución en instalaciones no root y no Docker

Cuando FUXA se lanza mediante npm start bajo una cuenta de usuario local y las rutas de instalación no incorporan el nombre del usuario (p. ej., la instalación se encuentra en /opt, /tmp o un /app genérico), y /root/ no es escribible, el POC recurre a iterar /home/<candidate>/ con escrituras de cero bytes.

El manejador de subida de FUXA llama condicionalmente a fs.mkdirSync(parent, { recursive: true }) antes de fs.writeFileSync, lo que crea una ambigüedad de EACCES: un /home/<user>/ inexistente falla con EACCES en el intento de mkdir (el proceso no puede crear directorios bajo /home/ propiedad de root), mientras que un /home/<other>/ existente con modo 0700 falla con EACCES en la propia escritura. Mismo errno, significado diferente. El POC desambigua analizando el token de syscall del err.message reenviado por el servidor (formato libuv "<CODE>: <reason>, <syscall> '<path>'") y solo reporta un EACCES en open (o cualquier syscall que no sea ) como "existe otro usuario". Esto elimina la lista de movimiento lateral con falsos positivos que produciría una sonda ingenua basada únicamente en errno.

Vía secundaria de RCE a través de Node-RED

Si nodeRedEnabled = true en la configuración filtrada, los endpoints de administración de Node-RED integrado en FUXA (/nodered/flows/deploy, etc.) son accesibles sin autenticación debido a una comprobación de lista blanca del encabezado Referer (node-red/index.js:134-136) que acepta cualquier solicitud cuyo Referer contenga /editor, /viewer o /lab. Esto produce una RCE no autenticada instantánea a través de un nodo de función sin necesidad de reiniciar. El modo recon señala esta condición; los operadores deberían preferirla cuando esté disponible.

Los payloads de settings.js preservan la configuración del objetivo

Al generar un reemplazo de settings.js (modos settings-rce y webshell), el POC primero obtiene la configuración en vivo mediante /api/settings y la serializa en JSON como cuerpo de module.exports (JSON es un subconjunto válido de literal de objeto JavaScript). Esto preserva el uiPort, allowedOrigins, secureEnabled y otros ajustes de runtime del objetivo para que la aplicación continúe sirviendo con normalidad tras el reemplazo. El POC advierte explícitamente cuando el objetivo tiene secureEnabled = true o un bloque smtp, ya que la depuración en el lado del servidor elimina secretCode (el fallback de JWT se activará) y smtp.password (el correo dejará de funcionar hasta que se restaure manualmente).

Detección / Indicadores

  • Entradas del registro de acceso HTTP: POST /api/upload desde fuentes no autenticadas, especialmente con valores de destination que contengan .. o rutas absolutas del sistema de archivos en la respuesta
  • GET /api/settings desde fuentes no autenticadas (normalmente solo lo utiliza la interfaz autenticada)
  • Archivos que coincidan con /tmp/healthcheck*, /tmp/.fuxa-probe-* o /home/*/.fuxa-probe-* (nombres de archivo marcadores por defecto de canary y sondas — el POC permite anularlos para evitar IOCs evidentes, por lo que su ausencia no descarta la explotación)
  • Marcas de tiempo modificadas en settings.js, /etc/cron.d/* o ~/.ssh/authorized_keys que no correspondan a una acción de un administrador
  • Nuevos listeners en el host de FUXA vinculados a puertos inesperados (el modo webshell vincula un puerto configurable dentro del proceso Node)

Mitigación

  • Actualiza a FUXA 1.2.10 o posterior. El endpoint /api/upload está protegido por la cadena de middleware estándar en la versión parcheada.
  • Segmenta a nivel de red la interfaz de administración de FUXA. Los HMI ICS/SCADA no deberían ser accesibles desde redes no confiables.
  • Si la actualización inmediata no es posible, coloca un proxy inverso delante de FUXA que bloquee las solicitudes no autenticadas a /api/upload y /api/settings.
  • Ejecuta FUXA con una cuenta de servicio dedicada y sin privilegios. Esto no evita la explotación, pero reduce significativamente el radio de explosión (sin escritura en /root/, sin escritura en /etc/cron.d/, sin persistencia en todo el host mediante cron).
  • Desactiva Node-RED (nodeRedEnabled = false) si no se utiliza activamente.

Referencias

  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-25895
  • Proveedor: https://github.com/frangoteam/FUXA
  • Parche: versión 1.2.10 de FUXA
  • Código vulnerable: server/api/projects/index.js:193 en FUXA 1.2.9

Créditos

Investigación, PoC y redacción por Anthony Cihan (Hann1bl3L3ct3r), Líder de Seguridad Ofensiva.

Autorización y Aspectos Legales

Este repositorio contiene código de exploit funcional para una vulnerabilidad crítica en un producto ICS/SCADA. Se publica bajo los principios de divulgación responsable, después del parcheo por parte del proveedor, en beneficio de los defensores (autores de detecciones, respondedores de incidentes) y de los testers de seguridad autorizados.

Úsalo únicamente contra sistemas que te pertenezcan o para los que tengas autorización explícita y por escrito para realizar pruebas. El uso no autorizado de este código contra sistemas de terceros es ilegal en la mayoría de las jurisdicciones y el autor lo tratará como tal. El autor no acepta ninguna responsabilidad por el uso indebido.

Si eres operador de FUXA y quieres ayuda para validar tu nivel de parcheo frente a este PoC en condiciones controladas, contacta con el autor.

Licencia

Publicado con fines de pruebas de seguridad autorizadas e investigación defensiva. Consulta LICENSE para conocer los términos completos.

Descargar herramienta
ModoPropósito
reconFuga de información no autenticada mediante GET /api/settings; deduce el usuario del SO en ejecución a partir de rutas absolutas; informa del estado de Node-RED; sondas activas opcionales --probe-root y --probe-home
canaryPrueba de la primitiva de escritura de archivos con una ruta neutral por defecto
settings-rceReemplaza settings.js con un payload que ejecuta un comando configurable en el siguiente arranque en frío de FUXA
ssh-keyEscribe una clave pública en el authorized_keys de un usuario objetivo
dropColocación arbitraria de archivos en cualquier ruta absoluta
cronColoca /etc/cron.d/<name> para lograr RCE en menos de 60 segundos sin esperar un reinicio de FUXA (requiere que FUXA se ejecute como root)
webshellInstala un listener de webshell HTTP dentro del proceso Node de FUXA mediante el reemplazo de settings.js (se activa en el siguiente arranque en frío)
webshell-execCliente para una webshell ya instalada; comando único o REPL con --interact
mkdir