Esempio n. 1
0
    def handle(self, sock, addr):
        print 'connection from %s:%s' % addr

        src = XSocket(socket = sock, secure = True)

        #socks5 negotiation step2: specify command and destination
        ver, cmd, rsv, atype = src.unpack('BBBB', 4)

        if cmd != 0x01:
            src.pack('BBBBIH', 0x05, 0x07, 0x00, 0x01, 0, 0)
            return

        if atype == 0x01: #ipv4
            host, port = src.unpack('!IH', 6)
            hostip = socket.inet_ntoa(struct.pack('!I', host))
        elif atype == 0x03: #domain name
            length = src.unpack('B', 1)[0]
            hostname, port = src.unpack("!%dsH" % length, length + 2)
            hostip = gethostbyname(hostname)
            host = struct.unpack("!I", socket.inet_aton(hostip))[0]
        elif atype == 0x04: #ipv6: TODO
            src.pack('!BBBBIH', 0x05, 0x07, 0x00, 0x01, 0, 0)
            return
        else:
            src.pack('!BBBBIH', 0x05, 0x07, 0x00, 0x01, 0, 0)
            return

        try:
            dest = XSocket(addr = (hostip, port))
        except IOError, ex:
            print "%s:%d" % addr, "failed to connect to %s:%d" % (hostip, port)
            src.pack('!BBBBIH', 0x05, 0x03, 0x00, 0x01, host, port)
            return
Esempio n. 2
0
    def socks4Handle(self):
        cd,port,dstip = self.sock.unpack('!BHI')

        if cd != 1:
            # 1 == 连接, 2 == 绑定
            self.sock.pack('!BBHI',0,91,port,dstip)
            self.sock.close()

        userid = self.sock.readline(end='\0')[:-1]

        hostname = _socket.inet_ntoa(struct.pack('!I', dstip))

        if hostname.startswith('0.0.0.'):
            # SOCKS4a 支持 ,chrome 不支持 socks4a 扩展。
            hostname = self.sock.readline(end='\0')[:-1]

        # 对外发起请求
        try:
            remote_sock = self.server.upstream.create_connection((hostname,port),)
        except:
            logging.exception(u'所有线路连接 tcp host:%s port:%s 失败。'%(hostname,port))
            # 按照socks4协议,这里返回和请求相同的ip和端口
            # https://zh.wikipedia.org/wiki/SOCKS
            self.sock.pack('!BBHI',0,91,port,dstip)
            self.sock.close()
            return

        # 按照socks4协议,这里返回和请求相同的ip和端口
        # https://zh.wikipedia.org/wiki/SOCKS
        self.sock.pack('!BBHI',0,90,port,dstip)

        self.forward(self.sock,remote_sock,5*60)
