packetgen-plugin-smb 0.4.0 → 0.5.0

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: f3f0164d4068b3b829fac802f5ce944c33bf86275fb90aa46150e57926a236f3
4
- data.tar.gz: 001d57bf0ec000e0e738b25d1116ea0b73bc7a2c0de61b68e6c16ef75a130d4b
3
+ metadata.gz: 7aaeb4b048754ed60fdb9f88a6d82dec247a993056617765e48e047d312d0962
4
+ data.tar.gz: 9c5da64aa7a58e9e7971554cdf435c08b085e2b63f81bacd9d36a19e9b610ac5
5
5
  SHA512:
6
- metadata.gz: 661c09099b29c3c747e5b4d1831b05fb3945123e1d5ff7aaabc053221c100ed1113fd04a72af5fdbc245a9d0789419f6b6fc1c8a37a558c64da53ef1b30c4e8e
7
- data.tar.gz: 06b857556ca716b954a4fb935ec3e6e91ab2a0416442b31e3ad7e9eec7631fe33d6c3bb96814fd949fbffd2d58c97fc80fbbd18dd4b66cd5a603663f58169bb9
6
+ metadata.gz: e261d4a050ed4a8ed34a51d106bacc519279256bc95bb75e0998947c6365bf008f4f7e43103b9f86b9526efafd0ee18e5cdb1f9f260fe94e052b309555552b50
7
+ data.tar.gz: 1c1e0fa328e1272a45ab699168b8cc246df7bf4520f4e2a82d2378ff89706e308dfbd57f50ecd1567800e905959a2672bce3756d1e1d6a59c8838198ae4dde92
data/.rubocop.yml CHANGED
@@ -8,6 +8,8 @@ Metrics:
8
8
  Enabled: false
9
9
  Style/AsciiComments:
10
10
  Enabled: false
11
+ Style/ClassAndModuleChildren:
12
+ Enabled: false
11
13
  Style/Encoding:
12
14
  Enabled: false
13
15
  Style/EvalWithLocation:
@@ -75,7 +75,7 @@ module PacketGen::Plugin
75
75
  content: [sequence_of(:mech_types, RASN1::Types::ObjectId, explicit: 0, class: :context),
76
76
  bit_string(:req_flags, explicit: 1, class: :context, constructed: true, optional: true),
77
77
  octet_string(:mech_token, explicit: 2, class: :context, constructed: true, optional: true),
78
- octet_string(:mech_list_mic, explicit: 3, class: :context, constructed: true, optional: true)]
78
+ any(:mech_list_mic, explicit: 3, class: :context, constructed: true, optional: true)]
79
79
  end
80
80
 
81
81
  # GSS API Negotiation Token Response
@@ -122,5 +122,7 @@ module PacketGen::Plugin
122
122
  def sz
123
123
  to_der.size
124
124
  end
125
+
126
+ alias to_s to_der
125
127
  end
126
128
  end
@@ -0,0 +1,58 @@
1
+ # This file is part of packetgen-plugin-smb.
2
+ # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
+ # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
+ # This program is published under MIT license.
5
+
6
+ # frozen_string_literal: true
7
+
8
+ module PacketGen::Plugin
9
+ # Link-Local Multicast Name Resolution (LLMNR) header ({https://tools.ietf.org/html/rfc4795 RFC 4795}).
10
+ # @author Sylvain Daubert
11
+ class LLMNR < PacketGen::Header::DNS
12
+ # UDP port number
13
+ UDP_PORT = 5355
14
+ # MAC address used with IPv4 multicast addresses
15
+ MAC_IPV4_MCAST = '01:00:5e:00:00:fc'
16
+
17
+ # @api private
18
+ # @note This method is used internally by PacketGen and should not be
19
+ # directly called
20
+ def added_to_packet(packet)
21
+ packet.instance_eval <<-END_OF_DEFINITION
22
+ def llmnrize(**kwargs)
23
+ llmnr = headers.find { |hdr| hdr.is_a? PacketGen::Plugin::LLMNR }
24
+ llmnr.llmnrize(**kwargs)
25
+ end
26
+ END_OF_DEFINITION
27
+ end
28
+
29
+ # Fixup IP header according to RFC 4795:
30
+ # * optionally set destination address,
31
+ # * set TTL to 1 if destination is a mcast address,
32
+ # * set MAC destination address to {MAC_IPV4_MCAST} if destination address is a mcast one.
33
+ # This method may be called as:
34
+ # # first way
35
+ # pkt.llmnr.llmnrize
36
+ # # second way
37
+ # pkt.llmnrize
38
+ # @param [String,nil] dst destination address. May be a dotted IP
39
+ # address (by example '224.0.0.252').
40
+ # @return [void]
41
+ def llmnrize(dst: nil)
42
+ ip = ip_header(self)
43
+ ip.dst = dst unless dst.nil?
44
+ ip.ttl = 1 if ip[:dst].mcast?
45
+
46
+ # rubocop:disable Lint/HandleExceptions
47
+ begin
48
+ llh = ll_header(self)
49
+ llh.dst = MAC_IPV4_MCAST if ip[:dst].mcast?
50
+ rescue PacketGen::FormatError
51
+ end
52
+ # rubocop:enable Lint/HandleExceptions
53
+ end
54
+ end
55
+ PacketGen::Header.add_class LLMNR
56
+ PacketGen::Header::UDP.bind LLMNR, sport: LLMNR::UDP_PORT
57
+ PacketGen::Header::UDP.bind LLMNR, dport: LLMNR::UDP_PORT
58
+ end
@@ -59,6 +59,7 @@ module PacketGen::Plugin
59
59
  def added_to_packet(packet)
