ruby_smb 0.0.10 → 0.0.11

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d730a6a0e6943e7d8e8e519f8fca041fb96d48e0
4
- data.tar.gz: a5f252ba978e403a832846827b45f95602cd715c
3
+ metadata.gz: 851b91cd7c3a5584f839a77b10bae8d84fb48212
4
+ data.tar.gz: 5a0443efab42f322e25da34ee398e98afd13080b
5
5
  SHA512:
6
- metadata.gz: 12b3d5af427ac2655c469d7c3b94796d0125c2f6d4e7c883494d304cb65489bb4c131e258ace6a5dcbf8421b4bc79bad9639144d4b0301d9e0acf72caf1091a3
7
- data.tar.gz: e7bc4b20c587c1e2ac982f3d98b5a2c91085ad17fcf66115749c5af726a972a3415c36cba9957774844cb9e423e6635e8499e0d8ab64069eafa7db276a006818
6
+ metadata.gz: 6f6df6e678fc8e73921f20784d465c447e37c364b1e01a07be5ab7683f40f6349fc0698446a6c72300b834698513626951441e1ae8c46e1a0d9ac9c3bb927097
7
+ data.tar.gz: b004442c39c3f88b63fa3052b7d7a3c8505c83748e5d8bf8531cd94d65816137d241e60e4e626439905993520c048cf11b919131602fec28a8f88f1f9bf9dbef
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -118,6 +118,15 @@ module RubySMB
118
118
  @smb2_message_id = 0
119
119
  end
120
120
 
121
+ # Logs off any currently open session on the server
122
+ # and closes the TCP socket connection.
123
+ #
124
+ # @return [void]
125
+ def disconnect!
126
+ logoff!
127
+ dispatcher.tcp_socket.close
128
+ end
129
+
121
130
  # Sets the message id field in an SMB2 packet's
122
131
  # header to the one tracked by the client. It then increments
123
132
  # the counter on the client.
@@ -132,6 +141,8 @@ module RubySMB
132
141
  packet
133
142
  end
134
143
 
144
+ # Performs protocol negotiation and session setup. It defaults to using
145
+ # the credentials supplied during initialization, but can take a new set of credentials if needed.
135
146
  def login(username: self.username, password: self.password, domain: self.domain, local_workstation: self.local_workstation )
136
147
  @domain = domain
137
148
  @local_workstation = local_workstation
@@ -149,6 +160,23 @@ module RubySMB
149
160
  authenticate
150
161
  end
151
162
 
163
+ # Sends a LOGOFF command to the remote server to terminate the session
164
+ #
165
+ # @return [WindowsError::ErrorCode] the NTStatus of the response
166
+ def logoff!
167
+ if smb2
168
+ request = RubySMB::SMB2::Packet::LogoffRequest.new
169
+ raw_response = send_recv(request)
170
+ response = RubySMB::SMB2::Packet::LogoffResponse.read(raw_response)
171
+ else
172
+ request = RubySMB::SMB1::Packet::LogoffRequest.new
173
+ raw_response = send_recv(request)
174
+ response = RubySMB::SMB1::Packet::LogoffResponse.read(raw_response)
175
+ end
176
+ wipe_state!
177
+ response.status_code
178
+ end
179
+
152
180
  # Sends a packet and receives the raw response through the Dispatcher.
153
181
  # It will also sign the packet if neccessary.
154
182
  #
@@ -190,9 +218,19 @@ module RubySMB
190
218
  smb1_tree_connect(share)
191
219
  end
192
220
  end
193
- private
194
-
195
221
 
222
+ # Resets all of the session state on the client, setting it
223
+ # back to scratch. Should only be called when a session is no longer
224
+ # valid.
225
+ #
226
+ # @return [void]
227
+ def wipe_state!
228
+ self.session_id = 0x00
229
+ self.user_id = 0x00
230
+ self.session_key = ''
231
+ self.sequence_counter = 0
232
+ self.smb2_message_id = 0
233
+ end
196
234
 
