packetgen 2.8.3 → 2.8.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8ed1bb8d789bf32ec06fefdb337c59a0bc798c681b109414e3c84e29d7668890
4
- data.tar.gz: 938c883c20a2a5452aa4ade8d55cec86971eafc4c561c8980260c509b57312fb
3
+ metadata.gz: bd941670ed94baa729f5ee91da53062195f6764b3e75d7e70cbbc09075adfdc2
4
+ data.tar.gz: 4e5b3082f9ada7a234fc559baf53f8abb0ab374e76391c938505f82235a2a58a
5
5
  SHA512:
6
- metadata.gz: 8cccb84679cdf8934e2e26b267cb4d00576201ff309311d70d7907dd3ea1ddb6ea3f61a11b2a081b4648a8e3263083ba7484961448ea60f944b6f0541e145d58
7
- data.tar.gz: dfda8ea794e137b501bcbf1810f35ed637113ee33c548132d8f0f0db2cb24b6ca8603222eaf8185d02f37ca8ba2a0bd7ff60701cedd28fbaf8ccedd1c3985d35
6
+ metadata.gz: ebe8bf700763779d708b96bc7731dec2e73b2aa9c23308b9b2f63743c785bc989dfeea01d1b04dba8210f031f6047791151f06a4671b0980bd429becc653403c
7
+ data.tar.gz: 9243425668eba786664e28a55edb7458b0d51bb27e3ca09ac68573b9d41e0cb5f087fe677f93c5d05aef05ac55adc08220475c643e1da81958259ab07b34407c
data/.rubocop.yml CHANGED
@@ -1,3 +1,4 @@
1
+ TargetRubyVersion: 2.3
1
2
  Layout/SpaceAroundEqualsInParameterDefault:
2
3
  EnforcedStyle: no_space
3
4
  Lint/EmptyWhen:
@@ -9,10 +9,10 @@ module PacketGen
9
9
  module Header
10
10
  # @abstract Base class for all header types.
11
11
  # Subclasses may define magic methods:
12
- # * {#calc_checksum}, which computes header checksum,
13
- # * {#calc_length}, which computes header length,
14
- # * {#parse?},
15
- # * {#reply!}, which inverts needed fields to forge a response.
12
+ # * +#calc_checksum+, which computes header checksum,
13
+ # * +#calc_length+, which computes header length,
14
+ # * +#parse?+,
15
+ # * +#reply!+, which inverts needed fields to forge a response.
16
16
  # @author Sylvain Daubert
17
17
  class Base < Types::Fields
18
18
  # @api private
@@ -61,7 +61,7 @@ module PacketGen
61
61
  # DUID Based on Link-layer Address Plus Time
62
62
  # @author Sylvain Daubert
63
63
  class DUID_LLT < DUID
64
- delete_field :body
64
+ remove_field :body
65
65
 
66
66
  # Base time for time computation
67
67
  BASE_TIME = Time.utc(2000, 1, 1)
@@ -99,7 +99,7 @@ module PacketGen
99
99
  # DUID Based on Enterprise Number
100
100
  # @author Sylvain Daubert
101
101
  class DUID_EN < DUID
102
- delete_field :body
102
+ remove_field :body
103
103
 
104
104
  # @!attribute en
105
105
  # 32-bit entreprise number
@@ -119,7 +119,7 @@ module PacketGen
119
119
  # DUID Based on Link-layer
120
120
  # @author Sylvain Daubert
121
121
  class DUID_LL < DUID
122
- delete_field :body
122
+ remove_field :body
123
123
 
124
124
  # @!attribute htype
125
125
  # 16-bit hardware protocol type
@@ -72,10 +72,6 @@ module PacketGen
72
72
  # Create an Option
73
73
  # @param [Hash] options
74
74
  def initialize(options={})
75
- if self.class.const_defined?(:TYPE) && options[:type].nil?
76
- options[:type] = self.class.const_get(:TYPE)
77
- end
78
-
79
75
  options[:length] = options[:data].to_s.size if options[:data]
