def accepter(): while True: h = self.waitfor('Waiting for connections on %s:%s' % (self.lhost, self.lport)) while True: try: if self.type == socket.SOCK_STREAM: sock, rhost = listen_sock.accept() else: data, rhost = listen_sock.recvfrom(4096) listen_sock.connect(rhost) sock = listen_sock self.unrecv(data) sock.settimeout(self.timeout) break except socket.error as e: if e.errno == errno.EINTR: continue h.failure() self.exception("Socket failure while waiting for connection") sock = None return self.rhost, self.rport = rhost[:2] r = remote(self.rhost, self.rport, sock = sock) h.success('Got connection from %s on port %d' % (self.rhost, self.rport)) if callback: if not blocking: t = context.Thread(target = callback, args = (r,)) t.daemon = True t.start() else: callback(r) else: self.connections.put(r)
def interactive(self, prompt=term.text.bold_red('$') + ' '): """interactive(prompt = pwnlib.term.text.bold_red('$') + ' ') Does simultaneous reading and writing to the tube. In principle this just connects the tube to standard in and standard out, but in practice this is much more usable, since we are using :mod:`pwnlib.term` to print a floating prompt. Thus it only works in while in :data:`pwnlib.term.term_mode`. """ self.info('Switching to interactive mode') go = threading.Event() def recv_thread(): while not go.isSet(): try: cur = self.recv(timeout=0.05) cur = cur.replace(self.newline, b'\n') if cur: stdout = sys.stdout if not term.term_mode: stdout = getattr(stdout, 'buffer', stdout) stdout.write(cur) stdout.flush() except EOFError: self.info('Got EOF while reading in interactive') break t = context.Thread(target=recv_thread) t.daemon = True t.start() try: while not go.isSet(): if term.term_mode: data = term.readline.readline(prompt=prompt, float=True) else: stdin = getattr(sys.stdin, 'buffer', sys.stdin) data = stdin.read(1) if data: try: self.send(data) except EOFError: go.set() self.info('Got EOF while sending in interactive') else: go.set() except KeyboardInterrupt: self.info('Interrupted') go.set() while t.is_alive(): t.join(timeout=0.1)
def connect_input(self, other): """connect_input(other) Connects the input of this tube to the output of another tube object. Examples: >>> def p(x): print x >>> def recvone(n, data=['data']): ... while data: return data.pop() ... raise EOFError >>> a = tube() >>> b = tube() >>> a.recv_raw = recvone >>> b.send_raw = p >>> a.connected_raw = lambda d: True >>> b.connected_raw = lambda d: True >>> a.shutdown = lambda d: True >>> b.shutdown = lambda d: True >>> import time >>> _=(b.connect_input(a), time.sleep(0.1)) data """ def pump(): import sys as _sys while self.countdown_active(): if not (self.connected('send') and other.connected('recv')): break try: data = other.recv(timeout = 0.05) except EOFError: break if not _sys: return if not data: continue try: self.send(data) except EOFError: break if not _sys: return self.shutdown('send') other.shutdown('recv') t = context.Thread(target = pump) t.daemon = True t.start()
def spawn_process(self, *args, **kwargs): def accepter(): self.wait_for_connection() self.sock.setblocking(1) p = super(listen, self).spawn_process(*args, **kwargs) p.wait() self.close() t = context.Thread(target = accepter) t.daemon = True t.start()
def interactive(self, prompt=term.text.bold_red('$') + ' '): log.info('Switching to interactive mode') go = threading.Event() def recv_thread(): while not go.isSet(): try: cur = self.recv(timeout=0.05) cur = c2s(cur) cur = cur.replace('\r\n', '\n') if cur: sys.stdout.write(cur) sys.stdout.flush() except EOFError: log.info('Got EOF while reading in interactive') break t = context.Thread(target=recv_thread) t.daemon = True t.start() try: while not go.isSet(): if term.term_mode: data = term.readline.readline(prompt=prompt, float=True) else: data = sys.stdin.read(1) if data: try: self.send(data) except EOFError: go.set() log.info('Got EOF while sending in interactive') else: go.set() except KeyboardInterrupt: log.info('Interrupted') go.set() while t.is_alive(): t.join(timeout=0.1)
def __init__(self, port=0, bindaddr = "0.0.0.0", fam = "any", typ = "tcp", callback = None, blocking = False, *args, **kwargs): super(server, self).__init__(*args, **kwargs) port = int(port) fam = {socket.AF_INET: 'ipv4', socket.AF_INET6: 'ipv6'}.get(fam, fam) fam = self._get_family(fam) typ = self._get_type(typ) if fam == socket.AF_INET6 and bindaddr == '0.0.0.0': bindaddr = '::' h = self.waitfor('Trying to bind to %s on port %d' % (bindaddr, port)) for res in socket.getaddrinfo(bindaddr, port, fam, typ, 0, socket.AI_PASSIVE): self.family, self.type, self.proto, self.canonname, self.sockaddr = res if self.type not in [socket.SOCK_STREAM, socket.SOCK_DGRAM]: continue h.status("Trying %s" % self.sockaddr[0]) listen_sock = socket.socket(self.family, self.type, self.proto) listen_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) listen_sock.bind(self.sockaddr) self.lhost, self.lport = listen_sock.getsockname()[:2] if self.type == socket.SOCK_STREAM: listen_sock.listen(1) break else: h.failure() self.error("Could not bind to %s on port %d" % (bindaddr, port)) h.success() self.sock = listen_sock self.connections_waiting = threading.Event() self.connections = [] def accepter(): while True: h = self.waitfor('Waiting for connections on %s:%s' % (self.lhost, self.lport)) while True: try: if self.type == socket.SOCK_STREAM: sock, rhost = listen_sock.accept() else: data, rhost = listen_sock.recvfrom(4096) listen_sock.connect(rhost) sock = listen_sock self.unrecv(data) sock.settimeout(self.timeout) break except socket.error as e: if e.errno == errno.EINTR: continue h.failure() self.exception("Socket failure while waiting for connection") sock = None return self.rhost, self.rport = rhost[:2] r = remote(self.rhost, self.rport, sock = sock) h.success('Got connection from %s on port %d' % (self.rhost, self.rport)) if callback: if not blocking: t = context.Thread(target = callback, args = (r,)) t.daemon = True t.start() else: callback(r) else: self.connections.append(r) if not self.connections_waiting.is_set(): self.connections_waiting.set() self._accepter = context.Thread(target = accepter) self._accepter.daemon = True self._accepter.start()
def __init__(self, port=0, bindaddr='::', fam='any', typ='tcp', *args, **kwargs): super(listen, self).__init__(*args, **kwargs) fam = self._get_family(fam) typ = self._get_type(typ) if fam == socket.AF_INET and bindaddr == '::': bindaddr = '0.0.0.0' h = self.waitfor('Trying to bind to %s on port %s' % (bindaddr, port)) for res in socket.getaddrinfo(bindaddr, port, fam, typ, 0, socket.AI_PASSIVE): self.family, self.type, self.proto, self.canonname, self.sockaddr = res if self.type not in [socket.SOCK_STREAM, socket.SOCK_DGRAM]: continue h.status("Trying %s" % self.sockaddr[0]) listen_sock = socket.socket(self.family, self.type, self.proto) listen_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) if self.family == socket.AF_INET6: try: listen_sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, fam == socket.AF_INET6) except (socket.error, AttributeError): self.warn("could not set socket to accept also IPV4") listen_sock.bind(self.sockaddr) self.lhost, self.lport = listen_sock.getsockname()[:2] if self.type == socket.SOCK_STREAM: listen_sock.listen(1) break else: h.failure() self.error("Could not bind to %s on port %s" % (bindaddr, port)) h.success() h = self.waitfor('Waiting for connections on %s:%s' % (self.lhost, self.lport)) def accepter(): while True: try: if self.type == socket.SOCK_STREAM: self.sock, rhost = listen_sock.accept() listen_sock.close() else: data, rhost = listen_sock.recvfrom(4096) listen_sock.connect(rhost) self.sock = listen_sock self.unrecv(data) self.settimeout(self.timeout) break except socket.error as e: if e.errno == errno.EINTR: continue h.failure() self.exception( "Socket failure while waiting for connection") self.sock = None return self.rhost, self.rport = rhost[:2] h.success('Got connection from %s on port %d' % (self.rhost, self.rport)) self._accepter = context.Thread(target=accepter) self._accepter.daemon = True self._accepter.start()
def __init__(self, port=0, bindaddr = "0.0.0.0", fam = "any", typ = "tcp", *args, **kwargs): super(listen, self).__init__(*args, **kwargs) port = int(port) fam = {socket.AF_INET: 'ipv4', socket.AF_INET6: 'ipv6'}.get(fam, fam) if fam == 'any': fam = socket.AF_UNSPEC elif fam.lower() in ['ipv4', 'ip4', 'v4', '4']: fam = socket.AF_INET elif fam.lower() in ['ipv6', 'ip6', 'v6', '6']: fam = socket.AF_INET6 if bindaddr == '0.0.0.0': bindaddr = '::' elif isinstance(fam, (int, long)): pass else: self.error("remote(): family %r is not supported" % fam) if typ == "tcp": typ = socket.SOCK_STREAM elif typ == "udp": typ = socket.SOCK_DGRAM elif isinstance(typ, (int, long)): pass else: self.error("remote(): type %r is not supported" % typ) h = self.waitfor('Trying to bind to %s on port %d' % (bindaddr, port)) for res in socket.getaddrinfo(bindaddr, port, fam, typ, 0, socket.AI_PASSIVE): self.family, self.type, self.proto, self.canonname, self.sockaddr = res if self.type not in [socket.SOCK_STREAM, socket.SOCK_DGRAM]: continue h.status("Trying %s" % self.sockaddr[0]) listen_sock = socket.socket(self.family, self.type, self.proto) listen_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) listen_sock.bind(self.sockaddr) self.lhost, self.lport = listen_sock.getsockname()[:2] if self.type == socket.SOCK_STREAM: listen_sock.listen(1) break else: h.failure() self.error("Could not bind to %s on port %d" % (bindaddr, port)) h.success() h = self.waitfor('Waiting for connections on %s:%s' % (self.lhost, self.lport)) def accepter(): while True: try: if self.type == socket.SOCK_STREAM: self.sock, rhost = listen_sock.accept() listen_sock.close() else: data, rhost = listen_sock.recvfrom(4096) listen_sock.connect(rhost) self.sock = listen_sock self.unrecv(data) self.settimeout(self.timeout) break except socket.error as e: if e.errno == errno.EINTR: continue h.failure() self.exception("Socket failure while waiting for connection") self.sock = None return self.rhost, self.rport = rhost[:2] h.success('Got connection from %s on port %d' % (self.rhost, self.rport)) self._accepter = context.Thread(target = accepter) self._accepter.daemon = True self._accepter.start()