Esempio n. 3
0
    def socks5Handle(self):
        # 鉴定
        (nmethods,) = self.sock.unpack('B')
        if nmethods > 0:
            (methods,) = self.sock.unpack('B' * nmethods)
            # TODO: 未检查客户端支持的鉴定方式
        self.sock.pack('BB', 0x05, 0x00)
        logging.debug(u'[Socks5Handler]client login')

        # 接收代理请求
        ver, cmd, rsv, atyp = self.sock.unpack('BBBB')

        if ver != 0x05 or cmd != 0x01:
            logging.warn(u'[Socks5Handler]收到未知类型的请求,关闭连接。 ver=%s ,cmd=%s' % (ver, cmd))
            self.sock.pack('BBBBIH', 0x05, 0x07, 0x00, 0x01, 0, 0)
            self.sock.close()
            return

        if atyp == 0x01:
            # ipv4
            host, port = self.sock.unpack('!IH')
            hostname = _socket.inet_ntoa(struct.pack('!I', host))
        elif atyp == 0x03:
            # 域名
            length = self.sock.unpack('B')[0]
            hostname, port = self.sock.unpack("!%dsH" % length)
        elif atyp == 0x04:
            # ipv6
            ipv61, ipv62, port = self.sock.unpack('!2QH')
            hostname = _socket.inet_ntop(_socket.AF_INET6, struct.pack('!2Q', ipv61, ipv62))
        else:
            logging.warn(u'[SClient]收到未知的目的地址类型,关闭连接。 atyp=%s ' % (atyp))
            self.sock.pack('!BBBBIH', 0x05, 0x07, 0x00, 0x01, 0, 0)
            self.sock.close()
            return
        logging.debug(u'[SClient] host:%s   prot:%s' % (hostname, port))

        # 对外发起请求
        try:
            remote_sock = self.server.upstream.create_connection((hostname,port),)
        except:
            logging.exception(u'所有线路连接 tcp host:%s port:%s 失败。'%(hostname,port))
            # TODO: 按照socks5协议,这里应该返回服务器绑定的地址及端口
            # http://blog.csdn.net/testcs_dn/article/details/7915505
            self.sock.pack('!BBBBIH', 0x05, 0x03, 0x00, 0x01, 0, 0)
            self.sock.close()
            return

        if hasattr(remote_sock,'display_name'):
            remote_sock_display_name = remote_sock.display_name
        else:
            remote_sock_display_name = str(remote_sock)

        logging.info(u'连接 tcp目标 host:%s port:%s 通过 %s 建立成功。'%(hostname,port,remote_sock_display_name))

        # TODO: 按照socks5协议,这里应该返回服务器绑定的地址及端口
        # http://blog.csdn.net/testcs_dn/article/details/7915505
        self.sock.pack('!BBBBIH', 0x05, 0x00, 0x00, 0x01, 0, 0)

        self.forward(self.sock,remote_sock,5*60)
Esempio n. 4
0
 def unpackRR(self, s):
     n = self.unpackname(s)
     r = struct.unpack('>HHIH', s.read(10))
     if r[0] == TYPE.A:
         return n, r[0], r[1], r[2], socket.inet_ntoa(s.read(r[3]))
     elif r[0] == TYPE.CNAME:
         return n, r[0], r[1], r[2], self.unpackname(s)
     else: raise Exception("don't know howto handle type")
Esempio n. 5
0
 def ipAddress(self, Address):
     """returns self.Address in ip address format"""
     if Address == "":
         return ""
     try:
         return socket.inet_ntoa(struct.pack("!I", Address))
     except:
         return Address
Esempio n. 6
0
	def ipAddress(self,Address):
		'''returns self.Address in ip address format'''
		if Address == '':
			return ''
		try:
			return socket.inet_ntoa(struct.pack("!I", Address))
		except:
			return Address
Esempio n. 7
0
    def socks5Handle(self):
        # 鉴定
        (nmethods,) = self.sock.unpack('B')
        if nmethods > 0:
            (methods,) = self.sock.unpack('B' * nmethods)
            # TODO: 未检查客户端支持的鉴定方式
        self.sock.pack('BB', 0x05, 0x00)
        logging.debug(u'[Socks5Handler]client login')

        # 接收代理请求
        ver, cmd, rsv, atyp = self.sock.unpack('BBBB')

        if ver != 0x05 or cmd != 0x01:
            logging.warn(u'[Socks5Handler]收到未知类型的请求,关闭连接。 ver=%s ,cmd=%s' % (ver, cmd))
            self.sock.pack('BBBBIH', 0x05, 0x07, 0x00, 0x01, 0, 0)
            self.sock.close()
            return

        if atyp == 0x01:
            # ipv4
            host, port = self.sock.unpack('!IH')
            hostname = _socket.inet_ntoa(struct.pack('!I', host))
        elif atyp == 0x03:
            # 域名
            length = self.sock.unpack('B')[0]
            hostname, port = self.sock.unpack("!%dsH" % length)
        elif atyp == 0x04:
            # ipv6
            ipv61, ipv62, port = self.sock.unpack('!2QH')
            hostname = _socket.inet_ntop(_socket.AF_INET6, struct.pack('!2Q', ipv61, ipv62))
        else:
            logging.warn(u'[SClient]收到未知的目的地址类型,关闭连接。 atyp=%s ' % (atyp))
            self.sock.pack('!BBBBIH', 0x05, 0x07, 0x00, 0x01, 0, 0)
            self.sock.close()
            return
        logging.debug(u'[SClient] host:%s   prot:%s' % (hostname, port))

        # 对外发起请求
        try:
            remote_sock = self.server.upstream.create_connection((hostname,port),)
        except:
            logging.exception(u'所有线路连接 tcp host:%s port:%s 失败。'%(hostname,port))
            # TODO: 按照socks5协议,这里应该返回服务器绑定的地址及端口
            # http://blog.csdn.net/testcs_dn/article/details/7915505
            self.sock.pack('!BBBBIH', 0x05, 0x03, 0x00, 0x01, 0, 0)
            self.sock.close()
            return

        # TODO: 按照socks5协议,这里应该返回服务器绑定的地址及端口
        # http://blog.csdn.net/testcs_dn/article/details/7915505
        self.sock.pack('!BBBBIH', 0x05, 0x00, 0x00, 0x01, 0, 0)

        self.forward(self.sock,remote_sock,5*60)
