Example #1
0
    def probe_packet(self):
        """ Build the outgoing probe packet
        """
        
        # build the packet, then set its length 
        probe_ip = ip.Packet()
        
        probe_ip.src = self.src_addr
        probe_ip.dst = self.dst_addr
        probe_ip.p = socket.IPPROTO_UDP
        probe_ip.ttl = self.ttl
        probe_ip.df = self.dont_frag

        # build UPD packet as the payload of IP packet
        probe_udp = udp.Packet()
        
        # Because more than 1 traceroute can be running at the same time, we need to 
        #   distinguish the packets responding to this traceroute instance. We do this
        #   by setting source port in UDP header to our process id. As ICMP will include
        #   UDP header that triggers it in the payload, we will be able to compare the
        #   UDP source port embedded in returned ICMP packet with our process id and 
        #   determine if the packet is of our interest.
        probe_udp.sport = self.src_port
        probe_udp.dport = self.dst_port
        # calculate the length of UDP data
        header_len = len(udp.assemble(probe_udp) + ip.assemble(probe_ip))
        if self.packet_len <= header_len:
            raise TraceError, "packet length must be > %d" % (header_len)
    
        probe_udp.data = '\000' * (self.packet_len - header_len)
        
        probe_ip.data = udp.assemble(probe_udp)
        return ip.assemble(probe_ip, self.check_sum)        
Example #2
0
    def probe_packet(self):
        """ Build the outgoing probe packet
        """

        # build the packet, then set its length
        probe_ip = ip.Packet()

        probe_ip.src = self.src_addr
        probe_ip.dst = self.dst_addr
        probe_ip.p = socket.IPPROTO_UDP
        probe_ip.ttl = self.ttl
        probe_ip.df = self.dont_frag

        # build UPD packet as the payload of IP packet
        probe_udp = udp.Packet()

        # Because more than 1 traceroute can be running at the same time, we need to
        #   distinguish the packets responding to this traceroute instance. We do this
        #   by setting source port in UDP header to our process id. As ICMP will include
        #   UDP header that triggers it in the payload, we will be able to compare the
        #   UDP source port embedded in returned ICMP packet with our process id and
        #   determine if the packet is of our interest.
        probe_udp.sport = self.src_port
        probe_udp.dport = self.dst_port
        # calculate the length of UDP data
        header_len = len(udp.assemble(probe_udp) + ip.assemble(probe_ip))
        if self.packet_len <= header_len:
            raise TraceError, "packet length must be > %d" % (header_len)

        probe_udp.data = '\000' * (self.packet_len - header_len)

        probe_ip.data = udp.assemble(probe_udp)
        return ip.assemble(probe_ip, self.check_sum)
Example #3
0
def outgoing_packet_handler(src_port, dst_addr, dst_port, data):
	udp_frag = udp.Packet(sport=src_port, dport=dst_port, data=data)
	udp_assembled = udp.assemble(udp_frag, False)
	pseudo_header = socket.inet_aton(local_ip) + socket.inet_aton(dst_addr) + '\x00\x11' + struct.pack('!H', len(udp_assembled))
	cksum = inetutils.cksum(pseudo_header + udp_assembled)
	udp_assembled_with_cksum = udp_assembled[:6] + struct.pack('H', cksum) + udp_assembled[8:]
	out_sk.sendto(udp_assembled_with_cksum, (dst_addr, 0))
Example #4
0
    def send(self, service_descriptor, response_data, REQUEST):
        import ip, udp
        response_packet = udp.Packet(dport=REQUEST[1],
                                     sport=self.port,
                                     data=response_data)
        ip_packet = ip.Packet(dst=REQUEST[0],
                              src=service_descriptor.params['ip'],
                              data=udp.assemble(response_packet, 0),
                              p=socket.IPPROTO_UDP,
                              ttl=15)

        self.logger.debug(response_packet)
        data = udp.assemble(response_packet, 0)
        self.logger.debug(response_data)
        self.logger.debug(ip_packet)
        self.raw_sock.sendto(ip.assemble(ip_packet, 0), REQUEST.REMOTE)
Example #5
0
    def send(self, data, family, src, dst):
        packet_udp       = udp.Packet()
        packet_udp.sport = src[1]
        packet_udp.dport = dst[1]
        packet_udp.data  = data

        packet_ip        = ip.Packet()
        packet_ip.src    = src[0]
        packet_ip.dst    = dst[0]
        packet_ip.ttl    = 1
        packet_ip.p      = 17
        packet_ip.data   = udp.assemble(packet_udp, 0)

        packet = bytearray(ip.assemble(packet_ip))

        #Restore byte order for OSX
        repack(packet, "H", 2)
        repack(packet, "H", 6)

        print ':'.join('{:02x}'.format(c) for c in packet)
        if   family == socket.AF_INET:
            self.socket_v4.sendto(packet, dst)
        #elif family == socket.AF_INET6:
        #    self.socket_v6.sendto(packet, dst)
        else:
            raise "Socket family not implemented"
