packetgen-plugin-smb 0.2.0 → 0.3.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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/packetgen-plugin-smb.rb +7 -5
  3. data/lib/packetgen/plugin/gssapi.rb +125 -0
  4. data/lib/packetgen/plugin/smb.rb +26 -32
  5. data/lib/packetgen/plugin/smb/blocks.rb +2 -2
  6. data/lib/packetgen/plugin/smb/browser.rb +3 -3
  7. data/lib/packetgen/plugin/smb/browser/domain_announcement.rb +3 -3
  8. data/lib/packetgen/plugin/smb/browser/host_announcement.rb +4 -4
  9. data/lib/packetgen/plugin/smb/browser/local_master_announcement.rb +3 -3
  10. data/lib/packetgen/plugin/smb/close.rb +9 -59
  11. data/lib/packetgen/plugin/smb/close/request.rb +45 -0
  12. data/lib/packetgen/plugin/smb/close/response.rb +36 -0
  13. data/lib/packetgen/plugin/smb/filetime.rb +10 -9
  14. data/lib/packetgen/plugin/smb/nt_create_and_x.rb +9 -264
  15. data/lib/packetgen/plugin/smb/ntcreateandx/request.rb +159 -0
  16. data/lib/packetgen/plugin/smb/ntcreateandx/response.rb +128 -0
  17. data/lib/packetgen/plugin/smb/string.rb +4 -4
  18. data/lib/packetgen/plugin/smb/trans.rb +9 -190
  19. data/lib/packetgen/plugin/smb/trans/request.rb +121 -0
  20. data/lib/packetgen/plugin/smb/trans/response.rb +94 -0
  21. data/lib/packetgen/plugin/smb2.rb +181 -0
  22. data/lib/packetgen/plugin/smb2/base.rb +31 -0
  23. data/lib/packetgen/plugin/smb2/error.rb +50 -0
  24. data/lib/packetgen/plugin/smb2/guid.rb +68 -0
  25. data/lib/packetgen/plugin/smb2/negotiate.rb +22 -0
  26. data/lib/packetgen/plugin/smb2/negotiate/context.rb +131 -0
  27. data/lib/packetgen/plugin/smb2/negotiate/request.rb +166 -0
  28. data/lib/packetgen/plugin/smb2/negotiate/response.rb +190 -0
  29. data/lib/packetgen/plugin/smb2/session_setup.rb +21 -0
  30. data/lib/packetgen/plugin/smb2/session_setup/request.rb +98 -0
  31. data/lib/packetgen/plugin/smb2/session_setup/response.rb +69 -0
  32. data/lib/packetgen/plugin/smb_version.rb +1 -1
  33. data/packetgen-plugin-smb.gemspec +2 -1
  34. metadata +42 -4