197
235
 
198
236
  end
@@ -11,6 +11,9 @@ class RubySMB::Dispatcher::Socket < RubySMB::Dispatcher::Base
11
11
  # @param tcp_socket [IO]
12
12
  def initialize(tcp_socket)
13
13
  @tcp_socket = tcp_socket
14
+ if @tcp_socket.respond_to?(:setsockopt)
15
+ @tcp_socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true)
16
+ end
14
17
  end
15
18
 
16
19
  # @param host [String] passed to TCPSocket.new
@@ -4,6 +4,7 @@ module RubySMB
4
4
  SMB_COM_TREE_DISCONNECT = 0x71
5
5
  SMB_COM_NEGOTIATE = 0x72
6
6
  SMB_COM_SESSION_SETUP = 0x73
7
+ SMB_COM_LOGOFF = 0x74
7
8
  SMB_COM_TREE_CONNECT = 0x75
8
9
  SMB_COM_NO_ANDX_COMMAND = 0xFF
9
10
  end
@@ -11,6 +11,8 @@ module RubySMB
11
11
  require 'ruby_smb/smb1/packet/tree_connect_response'
12
12
  require 'ruby_smb/smb1/packet/tree_disconnect_request'
13
13
  require 'ruby_smb/smb1/packet/tree_disconnect_response'
14
+ require 'ruby_smb/smb1/packet/logoff_request'
15
+ require 'ruby_smb/smb1/packet/logoff_response'
14
16
  end
15
17
  end
16
18
  end
@@ -0,0 +1,30 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+
5
+ # This class represents an SMB1 LOGOFF Request Packet as defined in
6
+ # [2.2.4.54.1 Request](https://msdn.microsoft.com/en-us/library/ee442167.aspx)
7
+ class LogoffRequest < RubySMB::GenericPacket
8
+
9
+ # The Parameter Block for this packet is empty save the Word Count and ANDX Block
10
+ class ParameterBlock < RubySMB::SMB1::ParameterBlock
11
+ and_x_block :andx_block
12
+ end
13
+
14
+ # The Data Block for this packet is empty save the Byte Count
15
+ class DataBlock < RubySMB::SMB1::DataBlock
16
+ end
17
+
18
+ smb_header :smb_header
19
+ parameter_block :parameter_block
20
+ data_block :data_block
21
+
22
+ def initialize_instance
23
+ super
24
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_LOGOFF
25
+ end
26
+
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+ module RubySMB
2
+ module SMB1
3
+ module Packet
4
+
5
+ # This class represents an SMB1 LOGOFF Response Packet as defined in
6
+ # [2.2.4.54.2 Response](https://msdn.microsoft.com/en-us/library/ee441488.aspx)
7
+ class LogoffResponse < RubySMB::GenericPacket
8
+
9
+ # The Parameter Block for this packet is empty save the Word Count and ANDX Block
10
+ class ParameterBlock < RubySMB::SMB1::ParameterBlock
11
+ and_x_block :andx_block
12
+ end
13
+
14
+ # The Data Block for this packet is empty save the Byte Count
15
+ class DataBlock < RubySMB::SMB1::DataBlock
16
+ end
17
+
18
+ smb_header :smb_header
19
+ parameter_block :parameter_block
20
+ data_block :data_block
21
+
22
+ def initialize_instance
23
+ super
24
+ smb_header.command = RubySMB::SMB1::Commands::SMB_COM_LOGOFF
25
+ smb_header.flags.reply = 1
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
@@ -10,6 +10,8 @@ module RubySMB
10
10
  require 'ruby_smb/smb2/packet/tree_connect_response'
11
11
  require 'ruby_smb/smb2/packet/tree_disconnect_request'
12
12
  require 'ruby_smb/smb2/packet/tree_disconnect_response'
