packetgen 2.4.0 → 2.5.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.
Files changed (127) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +13 -4
  3. data/lib/packetgen.rb +3 -1
  4. data/lib/packetgen/capture.rb +2 -0
  5. data/lib/packetgen/config.rb +1 -0
  6. data/lib/packetgen/header.rb +5 -0
  7. data/lib/packetgen/header/arp.rb +2 -0
  8. data/lib/packetgen/header/asn1_base.rb +2 -0
  9. data/lib/packetgen/header/base.rb +16 -0
  10. data/lib/packetgen/header/bootp.rb +2 -0
  11. data/lib/packetgen/header/crypto.rb +2 -0
  12. data/lib/packetgen/header/dhcp.rb +2 -0
  13. data/lib/packetgen/header/dhcp/option.rb +3 -0
  14. data/lib/packetgen/header/dhcp/options.rb +2 -0
  15. data/lib/packetgen/header/dhcpv6.rb +109 -0
  16. data/lib/packetgen/header/dhcpv6/duid.rb +147 -0
  17. data/lib/packetgen/header/dhcpv6/option.rb +391 -0
  18. data/lib/packetgen/header/dhcpv6/options.rb +29 -0
  19. data/lib/packetgen/header/dhcpv6/relay.rb +48 -0
  20. data/lib/packetgen/header/dns.rb +10 -2
  21. data/lib/packetgen/header/dns/name.rb +7 -0
  22. data/lib/packetgen/header/dns/opt.rb +6 -0
  23. data/lib/packetgen/header/dns/option.rb +7 -0
  24. data/lib/packetgen/header/dns/qdsection.rb +7 -1
  25. data/lib/packetgen/header/dns/question.rb +7 -0
  26. data/lib/packetgen/header/dns/rr.rb +7 -0
  27. data/lib/packetgen/header/dns/rrsection.rb +7 -0
  28. data/lib/packetgen/header/dot11.rb +4 -2
  29. data/lib/packetgen/header/dot11/control.rb +2 -0
  30. data/lib/packetgen/header/dot11/data.rb +2 -0
  31. data/lib/packetgen/header/dot11/element.rb +2 -0
  32. data/lib/packetgen/header/dot11/management.rb +2 -0
  33. data/lib/packetgen/header/dot11/sub_mngt.rb +2 -0
  34. data/lib/packetgen/header/dot1q.rb +2 -0
  35. data/lib/packetgen/header/dot1x.rb +3 -1
  36. data/lib/packetgen/header/eap.rb +3 -1
  37. data/lib/packetgen/header/eap/fast.rb +2 -0
  38. data/lib/packetgen/header/eap/md5.rb +2 -0
  39. data/lib/packetgen/header/eap/tls.rb +2 -0
  40. data/lib/packetgen/header/eap/ttls.rb +2 -0
  41. data/lib/packetgen/header/esp.rb +7 -0
  42. data/lib/packetgen/header/eth.rb +2 -0
  43. data/lib/packetgen/header/gre.rb +4 -9
  44. data/lib/packetgen/header/http/headers.rb +2 -0
  45. data/lib/packetgen/header/http/request.rb +3 -1
  46. data/lib/packetgen/header/http/response.rb +3 -1
  47. data/lib/packetgen/header/icmp.rb +4 -11
  48. data/lib/packetgen/header/icmpv6.rb +4 -11
  49. data/lib/packetgen/header/igmp.rb +4 -11
  50. data/lib/packetgen/header/igmpv3.rb +4 -11
  51. data/lib/packetgen/header/igmpv3/group_record.rb +2 -0
  52. data/lib/packetgen/header/igmpv3/mq.rb +2 -0
  53. data/lib/packetgen/header/igmpv3/mr.rb +2 -0
  54. data/lib/packetgen/header/ike.rb +13 -6
  55. data/lib/packetgen/header/ike/auth.rb +2 -0
  56. data/lib/packetgen/header/ike/cert.rb +2 -0
  57. data/lib/packetgen/header/ike/certreq.rb +2 -0
  58. data/lib/packetgen/header/ike/id.rb +2 -0
  59. data/lib/packetgen/header/ike/ke.rb +2 -0
  60. data/lib/packetgen/header/ike/nonce.rb +2 -0
  61. data/lib/packetgen/header/ike/notify.rb +7 -0
  62. data/lib/packetgen/header/ike/payload.rb +9 -0
  63. data/lib/packetgen/header/ike/sa.rb +11 -4
  64. data/lib/packetgen/header/ike/sk.rb +7 -0
  65. data/lib/packetgen/header/ike/ts.rb +2 -0
  66. data/lib/packetgen/header/ike/vendor_id.rb +2 -0
  67. data/lib/packetgen/header/ip.rb +48 -11
  68. data/lib/packetgen/header/ip/addr.rb +8 -0
  69. data/lib/packetgen/header/ip/option.rb +2 -0
  70. data/lib/packetgen/header/ip/options.rb +2 -0
  71. data/lib/packetgen/header/ipv6.rb +5 -3
  72. data/lib/packetgen/header/ipv6/addr.rb +8 -0
  73. data/lib/packetgen/header/ipv6/extension.rb +2 -0
  74. data/lib/packetgen/header/ipv6/hop_by_hop.rb +2 -0
  75. data/lib/packetgen/header/llc.rb +2 -0
  76. data/lib/packetgen/header/mld.rb +2 -0
  77. data/lib/packetgen/header/mldv2.rb +4 -2
  78. data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -1
  79. data/lib/packetgen/header/mldv2/mlq.rb +2 -0
  80. data/lib/packetgen/header/mldv2/mlr.rb +4 -2
  81. data/lib/packetgen/header/ospfv2.rb +249 -0
  82. data/lib/packetgen/header/ospfv2/db_description.rb +105 -0
  83. data/lib/packetgen/header/ospfv2/hello.rb +104 -0
  84. data/lib/packetgen/header/ospfv2/ls_ack.rb +55 -0
  85. data/lib/packetgen/header/ospfv2/ls_request.rb +90 -0
  86. data/lib/packetgen/header/ospfv2/ls_update.rb +72 -0
  87. data/lib/packetgen/header/ospfv2/lsa.rb +252 -0
  88. data/lib/packetgen/header/ospfv2/lsa_header.rb +122 -0
  89. data/lib/packetgen/header/ospfv3.rb +216 -0
  90. data/lib/packetgen/header/ospfv3/db_description.rb +114 -0
  91. data/lib/packetgen/header/ospfv3/hello.rb +104 -0
  92. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +103 -0
  93. data/lib/packetgen/header/ospfv3/ls_ack.rb +51 -0
  94. data/lib/packetgen/header/ospfv3/ls_request.rb +108 -0
  95. data/lib/packetgen/header/ospfv3/ls_update.rb +74 -0
  96. data/lib/packetgen/header/ospfv3/lsa.rb +252 -0
  97. data/lib/packetgen/header/ospfv3/lsa_header.rb +123 -0
  98. data/lib/packetgen/header/snmp.rb +2 -0
  99. data/lib/packetgen/header/tcp.rb +14 -14
  100. data/lib/packetgen/header/tcp/option.rb +7 -1
  101. data/lib/packetgen/header/tcp/options.rb +7 -0
  102. data/lib/packetgen/header/tftp.rb +2 -0
  103. data/lib/packetgen/header/udp.rb +6 -14
  104. data/lib/packetgen/inspect.rb +5 -1
  105. data/lib/packetgen/packet.rb +3 -1
  106. data/lib/packetgen/pcapng.rb +2 -0
  107. data/lib/packetgen/pcapng/block.rb +2 -0
  108. data/lib/packetgen/pcapng/epb.rb +2 -0
  109. data/lib/packetgen/pcapng/file.rb +2 -0
  110. data/lib/packetgen/pcapng/idb.rb +2 -0
  111. data/lib/packetgen/pcapng/shb.rb +2 -0
  112. data/lib/packetgen/pcapng/spb.rb +2 -0
  113. data/lib/packetgen/pcapng/unknown_block.rb +2 -0
  114. data/lib/packetgen/proto.rb +2 -0
  115. data/lib/packetgen/types/array.rb +3 -0
  116. data/lib/packetgen/types/cstring.rb +3 -1
  117. data/lib/packetgen/types/enum.rb +2 -0
  118. data/lib/packetgen/types/fields.rb +8 -4
  119. data/lib/packetgen/types/int.rb +3 -1
  120. data/lib/packetgen/types/int_string.rb +2 -0
  121. data/lib/packetgen/types/oui.rb +2 -0
  122. data/lib/packetgen/types/string.rb +3 -0
  123. data/lib/packetgen/types/tlv.rb +8 -0
  124. data/lib/packetgen/utils.rb +6 -4
  125. data/lib/packetgen/utils/arp_spoofer.rb +2 -0
  126. data/lib/packetgen/version.rb +3 -1
  127. metadata +25 -3