@@ -0,0 +1,128 @@
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 NT_CREATE_ANDX related classes
11
+ module NtCreateAndX
12
+ # SMB Command NtCreateAndX response
13
+ # @author Sylvain Daubert
14
+ class Response < PacketGen::Header::Base
15
+ # OpLock levels
16
+ OP_LOCK_LEVELS = {
17
+ 'none' => 0,
18
+ 'exclusive' => 1,
19
+ 'batch' => 2,
20
+ 'level II' => 3,
21
+ }.freeze
22
+
23
+ # @!attribute word_count
24
+ # The size, in 2-byte words, of the SMB parameters.
25
+ # @return [Integer]
26
+ define_field :word_count, PacketGen::Types::Int8, default: 34
27
+ # @!attribute and_xcommand
28
+ # 8-bit command code for the next SMB command in the
29
+ # packet.
30
+ # @return [Integer]
31
+ define_field :and_xcommand, PacketGen::Types::Int8Enum, enum: Request::COMMANDS
32
+ # @!attribute rsv1
33
+ # 8-bit reserved field.
34
+ # @return [Integer]
35
+ define_field :rsv1, PacketGen::Types::Int8, default: 0
36
+ # @!attribute and_xoffset
37
+ # 16-bit offset from the start of SMB header to the start of
38
+ # the {#word_count} field in the next SMB command in this
39
+ # packet.
40
+ # @return [Integer]
41
+ define_field :and_xoffset, PacketGen::Types::Int16le, default: 0
42
+ # @!attribute oplock_level
43
+ # 8-bit OpLock level.
44
+ # @return [Integer]
45
+ define_field :oplock_level, PacketGen::Types::Int8Enum, enum: OP_LOCK_LEVELS
46
+ # @!attribute fid
47
+ # 16-bit FID.
48
+ # @return [Integer]
49
+ define_field :fid, PacketGen::Types::Int16le
50
+ # @!attribute disposition
51
+ # 32-bit value that represents the action to take if the file
52
+ # already exists or if the file is a new file and does not already
53
+ # exist.
54
+ # @return [Integer]
55
+ define_field :disposition, PacketGen::Types::Int32le
56
+ # @!attribute create_time
57
+ # 64-bit integer representing the time that the file was created.
58
+ # @return [Integer]
59
+ define_field :create_time, SMB::Filetime
60
+ # @!attribute access_time
61
+ # 64-bit integer representing the time that the file was last accessed.
62
+ # @return [Integer]
63
+ define_field :access_time, SMB::Filetime
64
+ # @!attribute write_time
65
+ # 64-bit integer representing the time that the file was last writen.
66
+ # @return [Integer]
67
+ define_field :write_time, SMB::Filetime
68
+ # @!attribute change_time
69
+ # 64-bit integer representing the time that the file was last changed.
70
+ # @return [Integer]
71
+ define_field :change_time, SMB::Filetime
72
+ # @!attribute attributes
73
+ # 32-bit extended file attributes.
74
+ # @return [Integer]
75
+ define_field :attributes, PacketGen::Types::Int32le
76
+ # @!attribute alloc_size
77
+ # 64-bit integer representing the number of bytes allocated to the file.
78
+ # @return [Integer]
79
+ define_field :alloc_size, PacketGen::Types::Int64le
80
+ # @!attribute end_of_file
81
+ # 64-bit integer representing the end of file offset.
82
+ # @return [Integer]
83
+ define_field :end_of_file, PacketGen::Types::Int64le
84
+ # @!attribute res_type
85
+ # 16-bit file type.
86
+ # @return [Integer]
87
+ define_field :res_type, PacketGen::Types::Int16le
88
+ # @!attribute pipe_status
89
+ # 16-bit field that shows the status of the named pipe (if opened resource
90
+ # is a named pipe).
91
+ # @return [Integer]
92
+ define_field :pipe_status, PacketGen::Types::Int16le
93
+ # @!attribute directory
94
+ # 8-bit field indicating is the FID represents a directory.
95
+ # @return [Integer]
96
+ define_field :directory, PacketGen::Types::Int8
97
+ # @!attribute byte_count
98
+ # The size, in bytes, of the SMB data. Should be zero.
99
+ # @return [Integer]
100
+ define_field :byte_count, PacketGen::Types::Int16le, default: 0
101
+
102
+ # Give protocol name for this class
103
+ # @return [String]
104
+ def protocol_name
105
+ 'SMB::NtCreateAndX::Response'
106
+ end
107
+
108
+ # Say if FID is a directory
109
+ # @return [Boolean]
110
+ def directory?
111
+ self.directory > 0
112
+ end
113
+
114
+ # @!method human_create_time
115
+ # @return [String]
116
+ # @!method human_access_time
117
+ # @return [String]
118
+ # @!method human_write_time
119
+ # @return [String]
120
+ # @!method human_change_time
121
+ # @return [String]
122
+ %i[create access write change].each do |type|
123
+ class_eval "def human_#{type}_time; self[:#{type}_time].to_human; end"
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
@@ -1,6 +1,6 @@
1
- # This file is part of PacketGen
1
+ # This file is part of packetgen-plugin-smb.
2
2
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
- # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
3
+ # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
6
  # frozen_string_literal: true
