90 lines
2.5 KiB
Python
90 lines
2.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import zmq
|
|
import redis
|
|
import socket
|
|
import redis.exceptions
|
|
import logging
|
|
|
|
import amqp.connection
|
|
|
|
from .exceptions import AuthRequired
|
|
|
|
log = logging.getLogger()
|
|
|
|
|
|
# --------------------------------------------------------------------------
|
|
# These 3 functions determinate if server has listen one of these services:
|
|
# - Redis server
|
|
# - RabbitMQ server
|
|
# - ZeroMQ PUB/SUB pattern
|
|
#
|
|
# Each function try to connect or do some action and determinate if service
|
|
# is on or not.
|
|
# --------------------------------------------------------------------------
|
|
def brute_redis(host, port=6379, user=None, password=None, db=0):
|
|
|
|
try:
|
|
redis.StrictRedis(host=host,
|
|
port=int(port),
|
|
socket_connect_timeout=1,
|
|
socket_timeout=1,
|
|
password=password,
|
|
db=db).ping()
|
|
return True
|
|
|
|
except redis.exceptions.ResponseError as e:
|
|
if str(e).startswith("NOAUTH"):
|
|
raise AuthRequired()
|
|
else:
|
|
return False
|
|
except Exception:
|
|
return False
|
|
|
|
|
|
# ----------------------------------------------------------------------
|
|
def brute_amqp(host, port=5672, user=None, password=None, db=0):
|
|
|
|
host_and_port = "%s:%s" % (host, port)
|
|
user_name = "guest" if user is None else user
|
|
user_password = "guest" if password is None else password
|
|
|
|
timeout = 0.2
|
|
try:
|
|
amqp.connection.Connection(host=host_and_port,
|
|
userid=user_name,
|
|
password=user_password,
|
|
connect_timeout=timeout,
|
|
read_timeout=timeout,
|
|
socket_timeout=timeout).connected
|
|
return True
|
|
except socket.timeout as e:
|
|
raise AuthRequired()
|
|
except Exception:
|
|
return False
|
|
|
|
|
|
# ----------------------------------------------------------------------
|
|
def brute_zmq(host, port=5555, user=None, password=None, db=0):
|
|
|
|
context = zmq.Context()
|
|
|
|
# Configure
|
|
socket = context.socket(zmq.SUB)
|
|
socket.setsockopt(zmq.SUBSCRIBE, b"") # All topics
|
|
socket.setsockopt(zmq.LINGER, 0) # All topics
|
|
socket.RCVTIMEO = 1000 # timeout: 1 sec
|
|
|
|
# Connect
|
|
socket.connect("tcp://%s:%s" % (host, port))
|
|
|
|
# Try to receive
|
|
try:
|
|
socket.recv()
|
|
|
|
return True
|
|
except Exception:
|
|
return False
|
|
finally:
|
|
socket.close()
|