1*527238f8Sbluhm#!/usr/local/bin/python3 2233b170eSbluhm 3*527238f8Sbluhmprint("ping6 fragments with fragmented destination option") 4233b170eSbluhm 5233b170eSbluhm# |OOOO| 6233b170eSbluhm# |OOOOOOOOOO--------------| 73c2c48acSbluhm 83c2c48acSbluhmimport os 93c2c48acSbluhmfrom addr import * 103c2c48acSbluhmfrom scapy.all import * 113c2c48acSbluhm 129ae5678bSbluhmpid=os.getpid() 139ae5678bSbluhmeid=pid & 0xffff 14*527238f8Sbluhmpayload=b"ABCDEFGHIJKLMNOP" 157b3475a7Sbluhmpacket=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/IPv6ExtHdrDestOpt( \ 163c2c48acSbluhm options=PadN(optdata='\0'*12)/PadN(optdata='\0'*6))/ \ 179ae5678bSbluhm ICMPv6EchoRequest(id=eid, data=payload) 183c2c48acSbluhmfrag=[] 199ae5678bSbluhmfid=pid & 0xffffffff 20*527238f8Sbluhmfrag.append(IPv6ExtHdrFragment(nh=60, id=fid, m=1)/bytes(packet)[40:48]) 21*527238f8Sbluhmfrag.append(IPv6ExtHdrFragment(nh=60, id=fid, offset=1)/bytes(packet)[48:88]) 223c2c48acSbluhmeth=[] 233c2c48acSbluhmfor f in frag: 247b3475a7Sbluhm pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f 257b3475a7Sbluhm eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt) 263c2c48acSbluhm 273c2c48acSbluhmif os.fork() == 0: 283c2c48acSbluhm time.sleep(1) 297b3475a7Sbluhm sendp(eth, iface=LOCAL_IF) 303c2c48acSbluhm os._exit(0) 313c2c48acSbluhm 327b3475a7Sbluhmans=sniff(iface=LOCAL_IF, timeout=3, filter= 337b3475a7Sbluhm "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and icmp6") 343c2c48acSbluhmfor a in ans: 359c70e3bfSbluhm if a and a.type == ETH_P_IPV6 and \ 363c2c48acSbluhm ipv6nh[a.payload.nh] == 'ICMPv6' and \ 373c2c48acSbluhm icmp6types[a.payload.payload.type] == 'Echo Reply': 383c2c48acSbluhm id=a.payload.payload.id 39*527238f8Sbluhm print("id=%#x" % (id)) 409ae5678bSbluhm if id != eid: 41*527238f8Sbluhm print("WRONG ECHO REPLY ID") 423c2c48acSbluhm exit(2) 433c2c48acSbluhm data=a.payload.payload.data 44*527238f8Sbluhm print("payload=%s" % (data)) 453c2c48acSbluhm if data == payload: 463c2c48acSbluhm exit(0) 47*527238f8Sbluhm print("PAYLOAD!=%s" % (payload)) 483c2c48acSbluhm exit(1) 49*527238f8Sbluhmprint("NO ECHO REPLY") 503c2c48acSbluhmexit(2) 51