## https://sploitus.com/exploit?id=98DAABB7-F911-5937-8DF6-FF18ED01FC23
# 🔴 CVE-2025-31324 — SAP NetWeaver Visual Composer Unauthenticated File Upload
> **Type:** Proof of Concept — Vulnerability Research
> **CVE:** [CVE-2025-31324](https://vulners.com/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](https://me.sap.com/notes/3594142) + [3604119](https://me.sap.com/notes/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.*
---
## `$ cat ./vulnerability_summary.txt`
A 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.txt`
Por 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`
### Como o endpoint vulnerável funciona
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 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) │
└─────────────────────────────────────────────────────────────────────────┘
```
### Por que o endpoint existe?
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.md`
### 1. Escolha do Payload — JSP "Hello World"
```python
file_content = """
Hello World"""
```
**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:
- **Valida a superfície vulnerável** sem executar código malicioso
- **Confirma o upload** (código HTTP 200 + arquivo acessível via GET)
- **Evidência forense limpa** para relatório de pentest
Em exploração real, o conteúdo seria um webshell JSP com execução de comandos, ex:
```jsp
```
### 2. `multipart/form-data` — Por que esse Content-Type?
```python
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'`.
### 3. Endpoint Path — Anatomia da URL
```
https://:/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.yml`
```yaml
tactic: 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.txt`
```
Produto: 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`
### Detecção do Exploit (durante ataque)
```yaml
# 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
```
### Detecção de Webshell (pós-compromisso)
```yaml
# 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: 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.
### Hunting em Logs SAP
```bash
# Buscar requests POST para o endpoint vulnerável nos últimos 90 dias
# Diretório de logs: /usr/sap//J/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//SYS/global/security -type f
```
---
## `$ cat ./remediation.md`
```
PRIORIDADE: 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`
```bash
# Instalar dependência
pip install requests
# Editar a URL no script antes de executar:
# url = "https://:/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://:/irj/hello_world.jsp
# Resposta esperada se vulnerável: HTML com "Hello World"
# Resposta esperada se patchado: 404 ou 403
```
---
## `$ cat ./timeline.txt`
```
Jan 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.md`
```
CVE: https://vulners.com/cve/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