80
76
  super
81
77
  self.length = self.sz - 4 if options[:data].nil?
@@ -131,10 +127,8 @@ module PacketGen
131
127
  # DHCPv6 Client ID option
132
128
  # @author Sylvain Daubert
133
129
  class ClientID < Option
134
- # Option type value
135
- TYPE = 1
136
-
137
- delete_field :data
130
+ update_field :type, default: 1
131
+ remove_field :data
138
132
 
139
133
  # @!attribute duid
140
134
  # @return [DUID]
@@ -150,17 +144,14 @@ module PacketGen
150
144
  # DHCPv6 Server ID option
151
145
  # @author Sylvain Daubert
152
146
  class ServerID < ClientID
153
- # Option type value
154
- TYPE = 2
147
+ update_field :type, default: 2
155
148
  end
156
149
 
157
150
  # DHCPv6 Identity Association for Non-temporary Addresses Option
158
151
  # @author Sylvain Daubert
159
152
  class IANA < Option
160
- # Option type value
161
- TYPE = 3
162
-
163
- delete_field :data
153
+ update_field :type, default: 3
154
+ remove_field :data
164
155
 
165
156
  # @!attribute iaid
166
157
  # 32-bit IAID field
@@ -190,10 +181,8 @@ module PacketGen
190
181
  # DHCPv6 Identity Association for Temporary Addresses Option
191
182
  # @author Sylvain Daubert
192
183
  class IATA < Option
193
- # Option type value
194
- TYPE = 4
195
-
196
- delete_field :data
184
+ update_field :type, default: 4
185
+ remove_field :data
197
186
 
198
187
  # @!attribute iaid
199
188
  # 32-bit IAID field
@@ -215,10 +204,8 @@ module PacketGen
215
204
  # DHCPv6 IA Address option
216
205
  # @author Sylvain Daubert
217
206
  class IAAddr < Option
218
- # Option type value
219
- TYPE = 5
220
-
221
- delete_field :data
207
+ update_field :type, default: 5
208
+ remove_field :data
222
209
 
223
210
  # @attribute ipv6
224
211
  # IPv6 address
@@ -255,10 +242,8 @@ module PacketGen
255
242
  # DHCPv6 Option Request Option
256
243
  # @author Sylvain Daubert
257
244
  class ORO < Option
258
- # Option type value
259
- TYPE = 6
260
-
261
- delete_field :data
245
+ update_field :type, default: 6
246
+ remove_field :data
262
247
 
263
248
  # @!attribute options
264
249
  # @return [RequestedOptions]
@@ -284,10 +269,8 @@ module PacketGen
284
269
  # DHCPv6 Preference option
285
270
  # @author Sylvain Daubert
286
271
  class Preference < Option
287
- # Option type value
288
- TYPE = 7
289
-
290
- delete_field :data
272
+ update_field :type, default: 7
273
+ remove_field :data
291
274
 
292
275
  # @!attribute value
293
276
  # 8-bit value
@@ -304,10 +287,8 @@ module PacketGen
304
287
  # DHCPv6 Elapsed Time option
305
288
  # @author Sylvain Daubert
306
289
  class ElapsedTime < Option
307
- # Option type value
308
- TYPE = 8
309
-
310
- delete_field :data
290
+ update_field :type, default: 8
291
+ remove_field :data
311
292
 
312
293
  # @!attribute value
313
294
  # 16-bit value
@@ -324,17 +305,14 @@ module PacketGen
324
305
  # DHCPv6 Relay Message option
325
306
  # @author Sylvain Daubert
326
307
  class RelayMessage < Option
327
- # Option type value
328
- TYPE = 9
308
+ update_field :type, default: 9
329
309
  end
330
310
 
331
311
  # DHCPv6 Server Unicast option
332
312
  # @author Sylvain Daubert
333
313
  class ServerUnicast < Option