60
60
  return unless packet.is? 'TCP'
61
61
  return unless packet.tcp.sport.zero?
62
+
62
63
  packet.tcp.sport = TCP_PORT
63
64
  end
64
65
  end
@@ -67,5 +68,5 @@ module PacketGen::Plugin
67
68
  PacketGen::Header::TCP.bind Session, sport: Session::TCP_PORT
68
69
  PacketGen::Header::TCP.bind Session, dport: Session::TCP_PORT2
69
70
  PacketGen::Header::TCP.bind Session, sport: Session::TCP_PORT2
70
- end
71
+ end
71
72
  end
@@ -42,6 +42,4 @@ module PacketGen::Plugin
42
42
  end
43
43
  end
44
44
  end
45
- PacketGen::Header.add_class SMB::Blocks
46
- SMB.bind SMB::Blocks
47
45
  end
@@ -0,0 +1,32 @@
1
+ module PacketGen::Plugin
2
+ class SMB
3
+ module Negotiate
4
+ # A SMB_Dialect struct containing:
5
+ # * a 8-bit {#format} field, which should be set to 0x02,
6
+ # * a null-terminated string identifying a SMB dialect.
7
+ # @author Sylvain Daubert
8
+ class Dialect < PacketGen::Types::Fields
9
+ # @!attribute format
10
+ # 8-bit format. Should be +2+ to indicate a null-terminated string for
11
+ # {#dialect} field.
12
+ # @return [Integer]
13
+ define_field :format, PacketGen::Types::Int8, default: 2
14
+ # @!attribute dialect
15
+ # Null-terminated string identifying a SMB dialect.
16
+ # @return [String]
17
+ define_field :dialect,PacketGen::Types::CString
18
+
19
+ # @return [String]
20
+ def to_human
21
+ self[:dialect].to_human
22
+ end
23
+ end
24
+
25
+ # Specialized {PacketGen::Types::Array} to embed {Dialect Dialects}.
26
+ # @author Sylvain Daubert
27
+ class ArrayOfDialect < PacketGen::Types::Array
28
+ set_of Dialect
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,28 @@
1
+ module PacketGen::Plugin
2
+ class SMB
3
+ module Negotiate
4
+ # SMB Negotiation Request header.
5
+ #
6
+ # See also {Blocks}, as {Negotiate::Request} is a specialization of {Blocks#words}
7
+ # and {Blocks#bytes}.
8
+ # @author Sylvain Daubert
9
+ class Request < PacketGen::Header::Base
10
+ # @!attribute word_count
11
+ # The size, in 2-byte words, of the SMB command parameters. It should
12
+ # be +0+ setup_count+.
13
+ # @return [Integer]
14
+ define_field :word_count, PacketGen::Types::Int8, default: 0
15
+ # @!attribute byte_count
16
+ # @return [Integer]
17
+ define_field :byte_count, PacketGen::Types::Int16le
18
+ # @!attribute dialects
19
+ # @return [ArrayOfDialect]
20
+ define_field :dialects, ArrayOfDialect
21
+
22
+ def self.protocol_name
23
+ 'SMB::Negotiate::Request'
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,23 @@
1
+ module PacketGen::Plugin
2
+ class SMB
3
+ module Negotiate
4
+ # SMB Negotiation Response header.
5
+ #
6
+ # See also {Blocks}, as {Negotiate::Rersponse} is a specialization of {Blocks#words}
7
+ # and {Blocks#bytes}.
8
+ # @author Sylvain Daubert
9
+ class Response < Blocks
10
+
11
+ # Get index of the dialect selected by the server from the list presented in the request.
12
+ # @return [Integer]
13
+ def dialect_index
14
+ words.first.to_i
15
+ end
16
+
17
+ def self.protocol_name
18
+ 'SMB::Negotiate::Response'
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ # This file is part of packetgen-plugin-smb.
2
+ # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
+ # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
+ # This program is published under MIT license.
5
+
6
+ # frozen_string_literal: true
7
+
8
+ module PacketGen::Plugin
9
+ class SMB
10
+ # Namespace for NEGOTIATE related classes
11
+ # @author Sylvain Daubert
12
+ module Negotiate; end
13
+ end
14
+ end
15
+
16
+ require_relative 'negotiate/dialect'
17
+ require_relative 'negotiate/request'
18
+ require_relative 'negotiate/response'
19
+
20
+ PacketGen::Plugin::SMB.bind_command 'negotiate'
@@ -171,6 +171,13 @@ module PacketGen::Plugin
171
171
  self.bind kresponse, command: SMB::COMMANDS[command], flags: ->(v) { v.nil? ? 0 : (v & 0x80 == 0x80) }