@@ -0,0 +1,391 @@
1
+ # This file is part of PacketGen
2
+ # See https://github.com/sdaubert/packetgen for more informations
3
+ # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
+ # This program is published under MIT license.
5
+
6
+ # frozen_string_literal: true
7
+
8
+ module PacketGen
9
+ module Header
10
+ class DHCPv6
11
+
12
+ # A DHCPv6 consists of:
13
+ # * a {#type} ({Types::Int16}),
14
+ # * a {#length} ({Types::Int16}),
15
+ # * and a {#data} ({Types::String}).
16
+ #
17
+ # Subclasses handles known options. These subclasses may remove {#data}
18
+ # field to replace it by specific option field(s).
19
+ # @author Sylvain Daubert
20
+ class Option < Types::Fields
21
+
22
+ # @!attribute type
23
+ # 16-bit option type
24
+ # @return [Integer]
25
+ define_field :type, Types::Int16
26
+ # @!attribute length
27
+ # 16-bit option length
28
+ # @return [Integer]
29
+ define_field :length, Types::Int16
30
+ # @!attribute data
31
+ # variable length option data.
32
+ # @return [String]
33
+ define_field :data, Types::String,
34
+ builder: ->(h,t) { t.new(length_from: h[:length]) }
35
+
36
+ class << self
37
+ # Get Option subclasses
38
+ # @return [Hash]
39
+ def subclasses
40
+ return @klasses if defined? @klasses
41
+ @klasses = []
42
+ DHCPv6.constants.each do |cst|
43
+ klass = DHCPv6.const_get(cst)
44
+ next unless klass.is_a?(Class) and klass < Option
45
+ @klasses[klass.new.type] = klass
46
+ end
47
+ @klasses
48
+ end
49
+
50
+ # Create a new Option object (or a subclass)
51
+ # @param [Hash] options
52
+ # @return [Option]
53
+ def new(options={})
54
+ if self == Option
55
+ case options[:type]
56
+ when Integer
57
+ klass = Option.subclasses[options[:type]]
58
+ klass.new(options) if klass
59
+ when String
60
+ if DHCPv6.const_defined?(options[:type])
61
+ klass = DHCPv6.const_get(options[:type])
62
+ options.delete :type
63
+ klass.new(options) if klass < Option
64
+ end
65
+ else
66
+ super
67
+ end
68
+ else
69
+ super
70
+ end
71
+ end
72
+ end
73
+
74
+ # Create an Option
75
+ # @param [Hash] options
76
+ def initialize(options={})
77
+ if self.class.const_defined?(:TYPE) and options[:type].nil?
78
+ options[:type] = self.class.const_get(:TYPE)
79
+ end
80
+ if options[:data]
81
+ options[:length] = options[:data].to_s.size
82
+ end
83
+ super
84
+ if options[:data].nil?
85
+ self.length = self.sz - 4
86
+ end
87
+ end
88
+
89
+ alias private_read read
90
+ private :private_read
91
+
92
+ # Populate object from binary string
93
+ # @param [String] str
94
+ # @return [Option]
95
+ def read(str)
96
+ if self.class == Option
97
+ return self if str.nil?
98
+ PacketGen.force_binary str
99
+ type = Types::Int16.new.read(str).to_i
100
+ klass = Option.subclasses[type]
101
+ if klass
102
+ klass.new.read(str)
103
+ else
104
+ private_read str
105
+ end
106
+ else
107
+ private_read str
108
+ end
109
+ end
110
+
111
+ # Get human-readable {#type}
112
+ # @return [String]
113
+ def human_type
114
+ if self.class == Option
115
+ "option#{type}"
116
+ else
117
+ self.class.to_s.sub(/.*::/, '')
118
+ end
119
+ end
120
+
121
+ # Get a human-readable string for this option
122
+ # @return [String]
123
+ def to_human
124
+ str = "#{human_type}:".dup
125
+ if respond_to? :human_data and human_data.size > 0
126
+ str << human_data
127
+ elsif !self[:data].nil?
128
+ str << data.inspect
129
+ else
130
+ # No data: only give option name
131
+ human_type
132
+ end
133
+ end
134
+ end
135
+
136
+ # DHCPv6 Client ID option
137
+ # @author Sylvain Daubert
138
+ class ClientID < Option
139
+ # Option type value
140
+ TYPE = 1
141
+
142
+ delete_field :data
143
+ undef data
144
+ undef data=
145
+
146
+ # @!attribute duid
147
+ # @return [DUID]
148
+ define_field :duid, DUID
149
+
150
+ # Get human-readable data (DUID)
151
+ # @return [String]
152
+ def human_data
153
+ self[:duid].to_human
154
+ end
155
+ end
156
+
157
+ # DHCPv6 Server ID option
158
+ # @author Sylvain Daubert
159
+ class ServerID < ClientID
160
+ # Option type value
161
+ TYPE = 2
162
+ end
163
+
164
+ # DHCPv6 Identity Association for Non-temporary Addresses Option
165
+ # @author Sylvain Daubert
166
+ class IANA < Option
167
+ # Option type value
168
+ TYPE = 3
169
+
170
+ delete_field :data
171
+ undef data
172
+ undef data=
173
+
174
+ # @!attribute iaid
175
+ # 32-bit IAID field
176
+ # @return [Integer]
177
+ define_field :iaid, Types::Int32
178
+ # @!attribute t1
179
+ # 32-bit T1 field
180
+ # @return [Integer]
181
+ define_field :t1, Types::Int32
182
+ # @!attribute t2
183
+ # 32-bit T2 field
184
+ # @return [Integer]
185
+ define_field :t2, Types::Int32
186
+ # @!attribute options
187
+ # options field
188
+ # @return [String]
189
+ define_field :options, Types::String,
190
+ builder: ->(h,t) { t.new length_from: ->() { h[:length].to_i - 12 } }
191
+
192
+ # Get human-readable data (IAID, T1 and T2)
193
+ # @return [String]
194
+ def human_data
195
+ "%#x,%u,%u" % [iaid, t1, t2]
196
+ end
197
+ end
198
+
199
+ # DHCPv6 Identity Association for Temporary Addresses Option
200
+ # @author Sylvain Daubert
201
+ class IATA < Option
202
+ # Option type value
203
+ TYPE = 4
204
+
205
+ delete_field :data
206
+ undef data
207
+ undef data=
208
+
209
+ # @!attribute iaid
210
+ # 32-bit IAID field
211
+ # @return [Integer]
212
+ define_field :iaid, Types::Int32
213
+ # @!attribute options
214
+ # options field
215
+ # @return [String]
216
+ define_field :options, Types::String,
217
+ builder: ->(h,t) { t.new length_from: ->() { h[:length].to_i - 4 } }
218
+
219
+ # Get human-readable data (IAID)
220
+ # @return [String]
221
+ def human_data
222
+ "%#x" % iaid
223
+ end
224
+ end
225
+
226
+ # DHCPv6 IA Address option
227
+ # @author Sylvain Daubert
228
+ class IAAddr < Option
229
+ # Option type value
230
+ TYPE = 5
231
+
232
+ delete_field :data
233
+ undef data
234
+ undef data=
235
+
236
+ # @attribute ipv6
237
+ # IPv6 address
238
+ # @return [IPv6::Addr]
239
+ define_field :ipv6, IPv6::Addr
240
+ # @attribute preferred_lifetime
241
+ # 32-bit preferred lifetime
242
+ # @return [Integer]
243
+ define_field :preferred_lifetime, Types::Int32
244
+ # @attribute valid_lifetime
245
+ # 32-bit valid lifetime
246
+ # @return [Integer]
247
+ define_field :valid_lifetime, Types::Int32
248
+ # @!attribute options
249
+ # options field
250
+ # @return [String]
251
+ define_field :options, Types::String,
252
+ builder: ->(h,t) { t.new length_from: ->() { h[:length].to_i - 24 } }
253
+
254
+ # Get human-readable data (ipv6, preferred lifetime and valid lifetime)
255
+ # @return [String]
256
+ def human_data
257
+ "#{ipv6},#{preferred_lifetime},#{valid_lifetime}"
258
+ end
259
+ end
260
+
261
+ # List of requested options for {ORO} option.
262
+ # Set of {Types::Int16}
263
+ # @author Sylvain Daubert
264
+ class RequestedOptions < Types::Array
265
+ set_of Types::Int16
266
+ end
267
+
268
+ # DHCPv6 Option Request Option
269
+ # @author Sylvain Daubert
270
+ class ORO < Option
271
+ # Option type value
272
+ TYPE = 6
273
+
274
+ delete_field :data
275
+ undef data
276
+ undef data=
277
+
278
+ # @!attribute options
279
+ # @return [RequestedOptions]
280
+ define_field :options, RequestedOptions
281
+
282
+ # Populate object from +str+
283
+ # @param [String] str
284
+ # @return [self]
285
+ def read(str)
286
+ self[:type].read str[0, 2]
287
+ self[:length].read str[2, 2]
288
+ self[:options].read str[4, self.length]
289
+ self
290
+ end
291
+
292
+ # Get human-readable data
293
+ # @return [String]
294
+ def human_data
295
+ self[:options].to_human
296
+ end
297
+ end
298
+
299
+ # DHCPv6 Preference option
300
+ # @author Sylvain Daubert
301
+ class Preference < Option
302
+ # Option type value
303
+ TYPE = 7
304
+
305
+ delete_field :data
306
+ undef data
307
+ undef data=
308
+
309
+ # @!attribute value
310
+ # 8-bit value
311
+ # @return [Integer]
312
+ define_field :value, Types::Int8
313
+
314
+ # Get human-readable data (value)
315
+ # @return [String]
316
+ def human_data
317
+ value.to_s
318
+ end
319
+ end
320
+
321
+ # DHCPv6 Elapsed Time option
322
+ # @author Sylvain Daubert
323
+ class ElapsedTime < Option
324
+ # Option type value
325
+ TYPE = 8
326
+
327
+ delete_field :data
328
+ undef data
329
+ undef data=
330
+
331
+ # @!attribute value
332
+ # 16-bit value
333
+ # @return [Integer]
334
+ define_field :value, Types::Int16
335
+
336
+ # Get human-readable data (value)
337
+ # @return [String]
338
+ def human_data
339
+ value.to_s
340
+ end
341
+ end
342
+
343
+ # DHCPv6 Relay Message option
344
+ # @author Sylvain Daubert
345
+ class RelayMessage < Option
346
+ # Option type value
347
+ TYPE = 9
348
+ end
349
+
350
+ # DHCPv6 Server Unicast option
351
+ # @author Sylvain Daubert
352
+ class ServerUnicast < Option
353
+ # Option type value
354
+ TYPE = 12
355
+
356
+ delete_field :data
357
+ undef data
358
+ undef data=
359
+
360
+ # @!attribute addr
361
+ # IPv6 server address
362
+ # @return [IPv6::Addr]
363
+ define_field :addr, IPv6::Addr
364
+
365
+ # Get human-readable data (addr)
366
+ # @return [String]
367
+ def human_data
368
+ addr
369
+ end
370
+ end
371
+
372
+ # DHCPv6 Status Code option
373
+ # @author Sylvain Daubert
374
+ class StatusCode < ElapsedTime
375
+ # Option type value
376
+ TYPE = 13
377
+ end
378
+
379
+ # DHCPv6 Rapid Commit option
380
+ # @author Sylvain Daubert
381
+ class RapidCommit < Option
382
+ # Option type value
383
+ TYPE = 14
384
+
385
+ delete_field :data
386
+ undef data
387
+ undef data=
388
+ end
389
+ end
390
+ end
391
+ end
@@ -0,0 +1,29 @@
1
+ # This file is part of PacketGen
2
+ # See https://github.com/sdaubert/packetgen for more informations
3
+ # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
+ # This program is published under MIT license.
5
+
6
+ # frozen_string_literal: true
7
+
8
+ module PacketGen
9
+ module Header
10
+ class DHCPv6
11
+ # Container class for DHCPv6 {Option options}.
12
+ #
13
+ # == Add DHCPv6 options to an +Options+ instance
14
+ # options = PacketGen::Header::DHCP::Options.new
15
+ # # Add an ElapsedTime option
16
+ # options << { type: 'ElapsedTime', value: 3600 }
17
+ # # Add a ClientID. Here, use integer type
18
+ # duid = PacketGen::Header::DHCPv6::DUID_LL.new(link_addr: '08:00:27:fe:8f:95')
19
+ # options << { type: 1, duid: duid }
20
+ # @author Sylvain Daubert
21
+ class Options < Types::Array
22
+ set_of DHCPv6::Option
23
+
24
+ # Separator used in {#to_human}.
25
+ HUMAN_SEPARATOR = ';'
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,48 @@
1
+ # This file is part of PacketGen
2
+ # See https://github.com/sdaubert/packetgen for more informations
3
+ # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
+ # This program is published under MIT license.
5
+
6
+ # frozen_string_literal: true
7
+
8
+ module PacketGen
9
+ module Header
10
+ class DHCPv6
11
+ # DHCPv6 Relay agent / server header
12
+ # @author Sylvain Daubert
13
+ class Relay < Base
14
+ # DHCPv6 Relay message types
15
+ MESSAGE_TYPES = {
16
+ 'RELAY-FORW' => 12,
17
+ 'RELAY-REPL' => 13
18
+ }
19
+
20
+ # @!attribute msg_type
21
+ # 8-bit message type
22
+ # @return [Integer]
23
+ define_field :msg_type, Types::Int8Enum, enum: MESSAGE_TYPES
24
+ # @!attribute hop_count
25
+ # 8-bit hop count (number of relay agents that have relayed
26
+ # this message)
27
+ # @return [Integer]
28
+ define_field :hop_count, Types::Int8
29
+ # @!attribute link
30
+ # Link address: address that will be used by the server to identify
31
+ # the link on which the client is located
32
+ # @return [IPv6::Addr]
33
+ define_field :link, IPv6::Addr
34
+ # @!attribute peer
35
+ # Peer address: the address of the client or relay agent from which
36
+ # the message to be relayed was received
37
+ # @return [IPv6::Addr]
38
+ define_field :peer, IPv6::Addr
39
+ # @!attribute options
40
+ # @return [DHCPv6::Options]
41
+ define_field :options, DHCPv6::Options
42
+ end
43
+ end
44
+
45
+ UDP.bind_header DHCPv6::Relay, sport: DHCPv6::UDP_CLIENT_PORT, dport: DHCPv6::UDP_SERVER_PORT
46
+ UDP.bind_header DHCPv6::Relay, sport: DHCPv6::UDP_SERVER_PORT, dport: DHCPv6::UDP_CLIENT_PORT
47
+ end
48
+ end