334
- # Option type value
335
- TYPE = 12
336
-
337
- delete_field :data
314
+ update_field :type, default: 12
315
+ remove_field :data
338
316
 
339
317
  # @!attribute addr
340
318
  # IPv6 server address
@@ -351,17 +329,14 @@ module PacketGen
351
329
  # DHCPv6 Status Code option
352
330
  # @author Sylvain Daubert
353
331
  class StatusCode < ElapsedTime
354
- # Option type value
355
- TYPE = 13
332
+ update_field :type, default: 13
356
333
  end
357
334
 
358
335
  # DHCPv6 Rapid Commit option
359
336
  # @author Sylvain Daubert
360
337
  class RapidCommit < Option
361
- # Option type value
362
- TYPE = 14
363
-
364
- delete_field :data
338
+ update_field :type, default: 14
339
+ remove_field :data
365
340
  end
366
341
  end
367
342
  end
@@ -222,13 +222,13 @@ module PacketGen
222
222
 
223
223
  # rubocop:disable Naming/PredicateName
224
224
 
225
- # @deprecated Use {#fcs?} instead.
225
+ # @deprecated Use {.fcs?} instead.
226
226
  def has_fcs
227
227
  Deprecation.deprecated(self, __method__, 'fcs?', klass_method: true)
228
228
  fcs?
229
229
  end
230
230
 
231
- # @deprecated Use {#fcs=} instead.
231
+ # @deprecated Use {.fcs=} instead.
232
232
  def has_fcs=(fcs)
233
233
  Deprecation.deprecated(self, __method__, 'fcs=', klass_method: true)
234
234
  self.fcs = fcs
@@ -18,10 +18,7 @@ module PacketGen
18
18
  # @author Sylvain Daubert
19
19
  # @since 2.1.4
20
20
  class FAST < TTLS
21
- # @return [EAP::FAST]
22
- def initialize(options={})
23
- super({ type: 43 }.merge!(options))
24
- end
21
+ update_field :type, default: 43
25
22
  end
26
23
  end
27
24
  end
@@ -13,7 +13,8 @@ module PacketGen
13
13
  # @author Sylvain Daubert
14
14
  # @since 2.1.4
15
15
  class MD5 < EAP
16
- delete_field :body
16
+ update_field :type, default: 4
17
+ remove_field :body
17
18
 
18
19
  # @!attribute value_size
19
20
  # @return [Integer] 8-bit value size
@@ -25,11 +26,6 @@ module PacketGen
25
26
  # @!attribute optional_name
26
27
  # @return [::String]
27
28
  define_field :optional_name, Types::String
28
-
29
- # @return [EAP::MD5]
30
- def initialize(options={})
31
- super({ type: 4 }.merge!(options))
32
- end
33
29
  end
34
30
  end
35
31
  end
@@ -18,6 +18,7 @@ module PacketGen
18
18
  # @author Sylvain Daubert
19
19
  # @since 2.1.4
20
20
  class TLS < EAP
21
+ update_field :type, default: 13
21
22
  # @!attribute flags
22
23
  # @return [Integer] 8-bit flags
23
24
  define_field_before :body, :flags, Types::Int8
@@ -44,11 +45,6 @@ module PacketGen
44
45
  define_field_before :body, :tls_length, Types::Int32,
45
46
  optional: ->(h) { h.l? }
46
47
 
47
- # @return [EAP::TLS]
48
- def initialize(options={})
49
- super({ type: 13 }.merge!(options))
50
- end
51
-
52
48
  # @return [String]
53
49
  def inspect
54
50
  str = Inspect.dashed_line(self.class, 1)
@@ -18,6 +18,7 @@ module PacketGen
18
18
  # @author Sylvain Daubert
19
19
  # @since 2.1.4
20
20
  class TTLS < EAP
21
+ update_field :type, default: 21
21
22
  # @!attribute flags
22
23
  # @return [Integer] 8-bit flags
23
24
  define_field_before :body, :flags, Types::Int8
@@ -48,11 +49,6 @@ module PacketGen
48
49
  define_field_before :body, :message_length, Types::Int32,