Esempio n. 8
0
    def _read_SOCKS5_address(self, file):
        atyp = self._readall(file, 1)
        if atyp == b"\x01":
            addr = socket.inet_ntoa(self._readall(file, 4))
        elif atyp == b"\x03":
            length = self._readall(file, 1)
            addr = self._readall(file, ord(length))
        else:
            raise GeneralProxyError("SOCKS5 proxy server sent invalid data")

        port = struct.unpack(">H", self._readall(file, 2))[0]
        return addr, port
Esempio n. 9
0
def socks5_connect(target, proxy, username=None, password=None, rdns=True):
    sock = socket.socket()
    sock.connect(proxy)
    stream = sock.makefile()

    # hand shake request
    if username is None or password is None:
        stream.write("\x05\x01\x00")
    else: stream.write("\x05\x02\x00\x02")
    stream.flush()
    
    # hand shake response
    chosenauth = stream.read(2)
    if chosenauth[0] != "\x05": raise GeneralProxyError(1)
    if chosenauth[1] == "\x00": pass
    elif chosenauth[1] == "\x02":
        stream.write('\x01' + fmt_string(username) + fmt_string(password))
        stream.flush()
        authstat = stream.read(2)
        if authstat[0] != "\x01": raise GeneralProxyError(1)
        if authstat[1] != "\x00": raise Socks5AuthError(3)
        logger.debug('authenticated with password')
    elif chosenauth[1] == "\xFF": raise Socks5AuthError(2)
    else: raise GeneralProxyError(1)

    # connect request
    try: reqaddr = "\x01" + socket.inet_aton(target[0])
    except socket.error:
        if rdns: reqaddr = '\x03' + fmt_string(target[0])
        else: reqaddr = "\x01" + socket.inet_aton(socket.gethostbyname(target[0]))
    s = "\x05\x01\x00" + reqaddr + struct.pack(">H", target[1])
    stream.write(s)
    stream.flush()

    # connect response
    resp = stream.read(4)
    if not resp: raise EOFError()
    if resp[0] != "\x05": raise GeneralProxyError(1)
    if resp[1] != "\x00":
        if ord(resp[1]) <= 8: raise Socks5Error(ord(resp[1]))
        else: raise Socks5Error(9)
    if resp[3] == "\x03": boundaddr = stream.read(stream.read(1))
    elif resp[3] == "\x01": boundaddr = socket.inet_ntoa(stream.read(4))
    else: raise GeneralProxyError(1)
    boundport = struct.unpack(">H", stream.read(2))[0]
    logger.debug('connected with %s:%s, bind in %s:%d' % (
            target[0], target[1], boundaddr, boundport))
    return sock, (boundaddr, boundport)
