ruby_smb 0.0.10 → 0.0.11

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