add: performance improvements in scanner

This commit is contained in:
cr0hn
2016-02-24 18:12:00 +01:00
parent cf00a497ca
commit 16e0711697
2 changed files with 31 additions and 4 deletions

View File

@@ -18,6 +18,7 @@ class ModuleModel(CommonData):
target = StringField(required=True) target = StringField(required=True)
own_ips = BoolField(label="Try to find all IPs registered for this company") own_ips = BoolField(label="Try to find all IPs registered for this company")
concurrency = IntegerField(label="maximum parallels scans", default=10) concurrency = IntegerField(label="maximum parallels scans", default=10)
output = StringField(label="output file, in JSON format")
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------

View File

@@ -2,6 +2,7 @@
import six import six
import zmq import zmq
import json
import redis import redis
import socket import socket
import logging import logging
@@ -11,6 +12,7 @@ import amqp.connection
from functools import partial from functools import partial
from collections import defaultdict
from threading import Thread, BoundedSemaphore from threading import Thread, BoundedSemaphore
from .patch import patch_transport from .patch import patch_transport
@@ -27,6 +29,8 @@ logging.getLogger('amqp').setLevel(100)
log = logging.getLogger() log = logging.getLogger()
OPEN_SERVICES = defaultdict(dict)
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
def _do_scan(config, sem, host): def _do_scan(config, sem, host):
@@ -45,24 +49,35 @@ def _do_scan(config, sem, host):
for port in config.ports.split(","): for port in config.ports.split(","):
# Check each serve # Check each serve
for server, handle in six.iteritems(handlers): for server_type, handle in six.iteritems(handlers):
log.info(" >> Trying to find %s service in '%s' port '%s'." % (server_type, host, port))
try: try:
log.debug(" >> Trying '%s' port '%s'" % (host, port))
# Try to check if port is open # Try to check if port is open
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(1) s.settimeout(1)
result = s.connect_ex((host, int(port))) result = s.connect_ex((host, int(port)))
except socket.gaierror as e: except socket.gaierror as e:
log.warning("%s : %s error: %s" % (server, port, e)) log.debug("%s : %s error: %s" % (server_type, port, e))
continue continue
finally:
s.close()
# Is port open? # Is port open?
if result == 0: if result == 0:
log.error(" ) Port '%s' is open in '%s'" % (port, host))
if handle(host, port, config) is True: if handle(host, port, config) is True:
log.error(" <!!> Open '%s' server found in port '%s'" % (server, port)) log.error(" <!!> Open '%s' server found in port '%s'" % (server_type, port))
OPEN_SERVICES[host][server_type] = dict(
state="open",
port=port
)
else: else:
log.debug(" <i> Port %s is closed" % port) log.debug(" <i> Port %s is closed" % port)
@@ -106,6 +121,17 @@ def action_scan_main(config):
for t in threads: for t in threads:
t.join() t.join()
# --------------------------------------------------------------------------
# Export results
# --------------------------------------------------------------------------
if config.output is not None:
_output_path = "%s.json" % config.output if ".json" not in config.output else config.output
with open(_output_path, "w") as f:
json.dump(OPEN_SERVICES, f)
log.error(" - Output results saved into: %s" % _output_path)
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
def build_targets(config): def build_targets(config):