13
+ require 'ruby_smb/smb2/packet/logoff_request'
14
+ require 'ruby_smb/smb2/packet/logoff_response'
13
15
  end
14
16
  end
15
17
  end
@@ -0,0 +1,22 @@
1
+ module RubySMB
2
+ module SMB2
3
+ module Packet
4
+
5
+ # An SMB2 LOGOFF Request Packet as defined in
6
+ # [2.2.7 SMB2 LOGOFF Request](https://msdn.microsoft.com/en-us/library/cc246565.aspx)
7
+ class LogoffRequest < RubySMB::GenericPacket
8
+ endian :little
9
+ smb2_header :smb2_header
10
+ uint16 :structure_size, label: 'Structure Size', initial_value: 4
11
+ uint16 :reserved, label: 'Reserved Space'
12
+
13
+
14
+ def initialize_instance
15
+ super
16
+ smb2_header.command = RubySMB::SMB2::Commands::LOGOFF
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ module RubySMB
2
+ module SMB2
3
+ module Packet
4
+
5
+ # An SMB2 LOGOFF Response Packet as defined in
6
+ # [2.2.8 SMB2 LOGOFF Response](https://msdn.microsoft.com/en-us/library/cc246566.aspx)
7
+ class LogoffResponse < RubySMB::GenericPacket
8
+ endian :little
9
+ smb2_header :smb2_header
10
+ uint16 :structure_size, label: 'Structure Size', initial_value: 4
11
+ uint16 :reserved, label: 'Reserved Space'
12
+
13
+
14
+ def initialize_instance
15
+ super
16
+ smb2_header.command = RubySMB::SMB2::Commands::LOGOFF
17
+ smb2_header.flags.reply = 1
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,3 +1,3 @@
1
1
  module RubySMB
2
- VERSION = '0.0.10'
2
+ VERSION = '0.0.11'
3
3
  end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB1::Packet::LogoffRequest do
