packetgen 3.2.0 → 3.2.1
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/README.md +1 -1
- data/bin/pgconsole +3 -3
- data/lib/packetgen/header/arp.rb +24 -13
- data/lib/packetgen/header/asn1_base.rb +2 -2
- data/lib/packetgen/header/base.rb +1 -1
- data/lib/packetgen/header/dhcpv6/option.rb +11 -13
- data/lib/packetgen/header/dns/opt.rb +2 -2
- data/lib/packetgen/header/dns/rr.rb +61 -28
- data/lib/packetgen/header/dns.rb +13 -6
- data/lib/packetgen/header/dot11/management.rb +2 -5
- data/lib/packetgen/header/dot11.rb +1 -1
- data/lib/packetgen/header/eap.rb +1 -1
- data/lib/packetgen/header/eth.rb +1 -1
- data/lib/packetgen/header/http/response.rb +43 -23
- data/lib/packetgen/header/igmp.rb +1 -1
- data/lib/packetgen/header/ip/option.rb +2 -1
- data/lib/packetgen/header/ipv6/addr.rb +3 -0
- data/lib/packetgen/header/mdns.rb +19 -25
- data/lib/packetgen/header/mld.rb +1 -1
- data/lib/packetgen/header/ospfv2/lsa_header.rb +2 -4
- data/lib/packetgen/header/ospfv2.rb +1 -1
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +14 -5
- data/lib/packetgen/header/ospfv3/lsa.rb +1 -1
- data/lib/packetgen/header/ospfv3/lsa_header.rb +2 -4
- data/lib/packetgen/header/ospfv3.rb +1 -1
- data/lib/packetgen/header/snmp.rb +20 -14
- data/lib/packetgen/header/tcp/option.rb +1 -1
- data/lib/packetgen/header/tcp.rb +12 -5
- data/lib/packetgen/header/tftp.rb +15 -9
- data/lib/packetgen/inspect.rb +15 -9
- data/lib/packetgen/packet.rb +48 -2
- data/lib/packetgen/pcapng/file.rb +13 -13
- data/lib/packetgen/pcapng.rb +1 -0
- data/lib/packetgen/pcaprub_wrapper.rb +0 -4
- data/lib/packetgen/types/abstract_tlv.rb +1 -1
- data/lib/packetgen/types/array.rb +8 -1
- data/lib/packetgen/types/fields.rb +19 -19
- data/lib/packetgen/types/int.rb +7 -0
- data/lib/packetgen/types/oui.rb +1 -1
- data/lib/packetgen/types/tlv.rb +17 -9
- data/lib/packetgen/utils.rb +55 -21
- data/lib/packetgen/version.rb +1 -1
- data/lib/packetgen.rb +3 -3
- metadata +3 -3
data/lib/packetgen/utils.rb
CHANGED
@@ -16,10 +16,27 @@ module PacketGen
|
|
16
16
|
# @author Sylvain Daubert
|
17
17
|
# @since 2.1.3
|
18
18
|
module Utils
|
19
|
+
# @private
|
20
|
+
ARP_FILTER = 'arp src %<ipaddr>s and ether dst %<hwaddr>s'
|
21
|
+
# @private
|
22
|
+
MITM_FILTER = '((ip src %<target1>s and not ip dst %<local_ip>s) or' \
|
23
|
+
' (ip src %<target2>s and not ip dst %<local_ip>s) or' \
|
24
|
+
' (ip dst %<target1>s and not ip src %<local_ip>s) or' \
|
25
|
+
' (ip dst %<target2>s and not ip src %<local_ip>s))' \
|
26
|
+
' and ether dst %<local_mac>s'
|
27
|
+
|
19
28
|
# Get local ARP cache
|
20
29
|
# @return [Hash] key: IP address, value: array containing MAC address and
|
21
30
|
# interface name
|
22
31
|
def self.arp_cache
|
32
|
+
return self.cache_from_arp_command if File.exist?('/usr/sbin/arp')
|
33
|
+
return self.cache_from_ip_command if File.exist?('/usr/bin/ip')
|
34
|
+
|
35
|
+
{}
|
36
|
+
end
|
37
|
+
|
38
|
+
# @private
|
39
|
+
def self.cache_from_arp_command
|
23
40
|
raw_cache = `/usr/sbin/arp -an`
|
24
41
|
|
25
42
|
cache = {}
|
@@ -31,6 +48,21 @@ module PacketGen
|
|
31
48
|
cache
|
32
49
|
end
|
33
50
|
|
51
|
+
# @private
|
52
|
+
def self.cache_from_ip_command
|
53
|
+
raw_cache = `ip neigh`
|
54
|
+
|
55
|
+
cache = {}
|
56
|
+
raw_cache.split("\n").each do |line|
|
57
|
+
match = line.match(/^(\d+\.\d+\.\d+\.\d+) dev (\w+) lladdr (([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2})/)
|
58
|
+
cache[match[1]] = [match[3], match[2]] if match
|
59
|
+
end
|
60
|
+
|
61
|
+
cache
|
62
|
+
end
|
63
|
+
|
64
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/AbcSize
|
65
|
+
|
34
66
|
# Get MAC address from an IP address, or nil if this IP address is unknown
|
35
67
|
# on local network.
|
36
68
|
# @param [String] ipaddr dotted-octet IP address
|
@@ -40,7 +72,7 @@ module PacketGen
|
|
40
72
|
# @option options [Boolean] :no_cache if +true+, do not query local ARP
|
41
73
|
# cache and always send an ARP request on wire. Default to +false+
|
42
74
|
# @option options [Integer] :timeout timeout in seconds before stopping
|
43
|
-
# request. Default to
|
75
|
+
# request. Default to 1.
|
44
76
|
# @return [String,nil]
|
45
77
|
# @raise [RuntimeError] user don't have permission to capture packets on network device.
|
46
78
|
def self.arp(ipaddr, options={})
|
@@ -57,10 +89,10 @@ module PacketGen
|
|
57
89
|
spa: Config.instance.ipaddr(iface),
|
58
90
|
tpa: ipaddr)
|
59
91
|
|
60
|
-
capture = Capture.new(iface: iface, timeout: timeout, max: 1,
|
61
|
-
filter: "arp src #{ipaddr} and ether dst #{my_hwaddr}")
|
92
|
+
capture = Capture.new(iface: iface, timeout: timeout, max: 1, filter: ARP_FILTER % { ipaddr: ipaddr, hwaddr: my_hwaddr })
|
62
93
|
cap_thread = Thread.new { capture.start }
|
63
94
|
|
95
|
+
sleep 0.1
|
64
96
|
arp_pkt.to_w(iface)
|
65
97
|
cap_thread.join
|
66
98
|
|
@@ -70,6 +102,7 @@ module PacketGen
|
|
70
102
|
break pkt.arp.sha.to_s if pkt.arp.spa.to_s == ipaddr
|
71
103
|
end
|
72
104
|
end
|
105
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/AbcSize
|
73
106
|
|
74
107
|
# Do ARP spoofing on given IP address. Call to this method blocks.
|
75
108
|
# @note This method is provided for test purpose.
|
@@ -125,36 +158,37 @@ module PacketGen
|
|
125
158
|
def self.mitm(target1, target2, options={})
|
126
159
|
options = { iface: PacketGen.default_iface }.merge(options)
|
127
160
|
|
128
|
-
mac1 = arp(target1)
|
129
|
-
mac2 = arp(target2)
|
130
|
-
|
131
161
|
spoofer = Utils::ARPSpoofer.new(options)
|
132
162
|
spoofer.add target1, target2, options
|
133
163
|
spoofer.add target2, target1, options
|
134
164
|
|
135
|
-
|
136
|
-
|
165
|
+
cfg = Config.instance
|
166
|
+
my_mac = cfg.hwaddr(options[:iface])
|
137
167
|
capture = Capture.new(iface: options[:iface],
|
138
|
-
filter:
|
139
|
-
" (ip src #{target2} and not ip dst #{my_ip}) or" \
|
140
|
-
" (ip dst #{target1} and not ip src #{my_ip}) or" \
|
141
|
-
" (ip dst #{target2} and not ip src #{my_ip}))" \
|
142
|
-
" and ether dst #{my_mac}")
|
168
|
+
filter: MITM_FILTER % { target1: target1, target2: target2, local_ip: cfg.ipaddr(options[:iface]), local_mac: my_mac })
|
143
169
|
|
144
170
|
spoofer.start_all
|
171
|
+
mitm_core(capture, target1, target2, my_mac, &proc)
|
172
|
+
spoofer.stop_all
|
173
|
+
end
|
174
|
+
|
175
|
+
# @private
|
176
|
+
def self.mitm_core(capture, target1, target2, my_mac)
|
177
|
+
mac1 = arp(target1)
|
178
|
+
mac2 = arp(target2)
|
179
|
+
|
145
180
|
capture.start do |pkt|
|
146
181
|
modified_pkt = yield pkt
|
147
182
|
iph = modified_pkt.ip
|
148
183
|
l2 = modified_pkt.is?('Dot11') ? modified_pkt.dot11 : modified_pkt.eth
|
149
184
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
modified_pkt.to_w(options[:iface])
|
185
|
+
l2.src = my_mac
|
186
|
+
l2.dst = if (iph.src == target1) || (iph.dst == target2)
|
187
|
+
mac2
|
188
|
+
else # (iph.src == target2) || (iph.dst == target1)
|
189
|
+
mac1
|
190
|
+
end
|
191
|
+
modified_pkt.to_w(capture.iface)
|
158
192
|
end
|
159
193
|
end
|
160
194
|
end
|
data/lib/packetgen/version.rb
CHANGED
data/lib/packetgen.rb
CHANGED
@@ -39,9 +39,9 @@ module PacketGen
|
|
39
39
|
|
40
40
|
def message
|
41
41
|
"#{prev_hdr.class} knowns no layer association with #{hdr.protocol_name}. " \
|
42
|
-
|
43
|
-
|
44
|
-
|
42
|
+
"Try #{prev_hdr.class}.bind_layer(#{hdr.class}, " \
|
43
|
+
"#{prev_hdr.method_name}_proto_field: " \
|
44
|
+
"<value_for_#{hdr.method_name}>)"
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: packetgen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.2.
|
4
|
+
version: 3.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sylvain Daubert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: interfacez
|
@@ -260,7 +260,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
260
260
|
requirements:
|
261
261
|
- - ">="
|
262
262
|
- !ruby/object:Gem::Version
|
263
|
-
version: 2.
|
263
|
+
version: 2.5.0
|
264
264
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
265
265
|
requirements:
|
266
266
|
- - ">="
|