packetgen-plugin-smb 0.5.0 → 0.6.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.
@@ -0,0 +1,127 @@
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 NTLM
10
+ # NTLM Negotiate message
11
+ # @author Sylvain Daubert
12
+ class Negotiate < NTLM
13
+ # @return [String]
14
+ attr_accessor :domain_name
15
+ # @return [String]
16
+ attr_accessor :workstation
17
+
18
+ update_field :type, default: NTLM::TYPES['negotiate']
19
+ # @!attribute flags
20
+ # Negotiate flags
21
+ # @return [Integer]
22
+
23
+ # @!group Negotiate flags
24
+ # @!attribute nego56?
25
+ # Also known as +flags_w?+.
26
+ # @return [Boolean]
27
+ # @!attribute key_exch?
28
+ # Also known as +flags_v?+
29
+ # @return [Boolean]
30
+ # @!attribute nego128?
31
+ # Also known as +flags_u?+
32
+ # @return [Boolean]
33
+ # @!attribute version?
34
+ # Also known as +flags_t+
35
+ # @return [Integer]
36
+ # @!attribute target_info?
37
+ # Also known as +flags_s?+
38
+ # @return [Boolean]
39
+ # @!attribute non_nt_session_key?
40
+ # Also known as +flags_r?+
41
+ # @return [Boolean]
42
+ # @!attribute identify?
43
+ # Also known as +flags_q+
44
+ # @return [Boolean]
45
+ # @!attribute ext_session_security?
46
+ # Also known as +flags_p?+
47
+ # @return [Boolean]
48
+ # @!attribute target_type_server?
49
+ # Also known as +flags_o?+
50
+ # @return [Boolean]
51
+ # @!attribute target_type_domain?
52
+ # Also known as +flags_n?+
53
+ # @return [Boolean]
54
+ # @!attribute always_sign?
55
+ # Also known as +flags_m?+
56
+ # @return [Boolean]
57
+ # @!attribute oem_workstation_supplied?
58
+ # Also known as +flags_l?+
59
+ # @return [Boolean]
60
+ # @!attribute oem_domain_supplied?
61
+ # Also known as +flags_k?+
62
+ # @return [Boolean]
63
+ # @!attribute anonymous?
64
+ # Also known as +flags_j?+
65
+ # @return [Boolean]
66
+ # @!attribute ntlm?
67
+ # Also known as +flags_h?+
68
+ # @return [Boolean]
69
+ # @!attribute lm_key?
70
+ # Also known as +flags_g?+
71
+ # @return [Boolean]
72
+ # @!attribute datagram?
73
+ # Also known as +flags_f?+
74
+ # @return [Boolean]
75
+ # @!attribute seal?
76
+ # Also known as +flags_e?+
77
+ # @return [Boolean]
78
+ # @!attribute sign?
79
+ # Also known as +flags_d?+
80
+ # @return [Boolean]
81
+ # @!attribute request_target?
82
+ # Also known as +flags_c?+
83
+ # @return [Boolean]
84
+ # @!attribute oem?
85
+ # Also known as +flags_b?+
86
+ # @return [Boolean]
87
+ # @!attribute unicode?
88
+ # Also known as +flags_a?+
89
+ # @return [Boolean]
90
+ define_negotiate_flags
91
+ # @!endgroup Negotiate flags
92
+
93
+ # @!attribute domain_name
94
+ # Name of the client authentication domain. Must be OEM encoded.
95
+ # @return [PacketGen::Types::String]
96
+ # @!attribute domain_name_len
97
+ # 2-byte domain name length
98
+ # @return [Integer]
99
+ # @!attribute domain_name_maxlen
100
+ # 2-byte domain name max length
101
+ # @return [Integer]
102
+ # @!attribute domain_name_offset
103
+ # 4-byte domain name offset
104
+ # @return [Integer]
105
+ define_in_payload :domain_name, PacketGen::Types::String
106
+
107
+ # @!attribute workstation
108
+ # Name of the client machine. Must be OEM encoded.
109
+ # @return [PacketGen::Types::String]
110
+ # @!attribute workstation_len
111
+ # 2-byte workstation length
112
+ # @return [Integer]
113
+ # @!attribute workstation_maxlen
114
+ # 2-byte workstation max length
115
+ # @return [Integer]
116
+ # @!attribute workstation_offset
117
+ # 4-byte workstation offset
118
+ # @return [Integer]
119
+ define_in_payload :workstation, PacketGen::Types::String
120
+
121
+ # @!attribute version
122
+ # 8-byte version information
123
+ # @return [String]
124
+ define_field_before :payload, :version, PacketGen::Types::String, static_length: 8, default: VOID_VERSION
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,59 @@
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 NTLM
10
+ class Ntlmv2Response < PacketGen::Types::Fields
11
+ # @!attribute response
12
+ # 16-byte array of unsigned char containing the client's NT challenge
13
+ # response.
14
+ # @return [String]
15
+ define_field :response, PacketGen::Types::String, static_length: 16
16
+ alias ntproof_str response
17
+ alias ntproof_str= response=
18
+
19
+ # @!attribute type
20
+ # 8-bit current version of the challenge. Should be 1.
21
+ # @return [Integer]
22
+ define_field :type, PacketGen::Types::Int8, default: 1
23
+ # @!attribute hi_type
24
+ # 8-bit maximum supported version of the challenge. Should be 1.
25
+ # @return [Integer]
26
+ define_field :hi_type, PacketGen::Types::Int8, default: 1
27
+ # @!attribute reserved1
28
+ # 16-bit reserved word.
29
+ # @return [Integer]
30
+ define_field :reserved1, PacketGen::Types::Int16le
31
+ # @!attribute reserved2
32
+ # 32-bit reserved word.
33
+ # @return [Integer]
34
+ define_field :reserved2, PacketGen::Types::Int32le
35
+ # @!attribute timestamp
36
+ # 64-bit current system time.
37
+ # @return [SMB::Filetime]
38
+ define_field :timestamp, SMB::Filetime
39
+ # @!attribute client_challenge
40
+ # 8-byte challenge from client
41
+ # @return [String]
42
+ define_field :client_challenge, PacketGen::Types::String, static_length: 8
43
+ # @!attribute reserved3
44
+ # 32-bit reserved word.
45
+ # @return [Integer]
46
+ define_field :reserved3, PacketGen::Types::Int32le
47
+ # @!attribute avpairs
48
+ # @return [ArrayOfAvPair]
49
+ define_field :avpairs, ArrayOfAvPair
50
+
51
+ # @return [false]
52
+ def empty?
53
+ false
54
+ end
55
+
56
+ alias size sz
57
+ end
58
+ end
59
+ end
@@ -22,6 +22,12 @@ module PacketGen::Plugin
22
22
  # String to parse time