49
50
  optional: ->(h) { h.l? }
50
51
 
51
- # @return [EAP::TTLS]
52
- def initialize(options={})
53
- super({ type: 21 }.merge!(options))
54
- end
55
-
56
52
  # @return [String]
57
53
  def inspect
58
54
  str = Inspect.dashed_line(self.class, 1)
@@ -70,7 +70,7 @@ module PacketGen
70
70
  'MembershipReport' => 0x22,
71
71
  }.freeze
72
72
 
73
- delete_field :group_addr
73
+ remove_field :group_addr
74
74
 
75
75
  # Encode value for IGMPv3 Max Resp Code and QQIC.
76
76
  # Value may be encoded as a float, so some error may occur.
@@ -528,7 +528,7 @@ module PacketGen
528
528
  # Payload type number
529
529
  PAYLOAD_TYPE = 33
530
530
 
531
- delete_field :content
531
+ remove_field :content
532
532
 
533
533
  # @!attribute proposals
534
534
  # Set of SA proposals
@@ -220,7 +220,7 @@ module PacketGen
220
220
  # Payload type number
221
221
  PAYLOAD_TYPE = 44
222
222
 
223
- delete_field :content
223
+ remove_field :content
224
224
 
225
225
  # @!attribute num_ts
226
226
  # 8-bit Number of TSs
@@ -224,7 +224,7 @@ module PacketGen
224
224
  #
225
225
  # When sending packet at IP level, +checksum+ and +length+ fields are set by
226
226
  # kernel, so bad IP packets cannot be sent this way. To do so, use {Eth#to_w}.
227
- # @param [String,nil] iface interface name. Not used
227
+ # @param [String,nil] _iface interface name. Not used
228
228
  # @return [void]
229
229
  def to_w(_iface=nil)
230
230
  sock = Socket.new(Socket::AF_INET, Socket::SOCK_RAW, Socket::IPPROTO_RAW)
@@ -109,8 +109,8 @@ module PacketGen
109
109
 
110
110
  # End-of-option-List IP option
111
111
  class EOL < Option
112
- delete_field :length
113
- delete_field :data
112
+ remove_field :length
113
+ remove_field :data
114
114
  end
115
115
 
116
116
  # No OPeration IP option
@@ -119,7 +119,7 @@ module PacketGen
119
119
 
120
120
  # Loose Source and Record Route IP option
121
121
  class LSRR < Option
122
- delete_field :data
122
+ remove_field :data
123
123
 
124
124
  # @!attribute pointer
125
125
  # 8-bit pointer on next address
@@ -165,7 +165,7 @@ module PacketGen
165
165
 
166
166
  # Stream Identifier IP option
167
167
  class SI < Option
168
- delete_field :data
168
+ remove_field :data
169
169
 
170
170
  # @!attribute id
171
171
  # 16-bit stream ID
@@ -175,7 +175,7 @@ module PacketGen
175
175
 
176
176
  # Router Alert IP option
177
177
  class RA < Option
178
- delete_field :data
178
+ remove_field :data
179
179
 
180
180
  # @!attribute value
181
181
  # 16-bit value. Should be 0.
@@ -107,7 +107,7 @@ module PacketGen
107
107
  # @author Sylvain Daubert
108
108
  class HopByHop < Extension
109
109
  # redefine options field
110
- delete_field :options
110
+ remove_field :options
111
111
  # @!attribute options
112
112
  # Specific options of extension header
113
113
  # @return [Options]
@@ -25,7 +25,7 @@ module PacketGen
25
25
  # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
26
26
  # | ... |
27
27
  # This paylod is implemented as a unique field: {#lsas}, which is an
28
- # {ArrayOfLSAHeader} object.
28
+ # {ArrayOfLSA} object.
29
29
  #
30
30
  # == Create a LSAck payload
31
31
  # # standalone
@@ -43,7 +43,7 @@ module PacketGen
43
43
  class LSAck < Base
