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