1#!/usr/local/bin/python3 2# check icmp6 checksum in returned icmp packet 3 4import os 5from addr import * 6from scapy.all import * 7 8dstaddr=sys.argv[1] 9eid=os.getpid() & 0xffff 10payload=b"a" * 1452 11p=(Ether(src=SRC_MAC, dst=PF_MAC)/IPv6(src=SRC_OUT6, dst=dstaddr)/ 12 ICMPv6EchoRequest(id=eid, data=payload)) 13echocksum=IPv6(bytes(p.payload)).payload.cksum 14print("echocksum=%#04x" % (echocksum)) 15a=srp1(p, iface=SRC_IF, timeout=2) 16if a and a.type == ETH_P_IPV6 and \ 17 ipv6nh[a.payload.nh] == 'ICMPv6' and \ 18 icmp6types[a.payload.payload.type] == 'Packet too big': 19 outercksum=a.payload.payload.cksum 20 print("outercksum=%#04x" % (outercksum)) 21 q=a.payload.payload.payload 22 if ipv6nh[q.nh] == 'ICMPv6' and \ 23 icmp6types[q.payload.type] == 'Echo Request': 24 innercksum=q.payload.cksum 25 print("innercksum=%#04x" % (innercksum)) 26 if innercksum == echocksum: 27 exit(0) 28 print("INNERCKSUM!=ECHOCKSUM") 29 exit(1) 30 print("NO INNER ECHO REQUEST") 31 exit(2) 32print("NO PACKET TOO BIG") 33exit(2) 34