def http_connect_request(self, server_socket): if self.config.has_option("Global", "remoteserverhost"): if not common.is_hostname(self.config.get("Global", "remoteserverhost")): common.internal_print("[Global] remoteserverhost value is not a hostname", -1) return False else: remoteserver = self.config.get("Global", "remoteserverhost") else: if self.config.has_option("Global", "remoteserverip"): if not common.is_ipv4(self.config.get("Global", "remoteserverip")): common.internal_print("[Global] remoteserverip value is not an IPv4 address", -1) return False remoteserver = self.config.get("Global", "remoteserverip") serverport = int(self.config.get(self.get_module_configname(), "serverport")) request = "CONNECT %s:%d HTTP/1.1\r\nHost: %s\r\n\r\n" % (remoteserver, serverport, remoteserver) server_socket.send(request) response = server_socket.recv(4096) if response[9:12] != "200": common.internal_print("Connection failed: {0}".format(response[0:response.find("\n")]), -1) return False return True
def sanity_check(self): if not super(WebSocket, self).sanity_check(): return False if not self.config.has_option(self.get_module_configname(), "proxyip"): common.internal_print( "'proxyip' option is missing from '{0}' section".format( self.get_module_configname()), -1) return False if not self.config.has_option(self.get_module_configname(), "proxyport"): common.internal_print( "'proxyport' option is missing from '{0}' section".format( self.get_module_configname()), -1) return False if not common.is_ipv4( self.config.get(self.get_module_configname(), "proxyip") ) and not common.is_ipv6( self.config.get(self.get_module_configname(), "proxyip")): common.internal_print( "'proxyip' should be ipv4 or ipv6 address in '{0}' section". format(self.get_module_configname()), -1) return False if not self.config.has_option("Global", "remoteserverhost"): common.internal_print( "'remoteserverhost' option is missing from 'Global' section", -1) return False if not common.is_hostname(self.config.get( "Global", "remoteserverhost")) and not common.is_ipv4( self.config.get( "Global", "remoteserverhost")) and not common.is_ipv6( self.config.get("Global", "remoteserverhost")): common.internal_print( "'remoteserverhost' should be a hostname 'Global' section", -1) return False return True
def socks_handshake(self, server_socket): version = self.config.get(self.get_module_configname(), "version") if (version == "4") or (version == "4a"): if self.config.has_option(self.get_module_configname(), "userid"): userid = self.config.get(self.get_module_configname(), "userid") + "\x00" else: userid = "\x00" if version == "4": server_socket.send( struct.pack( ">BBH4s", self.socks.SOCKS4_VERSION, self.socks.SOCKS4_CD, int( self.config.get(self.get_module_configname(), "serverport")), socket.inet_aton( self.config.get("Global", "remoteserverip"))) + userid) else: if self.config.has_option("Global", "remoteserverhost"): if not common.is_hostname( self.config.get("Global", "remoteserverhost")): common.internal_print( "[Global] remoteserverhost value is not a hostname", -1) return False domain = self.config.get("Global", "remoteserverhost") + "\x00" server_socket.send( struct.pack( ">BBH4s", self.socks.SOCKS4_VERSION, self.socks.SOCKS4_CD, int( self.config.get(self.get_module_configname(), "serverport")), socket.inet_aton("0.0.0.1")) + userid + domain) else: common.internal_print( "Missing remoteserverhost attribute from config [Global] section", -1) return False response = server_socket.recv(8) if (response[0:1] == self.socks.SOCKS4_OK) and ( response[1:2] == self.socks.SOCKS4_RESPONSES[0]): common.internal_print( "Connection was made through the proxy server", 1) else: if len(response) > 1: if (response[1:2] in self.socks.SOCKS4_RESPONSES): for i in range(len(self.socks.SOCKS4_RESPONSES)): if response[1:2] == self.socks.SOCKS4_RESPONSES[i]: common.internal_print( "Connection failed through the proxy server: {0}" .format( self.socks.SOCKS4_RESPONSES_STR[i]), -1) return False common.internal_print( "Connection failed through the proxy server: Unknown error", -1) return False if version == "5": # send greeting with auth method list greeting = struct.pack(">BB", self.socks.SOCKS5_VERSION, len(self.socks.SOCKS5_AUTH_METHODS)) for i in range(len(self.socks.SOCKS5_AUTH_METHODS)): greeting += self.socks.SOCKS5_AUTH_METHODS[i][0] server_socket.send(greeting) # receive response with selected auth method response = server_socket.recv(2) if (len(response) != 2) or (response[0:1] != chr( self.socks.SOCKS5_VERSION)): common.internal_print( "Connection failed through the proxy server: Unknown error", -1) return False if response[1:2] == self.socks.SOCKS5_REJECT_METHODS: common.internal_print( "Connection failed through the proxy server: Authentication methods rejected", -1) return False for i in range(len(self.socks.SOCKS5_AUTH_METHODS)): if response[1:2] == self.socks.SOCKS5_AUTH_METHODS[i][0]: if self.socks.SOCKS5_AUTH_METHODS[i][1](self.config, server_socket): if self.config.has_option("Global", "remoteserverhost"): remoteserverhost = self.config.get( "Global", "remoteserverhost") if not (common.is_hostname(remoteserverhost) or common.is_ipv4(remoteserverhost) or common.is_ipv6(remoteserverhost)): common.internal_print( "[Global] remoteserverhost value is not ipv4, ipv6 or a hostname", -1) return False else: common.internal_print( "Missing remoteserverhost attribute from config [Global] section", -1) return False if common.is_ipv4(remoteserverhost): host_type = self.socks.SOCKS5_ADDR_TYPE[0] connect_string = struct.pack( ">BBBB4sH", self.socks.SOCKS5_VERSION, self.socks.SOCKS5_CD, 0, host_type, socket.inet_aton(remoteserverhost), int( self.config.get( self.get_module_configname(), "serverport"))) if common.is_hostname(remoteserverhost): host_type = self.socks.SOCKS5_ADDR_TYPE[1] connect_string = struct.pack( ">BBBBB", self.socks.SOCKS5_VERSION, self.socks.SOCKS5_CD, 0, host_type, len(remoteserverhost)) connect_string += remoteserverhost + struct.pack( ">H", int( self.config.get( self.get_module_configname(), "serverport"))) if common.is_ipv6(remoteserverhost): host_type = self.socks.SOCKS5_ADDR_TYPE[2] connect_string = struct.pack( ">BBBB16sH", self.socks.SOCKS5_VERSION, self.socks.SOCKS5_CD, 0, host_type, socket.inet_pton(socket.AF_INET6, remoteserverhost), int( self.config.get( self.get_module_configname(), "serverport"))) server_socket.send(connect_string) response = server_socket.recv(4096) if (len(response) < 4) or (response[0:1] != chr( self.socks.SOCKS5_VERSION)): common.internal_print( "Connection failed through the proxy server: Connection error to the server", -1) return False if response[1:2] == self.socks.SOCKS5_RESPONSES[0]: return True if response[1:2] not in self.socks.SOCKS5_RESPONSES: common.internal_print( "Connection failed through the proxy server: Unknown error code", -1) return False for i in range(len(self.socks.SOCKS5_RESPONSES)): if response[1:2] == self.socks.SOCKS5_RESPONSES[i]: common.internal_print( "Connection failed through the proxy server: {0}" .format( self.socks.SOCKS5_RESPONSES_STR[i]), -1) return False return False else: return False common.internal_print( "Connection failed through the proxy server: Strange response (Authentication method)", -1) return False return True