packetgen 2.8.7 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +0 -1
- data/README.md +5 -4
- data/lib/packetgen.rb +6 -12
- data/lib/packetgen/capture.rb +43 -39
- data/lib/packetgen/config.rb +0 -1
- data/lib/packetgen/deprecation.rb +1 -1
- data/lib/packetgen/header.rb +9 -9
- data/lib/packetgen/header/asn1_base.rb +10 -10
- data/lib/packetgen/header/base.rb +42 -101
- data/lib/packetgen/header/dhcp/option.rb +5 -11
- data/lib/packetgen/header/dhcpv6/duid.rb +2 -0
- data/lib/packetgen/header/dhcpv6/option.rb +2 -19
- data/lib/packetgen/header/dhcpv6/options.rb +7 -0
- data/lib/packetgen/header/dns.rb +5 -23
- data/lib/packetgen/header/dns/name.rb +1 -0
- data/lib/packetgen/header/dns/qdsection.rb +1 -0
- data/lib/packetgen/header/dns/question.rb +3 -7
- data/lib/packetgen/header/dns/rr.rb +3 -0
- data/lib/packetgen/header/dns/rrsection.rb +1 -0
- data/lib/packetgen/header/dot11.rb +1 -17
- data/lib/packetgen/header/dot1x.rb +1 -0
- data/lib/packetgen/header/eap.rb +4 -7
- data/lib/packetgen/header/eth.rb +2 -0
- data/lib/packetgen/header/http/headers.rb +3 -0
- data/lib/packetgen/header/http/request.rb +5 -4
- data/lib/packetgen/header/http/response.rb +5 -4
- data/lib/packetgen/header/icmp.rb +6 -0
- data/lib/packetgen/header/icmpv6.rb +6 -0
- data/lib/packetgen/header/igmpv3/mq.rb +2 -0
- data/lib/packetgen/header/ip.rb +32 -30
- data/lib/packetgen/header/ip/addr.rb +1 -0
- data/lib/packetgen/header/ip/option.rb +23 -20
- data/lib/packetgen/header/ip/options.rb +11 -24
- data/lib/packetgen/header/ipv6.rb +45 -34
- data/lib/packetgen/header/ipv6/addr.rb +2 -0
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +7 -31
- data/lib/packetgen/header/mdns.rb +1 -0
- data/lib/packetgen/header/mldv2/mlq.rb +2 -0
- data/lib/packetgen/header/ospfv2/lsa.rb +15 -25
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +1 -1
- data/lib/packetgen/header/ospfv3/lsa.rb +8 -25
- data/lib/packetgen/header/snmp.rb +2 -0
- data/lib/packetgen/header/tcp.rb +23 -2
- data/lib/packetgen/header/tcp/option.rb +51 -52
- data/lib/packetgen/header/tcp/options.rb +17 -52
- data/lib/packetgen/header/tftp.rb +3 -0
- data/lib/packetgen/header/udp.rb +8 -0
- data/lib/packetgen/packet.rb +119 -102
- data/lib/packetgen/pcapng/block.rb +4 -10
- data/lib/packetgen/pcapng/epb.rb +4 -4
- data/lib/packetgen/pcapng/file.rb +7 -3
- data/lib/packetgen/pcapng/idb.rb +2 -2
- data/lib/packetgen/pcapng/shb.rb +3 -3
- data/lib/packetgen/pcapng/spb.rb +1 -8
- data/lib/packetgen/pcapng/unknown_block.rb +0 -7
- data/lib/packetgen/types.rb +1 -0
- data/lib/packetgen/types/array.rb +73 -71
- data/lib/packetgen/types/cstring.rb +1 -1
- data/lib/packetgen/types/enum.rb +3 -3
- data/lib/packetgen/types/fields.rb +66 -106
- data/lib/packetgen/types/int.rb +9 -5
- data/lib/packetgen/types/length_from.rb +45 -0
- data/lib/packetgen/types/oui.rb +2 -0
- data/lib/packetgen/types/string.rb +10 -16
- data/lib/packetgen/types/tlv.rb +7 -15
- data/lib/packetgen/utils.rb +8 -8
- data/lib/packetgen/utils/arp_spoofer.rb +1 -2
- data/lib/packetgen/version.rb +1 -1
- metadata +3 -21
- data/lib/packetgen/header/crypto.rb +0 -62
- data/lib/packetgen/header/esp.rb +0 -413
- data/lib/packetgen/header/ike.rb +0 -243
- data/lib/packetgen/header/ike/auth.rb +0 -165
- data/lib/packetgen/header/ike/cert.rb +0 -76
- data/lib/packetgen/header/ike/certreq.rb +0 -66
- data/lib/packetgen/header/ike/id.rb +0 -99
- data/lib/packetgen/header/ike/ke.rb +0 -79
- data/lib/packetgen/header/ike/nonce.rb +0 -40
- data/lib/packetgen/header/ike/notify.rb +0 -176
- data/lib/packetgen/header/ike/payload.rb +0 -315
- data/lib/packetgen/header/ike/sa.rb +0 -561
- data/lib/packetgen/header/ike/sk.rb +0 -261
- data/lib/packetgen/header/ike/ts.rb +0 -270
- data/lib/packetgen/header/ike/vendor_id.rb +0 -39
- data/lib/packetgen/header/netbios.rb +0 -20
- data/lib/packetgen/header/netbios/datagram.rb +0 -105
- data/lib/packetgen/header/netbios/name.rb +0 -67
- data/lib/packetgen/header/netbios/session.rb +0 -64
@@ -56,9 +56,6 @@ module PacketGen
|
|
56
56
|
74 => ['IRC_server', length: 4, v: IP::Addr]
|
57
57
|
}.freeze
|
58
58
|
|
59
|
-
# @deprecated Use {DHCP_OPTIONS} instead.
|
60
|
-
DCHPOptions = DHCP_OPTIONS
|
61
|
-
|
62
59
|
# Class to indicate DHCP options end
|
63
60
|
class End < Types::Int8
|
64
61
|
def initialize(value=255)
|
@@ -98,9 +95,10 @@ module PacketGen
|
|
98
95
|
def initialize(options={})
|
99
96
|
super
|
100
97
|
return unless DHCP_OPTIONS.key?(self.type)
|
101
|
-
h = DHCP_OPTIONS[self.type].last
|
102
98
|
|
99
|
+
h = DHCP_OPTIONS[self.type].last
|
103
100
|
return unless h.is_a? Hash
|
101
|
+
|
104
102
|
h.each do |k, v|
|
105
103
|
self.length = v if k == :length
|
106
104
|
if k == :v
|
@@ -135,13 +133,8 @@ module PacketGen
|
|
135
133
|
true
|
136
134
|
end
|
137
135
|
|
138
|
-
#
|
139
|
-
# @return [
|
140
|
-
def has_human_types?
|
141
|
-
Deprecation.deprecated(self.class, __method__, 'human_types?')
|
142
|
-
human_types?
|
143
|
-
end
|
144
|
-
|
136
|
+
# Get human-readable type
|
137
|
+
# @return [String]
|
145
138
|
def human_type
|
146
139
|
if DHCP_OPTIONS.key?(type)
|
147
140
|
DHCP_OPTIONS[type].first.dup
|
@@ -150,6 +143,7 @@ module PacketGen
|
|
150
143
|
end
|
151
144
|
end
|
152
145
|
|
146
|
+
# @return [String]
|
153
147
|
def to_human
|
154
148
|
s = human_type
|
155
149
|
if length > 0
|
@@ -36,10 +36,12 @@ module PacketGen
|
|
36
36
|
# @return [Hash]
|
37
37
|
def subclasses
|
38
38
|
return @klasses if defined? @klasses
|
39
|
+
|
39
40
|
@klasses = []
|
40
41
|
DHCPv6.constants.each do |cst|
|
41
42
|
klass = DHCPv6.const_get(cst)
|
42
43
|
next unless klass.is_a?(Class) && (klass < Option)
|
44
|
+
|
43
45
|
@klasses[klass.new.type] = klass
|
44
46
|
end
|
45
47
|
@klasses
|
@@ -80,25 +82,6 @@ module PacketGen
|
|
80
82
|
alias private_read read
|
81
83
|
private :private_read
|
82
84
|
|
83
|
-
# Populate object from binary string
|
84
|
-
# @param [String] str
|
85
|
-
# @return [Option]
|
86
|
-
def read(str)
|
87
|
-
if self.class == Option
|
88
|
-
return self if str.nil?
|
89
|
-
PacketGen.force_binary str
|
90
|
-
type = Types::Int16.new.read(str).to_i
|
91
|
-
klass = Option.subclasses[type]
|
92
|
-
if klass
|
93
|
-
klass.new.read(str)
|
94
|
-
else
|
95
|
-
private_read str
|
96
|
-
end
|
97
|
-
else
|
98
|
-
private_read str
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
85
|
# Get human-readable {#type}
|
103
86
|
# @return [String]
|
104
87
|
def human_type
|
data/lib/packetgen/header/dns.rb
CHANGED
@@ -97,12 +97,12 @@ module PacketGen
|
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
100
|
-
require_relative 'dns/rrsection'
|
101
|
-
require_relative 'dns/qdsection'
|
102
100
|
require_relative 'dns/name'
|
103
101
|
require_relative 'dns/question'
|
104
102
|
require_relative 'dns/rr'
|
105
103
|
require_relative 'dns/opt'
|
104
|
+
require_relative 'dns/rrsection'
|
105
|
+
require_relative 'dns/qdsection'
|
106
106
|
|
107
107
|
module PacketGen
|
108
108
|
module Header
|
@@ -184,27 +184,7 @@ module PacketGen
|
|
184
184
|
define_bit_fields_on :u16, :qr, :opcode, 4, :aa, :tc, :rd, :ra, :z,
|
185
185
|
:ad, :cd, :rcode, 4
|
186
186
|
|
187
|
-
|
188
|
-
# @param [String] str binary string
|
189
|
-
# @return [self]
|
190
|
-
def read(str)
|
191
|
-
return self if str.nil?
|
192
|
-
force_binary str
|
193
|
-
self[:id].read str[0, 2]
|
194
|
-
self[:u16].read str[2, 2]
|
195
|
-
self[:qdcount].read str[4, 2]
|
196
|
-
self[:ancount].read str[6, 2]
|
197
|
-
self[:nscount].read str[8, 2]
|
198
|
-
self[:arcount].read str[10, 2]
|
199
|
-
self[:qd].read str[12..-1] if self.qdcount > 0
|
200
|
-
start = 12 + self[:qd].sz
|
201
|
-
self[:an].read str[start..-1] if self.ancount > 0
|
202
|
-
start += self[:an].sz
|
203
|
-
self[:ns].read str[start..-1] if self.nscount > 0
|
204
|
-
start += self[:ns].sz
|
205
|
-
self[:ar].read str[start..-1] if self.arcount > 0
|
206
|
-
self
|
207
|
-
end
|
187
|
+
undef opcode=, rcode=
|
208
188
|
|
209
189
|
# Set opcode
|
210
190
|
# @param [Integer,String] value
|
@@ -217,6 +197,7 @@ module PacketGen
|
|
217
197
|
OPCODES[value.to_s]
|
218
198
|
end
|
219
199
|
raise ArgumentError, "unknown opcode #{value.inspect}" unless intg
|
200
|
+
|
220
201
|
self.u16 &= 0x87ff
|
221
202
|
self.u16 |= (intg & 0xf) << 11
|
222
203
|
end
|
@@ -232,6 +213,7 @@ module PacketGen
|
|
232
213
|
RCODES[value]
|
233
214
|
end
|
234
215
|
raise ArgumentError, "unknown rcode #{value.inspect}" unless intg
|
216
|
+
|
235
217
|
self.u16 &= 0xfff0
|
236
218
|
self.u16 |= intg & 0xf
|
237
219
|
end
|
@@ -78,6 +78,8 @@ module PacketGen
|
|
78
78
|
self.rrclass = options[:rrclass] if options[:rrclass]
|
79
79
|
end
|
80
80
|
|
81
|
+
undef rrclass=
|
82
|
+
|
81
83
|
# Setter for class
|
82
84
|
# @param [Integer] val
|
83
85
|
# @return [Integer,String]
|
@@ -89,6 +91,7 @@ module PacketGen
|
|
89
91
|
val
|
90
92
|
end
|
91
93
|
raise ArgumentError, "unknown class #{val.inspect}" unless v
|
94
|
+
|
92
95
|
self[:rrclass].read v
|
93
96
|
end
|
94
97
|
|
@@ -100,13 +103,6 @@ module PacketGen
|
|
100
103
|
self.class::TYPES[type] == self.type
|
101
104
|
end
|
102
105
|
|
103
|
-
# @deprecated Use {#type?} instead
|
104
|
-
# @return [Boolean]
|
105
|
-
def has_type?(type)
|
106
|
-
Deprecation.deprecated(self.class, __method__, 'type?')
|
107
|
-
type?(type)
|
108
|
-
end
|
109
|
-
|
110
106
|
# Get human readable type
|
111
107
|
# @return [String]
|
112
108
|
def human_type
|
@@ -36,9 +36,12 @@ module PacketGen
|
|
36
36
|
def initialize(dns, options={})
|
37
37
|
super
|
38
38
|
return unless options[:rdata] && options[:rdlength].nil?
|
39
|
+
|
39
40
|
self.rdata = options[:rdata]
|
40
41
|
end
|
41
42
|
|
43
|
+
undef rdata=
|
44
|
+
|
42
45
|
# Set rdata and rdlength from +data+
|
43
46
|
# @param [String] data
|
44
47
|
# @return [void]
|
@@ -68,8 +68,7 @@ module PacketGen
|
|
68
68
|
# @param [String] iface interface name
|
69
69
|
# @return [void]
|
70
70
|
def to_w(iface)
|
71
|
-
pcap = PCAPRUB::Pcap.open_live(iface, PCAP_SNAPLEN, PCAP_PROMISC,
|
72
|
-
PCAP_TIMEOUT)
|
71
|
+
pcap = PCAPRUB::Pcap.open_live(iface, PCAP_SNAPLEN, PCAP_PROMISC, PCAP_TIMEOUT)
|
73
72
|
pcap.inject self.to_s
|
74
73
|
pcap.close
|
75
74
|
end
|
@@ -219,21 +218,6 @@ module PacketGen
|
|
219
218
|
# @return [Boolean]
|
220
219
|
attr_accessor :fcs
|
221
220
|
alias fcs? fcs
|
222
|
-
|
223
|
-
# rubocop:disable Naming/PredicateName
|
224
|
-
|
225
|
-
# @deprecated Use {.fcs?} instead.
|
226
|
-
def has_fcs
|
227
|
-
Deprecation.deprecated(self, __method__, 'fcs?', klass_method: true)
|
228
|
-
fcs?
|
229
|
-
end
|
230
|
-
|
231
|
-
# @deprecated Use {.fcs=} instead.
|
232
|
-
def has_fcs=(fcs)
|
233
|
-
Deprecation.deprecated(self, __method__, 'fcs=', klass_method: true)
|
234
|
-
self.fcs = fcs
|
235
|
-
end
|
236
|
-
# rubocop:enable Naming/PredicateName
|
237
221
|
end
|
238
222
|
Dot11.fcs = true
|
239
223
|
|
data/lib/packetgen/header/eap.rb
CHANGED
@@ -132,6 +132,7 @@ module PacketGen
|
|
132
132
|
def read(str)
|
133
133
|
super str
|
134
134
|
return self unless self.class == EAP
|
135
|
+
|
135
136
|
if type?
|
136
137
|
obj = case self.type
|
137
138
|
when 4
|
@@ -162,6 +163,7 @@ module PacketGen
|
|
162
163
|
# @raise [ParseError] not a Request nor a Response packet
|
163
164
|
def human_type
|
164
165
|
raise ParseError, 'not a Request nor a Response' unless type?
|
166
|
+
|
165
167
|
self[:type].to_human
|
166
168
|
end
|
167
169
|
|
@@ -194,6 +196,7 @@ module PacketGen
|
|
194
196
|
# @raise [ParseError] not a Nak packet
|
195
197
|
def desired_auth_type
|
196
198
|
raise ParseError, 'not a Nak response' if (code != 2) && (type != 3)
|
199
|
+
|
197
200
|
body.to_s.unpack('C*')
|
198
201
|
end
|
199
202
|
|
@@ -210,13 +213,6 @@ module PacketGen
|
|
210
213
|
[1, 2].include?(self.code)
|
211
214
|
end
|
212
215
|
|
213
|
-
# @deprecated Use {#type?} instead.
|
214
|
-
# @return [Boolean]
|
215
|
-
def has_type?
|
216
|
-
Deprecation.deprecated(self.class, __method__, 'type?')
|
217
|
-
type?
|
218
|
-
end
|
219
|
-
|
220
216
|
# Callback called when a EAP header is added to a packet
|
221
217
|
# Here, add +#eap+ method as a shortcut to existing
|
222
218
|
# +#eap_(md5|tls|ttls|fast)+.
|
@@ -224,6 +220,7 @@ module PacketGen
|
|
224
220
|
# @return [void]
|
225
221
|
def added_to_packet(packet)
|
226
222
|
return if packet.respond_to? :eap
|
223
|
+
|
227
224
|
packet.instance_eval("def eap(arg=nil); header(#{self.class}, arg); end")
|
228
225
|
end
|
229
226
|
|
data/lib/packetgen/header/eth.rb
CHANGED
@@ -57,8 +57,10 @@ module PacketGen
|
|
57
57
|
# @return [self]
|
58
58
|
def from_human(str)
|
59
59
|
return self if str.nil?
|
60
|
+
|
60
61
|
bytes = str.split(/:/)
|
61
62
|
raise ArgumentError, 'not a MAC address' unless bytes.size == 6
|
63
|
+
|
62
64
|
self[:a0].read(bytes[0].to_i(16))
|
63
65
|
self[:a1].read(bytes[1].to_i(16))
|
64
66
|
self[:a2].read(bytes[2].to_i(16))
|
@@ -29,6 +29,7 @@ module PacketGen
|
|
29
29
|
when String
|
30
30
|
@data = s_or_h.split("\n").map do |h|
|
31
31
|
next unless h.include?(':')
|
32
|
+
|
32
33
|
k, v = h.split(':', 2)
|
33
34
|
[k, v.strip]
|
34
35
|
end.reject(&:nil?).to_h
|
@@ -42,6 +43,7 @@ module PacketGen
|
|
42
43
|
# @return [String]
|
43
44
|
def to_s
|
44
45
|
return "\r\n" if @data.nil? || @data.empty?
|
46
|
+
|
45
47
|
d = []
|
46
48
|
@data.map do |k, v|
|
47
49
|
d << k + ': ' + v
|
@@ -66,6 +68,7 @@ module PacketGen
|
|
66
68
|
# @return [Boolean]
|
67
69
|
def given?
|
68
70
|
return true unless @data.nil? || @data.empty?
|
71
|
+
|
69
72
|
false
|
70
73
|
end
|
71
74
|
end
|
@@ -69,9 +69,9 @@ module PacketGen
|
|
69
69
|
str = vrb + str.split(vrb)[-1]
|
70
70
|
str = str.split("\n").map(&:chomp)
|
71
71
|
first_line = str.shift.split
|
72
|
-
self[:method]
|
73
|
-
self[:path]
|
74
|
-
self[:version]
|
72
|
+
self[:method].read first_line[0]
|
73
|
+
self[:path].read first_line[1]
|
74
|
+
self[:version].read first_line[2]
|
75
75
|
# requests can sometimes have a payload
|
76
76
|
if (data_index = str.find_index(''))
|
77
77
|
data = str[data_index + 1..-1].join("\n")
|
@@ -80,7 +80,7 @@ module PacketGen
|
|
80
80
|
headers = str.join("\n")
|
81
81
|
end
|
82
82
|
self[:headers].read(headers)
|
83
|
-
self[:body]
|
83
|
+
self[:body].read data
|
84
84
|
self
|
85
85
|
end
|
86
86
|
|
@@ -90,6 +90,7 @@ module PacketGen
|
|
90
90
|
raise FormatError, 'Missing #method.' if self.method.empty?
|
91
91
|
raise FormatError, 'Missing #path.' if self.path.empty?
|
92
92
|
raise FormatError, 'Missing #version.' if self.version.empty?
|
93
|
+
|
93
94
|
str = ''.dup # build 'dat string
|
94
95
|
str << self[:method] << ' ' << self[:path] << ' ' << self[:version] << "\r\n" << self[:headers].to_s << self[:body]
|
95
96
|
end
|
@@ -87,12 +87,12 @@ module PacketGen
|
|
87
87
|
end
|
88
88
|
unless headers.empty?
|
89
89
|
first_line = headers.shift.split
|
90
|
-
self[:version]
|
91
|
-
self[:status_code]
|
92
|
-
self[:status_mesg]
|
90
|
+
self[:version].read first_line[0]
|
91
|
+
self[:status_code].read first_line[1]
|
92
|
+
self[:status_mesg].read first_line[2..-1].join(' ')
|
93
93
|
self[:headers].read(headers.join("\n"))
|
94
94
|
end
|
95
|
-
self[:body]
|
95
|
+
self[:body].read data.join("\n")
|
96
96
|
self
|
97
97
|
end
|
98
98
|
|
@@ -102,6 +102,7 @@ module PacketGen
|
|
102
102
|
raise FormatError, 'Missing #status_code.' if self.status_code.empty?
|
103
103
|
raise FormatError, 'Missing #status_mesg.' if self.status_mesg.empty?
|
104
104
|
raise FormatError, 'Missing #version.' if self.version.empty?
|
105
|
+
|
105
106
|
str = ''.dup # build 'dat string
|
106
107
|
str << self[:version] << ' ' << self[:status_code] << ' ' << self[:status_mesg] << "\r\n"
|
107
108
|
str << self[:headers].to_s if self[:headers].given?
|
@@ -7,6 +7,12 @@
|
|
7
7
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
|
+
# ICMP header ({https://tools.ietf.org/html/rfc792 RFC 792})
|
11
|
+
# 0 1 2 3
|
12
|
+
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
13
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
14
|
+
# | Type | Code | Checksum |
|
15
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
10
16
|
# A ICMP header consists of:
|
11
17
|
# * a {#type} field ({Types::Int8} type),
|
12
18
|
# * a {#code} field ({Types::Int8} type),
|
@@ -7,6 +7,12 @@
|
|
7
7
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
|
+
# ICMPv6 header ({https://tools.ietf.org/html/rfc4443 RFC 4443})
|
11
|
+
# 0 1 2 3
|
12
|
+
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
13
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
14
|
+
# | Type | Code | Checksum |
|
15
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
10
16
|
# A ICMPv6 header consists of:
|
11
17
|
# * a +type+ field ({Types::Int8} type),
|
12
18
|
# * a +code+ field ({Types::Int8} type),
|