packetgen-plugin-smb 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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