172
172
  end
173
173
 
174
+ # Check if this is really a SMB2 header. Check {#protocol} has value {MARKER}.
175
+ # @return [Boolean]
176
+ def parse?
177
+ protocol == MARKER
178
+ end
179
+
180
+ # @return [String]
174
181
  def inspect
175
182
  super do |attr|
176
183
  case attr
@@ -196,8 +203,13 @@ end
196
203
 
197
204
  require_relative 'smb/string'
198
205
  require_relative 'smb/filetime'
206
+ require_relative 'smb/blocks'
199
207
  require_relative 'smb/close'
200
208
  require_relative 'smb/trans'
201
209
  require_relative 'smb/nt_create_and_x'
210
+ require_relative 'smb/negotiate'
202
211
  require_relative 'smb/browser'
203
- require_relative 'smb/blocks'
212
+
213
+ # If unknown command, bind SMB blocks
214
+ PacketGen::Header.add_class PacketGen::Plugin::SMB::Blocks
215
+ PacketGen::Plugin::SMB.bind PacketGen::Plugin::SMB::Blocks
@@ -19,11 +19,9 @@ module PacketGen::Plugin
19
19
  def self.define_smb2_pad_field(name)
20
20
  prev_field = self.fields.last
21
21
  lf = lambda do |hdr|
22
- len = 8 - (hdr.offset_of(prev_field) + hdr[prev_field].sz) % 8
23
- len = 0 if len == 8
24
- len
22
+ (8 - (hdr.offset_of(prev_field) + hdr[prev_field].sz) % 8) % 8
25
23
  end
26
- define_field name, PacketGen::Types::String, default: [0].pack('q').freeze,
24
+ define_field name, PacketGen::Types::String, default: SMB2::MAX_PADDING,
27
25
  builder: ->(h, t) { t.new(length_from: -> { lf[h] }) }
28
26
  end
29
27
  end
@@ -52,7 +52,8 @@ module PacketGen::Plugin
52
52
  # @param [String] guid
53
53
  # @return [self]
54
54
  def from_human(guid)
55
- return self
55
+ return self if guid.nil? || guid.empty?
56
+
56
57
  values = guid.split('-')
57
58
  return self if values.size != 5
58
59
 
@@ -63,8 +63,16 @@ module PacketGen::Plugin
63
63
  def to_human
64
64
  human_type
65
65
  end
66
+
67
+ # Set {#data_length} field
68
+ # @return [Integer]
69
+ def calc_length
70
+ self[:pad].read SMB2::MAX_PADDING
71
+ self.data_length = sz - self[:pad].sz - 8
72
+ end
66
73
  end
67
74
 
75
+ # Specialized {Context} for PREAUTH_INTEGRITY_CAP type.
68
76
  class PreauthIntegrityCap < Context
69
77
  remove_field :data
70
78
  # @!attribute hash_alg_count
@@ -87,6 +95,7 @@ module PacketGen::Plugin
87
95
  update_field :pad, builder: ->(h, t) { t.new(length_from: -> { (8 - (h.offset_of(:salt) + h.salt_length) % 8) % 8 }) }