23
23
  PARSE_TIME_STR = '%Y-%m-%d %H:%M:%S.%N %Z'
24
24
 
25
+ # Return a new Filetime object initialized to current time.
26
+ # @return [Filetime]
27
+ def self.now
28
+ new(time: Time.now.utc)
29
+ end
30
+
25
31
  # @param [Hash] options
26
32
  # @option options [Integer] :filetime
27
33
  # @option options [Time] :time
@@ -3,7 +3,7 @@ module PacketGen::Plugin
3
3
  module Negotiate
4
4
  # SMB Negotiation Response header.
5
5
  #
6
- # See also {Blocks}, as {Negotiate::Rersponse} is a specialization of {Blocks#words}
6
+ # See also {Blocks}, as {Negotiate::Response} is a specialization of {Blocks#words}
7
7
  # and {Blocks#bytes}.
8
8
  # @author Sylvain Daubert
9
9
  class Response < Blocks
@@ -7,22 +7,28 @@
7
7
 
8
8
  module PacketGen::Plugin
9
9
  class SMB
10
- # SMB strings (UTF-16 little-endian).
10
+ # SMB strings (UTF-16 little-endian or OEM).
11
11
  # @author Sylvain Daubert
12
12
  class String < PacketGen::Types::CString
13
13
  # @param [Boolean] value