Esempio n. 10
0
    def handle(self, sock, addr):
        print 'connection from %s:%s' % addr

        src = XSocket(socket = sock)

        #socks5 negotiation step1: choose an authentication method
        ver, n_method = src.unpack('BB', 2) 

        if ver != 0x05:
            src.pack('BB', 0x05, 0xff)
            return

        if n_method > 0:
            src.recv(n_method)
        
        src.pack('!BB', 0x05, 0x00) #0x00 means no authentication needed

        #socks5 negotiation step2: specify command and destination
        ver, cmd, rsv, atype = src.unpack('BBBB', 4)

        if cmd != 0x01:
            src.pack('BBBBIH', 0x05, 0x07, 0x00, 0x01, 0, 0)
            return

        if atype == 0x01: #ipv4
            host, port = src.unpack('!IH', 6)
            hostip = socket.inet_ntoa(struct.pack('!I', host))
        elif atype == 0x03: #domain name
            length = src.unpack('B', 1)[0]
            hostname, port = src.unpack("!%dsH" % length, length + 2)
            hostip = gethostbyname(hostname)
            host = struct.unpack("!I", socket.inet_aton(hostip))[0]
        elif atype == 0x04: #ipv6: TODO
            src.pack('!BBBBIH', 0x05, 0x07, 0x00, 0x01, 0, 0)
            return
        else:
            src.pack('!BBBBIH', 0x05, 0x07, 0x00, 0x01, 0, 0)
            return

        try:
            print "call proxy, host:", hostip, port
            dest = SmartSocket(addr = (hostip, port))
        except IOError, ex:
            print "%s:%d" % addr, "failed to connect to %s:%d" % (hostip, port)
            src.pack('!BBBBIH', 0x05, 0x03, 0x00, 0x01, host, port)
            return
Esempio n. 11
0
 def unpackRR(self, s):
     n = self.unpackname(s)
     r = struct.unpack('>HHIH', s.read(10))
     if r[0] == TYPE.A:
         return n, r[0], r[1], r[2], socket.inet_ntoa(s.read(r[3]))
     elif r[0] == TYPE.CNAME:
         return n, r[0], r[1], r[2], self.unpackname(s)
     elif r[0] == TYPE.MX:
         return n, r[0], r[1], r[2], \
             struct.unpack('>H', s.read(2))[0], self.unpackname(s)
     elif r[0] == TYPE.PTR:
         return n, r[0], r[1], r[2], self.unpackname(s)
     elif r[0] == TYPE.SOA:
         rr = [n, r[0], r[1], r[2], self.unpackname(s), self.unpackname(s)]
         rr.extend(struct.unpack('>IIIII', s.read(20)))
         return tuple(rr)
     else: raise Exception("don't know howto handle type, %s." % str(r))
Esempio n. 12
0
    def handle(self, sock, addr):
        print 'connection from %s:%s' % addr

        src = XSocket(socket = sock)

        #socks5 negotiation step1: choose an authentication method
        ver, n_method = src.unpack('BB', 2) 

        if ver != 0x05:
            src.pack('BB', 0x05, 0xff)
            return

        if n_method > 0:
            src.recv(n_method)
        
        src.pack('!BB', 0x05, 0x00) #0x00 means no authentication needed

        #socks5 negotiation step2: specify command and destination
        ver, cmd, rsv, atype = src.unpack('BBBB', 4)

        if cmd != 0x01:
            src.pack('BBBBIH', 0x05, 0x07, 0x00, 0x01, 0, 0)
            return

        if atype == 0x01: #ipv4
            host, port = src.unpack('!IH', 6)
            hostip = socket.inet_ntoa(struct.pack('!I', host))
        elif atype == 0x03: #domain name
            length = src.unpack('B', 1)[0]
            hostname, port = src.unpack("!%dsH" % length, length + 2)
            hostip = gethostbyname(hostname)
            host = struct.unpack("!I", socket.inet_aton(hostip))[0]
        elif atype == 0x04: #ipv6: TODO
            src.pack('!BBBBIH', 0x05, 0x07, 0x00, 0x01, 0, 0)
            return
        else:
            src.pack('!BBBBIH', 0x05, 0x07, 0x00, 0x01, 0, 0)
            return

        try:
            dest = XSocket(addr = (hostip, port))
        except IOError, ex:
            print "%s:%d" % addr, "failed to connect to %s:%d" % (hostip, port)
            src.pack('!BBBBIH', 0x05, 0x03, 0x00, 0x01, host, port)
            return