44
44
  # @!attribute lsas
45
45
  # Array of LSA headers
46
- # @return [ArrayOfLSAHeader]
46
+ # @return [ArrayOfLSA]
47
47
  define_field :lsas, ArrayOfLSA, builder: ->(_h, t) { t.new(only_headers: true) }
48
48
  end
49
49
  end
@@ -137,7 +137,7 @@ module PacketGen
137
137
 
138
138
  # TFTP Read Request header
139
139
  class RRQ < TFTP
140
- delete_field :body
140
+ remove_field :body
141
141
 
142
142
  # @!attribute filename
143
143
  # Filename to access
@@ -163,7 +163,7 @@ module PacketGen
163
163
 
164
164
  # TFTP ACK header
165
165
  class ACK < TFTP
166
- delete_field :body
166
+ remove_field :body
167
167
 
168
168
  # @!attribute block_num
169
169
  # 16-bit block number
@@ -173,7 +173,7 @@ module PacketGen
173
173
 
174
174
  # TFTP ERROR header
175
175
  class ERROR < TFTP
176
- delete_field :body
176
+ remove_field :body
177
177
 
178
178
  # @!attribute error_code
179
179
  # 16-bit error code
@@ -105,8 +105,11 @@ module PacketGen
105
105
  # @param [Class] klass
106
106
  # @return [void]
107
107
  def self.inherited(klass)
108
+ field_defs = {}
109
+ @field_defs.each do |k, v|
110
+ field_defs[k] = v.clone
111
+ end
108
112
  ordered = @ordered_fields.clone
109
- field_defs = @field_defs.clone
110
113
  bf = @bit_fields.clone
111
114
  klass.class_eval do
112
115
  @ordered_fields = ordered
@@ -208,16 +211,43 @@ module PacketGen
208
211
  @ordered_fields[idx + 1, 0] = name
209
212
  end
210
213
 
211
- # Delete a previously defined field
214
+ # Remove a previously defined field
212
215
  # @param [Symbol] name
213
216
  # @return [void]
214
- def self.delete_field(name)
217
+ # @since 2.8.4
218
+ def self.remove_field(name)
215
219
  @ordered_fields.delete name
216
220
  @field_defs.delete name
217
221
  undef_method name
218
222
  undef_method "#{name}="
219
223
  end
220
224
 
225
+ # Delete a previously defined field
226
+ # @param [Symbol] name
227
+ # @return [void]
228
+ # @deprecated Use {.remove_field} instead.
229
+ # @since 2.8.4 deprecated
230
+ def self.delete_field(name)
231
+ Deprecation.deprecated(self, __method__, 'remove_field', klass_method: true)
232
+ remove_field name
233
+ end
234
+ # Update a previously defined field
235
+ # @param [Symbol] field field name to create
236
+ # @param [Hash] options See {.define_field}.
237
+ # @return [void]
238
+ # @see .define_field
239
+ # @raise [ArgumentError] unknown +field+
240
+ # @since 2.8.4
241
+ def self.update_field(field, options)
242
+ raise ArgumentError, "unkown #{field} field for #{self}" unless @field_defs.key?(field)
243
+
244
+ @field_defs[field][1] = options.delete(:default) if options.key?(:default)
245
+ @field_defs[field][2] = options.delete(:builder) if options.key?(:builder)
246
+ @field_defs[field][3] = options.delete(:optional) if options.key?(:optional)
247
+ @field_defs[field][4] = options.delete(:enum) if options.key?(:enum)
248
+ @field_defs[field][5].merge!(options)
249
+ end
250
+
221
251
  # Define a bitfield on given attribute
222
252
  # class MyHeader < PacketGen::Types::Fields
223
253
  # define_field :flags, Types::Int16
@@ -296,6 +326,20 @@ module PacketGen
296
326
  end
297
327
  end
298
328
 