14
14
  # @return [Boolean]
15
15
  attr_writer :unicode
16
+ # @param [Boolean] null_terminated
17
+ # @return [Boolean]
18
+ attr_writer :null_terminated
16
19
 
17
20
  # @param [Hash] options
18
21
  # @option options [Integer] :static_length set a static length for this string
19
22
  # @option options [Boolean] :unicode If +true+, string is encoded as a UTF-16
20
23
  # unicode string. If +false+, string is encode in ASCII. Defaults to +true+.
24
+ # @option options [Boolean] :null_terminated If +true+, string is null-terminated.
25
+ # If +false+, string is not null-terminated. Defaults to +true+.
21
26
  def initialize(options={})
22
27
  super
23
28
  @unicode = options.key?(:unicode) ? options[:unicode] : true
24
- self.encode!('UTF-16LE') if @unicode
25
- self.encode!('ASCII-8BIT') unless @unicode
29
+ @null_terminated = options.key?(:null_terminated) ? options[:null_terminated] : true
30
+ encoding = unicode? ? 'UTF-16LE' : 'ASCII-8BIT'
31
+ self.encode!(encoding)
26
32
  end
27
33
 
28
34
  # @return [Boolean]
@@ -30,6 +36,11 @@ module PacketGen::Plugin
30
36
  @unicode
31
37
  end
32
38
 
39
+ # @return [Boolean]
40
+ def null_terminated?
41
+ @null_terminated
42
+ end
43
+
33
44
  # @param [::String] str
34
45
  # @return [String] self
35
46
  def read(str)
@@ -57,6 +68,20 @@ module PacketGen::Plugin
57
68
  self
58
69
  end
59
70
 
71
+ # @return [String]
72
+ def to_s
73
+ s = super
74
+ s.encode(self_encoding)
75
+ return s if null_terminated?
76
+
77
+ s[0...-binary_terminator.size]
78
+ end
79
+
80
+ # @return [String]
81
+ def to_human
82
+ super.encode('UTF-8')
83
+ end
84
+
60
85
  private
61
86
 
62
87
  def self_encoding
@@ -184,8 +184,12 @@ module PacketGen::Plugin
184
184
  def calc_length
185
185
  self[:pad].read SMB2::MAX_PADDING
186
186
 
187
- self.buffer_offset = SMB2::HEADER_SIZE + offset_of(:buffer)
188
187
  self.buffer_length = self[:buffer].sz
188
+ self.buffer_offset = if self.buffer_length.zero?
189
+ 0
190
+ else
191
+ SMB2::HEADER_SIZE + offset_of(:buffer)
192
+ end
189
193
 
190
194
  self.context_offset = 0
191
195
  unless context_list.empty?
@@ -84,8 +84,12 @@ module PacketGen::Plugin
84
84
  # Calculate and set {#buffer_length} and {#buffer_offset} fields.
85
85
  # @return [void]
86
86
  def calc_length
87
- self.buffer_offset = SMB2.new.sz + offset_of(:buffer)
88
87
  self.buffer_length = self[:buffer].sz
88
+ self.buffer_offset = if self.buffer_length.zero?
89
+ 0
90
+ else
91
+ SMB2.new.sz + offset_of(:buffer)
92
+ end
89
93
  end
90
94
 
91
95
  # Protocol name
@@ -55,8 +55,12 @@ module PacketGen::Plugin
55
55
  # Calculate and set {#buffer_length} and {#buffer_offset} fields.
56
56
  # @return [void]
57
57
  def calc_length
58
- self.buffer_offset = SMB2.new.sz + offset_of(:buffer)
59
58
  self.buffer_length = self[:buffer].sz
59
+ self.buffer_offset = if self.buffer_length.zero?
60
+ 0
61
+ else
62
+ SMB2.new.sz + offset_of(:buffer)
63
+ end
60
64
  end
