Ejemplo n.º 1
0
	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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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