@@ -10,10 +10,10 @@ module PacketGen::Plugin
10
10
  # SMB strings (UTF-16 little-endian).
11
11
  # @author Sylvain Daubert
12
12
  class String < PacketGen::Types::CString
13
- # @param [Boolean] unicode
13
+ # @param [Boolean] value
14
+ # @return [Boolean]
14
15
  attr_writer :unicode
15
16
 
16
- # @param [Boolean, Proc] is string UTF-16 encoded?
17
17
  # @param [Hash] options
18
18
  # @option options [Integer] :static_length set a static length for this string
19
19
  # @option options [Boolean] :unicode If +true+, string is encoded as a UTF-16
@@ -1,199 +1,18 @@
1
- # This file is part of PacketGen
1
+ # This file is part of packetgen-plugin-smb.
2
2
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
- # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
3
+ # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
6
  # frozen_string_literal: true
7
7
 
8
8
  module PacketGen::Plugin
9
9
  class SMB
10
- # Transaction Request.
11
- #
12
- # See also {Blocks}, as {TransRequest} is a specialization of {Blocks#words}
13
- # and {Blocks#bytes}.
14
- # @author Sylvain Daubert
15
- class TransRequest < PacketGen::Header::Base
16
- # @!attribute word_count
17
- # The size, in 2-byte words, of the SMB command parameters. It should
18
- # be +14 + setup_count+.
19
- # @return [Integer]
20
- define_field :word_count, PacketGen::Types::Int8, default: 14
21
- # @!attribute total_param_count
22
- # The total number of transaction parameter bytes.
23
- # @return [Integer]
24
- define_field :total_param_count, PacketGen::Types::Int16le
25
- # @!attribute total_data_count
26
- # The total number of transaction data bytes.
27
- # @return [Integer]
28
- define_field :total_data_count, PacketGen::Types::Int16le
29
- # @!attribute max_param_count
30
- # The maximum number of parameter bytes that the client will accept
31
- # in transaction response.
32
- # @return [Integer]
33
- define_field :max_param_count, PacketGen::Types::Int16le
34
- # @!attribute max_data_count
35
- # The maximum number of data bytes that the client will accept
36
- # in transaction response.
37
- # @return [Integer]
38
- define_field :max_data_count, PacketGen::Types::Int16le
39
- # @!attribute max_setup_count
40
- # The maximum number of setup bytes that the client will accept
41
- # in transaction response.
42
- # @return [Integer]
43
- define_field :max_setup_count, PacketGen::Types::Int8
44
- # @!attribute rsv1
45
- # 8-bit reserved field
46
- # @return [Integer]
47
- define_field :rsv1, PacketGen::Types::Int8, default: 0
48
- # @!attribute flags
49
- # 16-bit flags
50
- # @return [Integer]
51
- define_field :flags, PacketGen::Types::Int16le
52
- # @!attribute timeout
53
- # 32-bit timeout
54
- # @return [Integer]
55
- define_field :timeout, PacketGen::Types::Int32le
56
- # @!attribute rsv2
57
- # 16-bit reserved field
58
- # @return [Integer]
59
- define_field :rsv2, PacketGen::Types::Int16le, default: 0
60
- # @!attribute param_count
61
- # 16-bit number of transaction parameter bytes that the clients attempts to
62
- # send to the server in this request.
63
- # @return [Integer]
64
- define_field :param_count, PacketGen::Types::Int16le
65
- # @!attribute param_offset
66
- # 16-bit offset (in bytes) from the start of the SMB header to the start of the
67
- # transaction parameters.
68
- # @return [Integer]
69
- define_field :param_offset, PacketGen::Types::Int16le
70
- # @!attribute data_count
71
- # 16-bit number of transaction data bytes that the clients sends to
72
- # the server in this request.
73
- # @return [Integer]
74
- define_field :data_count, PacketGen::Types::Int16le
75
- # @!attribute data_offset
76
- # 16-bit offset (in bytes) from the start of the SMB header to the start
77
- # of the data field.
78
- # @return [Integer]
79
- define_field :data_offset, PacketGen::Types::Int16le
80
- # @!attribute setup_count
81
- # 8-bit number of setup words (ie 16-bit words) contained in {#setup} field.
82
- define_field :setup_count, PacketGen::Types::Int8
83
- # @!attribute rsv3
84
- # 8-bit reserved field
85
- # @return [Integer]
86
- define_field :rsv3, PacketGen::Types::Int8
87
- # @!attribute setup
88
- # Array of 2-byte words.
89
- # @return [Array]
90
- define_field :setup, PacketGen::Types::ArrayOfInt16le, builder: ->(h, t) { t.new(counter: h[:setup_count]) }
91
- # @!attribute byte_count
92
- # @return [Integer]
93
- define_field :byte_count, PacketGen::Types::Int16le
94
- # @!attribute padname
95
- # 8-bit optional padding to align {#name} on a 2-byte boundary. Only present
96
- # if {SMB#flags2_unicode?} is +true+.
97
- # @return [Integer]
98
- define_field :padname, PacketGen::Types::Int8, optional: ->(h) { h.packet && h.packet.smb.flags2_unicode? }
99
- # @!attribute name
100
- # Pathname of the mailslot or named pipe.
101
- # @return [String]
102
- define_field :name, SMB::String, builder: ->(h, t) { t.new(unicode: !h.packet || h.packet.smb.flags2_unicode?) }
103
- # @!attribute pad1
104
- # Padding to align {#body} on 4-byte boundary.
105
- # @return [String]
106
- define_field :pad1, PacketGen::Types::String, default: "\0" * 4,
107
- builder: ->(h, t) { t.new(length_from: -> { h.data_offset - SMB.new.sz - (h.offset_of(:name) + h[:name].sz) }) }
108
- define_field :body, PacketGen::Types::String
109
-
110
- # Give protocol name for this class
111
- # @return [String]
112
- def protocol_name
113
- 'SMB::TransRequest'
114
- end
115
- end
116
-
117
- # Transaction Response.
118
- #
119
- # See also {Blocks}, as {TransResponse} is a specialization of {Blocks#words}
120
- # and {Blocks#bytes}.
121
- # @author Sylvain Daubert
122
- class TransResponse < PacketGen::Header::Base
123
- # @!attribute word_count
124
- # The size, in 2-byte words, of the SMB command parameters. It should
125
- # be +14 + setup_count+.
126
- # @return [Integer]
127
- define_field :word_count, PacketGen::Types::Int8, default: 10
128
- # @!attribute total_param_count
129
- # The total number of transaction parameter bytes.
130
- # @return [Integer]
131
- define_field :total_param_count, PacketGen::Types::Int16le
132
- # @!attribute total_data_count
133
- # The total number of transaction data bytes.
134
- # @return [Integer]
135
- define_field :total_data_count, PacketGen::Types::Int16le
136
- # @!attribute rsv1
137
- # 16-bit reserved field
138
- # @return [Integer]
139
- define_field :rsv1, PacketGen::Types::Int16le, default: 0
140
- # @!attribute param_count
141
- # 16-bit number of transaction parameter bytes sent in this response.
142
- # @return [Integer]
143
- define_field :param_count, PacketGen::Types::Int16le
144
- # @!attribute param_offset
145
- # 16-bit offset (in bytes) from the start of the SMB header to the start of the
146
- # transaction parameters.
147
- # @return [Integer]
148
- define_field :param_offset, PacketGen::Types::Int16le
149
- # @!attribute param_displacement
150
- # 16-bit offset (in bytes) relative to all of the transaction
151
- # parameter bytes in this transaction response at which this block of
152
- # parameter bytes SHOULD be placed.
153
- # @return [Integer]
154
- define_field :param_displacement, PacketGen::Types::Int16le
155
- # @!attribute data_count
156
- # 16-bit number of transaction data bytes sent in this response.
157
- # @return [Integer]
158
- define_field :data_count, PacketGen::Types::Int16le
159
- # @!attribute data_offset
160
- # 16-bit offset (in bytes) from the start of the SMB header to the start
161
- # of the data field.
162
- # @return [Integer]
163
- define_field :data_offset, PacketGen::Types::Int16le
164
- # @!attribute data_displacement
165
- # 16-bit offset (in bytes) relative to all of the transaction data bytes in
166
- # this transaction response at which this block of data bytes SHOULD be placed.
167
- # @return [Integer]
168
- define_field :data_displacement, PacketGen::Types::Int16le
169
- # @!attribute setup_count
170
- # 8-bit number of setup words (ie 16-bit words) contained in {#setup} field.
171
- define_field :setup_count, PacketGen::Types::Int8
172
- # @!attribute rsv3
173
- # 8-bit reserved field
174
- # @return [Integer]
175
- define_field :rsv2, PacketGen::Types::Int8
176
- # @!attribute setup
177
- # Array of 2-byte words.
178
- # @return [ArrayPacketGen::]
179
- define_field :setup, PacketGen::Types::ArrayOfInt16le, builder: ->(h, t) { t.new(counter: h[:setup_count]) }
180
- # @!attribute byte_count
181
- # @return [Integer]
182
- define_field :byte_count, PacketGen::Types::Int16le
183
- # @!attribute pad1
184
- # Padding before {#body} to align it on 32-bit boundary
185
- # @return [Integer]
186
- define_field :pad1, PacketGen::Types::String, default: "\0" * 4,
187
- builder: ->(h, t) { t.new(length_from: -> { h.data_offset - SMB.new.sz - (h.offset_of(:byte_count) + h[:byte_count].sz) }) }
188
- define_field :body, PacketGen::Types::String
189
-
190
- # Give protocol name for this class
191
- # @return [String]
192
- def protocol_name
193
- 'SMB::TransResponse'
194
- end
195
- end
196
-
197
- self.bind_command 'trans'
10
+ # Namespace for TRANS related classes
11
+ module Trans; end
198
12
  end