329
+ # Remove all bit fields defined on +attr+
330
+ # @param [Symbol] attr attribute defining bit fields
331
+ # @return [void]
332
+ # @since 2.8.4
333
+ def self.remove_bit_fields_on(attr)
334
+ fields = @bit_fields.delete(attr)
335
+ return if fields.nil?
336
+
337
+ fields.each do |field, size|
338
+ undef_method "#{field}="
339
+ undef_method(size == 1 ? "#{field}?" : "#{field}")
340
+ end
341
+ end
342
+
299
343
  # Create a new header object
300
344
  # @param [Hash] options Keys are symbols. They should have name of object
301
345
  # attributes, as defined by {.define_field} and by {.define_bit_fields_on}.
@@ -36,7 +36,7 @@ module PacketGen
36
36
  self
37
37
  end
38
38
 
39
- # @param [Integer] l
39
+ # @param [Integer] len
40
40
  # @return [Integer]
41
41
  def length=(len)
42
42
  @length.read len
@@ -48,7 +48,7 @@ module PacketGen
48
48
  @length.to_i
49
49
  end
50
50
 
51
- # @param [#to_s] s
51
+ # @param [#to_s] str
52
52
  # @return [String]
53
53
  def string=(str)
54
54
  @length.value = str.to_s.size
@@ -74,7 +74,7 @@ module PacketGen
74
74
  # @note This method is provided for test purpose.
75
75
  # For more control, see {ARPSpoofer} class.
76
76
  # @param [String] target_ip target IP address
77
- # @param [String] spoofed_ip IP address to spoofed_ip
77
+ # @param [String] spoofed_ip IP address to spoof
78
78
  # @param [Hash] options
79
79
  # @option options [String] :mac MAC address used to poison target
80
80
  # ARP cache. Default to local MAC address.
@@ -87,7 +87,7 @@ module PacketGen
87
87
  # @return [void]
88
88
  def self.arp_spoof(target_ip, spoofed_ip, options={})
89
89
  interval = options[:interval] || 1.0
90
- as = ARPSpoofer.new(for_seconds: options[:for_seconds], interval: interval,
90
+ as = ARPSpoofer.new(timeout: options[:for_seconds], interval: interval,
91
91
  iface: options[:iface])
92
92
  as.start(target_ip, spoofed_ip, mac: options[:mac])
93
93
  as.wait
@@ -122,6 +122,9 @@ module PacketGen
122
122
  def self.mitm(target1, target2, options={})
123
123
  options = { iface: PacketGen.default_iface }.merge(options)
124
124
 
125
+ mac1 = arp(target1)
126
+ mac2 = arp(target2)
127
+
125
128
  spoofer = Utils::ARPSpoofer.new(options)
126
129
  spoofer.add target1, target2, options
127
130
  spoofer.add target2, target1, options
@@ -138,7 +141,21 @@ module PacketGen
138
141
  spoofer.start_all
139
142
  capture.start do |pkt|
140
143
  modified_pkt = yield pkt
141
- modified_pkt.ip.to_w(options[:iface])
144
+ iph = modified_pkt.ip
145
+ l2 = modified_pkt.is?('Dot11') ? modified_pkt.dot11 : modified_pkt.eth
146
+
147
+ if (iph.dst != my_ip) && (iph.src != my_ip)
148
+ if (iph.src == target1) || (iph.dst == target2)
149
+ l2.dst = mac2
150
+ elsif (iph.src == target2) ||(iph.dst == target1)
151
+ l2.dst = mac1
152
+ else
153
+ next
154
+ end
155
+ else
156
+ next
157
+ end
158
+ modified_pkt.to_w(options[:iface])
142
159
  end
143
160
  end
144
161
  end
@@ -10,5 +10,5 @@
10
10
  # @author Sylvain Daubert
11
11
  module PacketGen
12
12
  # PacketGen version
13
- VERSION = '2.8.3'
13
+ VERSION = '2.8.4'
14
14
  end
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: 2.8.3
4
+ version: 2.8.4
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-09-26 00:00:00.000000000 Z
11
+ date: 2018-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: interfacez