4
+
5
+ subject(:packet) { described_class.new }
6
+
7
+ describe '#smb_header' do
8
+ subject(:header) { packet.smb_header }
9
+
10
+ it 'is a standard SMB Header' do
11
+ expect(header).to be_a RubySMB::SMB1::SMBHeader
12
+ end
13
+
14
+ it 'should have the command set to SMB_COM_NEGOTIATE' do
15
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_LOGOFF
16
+ end
17
+
18
+ it 'should not have the response flag set' do
19
+ expect(header.flags.reply).to eq 0
20
+ end
21
+ end
22
+
23
+ describe '#parameter_block' do
24
+ subject(:parameter_block) { packet.parameter_block }
25
+
26
+ it 'is a standard ParameterBlock' do
27
+ expect(parameter_block).to be_a RubySMB::SMB1::ParameterBlock
28
+ end
29
+
30
+ it { is_expected.to respond_to :andx_block }
31
+
32
+ it 'has an AndXBlock' do
33
+ expect(parameter_block.andx_block).to be_a RubySMB::SMB1::AndXBlock
34
+ end
35
+ end
36
+
37
+ describe '#data_block' do
38
+ subject(:data_block) { packet.data_block }
39
+
40
+ it 'is a standard DataBlock' do
41
+ expect(data_block).to be_a RubySMB::SMB1::DataBlock
42
+ end
43
+ end
44
+
45
+
46
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB1::Packet::LogoffResponse do
4
+
5
+ subject(:packet) { described_class.new }
6
+
7
+ describe '#smb_header' do
8
+ subject(:header) { packet.smb_header }
9
+
10
+ it 'is a standard SMB Header' do
11
+ expect(header).to be_a RubySMB::SMB1::SMBHeader
12
+ end
13
+
14
+ it 'should have the command set to SMB_COM_NEGOTIATE' do
15
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_LOGOFF
16
+ end
17
+
18
+ it 'should have the response flag set' do
19
+ expect(header.flags.reply).to eq 1
20
+ end
21
+ end
22
+
23
+ describe '#parameter_block' do
24
+ subject(:parameter_block) { packet.parameter_block }
25
+
26
+ it 'is a standard ParameterBlock' do
27
+ expect(parameter_block).to be_a RubySMB::SMB1::ParameterBlock
28
+ end
29
+
30
+ it { is_expected.to respond_to :andx_block }
31
+
32
+ it 'has an AndXBlock' do
33
+ expect(parameter_block.andx_block).to be_a RubySMB::SMB1::AndXBlock
34
+ end
35
+ end
36
+
37
+ describe '#data_block' do
38
+ subject(:data_block) { packet.data_block }
39
+
40
+ it 'is a standard DataBlock' do
41
+ expect(data_block).to be_a RubySMB::SMB1::DataBlock
42
+ end
43
+ end
44
+
45
+
46
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB2::Packet::LogoffRequest do
4
+
5
+ subject(:packet) { described_class.new }
6
+
7
+ it { is_expected.to respond_to :smb2_header }
8
+ it { is_expected.to respond_to :structure_size }
9
+
10
+ it 'is little endian' do
11
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
12
+ end
13
+
14
+ describe '#smb2_header' do
15
+ subject(:header) { packet.smb2_header }
16
+
17
+ it 'is a standard SMB Header' do
18
+ expect(header).to be_a RubySMB::SMB2::SMB2Header
19
+ end
20
+
21
+ it 'should have the command set to SMB_COM_NEGOTIATE' do
22
+ expect(header.command).to eq RubySMB::SMB2::Commands::LOGOFF
23
+ end
24
+
25
+ it 'should not have the response flag set' do
26
+ expect(header.flags.reply).to eq 0
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB2::Packet::LogoffResponse do
4
+
5
+ subject(:packet) { described_class.new }
6
+
7
+ it { is_expected.to respond_to :smb2_header }
8
+ it { is_expected.to respond_to :structure_size }
9
+
10
+ it 'is little endian' do
11
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
12
+ end
13
+
14
+ describe '#smb2_header' do
15
+ subject(:header) { packet.smb2_header }
16
+
17
+ it 'is a standard SMB Header' do
18
+ expect(header).to be_a RubySMB::SMB2::SMB2Header
19
+ end
20
+
21
+ it 'should have the command set to SMB_COM_NEGOTIATE' do
22
+ expect(header.command).to eq RubySMB::SMB2::Commands::LOGOFF
23
+ end
24
+
25
+ it 'should have the response flag set' do
26
+ expect(header.flags.reply).to eq 1
27
+ end
28
+ end
29
+
30
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_smb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Maloney
@@ -89,7 +89,7 @@ cert_chain:
89
89
  G+Hmcg1v810agasPdoydE0RTVZgEOOMoQ07qu7JFXVWZ9ZQpHT7qJATWL/b2csFG
90
90
  8mVuTXnyJOKRJA==
91
91
  -----END CERTIFICATE-----
92
- date: 2017-04-13 00:00:00.000000000 Z
92
+ date: 2017-04-17 00:00:00.000000000 Z
93
93
  dependencies:
94
94
  - !ruby/object:Gem::Dependency
95
95
  name: redcarpet
@@ -256,6 +256,8 @@ files:
256
256
  - lib/ruby_smb/smb1/dialect.rb
257
257
  - lib/ruby_smb/smb1/packet.rb
258
258
  - lib/ruby_smb/smb1/packet/error_packet.rb
259
+ - lib/ruby_smb/smb1/packet/logoff_request.rb
260
+ - lib/ruby_smb/smb1/packet/logoff_response.rb
259
261
  - lib/ruby_smb/smb1/packet/negotiate_request.rb
260
262
  - lib/ruby_smb/smb1/packet/negotiate_response.rb
261
263
  - lib/ruby_smb/smb1/packet/negotiate_response_extended.rb
@@ -282,6 +284,8 @@ files:
282
284
  - lib/ruby_smb/smb2/commands.rb