88
96
  end
89
97
 
98
+ # Specialized {Context} for ENCRYPTION_CAP type.
90
99
  class EncryptionCap < Context
91
100
  remove_field :data
92
101
  # @!attribute cipher_count
@@ -97,7 +106,7 @@ module PacketGen::Plugin
97
106
  # Array of 16-bit integer IDs specifying the supported encryption
98
107
  # algorithms
99
108
  # @return [PacketGen::Types::ArrayOfInt16le]
100
- define_field_before :pad, :ciphers, PacketGen::Types::ArrayOfInt16le, builder: ->(h, t) { t.new(counter: h[:hash_alg_count]) }
109
+ define_field_before :pad, :ciphers, PacketGen::Types::ArrayOfInt16le, builder: ->(h, t) { t.new(counter: h[:cipher_count]) }
101
110
  update_field :pad, builder: ->(h, t) { t.new(length_from: -> { (8 - (h.offset_of(:cipher_count) + h[:cipher_count].sz) % 8) % 8 }) }
102
111
  end
103
112
 
@@ -109,9 +118,13 @@ module PacketGen::Plugin
109
118
  private
110
119
 
111
120
  def real_type(ctx)
112
- name = Context::TYPES.key(ctx.type)
121
+ name = Context::TYPES.key(ctx.type).to_s
113
122
  klassname = name.downcase.capitalize.gsub(/_(\w)/) { $1.upcase }
114
- Negotiate.const_defined?(klassname) ? Negotiate.const_get(klassname) : ctx.class
123
+ if !klassname.empty? && Negotiate.const_defined?(klassname)
124
+ Negotiate.const_get(klassname)
125
+ else
126
+ ctx.class
127
+ end
115
128
  end
116
129
  end
117
130
  end
@@ -48,7 +48,7 @@ module PacketGen::Plugin
48
48
  SECURITY_MODES = {
49
49
  'signing_enabled' => 1,
50
50
  'signing required' => 2
51
- }
51
+ }.freeze
52
52
 
53
53
  # @!attribute structure_size
54
54
  # 16-bit negotiate request structure size. Should be 36.
@@ -146,7 +146,7 @@ module PacketGen::Plugin
146
146
  str << PacketGen::Inspect::FMT_ATTR % [self[attr].class.to_s.sub(/.*::/, ''),
147
147
  attr, value]
148
148
  when :dialects
149
- list = self.dialects.map { |v| "%#04x" % v.to_i }.join(',')
149
+ list = self.dialects.map { |v| '%#x' % v.to_i }.join(',')
150
150
  str = PacketGen::Inspect.shift_level
151
151
  str << PacketGen::Inspect::FMT_ATTR % [self[attr].class.to_s.sub(/.*::/, ''),
152
152
  attr, list]
@@ -154,11 +154,17 @@ module PacketGen::Plugin
154
154
  end
155
155
  end
156
156
 
157
- # Calculate and set {#context_offset} field. Also calculate
158
- # lengths in {Context contexts}.
157
+ # Calculate and set {#context_offset} and {#pad} fields.
158
+ # Also calculate lengths in {Context contexts}.
159
159
  # @return [Integer]
160
160
  def calc_length
161
- self.context_offset = SMB2.new.sz + offset_of(:context_list)
161
+ self[:pad].read SMB2::MAX_PADDING
162
+
163
+ self.context_offset = 0
164
+ unless context_list.empty?
165
+ self.context_offset = SMB2::HEADER_SIZE + offset_of(:context_list)
166
+ end
167
+ context_list.each { |ctx| ctx.calc_length if ctx.respond_to? :calc_length }
162
168
  end
163
169
  end
164
170
  end
@@ -140,10 +140,11 @@ module PacketGen::Plugin
140
140
  define_field :context_offset, PacketGen::Types::Int32le
141
141
  # @!attribute buffer
142
142
  # @return [GSSAPI]
143
- define_field :buffer, GSSAPI, token: :init
143
+ define_field :buffer, GSSAPI, token: :init, optional: ->(h) { h.buffer_offset > 0 }
144
144
  # @!attribute pad
145
145
  # Optional padding between the end of the {#buffer} field and the first negotiate
146
- # context in {#context_list} so that the first negotiate context is 8-byte aligned.
146
+ # context in {#context_list} so that the first negotiate context is 8-byte aligned
147
+ # with start of SMB2 header.
147
148
  # @return [String]
148
149
  define_smb2_pad_field :pad
