1#!/usr/local/bin/python3 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=b"ABCDEFGHIJKLOMNOQRSTUVWX" 29dummy=b"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)/bytes(packet)[40:48] 33frag1=IPv6ExtHdrFragment(nh=58, id=fid, offset=2, m=1)/dummy 34frag2=IPv6ExtHdrFragment(nh=58, id=fid, offset=1)/bytes(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