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.
- checksums.yaml +4 -4
- data/.travis.yml +3 -3
- data/README.md +2 -1
- data/examples/llmnr-responder +110 -0
- data/examples/smb-responder +233 -0
- data/lib/packetgen-plugin-smb.rb +1 -0
- data/lib/packetgen/plugin/gssapi.rb +1 -1
- data/lib/packetgen/plugin/ntlm.rb +211 -0
- data/lib/packetgen/plugin/ntlm/authenticate.rb +197 -0
- data/lib/packetgen/plugin/ntlm/av_pair.rb +117 -0
- data/lib/packetgen/plugin/ntlm/challenge.rb +140 -0
- data/lib/packetgen/plugin/ntlm/negotiate.rb +127 -0
- data/lib/packetgen/plugin/ntlm/ntlmv2_response.rb +59 -0
- data/lib/packetgen/plugin/smb/filetime.rb +6 -0
- data/lib/packetgen/plugin/smb/negotiate/response.rb +1 -1
- data/lib/packetgen/plugin/smb/string.rb +28 -3
- data/lib/packetgen/plugin/smb2/negotiate/response.rb +5 -1
- data/lib/packetgen/plugin/smb2/session_setup/request.rb +5 -1
- data/lib/packetgen/plugin/smb2/session_setup/response.rb +5 -1
- data/lib/packetgen/plugin/smb_version.rb +1 -1
- data/packetgen-plugin-smb.gemspec +8 -3
- metadata +17 -9
@@ -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::
|
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
|
-
|
25
|
-
|
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
|
@@ -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.
|
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.
|
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.
|
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.
|
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:
|
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.
|
19
|
+
version: '3.1'
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 3.
|
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.
|
29
|
+
version: '3.1'
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 3.
|
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:
|
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:
|
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.
|