Esempio n. 13
0
 def unpackRR(self, s):
     n = self.unpackname(s)
     r = struct.unpack('>HHIH', s.read(10))
     if r[0] == TYPE.A:
         return n, r[0], r[1], r[2], socket.inet_ntoa(s.read(r[3]))
     elif r[0] == TYPE.CNAME:
         return n, r[0], r[1], r[2], self.unpackname(s)
     elif r[0] == TYPE.MX:
         return n, r[0], r[1], r[2], \
             struct.unpack('>H', s.read(2))[0], self.unpackname(s)
     elif r[0] == TYPE.PTR:
         return n, r[0], r[1], r[2], self.unpackname(s)
     elif r[0] == TYPE.SOA:
         rr = [n, r[0], r[1], r[2], self.unpackname(s), self.unpackname(s)]
         rr.extend(struct.unpack('>IIIII', s.read(20)))
         return tuple(rr)
     else:
         raise Exception("don't know howto handle type, %s." % str(r))
Esempio n. 14
0
def msgfill_parsed_record_v9(dd):
    log.info("parsing  v9 records")
    global FIELDS
    global PROTO_DIC
    d = {}
    e = {}
    for (k, v) in dd.iteritems():
        #log.debug("********** %s ******* %s", k, v)
        if k in _filter_ipv4:
            #log.debug("#pack the ipv4")
            msgfilling.add_types(e, '_type_ip', FIELDS[k])
            msgfilling.add_types(e, '_type_str', FIELDS[k])
            d[k] = socket.inet_ntoa(struct.pack('!I', dd[k]))
        elif k in _filter_ipv6:
            #log.debug("#pace the ipv6")
            msgfilling.add_types(e, '_type_ip', FIELDS[k])
            msgfilling.add_types(e, '_type_str', FIELDS[k])
            d[k] = dd[k]
        else:
            #log.debug("leave as it is")
            d[k] = dd[k]
            if (k == 4):
                try:
                    e['protocol_name'] = PROTO_DIC[d[k]]
                except:
                    log.info("Protocol Name not found in PROTO_DIC")
                    e['protocol_name'] = "Unknown"
                msgfilling.add_types(e, '_type_str', "protocol_name")
            try:
                msgfilling.add_types(e, '_type_num', FIELDS[k])
            except:
                log.info(
                    "Fields not found in netflow_v9 field_type; Not filling msg_type"
                )
                #msgfilling.add_types(e, '_type_num', "Unknown_field_"+str(k))
        try:
            e[FIELDS[k]] = d[k]
        except:
            log.info(
                "Fields not found in netflow_v9 field_type; Not assigining values."
            )
            #e["Unknown_field_"+str(k)] = d[k]
    log.debug("this is v9 parsed result %s", e)
    return e
 def msgfill_parsed_record(self, ev):
     #log.info("parsing  v9 records")
     temp_ev = {}
     filled_ev = {}
     for (k, v) in ev.iteritems():
         #log.debug("********** %s ******* %s", k, v)
         if k in self._filter_ipv4:
             # log.debug("#pack the ipv4")
             self.prepare_msgfilling(filled_ev, TYPE_IP, FIELDS[k])
             self.prepare_msgfilling(filled_ev, TYPE_STR, FIELDS[k])
             temp_ev[k] = socket.inet_ntoa(struct.pack('!I', ev[k]))
         elif k in self._filter_ipv6:
             # log.debug("#pace the ipv6")
             self.prepare_msgfilling(filled_ev, TYPE_IP, FIELDS[k])
             self.prepare_msgfilling(filled_ev, TYPE_STR, FIELDS[k])
             temp_ev[k] = ev[k]
         else:
             #log.debug("leave as it is")
             temp_ev[k] = ev[k]
             if (k == 4):
                 filled_ev['protocol_name'] = PROTO_DIC.get(
                     temp_ev[k], "Unknown")
                 self.prepare_msgfilling(filled_ev, TYPE_STR,
                                         "protocol_name")
             try:
                 self.prepare_msgfilling(filled_ev, TYPE_NUM, FIELDS[k])
             except:
                 log.info(
                     "Fields not found in netflow_v9 field_type; Not filling msg_type"
                 )
                 #msgfilling.add_types(e, TYPE_NUM, "Unknown_field_"+str(k))
         try:
             filled_ev[FIELDS[k]] = temp_ev[k]
         except:
             log.info(
                 "Fields not found in netflow_v9 field_type; Not assigining values."
             )
             #e["Unknown_field_"+str(k)] = d[k]
     #log.debug("this is v9 parsed result %s", e)
     return filled_ev
