def setup_injector(cls, session): parser_retval = cls.parser().parse_known_args(None, None) args, _ = parser_retval cls.session = session cls.args = args form = re.compile('.*:\d{1,5}') for target in cls.args.client_tunnel_dest: if not form.match(target): logging.warning( "--tunnel-client-dest %s does not match format host:port (e.g. google.com:80)", target) break destnet, destport = target.split(":") t = TCPServerThread(ClientTunnelHandler( session, (destnet, int(destport))).handle_request, run_status=cls.session.running, network=cls.args.client_tunnel_net) t.start() cls.tcpservers.append(t) logging.info( "{session} created client tunnel injector for host {host} on port {port} to destination {dest}" .format(host=t.network, port=t.port, dest=target, session=session))
def __init__(self, session, server_interface, destination): super().__init__(session, server_interface, destination) self.tcpserver = TCPServerThread(self.serve, network=self.args.server_tunnel_net, run_status=self.session.running) logging.info( "created server tunnel injector for host {host} on port {port} to destination {dest}" .format(host=self.tcpserver.network, port=self.tcpserver.port, dest=self.destination)) self.tcpserver.start()
def __init__(self, session: 'ssh_proxy_server.session.Session', server_interface: 'ssh_proxy_server.interfaces.server.ServerInterface', destination: Optional[Tuple[str, int]]) -> None: super().__init__(session, server_interface, destination) self.tcpserver = TCPServerThread(self.handle_request, network=self.args.server_tunnel_net, run_status=self.session.running) logging.info(( f"{EMOJI['information']} {stylize(session.sessionid, fg('light_blue') + attr('bold'))}" " - " f"created server tunnel injector for host {self.tcpserver.network} on port {self.tcpserver.port} to destination {self.destination}" )) self.tcpserver.start()
def setup(cls, session: 'ssh_proxy_server.session.Session') -> None: parser_retval = cls.parser().parse_known_args(None, None) args, _ = parser_retval t = TCPServerThread(ClientTunnelHandler(session).handle_request, run_status=session.running, network=args.socks_listen_address) t.start() cls.tcpservers.append(t) logging.info(( f"{EMOJI['information']} {stylize(session.sessionid, fg('light_blue') + attr('bold'))}" " - " f"created Socks4 proxy server on port {stylize(t.port, fg('light_blue') + attr('bold'))}. " f"connect with {stylize(f'socat TCP-LISTEN:LISTEN_PORT,fork socks4:127.0.0.1:DESTINATION_ADDR:DESTINATION_PORT,socksport={t.port}', fg('light_blue') + attr('bold'))}" ))
def setup(cls, session: 'ssh_proxy_server.session.Session') -> None: parser_retval = cls.parser().parse_known_args(None, None) args, _ = parser_retval t = TCPServerThread( ClientTunnelHandler(session, args.socks5_username, args.socks5_password).handle_request, run_status=session.running, network=args.socks_listen_address ) t.start() cls.tcpservers.append(t) logging.info(( f"{EMOJI['information']} {stylize(session.sessionid, fg('light_blue') + attr('bold'))}" " - " f"created SOCKS5 proxy server on port {t.port}. connect with: {stylize(f'nc -X 5 -x localhost:{t.port} address port', fg('light_blue') + attr('bold'))}" ))
class InjectableRemotePortForwardingForwarder(RemotePortForwardingForwarder): """For each server port forwarding request open a local port to inject traffic into the port-forward The Handler is still the same as the RemotePortForwardingForwarder, only a tcp server is added """ @classmethod @typechecked def parser_arguments(cls) -> None: plugin_group = cls.parser().add_argument_group(cls.__name__) plugin_group.add_argument( '--tunnel-server-net', dest='server_tunnel_net', default='127.0.0.1', help='local address/interface where injector sessions are served') @typechecked def __init__(self, session: 'ssh_proxy_server.session.Session', server_interface: 'ssh_proxy_server.interfaces.server.ServerInterface', destination: Optional[Tuple[str, int]]) -> None: super().__init__(session, server_interface, destination) self.tcpserver = TCPServerThread(self.handle_request, network=self.args.server_tunnel_net, run_status=self.session.running) logging.info(( f"{EMOJI['information']} {stylize(session.sessionid, fg('light_blue') + attr('bold'))}" " - " f"created server tunnel injector for host {self.tcpserver.network} on port {self.tcpserver.port} to destination {self.destination}" )) self.tcpserver.start() @typechecked def handle_request(self, listenaddr: Tuple[Text, int], client: Union[socket, paramiko.Channel], addr: Tuple[Text, int]) -> None: try: f = TunnelForwarder( self.session.transport.open_channel("forwarded-tcpip", self.destination, addr), client) self.server_interface.forwarders.append(f) except (paramiko.SSHException, OSError): logging.warning("injector connection suffered an unexpected error") self.tcpserver.close()
def setup(cls, session: 'ssh_proxy_server.session.Session') -> None: parser_retval = cls.parser().parse_known_args(None, None) args, _ = parser_retval t = TCPServerThread( ClientTunnelHandler(session).handle_request, run_status=session.running, network=args.socks_listen_address ) t.start() cls.tcpservers.append(t) logging.info(( f"{EMOJI['information']} {stylize(session.sessionid, fg('light_blue') + attr('bold'))}" f" - local port forwading\n" f"{stylize('SOCKS port:', attr('bold'))} {stylize(t.port, fg('light_blue') + attr('bold'))}\n" f" {stylize('SOCKS4:', attr('bold'))}\n" f" * socat: {stylize(f'socat TCP-LISTEN:LISTEN_PORT,fork socks4:127.0.0.1:DESTINATION_ADDR:DESTINATION_PORT,socksport={t.port}', fg('light_blue') + attr('bold'))}\n" f" * netcat: {stylize(f'nc -X 4 -x localhost:{t.port} address port', fg('light_blue') + attr('bold'))}\n" f" {stylize('SOCKS5:', attr('bold'))}\n" f" * netcat: {stylize(f'nc -X 5 -x localhost:{t.port} address port', fg('light_blue') + attr('bold'))}" ))
class InjectableServerTunnelForwarder(ServerTunnelForwarder): """For each server port forwarding request open a local port to inject traffic into the port-forward The Handler is still the same as the ServerTunnelForwarder, only a tcp server is added """ @classmethod def parser_arguments(cls): cls.parser().add_argument( '--tunnel-server-net', dest='server_tunnel_net', default='127.0.0.1', help='local address/interface where injector sessions are served') def __init__(self, session, server_interface, destination): super().__init__(session, server_interface, destination) self.tcpserver = TCPServerThread(self.serve, network=self.args.server_tunnel_net, run_status=self.session.running) logging.info( "created server tunnel injector for host {host} on port {port} to destination {dest}" .format(host=self.tcpserver.network, port=self.tcpserver.port, dest=self.destination)) self.tcpserver.start() def serve(self, client, addr): try: f = TunnelForwarder( self.session.transport.open_channel("forwarded-tcpip", self.destination, addr), client) self.server_interface.forwarders.append(f) except (paramiko.SSHException, OSError): logging.warning("injector connection suffered an unexpected error") self.tcpserver.close()