-
Notifications
You must be signed in to change notification settings - Fork 10
/
ipv6_overlap.py
78 lines (62 loc) · 2.62 KB
/
ipv6_overlap.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
"""Creates overlapping fragments of the packets."""
import random
from fragscapy.modifications.mod import Mod
from fragscapy.modifications.utils import fragment6
from fragscapy.packetlist import PacketList
class Ipv6Overlap(Mod):
"""Creates overlapping fragments of the packets
Args:
*args: The argument of the mods.
Attributes:
fragsize: The fragmentation size (maximum length of a fragment if
there was no overlapping).
overlapsize: The size of the random_data added that will overlap.
Raises:
ValueError: Unrecognized or incorrect number of parameters.
Examples:
>>> Ipv6Overlap(64, 32).fragsize
64
>>> Ipv6Overlap(64, 32).overlapsize
32
"""
name = "Ipv6Overlap"
doc = ("Creates overlapping fragments of the packets.\n"
"ipv6overlap <fragsize> <overlapsize>\n"
" - 'fragsize' is the fragmentation size in octets to use\n"
" (not the size of the final packets but the size of the\n"
" packets as if there was no overlapping)\n"
" - 'overlapsize' is the size in octets of random data that\n"
" overlaps\n"
"The final size of the packets is 'fragsize + overlapsize'.")
def parse_args(self, *args):
try:
self.fragsize = int(args[0])
except ValueError:
raise ValueError("Parameter 1 unrecognized. "
"Got '{}'".format(args[0]))
if self.fragsize < 0:
raise ValueError("'fragsize' should be positive."
"Got '{}'".format(self.fragsize))
try:
self.overlap = int(args[1])
except ValueError:
raise ValueError("Parameter 2 unrecognized. "
"Got '{}'".format(args[1]))
if self.overlap < 0:
raise ValueError("'overlap' should be positive."
"Got '{}'".format(self.overlap))
def apply(self, pkt_list):
new_pl = PacketList()
for pkt in pkt_list:
if pkt.pkt.haslayer('IPv6'):
fragments = fragment6(pkt.pkt, self.fragsize)
index = len(new_pl) - 1
for fragment in fragments:
random_data = bytes(random.randrange(0, 0xff)
for _ in range(self.overlap))
fragment = fragment/random_data
new_pl.add_packet(fragment)
new_pl.edit_delay(index, pkt.delay)
else:
new_pl.add_packet(fragment, pkt.delay)
return new_pl