Esempio n. 16
0
def handshake(ws):
    try:
        recv = ws.receive()
        if recv[0] != 5:
            return False
        
        send_msg = (b'\x05\x00')
        ws.send(send_msg)
        gevent.sleep(2)
        recv = ws.receive()

        if recv != None:
            # print(recv)
            if recv[0] != 5 or recv[2] != 0:
                return False
        else:
            return False
        addr_type = recv[3]
        if addr_type == 1:
            addr = socket.inet_ntoa(recv[4:8])
        elif addr_type == 3:
            addr_len = recv[4]
            addr = socket.gethostbyname(recv[5:5 + addr_len])
        else:
            # only ipv4 addr or domain name is supported.
            return False

        port = recv[-2] * 256 + recv[-1]
        if recv[1] == 1:
            server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            r = server_sock.connect_ex((addr,port))
            if r == 0:
                return server_sock
        else:
            return False
    except Exception as e:
        return False
Esempio n. 17
0
def socks5_connect(sock, target, rdns=True):
    stream = sock.makefile()
    # connect request
    try: reqaddr = "\x01" + socket.inet_aton(target[0])
    except socket.error:
        if rdns: reqaddr = '\x03' + fmt_string(target[0])
        else: reqaddr = "\x01" + socket.inet_aton(socket.gethostbyname(target[0]))
    s = "\x05\x01\x00" + reqaddr + struct.pack(">H", target[1])
    stream.write(s)
    stream.flush()

    # connect response
    resp = stream.read(4)
    if not resp: raise EOFError()
    if resp[0] != "\x05": raise GeneralProxyError(1)
    if resp[1] != "\x00":
        if ord(resp[1]) <= 8: raise Socks5Error(ord(resp[1]))
        else: raise Socks5Error(9)
    if resp[3] == "\x03": boundaddr = stream.read(stream.read(1))
    elif resp[3] == "\x01": boundaddr = socket.inet_ntoa(stream.read(4))
    else: raise GeneralProxyError(1)
    boundport = struct.unpack(">H", stream.read(2))[0]
    logger.debug('socks connected with %s:%s' % target)
    return boundaddr, boundport
Esempio n. 18
0
    def getLocalIp(self):
        import socket, fcntl, struct
        f = open('/proc/net/dev')
        if_list = []
        while True:
            line = f.readline()
            if line:
                dev_info = line.split(":")
                if len(dev_info) < 2:
                    continue
                if_list.append(dev_info[0].strip())
            else:
                break

        ip_list = []
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        for eth in if_list:
            try:
                inet = fcntl.ioctl(s.fileno(), 0x8915,
                                   struct.pack('256s', eth[:15]))
                ip = socket.inet_ntoa(inet[20:24])
            except Exception, e:
                continue
            ip_list.append(ip)
Esempio n. 19
0
 def handle_connection(self, client_socket):
     try:
         data = client_socket.recv(1024)
         addrtype = ord(data[0])
         if addrtype == 1:
             remote_ip = socket.inet_ntoa(data[1:5])
             remote_port = struct.unpack('>H', data[5:7])[0]
             remote_addr = (remote_ip, remote_port)
         elif addrtype == 3:
             domain_length = ord(data[1])
             remote_domain = data[2:2+domain_length]
             remote_port = struct.unpack(
                 '>H', data[2+domain_length:4+domain_length])[0]
             remote_addr = (remote_domain, remote_port)
         remote_socket = socket.socket(
             socket.AF_INET, socket.SOCK_STREAM, socket.SOL_TCP)
         remote_socket.connect(remote_addr)
         gevent.spawn(self.handle_client_connection, client_socket,
                      remote_socket)
         gevent.spawn(self.handle_remote_connection, remote_socket,
                      client_socket)
     except socket.error as error:
         print error
         return