149
150
  # @!attribute context_list
@@ -176,13 +177,20 @@ module PacketGen::Plugin
176
177
  end
177
178
  end
178
179
 
179
- # Calculate and set {#context_offset}, {#buffer_offset} and {#buffer_length} fields.
180
+ # Calculate and set {#context_offset}, {#buffer_offset}, {#buffer_length} and
181
+ # {#pad} fields.
180
182
  # Also calculate lengths in {Context contexts}.
181
183
  # @return [void]
182
184
  def calc_length
183
- self.context_offset = SMB2.new.sz + offset_of(:context_list)
184
- self.buffer_offset = SMB2.new.sz + offset_of(:buffer)
185
- self.buffer_length = buffer.sz
185
+ self[:pad].read SMB2::MAX_PADDING
186
+
187
+ self.buffer_offset = SMB2::HEADER_SIZE + offset_of(:buffer)
188
+ self.buffer_length = self[:buffer].sz
189
+
190
+ self.context_offset = 0
191
+ unless context_list.empty?
192
+ self.context_offset = SMB2::HEADER_SIZE + offset_of(:context_list)
193
+ end
186
194
  context_list.each { |ctx| ctx.calc_length if ctx.respond_to? :calc_length }
187
195
  end
188
196
  end
@@ -79,12 +79,13 @@ module PacketGen::Plugin
79
79
  define_field :prev_session_id, PacketGen::Types::Int64le
80
80
  # @!attribute buffer
81
81
  # @return [GSSAPI]
82
- define_field :buffer, GSSAPI, token: :response
82
+ define_field :buffer, GSSAPI, token: :response, optional: ->(h) { h.buffer_offset > 0 }
83
83
 
84
- # Calculate and set {#buffer_length} field.
84
+ # Calculate and set {#buffer_length} and {#buffer_offset} fields.
85
85
  # @return [void]
86
86
  def calc_length
87
- self.buffer_length = buffer.sz
87
+ self.buffer_offset = SMB2.new.sz + offset_of(:buffer)
88
+ self.buffer_length = self[:buffer].sz
88
89
  end
89
90
 
90
91
  # Protocol name
@@ -50,12 +50,13 @@ module PacketGen::Plugin
50
50
  define_field :buffer_length, PacketGen::Types::Int16le
51
51
  # @!attribute buffer
52
52
  # @return [GSSAPI]
53
- define_field :buffer, GSSAPI, token: :response
53
+ define_field :buffer, GSSAPI, token: :response, optional: ->(h) { h.buffer_offset > 0 }
54
54
 
55
- # Calculate and set {#buffer_length} field.
55
+ # Calculate and set {#buffer_length} and {#buffer_offset} fields.
56
56
  # @return [void]
57
57
  def calc_length
58
- self.buffer_length = buffer.sz
58
+ self.buffer_offset = SMB2.new.sz + offset_of(:buffer)
59
+ self.buffer_length = self[:buffer].sz
59
60
  end
60
61
 
61
62
  # Protocol name
@@ -38,6 +38,9 @@ module PacketGen::Plugin
38
38
  # SMB2 header size
39
39
  HEADER_SIZE = 64
40
40
 
41
+ # SMB2 pad field at its maximum length
42
+ MAX_PADDING = [0].pack('q').freeze
43
+
41
44
  # @!attribute protocol
42
45
  # This field must contain {MARKER SMB2 marker}
43
46
  # @return [String]
@@ -145,7 +148,7 @@ module PacketGen::Plugin
145
148
  PacketGen::Header.add_class krequest
146
149
  self.bind krequest, command: SMB2::COMMANDS[command], flags: ->(v) { v.nil? ? 0 : (v & 1).zero? }
147
150
  PacketGen::Header.add_class kresponse
148
- self.bind kresponse, command: SMB2::COMMANDS[command], flags: ->(v) { v.nil? ? 0 : (v & 1 == 1) }
151
+ self.bind kresponse, command: SMB2::COMMANDS[command], flags: ->(v) { v.nil? ? 1 : (v & 1 == 1) }
149
152
  end
150
153
 
151
154
  # Invert {#flags_response?}
@@ -154,6 +157,12 @@ module PacketGen::Plugin
154
157
  self.flags_response = !flags_response?
155
158
  end
156
159
 
160
+ # Check if this is really a SMB2 header. Check {#protocol} has value {MARKER}.
161
+ # @return [Boolean]
162
+ def parse?
163
+ protocol == MARKER
164
+ end
165
+
157
166
  # @return [String]