283
285
  - lib/ruby_smb/smb2/packet.rb
284
286
  - lib/ruby_smb/smb2/packet/error_packet.rb
287
+ - lib/ruby_smb/smb2/packet/logoff_request.rb
288
+ - lib/ruby_smb/smb2/packet/logoff_response.rb
285
289
  - lib/ruby_smb/smb2/packet/negotiate_request.rb
286
290
  - lib/ruby_smb/smb2/packet/negotiate_response.rb
287
291
  - lib/ruby_smb/smb2/packet/session_setup_request.rb
@@ -313,6 +317,8 @@ files:
313
317
  - spec/lib/ruby_smb/smb1/data_block_spec.rb
314
318
  - spec/lib/ruby_smb/smb1/dialect_spec.rb
315
319
  - spec/lib/ruby_smb/smb1/packet/error_packet_spec.rb
320
+ - spec/lib/ruby_smb/smb1/packet/logoff_request_spec.rb
321
+ - spec/lib/ruby_smb/smb1/packet/logoff_response_spec.rb
316
322
  - spec/lib/ruby_smb/smb1/packet/negotiate_request_spec.rb
317
323
  - spec/lib/ruby_smb/smb1/packet/negotiate_response_extended_spec.rb
318
324
  - spec/lib/ruby_smb/smb1/packet/negotiate_response_spec.rb
@@ -333,6 +339,8 @@ files:
333
339
  - spec/lib/ruby_smb/smb2/bit_field/share_flags_spec.rb
334
340
  - spec/lib/ruby_smb/smb2/bit_field/smb2_capabilities_spec.rb
335
341
  - spec/lib/ruby_smb/smb2/bit_field/smb_secruity_mode_spec.rb
342
+ - spec/lib/ruby_smb/smb2/packet/logoff_request_spec.rb
343
+ - spec/lib/ruby_smb/smb2/packet/logoff_response_spec.rb
336
344
  - spec/lib/ruby_smb/smb2/packet/negotiate_request_spec.rb
337
345
  - spec/lib/ruby_smb/smb2/packet/negotiate_response_spec.rb
338
346
  - spec/lib/ruby_smb/smb2/packet/session_setup_request_spec.rb
@@ -391,6 +399,8 @@ test_files:
391
399
  - spec/lib/ruby_smb/smb1/data_block_spec.rb
392
400
  - spec/lib/ruby_smb/smb1/dialect_spec.rb
393
401
  - spec/lib/ruby_smb/smb1/packet/error_packet_spec.rb
402
+ - spec/lib/ruby_smb/smb1/packet/logoff_request_spec.rb
403
+ - spec/lib/ruby_smb/smb1/packet/logoff_response_spec.rb
394
404
  - spec/lib/ruby_smb/smb1/packet/negotiate_request_spec.rb
395
405
  - spec/lib/ruby_smb/smb1/packet/negotiate_response_extended_spec.rb
396
406
  - spec/lib/ruby_smb/smb1/packet/negotiate_response_spec.rb
@@ -411,6 +421,8 @@ test_files:
411
421
  - spec/lib/ruby_smb/smb2/bit_field/share_flags_spec.rb
412
422
  - spec/lib/ruby_smb/smb2/bit_field/smb2_capabilities_spec.rb
413
423
  - spec/lib/ruby_smb/smb2/bit_field/smb_secruity_mode_spec.rb
424
+ - spec/lib/ruby_smb/smb2/packet/logoff_request_spec.rb
425
+ - spec/lib/ruby_smb/smb2/packet/logoff_response_spec.rb
414
426
  - spec/lib/ruby_smb/smb2/packet/negotiate_request_spec.rb
415
427
  - spec/lib/ruby_smb/smb2/packet/negotiate_response_spec.rb
416
428
  - spec/lib/ruby_smb/smb2/packet/session_setup_request_spec.rb
metadata.gz.sig CHANGED
Binary file