1#!/usr/local/bin/python3 2# start of new fragment overlaps old one 3 4# |--------| 5# |XXXXX----| 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() 26eid=pid & 0xffff 27payload=b"ABCDEFGHIJKLOMNO" 28dummy=b"01234567" 29packet=IPv6(src=SRC_OUT6, dst=dstaddr)/ICMPv6EchoRequest(id=eid, data=payload) 30fid=pid & 0xffffffff 31frag0=IPv6ExtHdrFragment(nh=58, id=fid, m=1)/bytes(packet)[40:56] 32frag1=IPv6ExtHdrFragment(nh=58, id=fid, offset=1)/(dummy+bytes(packet)[56:64]) 33pkt0=IPv6(src=SRC_OUT6, dst=dstaddr)/frag0 34pkt1=IPv6(src=SRC_OUT6, dst=dstaddr)/frag1 35eth=[] 36eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt0) 37eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt1) 38 39sniffer = Sniff1(); 40sniffer.filter = "ip6 and src %s and dst %s and icmp6" % (dstaddr, SRC_OUT6) 41sniffer.start() 42time.sleep(1) 43sendp(eth, iface=SRC_IF) 44sniffer.join(timeout=5) 45a = sniffer.packet 46 47if a is None: 48 print("no reply") 49 exit(0) 50if a and a.type == ETH_P_IPV6 and \ 51 ipv6nh[a.payload.nh] == 'ICMPv6' and \ 52 icmp6types[a.payload.payload.type] == 'Echo Reply': 53 id=a.payload.payload.id 54 print("id=%#x" % (id)) 55 if id != eid: 56 print("WRONG ECHO REPLY ID") 57 exit(2) 58 data=a.payload.payload.data 59 print("payload=%s" % (data)) 60 if data == payload: 61 print("ECHO REPLY") 62 exit(1) 63 print("PAYLOAD!=%s" % (payload)) 64 exit(2) 65print("NO ECHO REPLY") 66exit(2) 67