Esempio n. 20
0
def socks5_connect(sock, target, rdns=True):
    stream = sock.makefile()
    # connect request
    try: reqaddr = "\x01" + socket.inet_aton(target[0])
    except socket.error:
        if rdns: reqaddr = '\x03' + fmt_string(target[0])
        else: reqaddr = "\x01" + socket.inet_aton(socket.gethostbyname(target[0]))
    s = "\x05\x01\x00" + reqaddr + struct.pack(">H", target[1])
    stream.write(s)
    stream.flush()

    # connect response
    resp = stream.read(4)
    if not resp: raise EOFError()
    if resp[0] != "\x05": raise GeneralProxyError(1)
    if resp[1] != "\x00":
        if ord(resp[1]) <= 8: raise Socks5Error(ord(resp[1]))
        else: raise Socks5Error(9)
    if resp[3] == "\x03": boundaddr = stream.read(stream.read(1))
    elif resp[3] == "\x01": boundaddr = socket.inet_ntoa(stream.read(4))
    else: raise GeneralProxyError(1)
    boundport = struct.unpack(">H", stream.read(2))[0]
    logger.debug('socks connected with %s:%s' % target)
    return boundaddr, boundport
Esempio n. 21
0
    def _negotiate_SOCKS4(self, dest_addr, dest_port):
        """
        Negotiates a connection through a SOCKS4 server.
        """
        proxy_type, addr, port, rdns, username, password = self.proxy

        writer = self.makefile("wb")
        reader = self.makefile("rb", 0)  # buffering=0 renamed in Python 3
        try:
            # Check if the destination address provided is an IP address
            remote_resolve = False
            try:
                addr_bytes = socket.inet_aton(dest_addr)
            except socket.error:
                # It's a DNS name. Check where it should be resolved.
                if rdns:
                    addr_bytes = b"\x00\x00\x00\x01"
                    remote_resolve = True
                else:
                    addr_bytes = socket.inet_aton(
                        socket.gethostbyname(dest_addr))

            # Construct the request packet
            writer.write(struct.pack(">BBH", 0x04, 0x01, dest_port))
            writer.write(addr_bytes)

            # The username parameter is considered userid for SOCKS4
            if username:
                writer.write(username)
            writer.write(b"\x00")

            # 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 remote_resolve:
                writer.write(dest_addr.encode('idna') + b"\x00")
            writer.flush()

            # Get the response from the server
            resp = self._readall(reader, 8)
            if resp[0:1] != b"\x00":
                # Bad data
                raise GeneralProxyError(
                    "SOCKS4 proxy server sent invalid data")

            status = ord(resp[1:2])
            if status != 0x5A:
                # Connection failed: server returned an error
                error = SOCKS4_ERRORS.get(status, "Unknown error")
                raise SOCKS4Error("{0:#04x}: {1}".format(status, error))

            # Get the bound address/port
            self.proxy_sockname = (socket.inet_ntoa(resp[4:]),
                                   struct.unpack(">H", resp[2:4])[0])
            if remote_resolve:
                self.proxy_peername = socket.inet_ntoa(addr_bytes), dest_port
            else:
                self.proxy_peername = dest_addr, dest_port
        finally:
            reader.close()
            writer.close()
Esempio n. 22
0
 def save(self, stream):
     r = []
     for mask, addrs in self.nets.iteritems():
         r.extend([(addr, mask) for addr in list(addrs)])
     for addr, mask in sorted(r, key=lambda x: x[0]):
         stream.write('%s %s\n' % (socket.inet_ntoa(addr), socket.inet_ntoa(mask)))
