1#!/usr/local/bin/python2.7 2# end of new fragment overlaps old one 3 4# |XXXXX----| 5# |--------| 6 7# RFC 5722 drop overlapping fragments 8 9import os 10import threading 11from addr import * 12from scapy.all import * 13 14class Sniff1(threading.Thread): 15 filter = None 16 captured = None 17 packet = None 18 def run(self): 19 self.captured = sniff(iface=SRC_IF, filter=self.filter, 20 count=1, timeout=3) 21 if self.captured: 22 self.packet = self.captured[0] 23 24dstaddr=sys.argv[1] 25pid=os.getpid() & 0xffff 26payload="ABCDEFGHIJKLOMNO" 27dummy="01234567" 28packet=IPv6(src=SRC_OUT6, dst=dstaddr)/ICMPv6EchoRequest(id=pid, data=payload) 29frag0=IPv6ExtHdrFragment(nh=58, id=pid, m=1)/str(packet)[40:56] 30frag1=IPv6ExtHdrFragment(nh=58, id=pid, offset=1)/(dummy+str(packet)[56:64]) 31pkt0=IPv6(src=SRC_OUT6, dst=dstaddr)/frag0 32pkt1=IPv6(src=SRC_OUT6, dst=dstaddr)/frag1 33eth=[] 34eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt1) 35eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt0) 36 37sniffer = Sniff1(); 38sniffer.filter = "ip6 and src %s and dst %s and icmp6" % (dstaddr, SRC_OUT6) 39sniffer.start() 40sendp(eth, iface=SRC_IF) 41sniffer.join(timeout=5) 42a = sniffer.packet 43 44if a is None: 45 print "no reply" 46 exit(0) 47if a and a.type == ETH_P_IPV6 and \ 48 ipv6nh[a.payload.nh] == 'ICMPv6' and \ 49 icmp6types[a.payload.payload.type] == 'Echo Reply': 50 id=a.payload.payload.id 51 print "id=%#x" % (id) 52 if id != pid: 53 print "WRONG ECHO REPLY ID" 54 exit(2) 55 data=a.payload.payload.data 56 print "payload=%s" % (data) 57 if data == payload: 58 print "ECHO REPLY" 59 exit(1) 60 print "PAYLOAD!=%s" % (payload) 61 exit(2) 62print "NO ECHO REPLY" 63exit(2) 64