Example #6
0
def outgoing_packet_handler(src_port, dst_addr, dst_port, data):
    udp_frag = udp.Packet(sport=src_port, dport=dst_port, data=data)
    udp_assembled = udp.assemble(udp_frag, False)
    pseudo_header = socket.inet_aton(local_ip) + socket.inet_aton(
        dst_addr) + '\x00\x11' + struct.pack('!H', len(udp_assembled))
    cksum = inetutils.cksum(pseudo_header + udp_assembled)
    udp_assembled_with_cksum = udp_assembled[:6] + struct.pack(
        'H', cksum) + udp_assembled[8:]
    out_sk.sendto(udp_assembled_with_cksum, (dst_addr, 0))
Example #7
0
    def sendPacket(self,bytes,target,sport,port):
	#Build raw UPD packet to avoid duplicate port/socket issues
	udpPacket = udp.Packet()
	udpPacket.sport = sport
	udpPacket.dport = port   
	udpPacket.data = bytes
	packet = udp.assemble(udpPacket, 0)
	sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
	sock.sendto(packet, (target, port))
	if self.debug > 0:
		print "UDP target IP: %s"%target
		print "UDP target port: %s"%port
		print "UDP source port: %s"%sport
		print "Sending: %s"%bytes.encode('hex')
Example #8
0
    def sendPacket(self,bytes,target,sport,port):
	#Build raw UPD packet to avoid duplicate port/socket issues
	udpPacket = udp.Packet()
	udpPacket.sport = sport
	udpPacket.dport = port   
	udpPacket.data = bytes
	packet = udp.assemble(udpPacket, 0)
	sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
	sock.sendto(packet, (target, port))
	if self.debug > 0:
		print "UDP target IP: %s"%target
		print "UDP target port: %s"%port
		print "UDP source port: %s"%sport
		print "Sending: %s"%bytes.encode('hex')
Example #9
0
    def disconnect(self, payload):
        # TODO Throttle disconnects!
        # Send fake packet to stop upload
        # Structure of content:
        #     254 254 06 B (A+1) (7 bytes)
        #
        # First 2 bytes marks it as udp paket(?!)
        # Thrid bytes is command (close connection to client)
        #   B and A+1 are to 16 bit numbers where A and B
        #   are content of 'payload'

        aHi, aLow = payload[1], payload[2]
        bHi, bLow = payload[3], payload[4]
        a_plus_1 = (aHi * 256 + aLow + 1) % 65536

        data = bytes(
            [254, 254, 6, bHi, bLow,
             int(a_plus_1 / 256), (a_plus_1 % 256)])

        logging.info('Disconnecting client at {!r}'.format(self))
        upacket = udp2.Packet()
        upacket.sport = self.client_port
        upacket.dport = self.server_port
        upacket.data = data

        ipacket = ip2.Packet()
        ipacket.src = self.client_ip
        ipacket.dst = self.server_ip
        ipacket.df = 1
        ipacket.ttl = 64
        ipacket.p = 17

        ipacket.data = udp2.assemble(upacket, False)
        raw_ip = ip2.assemble(ipacket, 1)

        # Send fake packet to the PB server that looks like its coming from the client
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_RAW,
                                 socket.IPPROTO_RAW)
        except socket.error as e:
            logging.error('Socket could not be created: {}'.format(e))

        sock.sendto(raw_ip, (ipacket.dst, 0))
        self.time_disconnected = time.time()
        self.number_unanswered_outgoing_packets = 0
Example #10
0
def sendUdpReply(src,dst,data):
	upacket = udp2.Packet()
	upacket.sport = src[1]
	upacket.dport = dst[1]
	upacket.data = data

	ipacket = ip2.Packet()
	ipacket.src = src[0]
	ipacket.dst = dst[0]
	ipacket.df = 1
	ipacket.ttl = 64
	ipacket.p = 17

	ipacket.data = udp2.assemble(upacket, False)
	raw_ip = ip2.assemble(ipacket, 1)

	try:
		sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
	except socket.error , msg:
		print 'Socket could not be created. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
