def try_handshake(self,
                      host,
                      port=443,
                      attempts=None,
                      sleep_fnc=None,
                      **kwargs):
        """
        Attempts for handshake
        :param host: 
        :param port: 
        :param attempts: 
        :param sleep_fnc:
        :param kwargs:
        :return:
        :rtype TlsHandshakeResult
        """
        attempts = util.defval(attempts, self.attempts)
        for attempt in range(attempts):
            try:
                return self.handshake(host=host, port=port, **kwargs)

            except Exception as e:
                logger.debug('Exception on handshake[%s]: %s' % (attempt, e))
                if attempt + 1 >= attempts:
                    raise
                if sleep_fnc is not None:
                    time.sleep(sleep_fnc(attempt))
                else:
                    time.sleep(0.5)
    def handshake(self, host, port=443, **kwargs):
        """
        Performs the handshake
        :param host: 
        :param port: 
        :return:
        :rtype TlsHandshakeResult
        """
        return_obj = TlsHandshakeResult()
        return_obj.connect_target = (host, port)
        tls_ver = kwargs.get('tls_version', self.tls_version)
        domain_sni = util.defval(kwargs.get('domain', host), host)
        timeout = float(kwargs.get('timeout', self.timeout))

        return_obj.tls_version = tls_ver
        return_obj.host = host
        return_obj.port = port
        return_obj.domain = domain_sni
        return_obj.socket_family = socket.AF_INET

        if TlsDomainTools.is_ip(host):
            return_obj.ip = host

            if TlsDomainTools.is_valid_ipv6_address(host):
                return_obj.socket_family = socket.AF_INET6
        else:
            self._resolve_ip(return_obj)

        # create simple tcp socket
        s = socket.socket(return_obj.socket_family, socket.SOCK_STREAM)
        try:
            s.settimeout(timeout)

            return_obj.time_start = time.time()
            try:
                logger.debug('Connecting to: %s, %s, %s' %
                             (return_obj.connect_target, host, domain_sni))
                s.connect(return_obj.connect_target)

                return_obj.time_connected = time.time()
                return_obj.ip = util.defval(self._try_get_peer_ip(s),
                                            return_obj.ip)

            except Exception as e:
                logger.debug('Exception during connect %s - %s: %s' %
                             (return_obj.connect_target, domain_sni, e))
                self.trace_logger.log(e)
                return_obj.handshake_failure = TlsHandshakeErrors.CONN_ERR
                return_obj.time_failed = time.time()
                return_obj.ip = util.defval(self._try_get_peer_ip(s),
                                            return_obj.ip)

                raise TlsTimeout('Connect timeout on %s - %s' %
                                 (return_obj.connect_target, domain_sni),
                                 e,
                                 scan_result=return_obj)

            cl_hello = self._build_client_hello(domain_sni, tls_ver, **kwargs)
            return_obj.cl_hello = cl_hello

            hello_packet = bytes(cl_hello)
            s.sendall(hello_packet)
            return_obj.time_sent = time.time()

            self._read_while_finished(return_obj, s, timeout)

            return_obj.certificates = self._extract_certificates(
                return_obj.resp_record)

            return return_obj

        except TlsTimeout:
            raise
        except TlsIncomplete:
            raise
        except Exception as e:
            logger.debug('Generic exception on tls scan %s' % e)
            self.trace_logger.log(e)

            raise TlsException('Generic exception', e, scan_result=return_obj)

        finally:
            util.silent_close(s)
示例#3
0
 def init_on_load(self):
     self.dns_res = util.defval(util.try_load_json(self.dns), [])
     self.dns_status = self.status
 def __init__(self, timeout=10, tls_version=None, attempts=None, **kwargs):
     self.timeout = timeout
     self.tls_version = util.defval(tls_version, self.DEFAULT_TLS)
     self.attempts = int(util.defval(attempts, self.DEFAULT_ATTEMPTS))
     self.trace_logger = trace_logger.Tracelogger(logger)
示例#5
0
 def init_on_load(self):
     self.trans_result = util.defval(util.try_load_json(self.result), [])