Пример #1
0
 def __negotiatesocks4(self,destaddr,destport):
     """__negotiatesocks4(self,destaddr,destport)
     Negotiates a connection through a SOCKS4 server.
     """
     # Check if the destination address provided is an IP address
     rmtrslv = False
     try:
         ipaddr = socket.inet_aton(destaddr)
     except socket.error:
         # It's a DNS name. Check where it should be resolved.
         if self.__proxy[3]:
             ipaddr = struct.pack("BBBB", 0x00, 0x00, 0x00, 0x01)
             rmtrslv = True
         else:
             ipaddr = socket.inet_aton(socket.gethostbyname(destaddr))
     # Construct the request packet
     req = struct.pack(">BBH", 0x04, 0x01, destport) + ipaddr
     # The username parameter is considered userid for SOCKS4
     if self.__proxy[4] != None:
         req = req + self.__proxy[4]
     req = req + chr(0x00).encode()
     # DNS name if remote resolving is required
     # NOTE: This is actually an extension to the SOCKS4 protocol
     # called SOCKS4A and may not be supported in all cases.
     if rmtrslv:
         req = req + destaddr + chr(0x00).encode()
     self.sendall(req)
     # Get the response from the server
     resp = self.__recvall(8)
     if resp[0:1] != chr(0x00).encode():
         # Bad data
         self.close()
         raise GeneralProxyError((1,_generalerrors[1]))
     if resp[1:2] != chr(0x5A).encode():
         # Server returned an error
         self.close()
         if ord(resp[1:2]) in (91, 92, 93):
             self.close()
             raise Socks4Error((ord(resp[1:2]), _socks4errors[ord(resp[1:2]) - 90]))
         else:
             raise Socks4Error((94, _socks4errors[4]))
     # Get the bound address/port
     self.__proxysockname = (socket.inet_ntoa(resp[4:]), struct.unpack(">H", resp[2:4])[0])
     if rmtrslv != None:
         self.__proxypeername = (socket.inet_ntoa(ipaddr), destport)
     else:
         self.__proxypeername = (destaddr, destport)
Пример #2
0
def iface_ip(iface):
    """Derives ip address from the interface"""
    try:
        from socket import socket
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        return socket.inet_ntoa(
            fcntl.ioctl(s.fileno(), 0x8915,
                        struct.pack('256s', str(self.iface[:15])))[20:24])
    except IOError as e:
        return ""
    ip = ""
Пример #3
0
 def __negotiatesocks5(self, destaddr, destport):
     """__negotiatesocks5(self,destaddr,destport)
     Negotiates a connection through a SOCKS5 server.
     """
     # First we'll send the authentication packages we support.
     if (self.__proxy[4]!=None) and (self.__proxy[5]!=None):
         # The username/password details were supplied to the
         # setproxy method so we support the USERNAME/PASSWORD
         # authentication (in addition to the standard none).
         self.sendall(struct.pack('BBBB', 0x05, 0x02, 0x00, 0x02))
     else:
         # No username/password were entered, therefore we
         # only support connections with no authentication.
         self.sendall(struct.pack('BBB', 0x05, 0x01, 0x00))
     # We'll receive the server's response to determine which
     # method was selected
     chosenauth = self.__recvall(2)
     if chosenauth[0:1] != chr(0x05).encode():
         self.close()
         raise GeneralProxyError((1, _generalerrors[1]))
     # Check the chosen authentication method
     if chosenauth[1:2] == chr(0x00).encode():
         # No authentication is required
         pass
     elif chosenauth[1:2] == chr(0x02).encode():
         # Okay, we need to perform a basic username/password
         # authentication.
         self.sendall(chr(0x01).encode() + chr(len(self.__proxy[4])) + self.__proxy[4] + chr(len(self.__proxy[5])) + self.__proxy[5])
         authstat = self.__recvall(2)
         if authstat[0:1] != chr(0x01).encode():
             # Bad response
             self.close()
             raise GeneralProxyError((1, _generalerrors[1]))
         if authstat[1:2] != chr(0x00).encode():
             # Authentication failed
             self.close()
             raise Socks5AuthError((3, _socks5autherrors[3]))
         # Authentication succeeded
     else:
         # Reaching here is always bad
         self.close()
         if chosenauth[1] == chr(0xFF).encode():
             raise Socks5AuthError((2, _socks5autherrors[2]))
         else:
             raise GeneralProxyError((1, _generalerrors[1]))
     # Now we can request the actual connection
     req = struct.pack('BBB', 0x05, 0x01, 0x00)
     # If the given destination address is an IP address, we'll
     # use the IPv4 address request even if remote resolving was specified.
     try:
         ipaddr = socket.inet_aton(destaddr)
         req = req + chr(0x01).encode() + ipaddr
     except socket.error:
         # Well it's not an IP number,  so it's probably a DNS name.
         if self.__proxy[3]:
             # Resolve remotely
             ipaddr = None
             req = req + chr(0x03).encode() + chr(len(destaddr)).encode() + destaddr
         else:
             # Resolve locally
             ipaddr = socket.inet_aton(socket.gethostbyname(destaddr))
             req = req + chr(0x01).encode() + ipaddr
     req = req + struct.pack(">H", destport)
     self.sendall(req)
     # Get the response
     resp = self.__recvall(4)
     if resp[0:1] != chr(0x05).encode():
         self.close()
         raise GeneralProxyError((1, _generalerrors[1]))
     elif resp[1:2] != chr(0x00).encode():
         # Connection failed
         self.close()
         if ord(resp[1:2])<=8:
             raise Socks5Error((ord(resp[1:2]), _socks5errors[ord(resp[1:2])]))
         else:
             raise Socks5Error((9, _socks5errors[9]))
     # Get the bound address/port
     elif resp[3:4] == chr(0x01).encode():
         boundaddr = self.__recvall(4)
     elif resp[3:4] == chr(0x03).encode():
         resp = resp + self.recv(1)
         boundaddr = self.__recvall(ord(resp[4:5]))
     else:
         self.close()
         raise GeneralProxyError((1,_generalerrors[1]))
     boundport = struct.unpack(">H", self.__recvall(2))[0]
     self.__proxysockname = (boundaddr, boundport)
     if ipaddr != None:
         self.__proxypeername = (socket.inet_ntoa(ipaddr), destport)
     else:
         self.__proxypeername = (destaddr, destport)