Example #11
0
    def disconnect(self, payload):
        # TODO Throttle disconnects!
        # Send fake packet to stop upload
        # Structure of content:
        # 254 254 06 B (A+1) (7 bytes)
        A = payload[3:5]  # String!
        B = payload[5:7]
        a1 = ord(A[0]) * 256 + ord(A[1]) + 1
        A1 = chr(a1 / 256) + chr(a1 % 256)
        data = chr(254) + chr(254) + chr(06) + B + A1

        logging.info('Disconnecting client at {!r}'.format(self))
        upacket = udp2.Packet()
        upacket.sport = self.client_port
        upacket.dport = self.server_port
        upacket.data = data

        ipacket = ip2.Packet()
        ipacket.src = self.client_ip
        ipacket.dst = self.server_ip
        ipacket.df = 1
        ipacket.ttl = 64
        ipacket.p = 17

        ipacket.data = udp2.assemble(upacket, False)
        raw_ip = ip2.assemble(ipacket, 1)

        # Send fake packet to the PB server that looks like its coming from the client
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_RAW,
                                 socket.IPPROTO_RAW)
        except socket.error as err:
            logging.error('Socket could not be created: {}'.format(err))

        sock.sendto(raw_ip, (ipacket.dst, 0))
        self.time_disconnected = time.time()
        self.number_unanswered_outgoing_packets = 0
Example #12
0
    def disconnect(self, payload):
        # TODO Throttle disconnects!
        # Send fake packet to stop upload
        # Structure of content:
        # 254 254 06 B (A+1) (7 bytes)
        A = payload[3:5]  # String!
        B = payload[5:7]
        a1 = ord(A[0]) * 256 + ord(A[1]) + 1
        A1 = chr(a1 / 256) + chr(a1 % 256)
        data = chr(254) + chr(254) + chr(06) + B + A1

        logging.info('Disconnecting client at {!r}'.format(self))
        upacket = udp2.Packet()
        upacket.sport = self.client_port
        upacket.dport = self.server_port
        upacket.data = data

        ipacket = ip2.Packet()
        ipacket.src = self.client_ip
        ipacket.dst = self.server_ip
        ipacket.df = 1
        ipacket.ttl = 64
        ipacket.p = 17

        ipacket.data = udp2.assemble(upacket, False)
        raw_ip = ip2.assemble(ipacket, 1)

        # Send fake packet to the PB server that looks like its coming from the client
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
        except socket.error as err:
            logging.error('Socket could not be created: {}'.format(err))

        sock.sendto(raw_ip, (ipacket.dst, 0))
        self.time_disconnected = time.time()
        self.number_unanswered_outgoing_packets = 0
Example #13
0
ClientHost = '192.168.0.22'
ServerHost = '192.168.0.22'
ClientPort = 2057 
ServerPort = 2056

upacket = udp.Packet()
upacket.sport = ClientPort
upacket.dport = ServerPort
upacket.data = "\xfe\xfe\x00\x06"
#upacket.data = "Hello Server"

ipacket = ip.Packet()
ipacket.src = ClientHost
ipacket.dst = ServerHost
ipacket.df = 1
ipacket.ttl = 64
ipacket.p = 17

ipacket.data = udp.assemble(upacket, False)
raw_ip = ip.assemble(ipacket, 1)

try:
	sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
except socket.error , msg:
	print 'Socket could not be created. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
	sys.exit()

sock.sendto(raw_ip, (ipacket.dst, 0))

Example #14
0
ClientHost = '192.168.0.22'
ServerHost = '192.168.0.22'
ClientPort = 2057
ServerPort = 2056

upacket = udp.Packet()
upacket.sport = ClientPort
upacket.dport = ServerPort
upacket.data = "\xfe\xfe\x00\x06"
#upacket.data = "Hello Server"

ipacket = ip.Packet()
ipacket.src = ClientHost
ipacket.dst = ServerHost
ipacket.df = 1
ipacket.ttl = 64
ipacket.p = 17

ipacket.data = udp.assemble(upacket, False)
raw_ip = ip.assemble(ipacket, 1)

try:
    sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
except socket.error, msg:
    print 'Socket could not be created. Error Code : ' + str(
        msg[0]) + ' Message ' + msg[1]
    sys.exit()

sock.sendto(raw_ip, (ipacket.dst, 0))
Example #15
0
 def testSimplePacket(self):
     buf = udp.assemble(self.simple, 1)
     new = udp.disassemble(buf, 1)
     self.assertEqual(self.simple, new)
Example #16
0
 def testSimplePacket(self):
     buf = udp.assemble(self.simple, 1)
     new = udp.disassemble(buf, 1)
     self.assertEqual(self.simple, new)