Esempio n. 23
0
    def handle(self, source, address):
        '''
            1. parse browser socks5 message
            2. establishes WebSocket connection to a remote server
            3. encrypt data using RC4
            4. forward with both the local and remote server
        '''
        log('New connection from %s:%s' % address)

        log('greenlet is %r', gevent.getcurrent())

        rfile = source.makefile('rb', -1)

        try:
            recvcount = source.recv(262)
            log("recv count: %r: %r " % (recvcount, type(recvcount)))

            source.send(b'\x05\x00')

            wsdata = ''
            data = rfile.read(4)
            log('second pack %r: %r' % (type(data), data))

            cmd = ord(data[1])  # CMD
            addrtype = ord(data[3])  # ADDR type 0x01 Ipv4 address

            wsdata = data[3]  # append type of address

            if addrtype == 1:  # IPv4
                addrStr = rfile.read(4)
                addr = socket.inet_ntoa(addrStr)
                wsdata += addrStr
            elif addrtype == 3:  # Domain name
                domainlen = ord(rfile.read(1)[0])
                domain = rfile.read(domainlen)
                log('domain len and name: %d %s' % (domainlen, domain))
                # addr = handle_dns(domain)
                addr = socket.inet_ntoa('\x00\x00\x00\x00')  # 16777343
                wsdata += chr(domainlen)
                wsdata += domain

            portstr = rfile.read(2)
            port = struct.unpack('>H', portstr)
            wsdata += portstr  # append port

            if cmd == 1:
                reply = b"\x05\x00\x00\x01" + socket.inet_aton(
                    addr) + struct.pack(">H", port[0])
                log("send replay %r" % reply)

                source.send(reply)
                log('Begin data, %s:%s' % (addr, port[0]))

                ws = WebSocketClient(self.remotehost, protocols=['binary'])
                try:
                    # gevent.monkey 阻塞
                    ws.connect()
                    log("connect remote websocket server!")
                    log('send data %r:%r:%r' %
                        (wsdata, type(wsdata), len(wsdata)))

                    encryptor = RC4(self.key)
                    generator = encryptor.encrypter()
                    out = ''
                    for wc in wsdata:
                        out += chr((ord(wc) ^ generator.next()))

                    # send socks5 message
                    ws.send(out, True)

                    l1 = gevent.spawn(self.forward, source, ws, generator)
                    l2 = gevent.spawn(self.incoming, ws, source)

                    gevent.joinall([l1, l2])

                except socket.error as e:
                    log('Conn refused, %s:%s:%s' % (addr, port[0], e.message))
                    # Connection refused
                    reply = b'\x05\x05\x00\x01\x00\x00\x00\x00\x00\x00'
                    source.send(reply)
                    raise e
                finally:
                    log('close websocket: ---------------------------')
                    ws.close()
            else:
                log('Unsupported cmd: %r' % cmd)
                reply = b"\x05\0x07\0x00\0x01"
                source.send(reply)
        except socket.error, (value, message):
            log('socks_handle socket error, %s' % (message))
def get_data32_addr(raw_data):
    global data
    data = raw_data[4:]
    #return socket.ntohl(struct.unpack('!L',raw_data[0:4])[0])
    return socket.inet_ntoa(raw_data[0:4])  #struct.pack('!L',raw_data[0:4]))
Esempio n. 25
0
 def int_to_ip(self, int_ip):
     return socket.inet_ntoa(struct.pack('I', socket.htonl(int_ip)))
Esempio n. 26
0
 def add_service(self, zeroconf, type, name):
     info = zeroconf.get_service_info(type, name)
     self.server_address = socket.inet_ntoa(info.address)
     self.port = info.port
     log.debug('Service %s added, service info: %s' % (name, info))
Esempio n. 27
0
def int2ip(addr):
	return socket.inet_ntoa(struct.pack("!I", addr))
Esempio n. 28
0
 def get_data32_addr(self):
     raw_data = self.data
     self.data = raw_data[4:]
     return socket.inet_ntoa(raw_data[0:4])  #struct.pack('!L',raw_data[0:4]))  
Esempio n. 29
0
 def save(self, stream):
     r = []
     for mask, addrs in self.nets.iteritems():
         r.extend([(addr, mask) for addr in list(addrs)])
     for addr, mask in sorted(r, key=lambda x: x[0]):
         stream.write('%s %s\n' % (socket.inet_ntoa(addr), socket.inet_ntoa(mask)))
Esempio n. 30
0
def get_ip(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(
        fcntl.ioctl(s.fileno(), 0x8915, pack('256s', ifname[:15]))[20:24])