158
167
  def inspect
159
168
  super do |attr|
@@ -1,5 +1,5 @@
1
1
  module PacketGen
2
2
  module Plugin
3
- SMB_VERSION = "0.4.0"
3
+ SMB_VERSION = "0.5.0"
4
4
  end
5
5
  end
@@ -11,3 +11,4 @@ require_relative 'packetgen/plugin/gssapi'
11
11
  require_relative 'packetgen/plugin/netbios'
12
12
  require_relative 'packetgen/plugin/smb'
13
13
  require_relative 'packetgen/plugin/smb2'
14
+ require_relative 'packetgen/plugin/llmnr'
@@ -1,4 +1,4 @@
1
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
  require 'packetgen/plugin/smb_version'
4
4
 
@@ -8,8 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ['Sylvain Daubert']
9
9
  spec.email = ['sylvain.daubert@laposte.net']
10
10
 
11
- spec.summary = %q{SMB plugin for packetgen.}
12
- #spec.description = %q{TODO: Write a longer description or delete this line.}
11
+ spec.summary = 'SMB plugin for packetgen.'
13
12
  spec.homepage = 'https://github.com/sdaubert/packetgen-plugin-smb'
14
13
 
15
14
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
@@ -19,14 +18,12 @@ Gem::Specification.new do |spec|
19
18
 
20
19
  spec.required_ruby_version = '>= 2.3.0'
21
20
 
22
- spec.add_dependency 'packetgen', '~>3.0'
23
- spec.add_dependency 'rasn1', '~>0.6', '>= 0.6.7'
21
+ spec.add_dependency 'packetgen', '~>3.0', '>= 3.0.2'
22
+ spec.add_dependency 'rasn1', '~>0.6', '>= 0.6.8'
24
23
 
25
24
  spec.add_development_dependency 'bundler', '~> 1.16'
26
25
  spec.add_development_dependency 'rake', '~> 10.0'
27
26
  spec.add_development_dependency 'rspec', '~> 3.7'
28
27
  spec.add_development_dependency 'simplecov', '~> 0.16'
29
28
  spec.add_development_dependency 'yard', '~> 0.9'
30
-
31
-
32
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: packetgen-plugin-smb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.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-10-26 00:00:00.000000000 Z
11
+ date: 2018-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: packetgen
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '3.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 3.0.2
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,6 +27,9 @@ dependencies:
24
27
  - - "~>"
25
28
  - !ruby/object:Gem::Version
26
29
  version: '3.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 3.0.2
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rasn1
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -33,7 +39,7 @@ dependencies:
33
39
  version: '0.6'
34
40
  - - ">="
35
41
  - !ruby/object:Gem::Version
36
- version: 0.6.7
42
+ version: 0.6.8
37
43
  type: :runtime
38
44
  prerelease: false
39
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -43,7 +49,7 @@ dependencies:
43
49
  version: '0.6'
44
50
  - - ">="
45
51
  - !ruby/object:Gem::Version
46
- version: 0.6.7
52
+ version: 0.6.8
47
53
  - !ruby/object:Gem::Dependency
48
54
  name: bundler
49
55
  requirement: !ruby/object:Gem::Requirement
@@ -130,6 +136,7 @@ files:
130
136
  - Rakefile
131
137
  - lib/packetgen-plugin-smb.rb
132
138
  - lib/packetgen/plugin/gssapi.rb
139
+ - lib/packetgen/plugin/llmnr.rb
133
140
  - lib/packetgen/plugin/netbios.rb
134
141
  - lib/packetgen/plugin/netbios/datagram.rb
135
142
  - lib/packetgen/plugin/netbios/name.rb
@@ -144,6 +151,10 @@ files:
144
151
  - lib/packetgen/plugin/smb/close/request.rb
145
152
  - lib/packetgen/plugin/smb/close/response.rb
146
153
  - lib/packetgen/plugin/smb/filetime.rb
154
+ - lib/packetgen/plugin/smb/negotiate.rb
155
+ - lib/packetgen/plugin/smb/negotiate/dialect.rb
156
+ - lib/packetgen/plugin/smb/negotiate/request.rb
157
+ - lib/packetgen/plugin/smb/negotiate/response.rb
147
158
  - lib/packetgen/plugin/smb/nt_create_and_x.rb
148
159
  - lib/packetgen/plugin/smb/ntcreateandx/request.rb
149
160
  - lib/packetgen/plugin/smb/ntcreateandx/response.rb