packetgen 2.6.0 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +28 -0
- data/Rakefile +6 -6
- data/bin/pgconsole +6 -6
- data/lib/packetgen.rb +4 -3
- data/lib/packetgen/capture.rb +5 -7
- data/lib/packetgen/config.rb +3 -3
- data/lib/packetgen/deprecation.rb +17 -0
- data/lib/packetgen/header.rb +40 -38
- data/lib/packetgen/header/arp.rb +46 -31
- data/lib/packetgen/header/asn1_base.rb +8 -8
- data/lib/packetgen/header/base.rb +108 -36
- data/lib/packetgen/header/bootp.rb +28 -19
- data/lib/packetgen/header/crypto.rb +6 -8
- data/lib/packetgen/header/dhcp.rb +4 -5
- data/lib/packetgen/header/dhcp/option.rb +46 -34
- data/lib/packetgen/header/dhcp/options.rb +0 -1
- data/lib/packetgen/header/dhcpv6.rb +10 -10
- data/lib/packetgen/header/dhcpv6/duid.rb +2 -3
- data/lib/packetgen/header/dhcpv6/option.rb +16 -21
- data/lib/packetgen/header/dhcpv6/relay.rb +6 -4
- data/lib/packetgen/header/dns.rb +13 -11
- data/lib/packetgen/header/dns/name.rb +4 -6
- data/lib/packetgen/header/dns/opt.rb +31 -31
- data/lib/packetgen/header/dns/option.rb +0 -2
- data/lib/packetgen/header/dns/qdsection.rb +1 -2
- data/lib/packetgen/header/dns/question.rb +19 -13
- data/lib/packetgen/header/dns/rr.rb +11 -14
- data/lib/packetgen/header/dns/rrsection.rb +5 -7
- data/lib/packetgen/header/dot11.rb +45 -29
- data/lib/packetgen/header/dot11/control.rb +3 -5
- data/lib/packetgen/header/dot11/data.rb +34 -6
- data/lib/packetgen/header/dot11/element.rb +0 -1
- data/lib/packetgen/header/dot11/management.rb +9 -5
- data/lib/packetgen/header/dot11/sub_mngt.rb +13 -14
- data/lib/packetgen/header/dot1q.rb +2 -2
- data/lib/packetgen/header/dot1x.rb +3 -4
- data/lib/packetgen/header/eap.rb +62 -53
- data/lib/packetgen/header/eap/fast.rb +0 -1
- data/lib/packetgen/header/eap/md5.rb +1 -2
- data/lib/packetgen/header/eap/tls.rb +9 -10
- data/lib/packetgen/header/eap/ttls.rb +9 -10
- data/lib/packetgen/header/esp.rb +33 -33
- data/lib/packetgen/header/eth.rb +11 -8
- data/lib/packetgen/header/gre.rb +5 -6
- data/lib/packetgen/header/http/headers.rb +11 -14
- data/lib/packetgen/header/http/request.rb +20 -20
- data/lib/packetgen/header/http/response.rb +16 -18
- data/lib/packetgen/header/http/verbs.rb +5 -5
- data/lib/packetgen/header/icmp.rb +1 -3
- data/lib/packetgen/header/icmpv6.rb +1 -3
- data/lib/packetgen/header/igmp.rb +5 -6
- data/lib/packetgen/header/igmpv3.rb +5 -9
- data/lib/packetgen/header/igmpv3/group_record.rb +4 -5
- data/lib/packetgen/header/igmpv3/mq.rb +2 -2
- data/lib/packetgen/header/igmpv3/mr.rb +4 -3
- data/lib/packetgen/header/ike.rb +33 -8
- data/lib/packetgen/header/ike/auth.rb +4 -6
- data/lib/packetgen/header/ike/cert.rb +0 -2
- data/lib/packetgen/header/ike/certreq.rb +1 -3
- data/lib/packetgen/header/ike/id.rb +1 -3
- data/lib/packetgen/header/ike/ke.rb +0 -2
- data/lib/packetgen/header/ike/nonce.rb +0 -2
- data/lib/packetgen/header/ike/notify.rb +22 -24
- data/lib/packetgen/header/ike/payload.rb +198 -199
- data/lib/packetgen/header/ike/sa.rb +21 -30
- data/lib/packetgen/header/ike/sk.rb +16 -17
- data/lib/packetgen/header/ike/ts.rb +22 -24
- data/lib/packetgen/header/ike/vendor_id.rb +0 -2
- data/lib/packetgen/header/ip.rb +30 -23
- data/lib/packetgen/header/ip/addr.rb +5 -6
- data/lib/packetgen/header/ip/option.rb +11 -15
- data/lib/packetgen/header/ip/options.rb +1 -2
- data/lib/packetgen/header/ipv6.rb +27 -12
- data/lib/packetgen/header/ipv6/addr.rb +2 -2
- data/lib/packetgen/header/ipv6/extension.rb +1 -1
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +11 -11
- data/lib/packetgen/header/llc.rb +4 -3
- data/lib/packetgen/header/mdns.rb +11 -5
- data/lib/packetgen/header/mld.rb +4 -4
- data/lib/packetgen/header/mldv2.rb +4 -3
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -4
- data/lib/packetgen/header/mldv2/mlq.rb +3 -4
- data/lib/packetgen/header/mldv2/mlr.rb +4 -3
- data/lib/packetgen/header/netbios.rb +18 -5
- data/lib/packetgen/header/ospfv2.rb +6 -7
- data/lib/packetgen/header/ospfv2/db_description.rb +3 -4
- data/lib/packetgen/header/ospfv2/hello.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_ack.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_request.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_update.rb +5 -6
- data/lib/packetgen/header/ospfv2/lsa.rb +13 -14
- data/lib/packetgen/header/ospfv2/lsa_header.rb +4 -5
- data/lib/packetgen/header/ospfv3.rb +3 -4
- data/lib/packetgen/header/ospfv3/db_description.rb +3 -5
- data/lib/packetgen/header/ospfv3/hello.rb +2 -3
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +7 -8
- data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -3
- data/lib/packetgen/header/ospfv3/ls_request.rb +2 -3
- data/lib/packetgen/header/ospfv3/ls_update.rb +5 -6
- data/lib/packetgen/header/ospfv3/lsa.rb +10 -11
- data/lib/packetgen/header/ospfv3/lsa_header.rb +3 -4
- data/lib/packetgen/header/snmp.rb +45 -32
- data/lib/packetgen/header/tcp.rb +13 -9
- data/lib/packetgen/header/tcp/option.rb +16 -11
- data/lib/packetgen/header/tcp/options.rb +3 -4
- data/lib/packetgen/header/tftp.rb +15 -17
- data/lib/packetgen/header/udp.rb +10 -4
- data/lib/packetgen/inspect.rb +7 -9
- data/lib/packetgen/packet.rb +44 -22
- data/lib/packetgen/pcapng.rb +1 -5
- data/lib/packetgen/pcapng/block.rb +17 -11
- data/lib/packetgen/pcapng/epb.rb +6 -11
- data/lib/packetgen/pcapng/file.rb +37 -44
- data/lib/packetgen/pcapng/idb.rb +17 -22
- data/lib/packetgen/pcapng/shb.rb +7 -10
- data/lib/packetgen/pcapng/spb.rb +21 -17
- data/lib/packetgen/pcapng/unknown_block.rb +17 -13
- data/lib/packetgen/proto.rb +1 -2
- data/lib/packetgen/types/array.rb +119 -34
- data/lib/packetgen/types/cstring.rb +1 -5
- data/lib/packetgen/types/enum.rb +8 -10
- data/lib/packetgen/types/fields.rb +34 -28
- data/lib/packetgen/types/int.rb +11 -13
- data/lib/packetgen/types/int_string.rb +6 -8
- data/lib/packetgen/types/oui.rb +3 -6
- data/lib/packetgen/types/string.rb +4 -6
- data/lib/packetgen/types/tlv.rb +11 -14
- data/lib/packetgen/utils.rb +15 -23
- data/lib/packetgen/utils/arp_spoofer.rb +12 -18
- data/lib/packetgen/version.rb +1 -1
- data/packetgen.gemspec +9 -8
- metadata +19 -17
data/lib/packetgen/types/int.rb
CHANGED
@@ -8,12 +8,10 @@
|
|
8
8
|
|
9
9
|
module PacketGen
|
10
10
|
module Types
|
11
|
-
|
12
11
|
# Base integer class to handle binary integers
|
13
12
|
# @abstract
|
14
13
|
# @author Sylvain Daubert
|
15
14
|
class Int
|
16
|
-
|
17
15
|
# Integer value
|
18
16
|
# @return [Integer]
|
19
17
|
attr_accessor :value
|
@@ -135,17 +133,17 @@ module PacketGen
|
|
135
133
|
# @return [self]
|
136
134
|
def read(value)
|
137
135
|
return self if value.nil?
|
138
|
-
@value =
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
136
|
+
@value = if value.is_a?(Integer)
|
137
|
+
value.to_i
|
138
|
+
else
|
139
|
+
up8 = down16 = 0
|
140
|
+
if @endian == :big
|
141
|
+
up8, down16 = value.to_s.unpack('Cn')
|
142
|
+
else
|
143
|
+
down16, up8 = value.to_s.unpack('vC')
|
144
|
+
end
|
145
|
+
(up8 << 16) | down16
|
146
|
+
end
|
149
147
|
self
|
150
148
|
end
|
151
149
|
|
@@ -8,12 +8,10 @@
|
|
8
8
|
|
9
9
|
module PacketGen
|
10
10
|
module Types
|
11
|
-
|
12
11
|
# Provides a class for creating strings preceeded by their length as a {Int}.
|
13
12
|
# By default, a null string will have one byte length (length byte set to 0).
|
14
13
|
# @author Sylvain Daubert
|
15
14
|
class IntString
|
16
|
-
|
17
15
|
# internal string
|
18
16
|
# @return [String]
|
19
17
|
attr_reader :string
|
@@ -40,9 +38,9 @@ module PacketGen
|
|
40
38
|
|
41
39
|
# @param [Integer] l
|
42
40
|
# @return [Integer]
|
43
|
-
def length=(
|
44
|
-
@length.read
|
45
|
-
|
41
|
+
def length=(len)
|
42
|
+
@length.read len
|
43
|
+
len
|
46
44
|
end
|
47
45
|
|
48
46
|
# @return [Integer]
|
@@ -52,9 +50,9 @@ module PacketGen
|
|
52
50
|
|
53
51
|
# @param [#to_s] s
|
54
52
|
# @return [String]
|
55
|
-
def string=(
|
56
|
-
@length.value =
|
57
|
-
@string =
|
53
|
+
def string=(str)
|
54
|
+
@length.value = str.to_s.size
|
55
|
+
@string = str.to_s
|
58
56
|
end
|
59
57
|
|
60
58
|
# Get binary string
|
data/lib/packetgen/types/oui.rb
CHANGED
@@ -8,12 +8,11 @@
|
|
8
8
|
|
9
9
|
module PacketGen
|
10
10
|
module Types
|
11
|
-
|
12
11
|
# OUI type, defined as a set of 3 bytes
|
13
12
|
# oui = OUI.new
|
14
13
|
# oui.from_human('00:01:02')
|
15
14
|
# oui.to_human # => "00:01:02"
|
16
|
-
|
15
|
+
# @author Sylvain Daubert
|
17
16
|
class OUI < Types::Fields
|
18
17
|
# @attribute b2
|
19
18
|
# @return [Integer] left-most byte
|
@@ -31,9 +30,7 @@ module PacketGen
|
|
31
30
|
def from_human(str)
|
32
31
|
return self if str.nil?
|
33
32
|
bytes = str.split(/:/)
|
34
|
-
unless bytes.size == 3
|
35
|
-
raise ArgumentError, 'not a OUI'
|
36
|
-
end
|
33
|
+
raise ArgumentError, 'not a OUI' unless bytes.size == 3
|
37
34
|
self[:b2].read(bytes[0].to_i(16))
|
38
35
|
self[:b1].read(bytes[1].to_i(16))
|
39
36
|
self[:b0].read(bytes[2].to_i(16))
|
@@ -43,7 +40,7 @@ module PacketGen
|
|
43
40
|
# Get OUI in human readable form (colon-separated bytes)
|
44
41
|
# @return [String]
|
45
42
|
def to_human
|
46
|
-
fields.map { |m|
|
43
|
+
fields.map { |m| '%02x' % self[m] }.join(':')
|
47
44
|
end
|
48
45
|
end
|
49
46
|
end
|
@@ -8,12 +8,10 @@
|
|
8
8
|
|
9
9
|
module PacketGen
|
10
10
|
module Types
|
11
|
-
|
12
11
|
# This class is just like regular String. It only adds {#read} and {#sz} methods
|
13
12
|
# to be compatible with others {Types}.
|
14
13
|
# @author Sylvain Daubert
|
15
14
|
class String < ::String
|
16
|
-
|
17
15
|
# @param [Hash] options
|
18
16
|
# @option options [Types::Int,Proc] :length_from object or proc from which
|
19
17
|
# takes length when reading
|
@@ -30,14 +28,14 @@ module PacketGen
|
|
30
28
|
s = str.to_s
|
31
29
|
str_end = case @length_from
|
32
30
|
when Types::Int
|
33
|
-
|
31
|
+
@length_from.to_i
|
34
32
|
when Proc
|
35
|
-
|
33
|
+
@length_from.call
|
36
34
|
else
|
37
35
|
if @static_length.is_a? Integer
|
38
|
-
|
36
|
+
@static_length
|
39
37
|
else
|
40
|
-
|
38
|
+
s.size
|
41
39
|
end
|
42
40
|
end
|
43
41
|
str_end = 0 if str_end < 0
|
data/lib/packetgen/types/tlv.rb
CHANGED
@@ -8,7 +8,6 @@
|
|
8
8
|
|
9
9
|
module PacketGen
|
10
10
|
module Types
|
11
|
-
|
12
11
|
# Class to handle Type-Length-Value attributes
|
13
12
|
#
|
14
13
|
# TLV fields handles three subfields:
|
@@ -64,7 +63,7 @@ module PacketGen
|
|
64
63
|
# @param [String] str
|
65
64
|
# @return [Fields] self
|
66
65
|
def read(str)
|
67
|
-
idx = 0
|
66
|
+
idx = 0
|
68
67
|
self[:type].read str[idx, self[:type].sz]
|
69
68
|
idx += self[:type].sz
|
70
69
|
self[:length].read str[idx, self[:length].sz]
|
@@ -86,11 +85,9 @@ module PacketGen
|
|
86
85
|
when Integer
|
87
86
|
self.old_type = val
|
88
87
|
else
|
89
|
-
unless
|
90
|
-
raise TypeError, 'need an Integer'
|
91
|
-
end
|
88
|
+
raise TypeError, 'need an Integer' unless human_types?
|
92
89
|
new_val = self.class::TYPES.key(val.to_s)
|
93
|
-
raise ArgumentError, "unknown #{val
|
90
|
+
raise ArgumentError, "unknown #{val} type" if new_val.nil?
|
94
91
|
self.old_type = new_val
|
95
92
|
end
|
96
93
|
end
|
@@ -125,7 +122,7 @@ module PacketGen
|
|
125
122
|
# Return human readable type, if TYPES is defined
|
126
123
|
# @return [String]
|
127
124
|
def human_type
|
128
|
-
if
|
125
|
+
if human_types?
|
129
126
|
htype = self.class::TYPES[type]
|
130
127
|
htype = type if htype.nil?
|
131
128
|
htype.to_s
|
@@ -137,20 +134,20 @@ module PacketGen
|
|
137
134
|
# @return [String]
|
138
135
|
def to_human
|
139
136
|
name = self.class.to_s.gsub(/.*::/, '')
|
140
|
-
@typestr ||= if
|
137
|
+
@typestr ||= if human_types?
|
141
138
|
types = self.class::TYPES.values
|
142
|
-
"%-#{types.
|
139
|
+
"%-#{types.max_by(&:length).size}s"
|
143
140
|
else
|
144
|
-
|
141
|
+
'%s'
|
145
142
|
end
|
146
|
-
@lenstr ||= "%-#{(2**(self[:length].width*8) - 1).to_s.size}u"
|
147
|
-
"#{name} type
|
148
|
-
|
143
|
+
@lenstr ||= "%-#{(2**(self[:length].width * 8) - 1).to_s.size}u"
|
144
|
+
"#{name} type:#{@typestr} length:#{@lenstr} value:#{value.inspect}" % [human_type,
|
145
|
+
length]
|
149
146
|
end
|
150
147
|
|
151
148
|
private
|
152
149
|
|
153
|
-
def
|
150
|
+
def human_types?
|
154
151
|
self.class.const_defined? :TYPES
|
155
152
|
end
|
156
153
|
end
|
data/lib/packetgen/utils.rb
CHANGED
@@ -4,11 +4,11 @@
|
|
4
4
|
# This program is published under MIT license.
|
5
5
|
|
6
6
|
# frozen_string_literal: true
|
7
|
+
|
7
8
|
require_relative 'config'
|
8
9
|
require_relative 'utils/arp_spoofer'
|
9
10
|
|
10
11
|
module PacketGen
|
11
|
-
|
12
12
|
# Collection of some network utilities.
|
13
13
|
#
|
14
14
|
# This module is not enabled by default. You need to:
|
@@ -16,29 +16,26 @@ module PacketGen
|
|
16
16
|
# @author Sylvain Daubert
|
17
17
|
# @since 2.1.3
|
18
18
|
module Utils
|
19
|
-
|
20
19
|
# Get local ARP cache
|
21
20
|
# @return [Hash] key: IP address, value: array containing MAC address and
|
22
21
|
# interface name
|
23
22
|
def self.arp_cache
|
24
|
-
raw_cache =
|
23
|
+
raw_cache = `/usr/sbin/arp -an`
|
25
24
|
|
26
25
|
cache = {}
|
27
26
|
raw_cache.split(/\n/).each do |line|
|
28
27
|
match = line.match(/\((\d+\.\d+\.\d+\.\d+)\) at (([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2})(?: \[ether\])? on (\w+)/)
|
29
|
-
if match
|
30
|
-
cache[match[1]] = [match[2], match[4]]
|
31
|
-
end
|
28
|
+
cache[match[1]] = [match[2], match[4]] if match
|
32
29
|
end
|
33
|
-
|
30
|
+
|
34
31
|
cache
|
35
32
|
end
|
36
|
-
|
33
|
+
|
37
34
|
# Get MAC address from an IP address, or nil if this IP address is unknown
|
38
35
|
# on local network.
|
39
36
|
# @param [String] ipaddr dotted-octet IP address
|
40
37
|
# @param [Hash] options
|
41
|
-
# @option options [String] :iface interface name. Default to
|
38
|
+
# @option options [String] :iface interface name. Default to
|
42
39
|
# {PacketGen.default_iface}
|
43
40
|
# @option options [Boolean] :no_cache if +true+, do not query local ARP
|
44
41
|
# cache and always send an ARP request on wire. Default to +false+
|
@@ -48,7 +45,7 @@ module PacketGen
|
|
48
45
|
def self.arp(ipaddr, options={})
|
49
46
|
unless options[:no_cache]
|
50
47
|
local_cache = self.arp_cache
|
51
|
-
return local_cache[ipaddr].first if local_cache.
|
48
|
+
return local_cache[ipaddr].first if local_cache.key? ipaddr
|
52
49
|
end
|
53
50
|
|
54
51
|
iface = options[:iface] || PacketGen.default_iface
|
@@ -56,8 +53,8 @@ module PacketGen
|
|
56
53
|
my_hwaddr = Config.instance.hwaddr(iface)
|
57
54
|
arp_pkt = Packet.gen('Eth', dst: 'ff:ff:ff:ff:ff:ff', src: my_hwaddr)
|
58
55
|
arp_pkt.add('ARP', sha: Config.instance.hwaddr, spa: Config.instance.ipaddr,
|
59
|
-
|
60
|
-
|
56
|
+
tpa: ipaddr)
|
57
|
+
|
61
58
|
capture = Capture.new(iface: iface, timeout: timeout, max: 1,
|
62
59
|
filter: "arp src #{ipaddr} and ether dst #{my_hwaddr}")
|
63
60
|
cap_thread = Thread.new do
|
@@ -66,18 +63,13 @@ module PacketGen
|
|
66
63
|
|
67
64
|
arp_pkt.to_w(iface)
|
68
65
|
cap_thread.join
|
69
|
-
|
70
|
-
if capture.packets.
|
71
|
-
|
72
|
-
|
73
|
-
break pkt.arp.sha.to_s
|
74
|
-
end
|
75
|
-
end
|
76
|
-
else
|
77
|
-
nil
|
66
|
+
|
67
|
+
return if capture.packets.empty?
|
68
|
+
capture.packets.each do |pkt|
|
69
|
+
break pkt.arp.sha.to_s if pkt.arp.spa.to_s == ipaddr
|
78
70
|
end
|
79
71
|
end
|
80
|
-
|
72
|
+
|
81
73
|
# Do ARP spoofing on given IP address. Call to this method blocks.
|
82
74
|
# @note This method is provided for test purpose.
|
83
75
|
# For more control, see {ARPSpoofer} class.
|
@@ -133,7 +125,7 @@ module PacketGen
|
|
133
125
|
spoofer = Utils::ARPSpoofer.new(options)
|
134
126
|
spoofer.add target1, target2, options
|
135
127
|
spoofer.add target2, target1, options
|
136
|
-
|
128
|
+
|
137
129
|
my_mac = Config.instance.hwaddr(options[:iface])
|
138
130
|
my_ip = Config.instance.ipaddr(options[:iface])
|
139
131
|
capture = Capture.new(iface: options[:iface],
|
@@ -4,11 +4,11 @@
|
|
4
4
|
# This program is published under MIT license.
|
5
5
|
|
6
6
|
# frozen_string_literal: true
|
7
|
+
|
7
8
|
require 'thread'
|
8
9
|
|
9
10
|
module PacketGen
|
10
11
|
module Utils
|
11
|
-
|
12
12
|
# @note This class is provided for test purpose.
|
13
13
|
# Utility class to make ARP spoofing.
|
14
14
|
# spoofer = PacketGen::Utils::ARPSpoofer.new
|
@@ -23,7 +23,6 @@ module PacketGen
|
|
23
23
|
# @author Sylvain Daubert
|
24
24
|
# @since 2.1.3
|
25
25
|
class ARPSpoofer
|
26
|
-
|
27
26
|
# @param [Integer,Float,nil] timeout spoof will happen for this amount
|
28
27
|
# of time
|
29
28
|
# @param [Integer,Float] interval time between 2 ARP packets
|
@@ -51,7 +50,7 @@ module PacketGen
|
|
51
50
|
# an ARP request is made to get it.
|
52
51
|
# @return [void]
|
53
52
|
def add(target_ip, spoofed_ip, options={})
|
54
|
-
@targets[target_ip] = options.merge(
|
53
|
+
@targets[target_ip] = options.merge(spoofed_ip: spoofed_ip, active: false)
|
55
54
|
end
|
56
55
|
|
57
56
|
# Remove target from spoofer.
|
@@ -104,7 +103,7 @@ module PacketGen
|
|
104
103
|
activate target_ip
|
105
104
|
end
|
106
105
|
end
|
107
|
-
|
106
|
+
|
108
107
|
# Stop spoofing on all targets.
|
109
108
|
# @return [void]
|
110
109
|
def stop_all
|
@@ -117,11 +116,8 @@ module PacketGen
|
|
117
116
|
# @param [String] target_ip target IP address
|
118
117
|
# @return [Boolean,nil]
|
119
118
|
def active?(target_ip)
|
120
|
-
|
121
|
-
|
122
|
-
else
|
123
|
-
nil
|
124
|
-
end
|
119
|
+
return unless @targets.key?(target_ip)
|
120
|
+
@targets[target_ip][:active]
|
125
121
|
end
|
126
122
|
|
127
123
|
# Wait for spoofing to finish. Wait forever if no +timeout+ options
|
@@ -138,16 +134,14 @@ module PacketGen
|
|
138
134
|
def activate(target_ip)
|
139
135
|
@arp_packets[target_ip] = make_arp_packet(target_ip)
|
140
136
|
@queue << @arp_packets.values
|
141
|
-
unless @spoof_thread
|
142
|
-
create_spoof_thread
|
143
|
-
end
|
137
|
+
create_spoof_thread unless @spoof_thread
|
144
138
|
@targets[target_ip][:active] = true
|
145
139
|
end
|
146
|
-
|
140
|
+
|
147
141
|
# Create spoof thread
|
148
142
|
def create_spoof_thread
|
149
|
-
@spoof_thread = Thread.new(@queue, @
|
150
|
-
while timeout.nil?
|
143
|
+
@spoof_thread = Thread.new(@queue, @timeout, @interval) do |queue, timeout, interval|
|
144
|
+
while timeout.nil? || timeout > 0.0
|
151
145
|
packets = queue.pop unless queue.empty?
|
152
146
|
send_packets_on_wire(packets) unless packets.empty?
|
153
147
|
timeout -= interval if timeout
|
@@ -184,9 +178,9 @@ module PacketGen
|
|
184
178
|
|
185
179
|
target_mac = params[:target_mac] || Utils.arp(target_ip)
|
186
180
|
|
187
|
-
Packet.gen('Eth', dst: target_mac, src: mac)
|
188
|
-
|
189
|
-
|
181
|
+
Packet.gen('Eth', dst: target_mac, src: mac)
|
182
|
+
.add('ARP', op: 'reply', sha: mac, spa: params[:spoofed_ip],
|
183
|
+
tha: target_mac, tpa: target_ip)
|
190
184
|
end
|
191
185
|
end
|
192
186
|
end
|
data/lib/packetgen/version.rb
CHANGED
data/packetgen.gemspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'packetgen/version'
|
5
6
|
|
@@ -10,8 +11,8 @@ Gem::Specification.new do |spec|
|
|
10
11
|
spec.authors = ['Sylvain Daubert']
|
11
12
|
spec.email = ['sylvain.daubert@laposte.net']
|
12
13
|
|
13
|
-
spec.summary =
|
14
|
-
#spec.description = %q{TODO: Write a longer description or delete this line.}
|
14
|
+
spec.summary = 'Network packet generator and dissector'
|
15
|
+
# spec.description = %q{TODO: Write a longer description or delete this line.}
|
15
16
|
spec.homepage = 'https://github.com/sdaubert/packetgen'
|
16
17
|
|
17
18
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
@@ -23,13 +24,13 @@ Gem::Specification.new do |spec|
|
|
23
24
|
|
24
25
|
spec.required_ruby_version = '>= 2.2.0'
|
25
26
|
|
26
|
-
spec.add_dependency 'pcaprub', '~>0.12.4'
|
27
27
|
spec.add_dependency 'interfacez', '~>1.0'
|
28
|
+
spec.add_dependency 'pcaprub', '~>0.12.4'
|
28
29
|
spec.add_dependency 'rasn1', '~>0.5', '>= 0.6.3'
|
29
30
|
|
30
|
-
spec.add_development_dependency 'bundler', '~> 1.
|
31
|
-
spec.add_development_dependency 'rake', '~> 12.
|
32
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
33
|
-
spec.add_development_dependency 'simplecov', '~> 0.
|
31
|
+
spec.add_development_dependency 'bundler', '~> 1.16'
|
32
|
+
spec.add_development_dependency 'rake', '~> 12.3'
|
33
|
+
spec.add_development_dependency 'rspec', '~> 3.7'
|
34
|
+
spec.add_development_dependency 'simplecov', '~> 0.16'
|
34
35
|
spec.add_development_dependency 'yard', '~> 0.9'
|
35
36
|
end
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: packetgen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sylvain Daubert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: interfacez
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0
|
19
|
+
version: '1.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0
|
26
|
+
version: '1.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: pcaprub
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.12.4
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 0.12.4
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rasn1
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -64,56 +64,56 @@ dependencies:
|
|
64
64
|
requirements:
|
65
65
|
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: '1.
|
67
|
+
version: '1.16'
|
68
68
|
type: :development
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: '1.
|
74
|
+
version: '1.16'
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: rake
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
79
|
- - "~>"
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: '12.
|
81
|
+
version: '12.3'
|
82
82
|
type: :development
|
83
83
|
prerelease: false
|
84
84
|
version_requirements: !ruby/object:Gem::Requirement
|
85
85
|
requirements:
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version: '12.
|
88
|
+
version: '12.3'
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
90
|
name: rspec
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
92
92
|
requirements:
|
93
93
|
- - "~>"
|
94
94
|
- !ruby/object:Gem::Version
|
95
|
-
version: '3.
|
95
|
+
version: '3.7'
|
96
96
|
type: :development
|
97
97
|
prerelease: false
|
98
98
|
version_requirements: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version: '3.
|
102
|
+
version: '3.7'
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
104
|
name: simplecov
|
105
105
|
requirement: !ruby/object:Gem::Requirement
|
106
106
|
requirements:
|
107
107
|
- - "~>"
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
version: '0.
|
109
|
+
version: '0.16'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
112
|
version_requirements: !ruby/object:Gem::Requirement
|
113
113
|
requirements:
|
114
114
|
- - "~>"
|
115
115
|
- !ruby/object:Gem::Version
|
116
|
-
version: '0.
|
116
|
+
version: '0.16'
|
117
117
|
- !ruby/object:Gem::Dependency
|
118
118
|
name: yard
|
119
119
|
requirement: !ruby/object:Gem::Requirement
|
@@ -137,6 +137,7 @@ extensions: []
|
|
137
137
|
extra_rdoc_files: []
|
138
138
|
files:
|
139
139
|
- ".gitignore"
|
140
|
+
- ".rubocop.yml"
|
140
141
|
- ".travis.yml"
|
141
142
|
- Gemfile
|
142
143
|
- LICENSE
|
@@ -146,6 +147,7 @@ files:
|
|
146
147
|
- lib/packetgen.rb
|
147
148
|
- lib/packetgen/capture.rb
|
148
149
|
- lib/packetgen/config.rb
|
150
|
+
- lib/packetgen/deprecation.rb
|
149
151
|
- lib/packetgen/header.rb
|
150
152
|
- lib/packetgen/header/arp.rb
|
151
153
|
- lib/packetgen/header/asn1_base.rb
|
@@ -296,5 +298,5 @@ rubyforge_project:
|
|
296
298
|
rubygems_version: 2.7.6
|
297
299
|
signing_key:
|
298
300
|
specification_version: 4
|
299
|
-
summary: Network packet generator and
|
301
|
+
summary: Network packet generator and dissector
|
300
302
|
test_files: []
|