def open(self): """ Opens connection to the target. Make sure to call close! Returns: None """ # Create socket if self.proto == "tcp" or self.proto == "ssl": self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) elif self.proto == "udp": self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) if self.bind: self._sock.bind(('0.0.0.0', self.bind)) if self._udp_broadcast: self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True) elif self.proto == "raw-l2": self._sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW) elif self.proto == "raw-l3": self._sock = socket.socket(socket.AF_PACKET, socket.SOCK_DGRAM) else: raise exception.FuzzowskiRuntimeError( "INVALID PROTOCOL SPECIFIED: %s" % self.proto) self._sock.setsockopt( socket.SOL_SOCKET, socket.SO_SNDTIMEO, _seconds_to_second_microsecond_struct(self._send_timeout)) self._sock.setsockopt( socket.SOL_SOCKET, socket.SO_RCVTIMEO, _seconds_to_second_microsecond_struct(self._recv_timeout)) # Connect is needed only for TCP protocols if self.proto == "tcp" or self.proto == "ssl": try: self._sock.settimeout(self._recv_timeout) self._sock.connect((self.host, self.port)) except socket.error as e: if e.errno == errno.ECONNREFUSED: # raise exception.FuzzowskiTargetConnectionFailedError(e.message) raise exception.FuzzowskiTargetConnectionFailedError( 'ECONNREFUSED') elif e.errno == errno.EALREADY: raise exception.FuzzowskiTargetConnectionFailedError( 'EALREADY') elif e.errno == errno.EINPROGRESS: raise exception.FuzzowskiTargetConnectionFailedError( 'EINPROGRESS') else: raise except OSError as e: raise exception.FuzzowskiTargetConnectionFailedError( errno.errorcode(e.errno)) # if SSL is requested, then enable it. if self.proto == "ssl": ssl_sock = ssl.wrap_socket(self._sock) # TODO: Python3 change, maybe should use a context instead of deprecated ssl.wrap_socket? self._sock = ssl_sock
def send_data(self, address, data, blocking=True): """Will handle sending data to the socket of corresponding address in the connections list.""" try: for i, modifier in enumerate(self.data_modifiers): try: data = modifier(data) except AttributeError: print "Warning: Modifier at index {} isn't callable!".format( i) except (TypeError, ValueError): print "Warning: Invalid modifier value passed!" print "Sending \'{}\' to socket at address \'{}\'!".format( data, address) data += "\n" try: while True: bytes_sent = 0 try: bytes_sent += self.connections[address]["socket"].send( data[bytes_sent:]) except socket.error as error_code: if blocking: print "Socket error: {}".format( errno.errorcode[error_code.errno]) if error_code.errno in (errno.ECONNREFUSED, errno.ECONNABORTED, errno.ECONNRESET, errno.ETIMEDOUT): print "Connection Error! Sending data to {} aborted! ({})".format( data, errno.errorcode(error_code.errno)) raise ConnectionTerminated if error_code.errno in (errno.EAGAIN, errno.EINPROGRESS, errno.EBUSY): continue else: raise if bytes_sent == len(data): return 0 except KeyError: print "Warning: Address \'{}\' not found in connection list!".format( address) return 1
def open(self): """ Opens connection to the target. Make sure to call close! Returns: None """ try: if self._active_session is False: self._client = telnetlib.Telnet(self.host, port=self.port, timeout=self.timeout) self._client.read_until(b'User name:') self._client.write(self.username + b'\r\n') self._client.read_until(b'User password:'******'\r\n') m = self._client.read_until( b'>') # Todo: Implementation dependant self._active_session = True except socket.error as e: self._active_session = False if e.errno == errno.ECONNREFUSED: # raise exception.FuzzowskiTargetConnectionFailedError(e.message) raise exception.FuzzowskiTargetConnectionFailedError( 'ECONNREFUSED') elif e.errno == errno.EALREADY: raise exception.FuzzowskiTargetConnectionFailedError( 'EALREADY') elif e.errno == errno.EINPROGRESS: raise exception.FuzzowskiTargetConnectionFailedError( 'EINPROGRESS') else: raise except OSError as e: raise exception.FuzzowskiTargetConnectionFailedError( errno.errorcode(e.errno))
def this_loop(): current_data = "" while True: try: current_data += client.recv(4096) except socket.error as error_code: if error_code in (errno.ECONNREFUSED, errno.ECONNABORTED, errno.ECONNRESET, errno.ETIMEDOUT): print "Connection Error! Receiving data from {} aborted! ({})".format( address, errno.errorcode(error_code.errno)) return 1 if error_code in (errno.EAGAIN, errno.EINPROGRESS): continue if not current_data.endswith("\n"): continue break return current_data
def __str__(self): return str(self.msg) + " return errcode %s" % errno.errorcode(self.rc)
def __str__(self): return "{0}; return errcode: {1}".format(self.msg, errno.errorcode(self.rc))
def send_data(self, address, data, blocking=True): """Will handle sending data to the socket of corresponding address in the connections list.""" try: for i, modifier in enumerate(self.data_modifiers): try: data = modifier(data) except AttributeError: print "Warning: Modifier at index {} isn't callable!".format(i) except (TypeError, ValueError): print "Warning: Invalid modifier value passed!" print "Sending \'{}\' to socket at address \'{}\'!".format(data, address) data += "\n" try: while True: bytes_sent = 0 try: bytes_sent += self.connections[address]["socket"].send(data[bytes_sent:]) except socket.error as error_code: if blocking: print "Socket error: {}".format(errno.errorcode[error_code.errno]) if error_code.errno in ( errno.ECONNREFUSED, errno.ECONNABORTED, errno.ECONNRESET, errno.ETIMEDOUT): print "Connection Error! Sending data to {} aborted! ({})".format(data, errno.errorcode( error_code.errno)) raise ConnectionTerminated if error_code.errno in (errno.EAGAIN, errno.EINPROGRESS, errno.EBUSY): continue else: raise if bytes_sent == len(data): return 0 except KeyError: print "Warning: Address \'{}\' not found in connection list!".format(address) return 1
def this_loop(): current_data = "" while True: try: current_data += client.recv(4096) except socket.error as error_code: if error_code in (errno.ECONNREFUSED, errno.ECONNABORTED, errno.ECONNRESET, errno.ETIMEDOUT): print "Connection Error! Receiving data from {} aborted! ({})".format(address, errno.errorcode( error_code.errno)) return 1 if error_code in (errno.EAGAIN, errno.EINPROGRESS): continue if not current_data.endswith("\n"): continue break return current_data