61
65
 
62
66
  # Protocol name
@@ -1,5 +1,5 @@
1
1
  module PacketGen
2
2
  module Plugin
3
- SMB_VERSION = "0.5.0"
3
+ SMB_VERSION = "0.6.0"
4
4
  end
5
5
  end
@@ -14,16 +14,21 @@ Gem::Specification.new do |spec|
14
14
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
15
15
  f.match(%r{^(test|spec|features)/})
16
16
  end
17
- spec.require_paths = ['lib']
17
+ spec.bindir = 'bin'
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.require_paths = %w[lib]
18
20
 
19
21
  spec.required_ruby_version = '>= 2.3.0'
20
22
 
21
- spec.add_dependency 'packetgen', '~>3.0', '>= 3.0.2'
23
+ spec.add_dependency 'packetgen', '~>3.1', '>=3.1.2'
22
24
  spec.add_dependency 'rasn1', '~>0.6', '>= 0.6.8'
23
25
 
24
- spec.add_development_dependency 'bundler', '~> 1.16'
26
+ spec.add_development_dependency 'bundler', '~> 1.17.3'
25
27
  spec.add_development_dependency 'rake', '~> 10.0'
26
28
  spec.add_development_dependency 'rspec', '~> 3.7'
27
29
  spec.add_development_dependency 'simplecov', '~> 0.16'
28
30
  spec.add_development_dependency 'yard', '~> 0.9'
31
+
32
+ #spec.add_development_dependency 'ruby-debug-ide'
33
+ #spec.add_development_dependency 'debase'
29
34
  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.5.0
4
+ version: 0.6.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-11-18 00:00:00.000000000 Z
11
+ date: 2019-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: packetgen
@@ -16,20 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.0'
19
+ version: '3.1'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 3.0.2
22
+ version: 3.1.2
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '3.0'
29
+ version: '3.1'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 3.0.2
32
+ version: 3.1.2
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: rasn1
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -56,14 +56,14 @@ dependencies:
56
56
  requirements:
57
57
  - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: '1.16'
59
+ version: 1.17.3
60
60
  type: :development
61
61
  prerelease: false
62
62
  version_requirements: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
- version: '1.16'
66
+ version: 1.17.3
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: rake
69
69
  requirement: !ruby/object:Gem::Requirement
@@ -134,6 +134,8 @@ files:
134
134
  - LICENSE
135
135
  - README.md
136
136
  - Rakefile
137
+ - examples/llmnr-responder
138
+ - examples/smb-responder
137
139
  - lib/packetgen-plugin-smb.rb
138
140
  - lib/packetgen/plugin/gssapi.rb
139
141
  - lib/packetgen/plugin/llmnr.rb
@@ -141,6 +143,12 @@ files:
141
143
  - lib/packetgen/plugin/netbios/datagram.rb
142
144
  - lib/packetgen/plugin/netbios/name.rb
143
145
  - lib/packetgen/plugin/netbios/session.rb
146
+ - lib/packetgen/plugin/ntlm.rb
147
+ - lib/packetgen/plugin/ntlm/authenticate.rb
148
+ - lib/packetgen/plugin/ntlm/av_pair.rb
149
+ - lib/packetgen/plugin/ntlm/challenge.rb
150
+ - lib/packetgen/plugin/ntlm/negotiate.rb
151
+ - lib/packetgen/plugin/ntlm/ntlmv2_response.rb
144
152
  - lib/packetgen/plugin/smb.rb
145
153
  - lib/packetgen/plugin/smb/blocks.rb
146
154
  - lib/packetgen/plugin/smb/browser.rb
@@ -194,7 +202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
202
  version: '0'
195
203
  requirements: []
196
204
  rubyforge_project:
197
- rubygems_version: 2.7.6
205
+ rubygems_version: 2.7.6.2
198
206
  signing_key:
199
207
  specification_version: 4
200
208
  summary: SMB plugin for packetgen.