
Preuve de concept d'exploitation pour CVE-2025-31324, un téléversement de fichier non authentifié dans SAP NetWeaver Visual Composer, avec des conseils de détection, un mapping MITRE et des étapes de remédiation.
Type: Preuve de concept — Recherche de vulnérabilité CVE: CVE-2025-31324 CVSS: 10.0 Critique (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H) Statut: Corrigé — Note de sécurité SAP 3594142 + 3604119 Ajouté au KEV de la CISA: Mai 2025
⚠️ Ce PoC utilise un fichier JSP bénin (« Hello World ») pour valider la surface d'attaque sans exécuter de code malveillant. Utilisation exclusive dans des environnements autorisés à des fins de pentest et de développement de détections.
Développé par : HKK$ cat ./vulnerability_summary.txtLa vulnérabilité CVE-2025-31324 réside dans le composant Visual Composer Metadata Uploader de SAP NetWeaver AS Java — une faille de contrôle d'autorisation manquant qui permet à tout attaquant non authentifié d'envoyer des requêtes POST vers le point de terminaison /developmentserver/metadatauploader, entraînant un téléversement non restreint de fichiers arbitraires.
La CVE affecte spécifiquement le SAP NetWeaver Visual Composer Framework version 7.50, avec un score CVSS de 10.0 — le maximum possible.
Des acteurs de la menace ont activement exploité cette vulnérabilité de janvier à mai 2025, déployant des webshells persistants sur des centaines de systèmes à travers le monde.
$ cat ./impact.txtEn raison de son fonctionnement avec des privilèges élevés et de sa proximité avec les données ERP, le mouvement latéral vers les piles SAP ABAP ou les bases de données connectées est trivial après l'exploitation.
La chaîne d'exploitation complète lors d'attaques réelles :
Téléversement JSP (CVE-2025-31324)
→ Webshell persistant sur le serveur
→ RCE en tant que processus SAP (privilège élevé)
→ Accès aux données ERP (Finance, RH, Supply Chain)
→ Mouvement latéral vers ABAP / DB
→ Déploiement de frameworks C2 (ex : Brute Ratel)
$ cat ./architecture.txt┌─────────────────────────────────────────────────────────────────────────┐
│ CVE-2025-31324 — FLUX D'EXPLOITATION │
│ │
│ ATTAQUANT SAP NETWEAVER AS JAVA │
│ │
│ POST /developmentserver/metadatauploader │
│ Content-Type: multipart/form-data ┌─────────────────────┐ │
│ Corps : fichier JSP/WAR/quelconque ──────► │ Metadata Uploader │ │
│ (sans authentification) │ │ │
│ │ ❌ Sans vérification│ │
│ │ d'auth │ │
│ │ ❌ Sans validation │ │
│ │ d'extension │ │
│ │ ❌ Sans assainissement│ │
│ │ du contenu │ │
│ └────────┬────────────┘ │
│ │ │
│ Fichier enregistré dans : │
│ /irj/root/ ou similaire │
│ │ │
│ GET /irj/hello_world.jsp ◄──────────────────────────┘ │
│ → Hello World (PoC bénin) │
│ → Webshell (exploit réel) │
└─────────────────────────────────────────────────────────────────────────┘
Le /developmentserver/metadatauploader fait partie du SAP Visual Composer — un outil de développement low-code permettant aux analystes métier de créer des applications SAP sans code Java. Le point de terminaison a été conçu pour recevoir des modèles de métadonnées pendant le développement. Bien que le composant ne soit pas activé dans la configuration par défaut de NetWeaver, Onapsis a signalé qu'il est largement activé dans les environnements de production.
$ cat ./design_decisions.mdfile_content = """<%@ page language="java" contentType="text/html; charset=UTF-8" ...%>
<h1>Hello World</h1>"""
Pourquoi JSP et pas un autre format ?
SAP NetWeaver AS Java exécute une JVM — les fichiers .jsp sont interprétés directement par le conteneur de servlets (Apache Tomcat intégré) sans compilation préalable. Cela fait du JSP le format idéal pour les webshells dans les environnements Java.
Le choix du contenu bénin (« Hello World ») est délibéré pour le PoC :
Lors d'une exploitation réelle, le contenu serait un webshell JSP avec exécution de commandes, ex :
<%
String cmd = request.getParameter("cmd");
Runtime.getRuntime().exec(cmd);
%>
multipart/form-data — Pourquoi ce Content-Type ?files = {'file': (file_name, open(file_name, 'rb'), 'application/octet-stream')}
Le point de terminaison attend une requête multipart/form-data — le même format utilisé par les formulaires HTML de téléversement de fichiers. Cela est intentionnel dans la conception originale du Visual Composer (téléversement de modèles de développement).
La bibliothèque requests assemble automatiquement les limites du multipart lorsque files= est passé — l'en-tête Content-Type: multipart/form-data; boundary=... est généré en interne.
verify=False : désactive la validation du certificat TLS — nécessaire car les environnements SAP utilisent souvent des certificats auto-signés. En production, utiliser verify='/chemin/vers/ca-bundle.crt'.
https://<hôte>:<port>/developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1
| Composant | Signification |
|---|---|
:50201 | Port par défaut du SAP ICM (Internet Communication Manager) HTTPS |
/developmentserver/ | Servlet de développement du Visual Composer |
metadatauploader | Point de terminaison spécifique de téléversement de métadonnées |
CONTENTTYPE=MODEL | Type de contenu attendu par le point de terminaison |
CLIENT=1 | Mandant SAP (client) — 000, 100, 001 sont courants |
$ cat ./mitre_mapping.ymltactic: Initial Access
- T1190 # Exploit Public-Facing Application
# Exploitation du point de terminaison /developmentserver/metadatauploader
# sans authentification via HTTP POST
tactic: Execution
- T1505.003 # Server Software Component: Web Shell
# Webshell JSP téléversé → exécuté par le conteneur de servlets (Tomcat)
tactic: Persistence
- T1505.003 # Web Shell comme mécanisme de persistance
# Le fichier JSP persiste dans le système de fichiers du serveur entre les redémarrages
tactic: Defense Evasion
- T1036 # Masquerading
# Webshells nommés comme des fichiers SAP légitimes (ex : metadata.jsp)
tactic: Discovery
- T1082 # System Information Discovery
# Post-RCE : énumérer les processus, utilisateurs, chemins SAP