199
13
  end
14
+
15
+ require_relative 'trans/request'
16
+ require_relative 'trans/response'
17
+
18
+ PacketGen::Plugin::SMB.bind_command 'trans'
@@ -0,0 +1,121 @@
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
+ module Trans
11
+ # Transaction Request.
12
+ #
13
+ # See also {Blocks}, as {Trans::Request} is a specialization of {Blocks#words}
14
+ # and {Blocks#bytes}.
15
+ # @author Sylvain Daubert
16
+ class Request < PacketGen::Header::Base
17
+ # @!attribute word_count
18
+ # The size, in 2-byte words, of the SMB command parameters. It should
19
+ # be +14 + setup_count+.
20
+ # @return [Integer]
21
+ define_field :word_count, PacketGen::Types::Int8, default: 14
22
+ # @!attribute total_param_count
23
+ # The total number of transaction parameter bytes.
24
+ # @return [Integer]
25
+ define_field :total_param_count, PacketGen::Types::Int16le
26
+ # @!attribute total_data_count
27
+ # The total number of transaction data bytes.
28
+ # @return [Integer]
29
+ define_field :total_data_count, PacketGen::Types::Int16le
30
+ # @!attribute max_param_count
31
+ # The maximum number of parameter bytes that the client will accept
32
+ # in transaction response.
33
+ # @return [Integer]
34
+ define_field :max_param_count, PacketGen::Types::Int16le
35
+ # @!attribute max_data_count
36
+ # The maximum number of data bytes that the client will accept
37
+ # in transaction response.
38
+ # @return [Integer]
39
+ define_field :max_data_count, PacketGen::Types::Int16le
40
+ # @!attribute max_setup_count
41
+ # The maximum number of setup bytes that the client will accept
42
+ # in transaction response.
43
+ # @return [Integer]
44
+ define_field :max_setup_count, PacketGen::Types::Int8
45
+ # @!attribute rsv1
46
+ # 8-bit reserved field
47
+ # @return [Integer]
48
+ define_field :rsv1, PacketGen::Types::Int8, default: 0
49
+ # @!attribute flags
50
+ # 16-bit flags
51
+ # @return [Integer]
52
+ define_field :flags, PacketGen::Types::Int16le
53
+ # @!attribute timeout
54
+ # 32-bit timeout
55
+ # @return [Integer]
56
+ define_field :timeout, PacketGen::Types::Int32le
57
+ # @!attribute rsv2
58
+ # 16-bit reserved field
59
+ # @return [Integer]
60
+ define_field :rsv2, PacketGen::Types::Int16le, default: 0
61
+ # @!attribute param_count
62
+ # 16-bit number of transaction parameter bytes that the clients attempts to
63
+ # send to the server in this request.
64
+ # @return [Integer]
65
+ define_field :param_count, PacketGen::Types::Int16le
66
+ # @!attribute param_offset
67
+ # 16-bit offset (in bytes) from the start of the SMB header to the start of the
68
+ # transaction parameters.
69
+ # @return [Integer]
70
+ define_field :param_offset, PacketGen::Types::Int16le
71
+ # @!attribute data_count
72
+ # 16-bit number of transaction data bytes that the clients sends to
73
+ # the server in this request.
74
+ # @return [Integer]
75
+ define_field :data_count, PacketGen::Types::Int16le
76
+ # @!attribute data_offset
77
+ # 16-bit offset (in bytes) from the start of the SMB header to the start
78
+ # of the data field.
79
+ # @return [Integer]
80
+ define_field :data_offset, PacketGen::Types::Int16le
81
+ # @!attribute setup_count
82
+ # 8-bit number of setup words (ie 16-bit words) contained in {#setup} field.
83
+ define_field :setup_count, PacketGen::Types::Int8
84
+ # @!attribute rsv3
85
+ # 8-bit reserved field
86
+ # @return [Integer]
87
+ define_field :rsv3, PacketGen::Types::Int8
88
+ # @!attribute setup
89
+ # Array of 2-byte words.
90
+ # @return [Array]
91
+ define_field :setup, PacketGen::Types::ArrayOfInt16le, builder: ->(h, t) { t.new(counter: h[:setup_count]) }
92
+ # @!attribute byte_count
93
+ # @return [Integer]
94
+ define_field :byte_count, PacketGen::Types::Int16le
95
+ # @!attribute padname
96
+ # 8-bit optional padding to align {#name} on a 2-byte boundary. Only present
97
+ # if {SMB#flags2_unicode?} is +true+.
98
+ # @return [Integer]
99
+ define_field :padname, PacketGen::Types::Int8, optional: ->(h) { h.packet && h.packet.smb.flags2_unicode? }
100
+ # @!attribute name
101
+ # Pathname of the mailslot or named pipe.
102
+ # @return [String]
103
+ define_field :name, SMB::String, builder: ->(h, t) { t.new(unicode: !h.packet || h.packet.smb.flags2_unicode?) }
104
+ # @!attribute pad1
105
+ # Padding to align {#body} on 4-byte boundary.
106
+ # @return [String]
107
+ define_field :pad1, PacketGen::Types::String, default: "\0" * 4,
108
+ builder: ->(h, t) { t.new(length_from: -> { h.data_offset - SMB.new.sz - (h.offset_of(:name) + h[:name].sz) }) }
109
+ # @!attribute body
110
+ # @return [String]
111
+ define_field :body, PacketGen::Types::String
112
+
113
+ # Give protocol name for this class
114
+ # @return [String]
115
+ def protocol_name
116
+ 'SMB::Trans::Request'
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end