ruby_smb 0.0.20 → 0.0.21

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 (39) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -3
  4. data/examples/pipes.rb +45 -0
  5. data/lib/ruby_smb/client.rb +25 -3
  6. data/lib/ruby_smb/client/negotiation.rb +10 -3
  7. data/lib/ruby_smb/nbss/session_header.rb +3 -3
  8. data/lib/ruby_smb/smb1.rb +1 -0
  9. data/lib/ruby_smb/smb1/bit_field.rb +1 -0
  10. data/lib/ruby_smb/smb1/bit_field/trans_flags.rb +15 -0
  11. data/lib/ruby_smb/smb1/commands.rb +1 -0
  12. data/lib/ruby_smb/smb1/packet.rb +1 -0
  13. data/lib/ruby_smb/smb1/packet/trans.rb +16 -0
  14. data/lib/ruby_smb/smb1/packet/trans/data_block.rb +49 -0
  15. data/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_request.rb +24 -0
  16. data/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_response.rb +59 -0
  17. data/lib/ruby_smb/smb1/packet/trans/request.rb +50 -0
  18. data/lib/ruby_smb/smb1/packet/trans/response.rb +46 -0
  19. data/lib/ruby_smb/smb1/packet/trans/subcommands.rb +11 -0
  20. data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +1 -1
  21. data/lib/ruby_smb/smb1/pipe.rb +65 -0
  22. data/lib/ruby_smb/smb1/tree.rb +8 -1
  23. data/lib/ruby_smb/smb2.rb +1 -0
  24. data/lib/ruby_smb/smb2/file.rb +6 -6
  25. data/lib/ruby_smb/smb2/packet/tree_disconnect_request.rb +1 -0
  26. data/lib/ruby_smb/smb2/pipe.rb +69 -0
  27. data/lib/ruby_smb/smb2/tree.rb +11 -1
  28. data/lib/ruby_smb/version.rb +1 -1
  29. data/spec/lib/ruby_smb/nbss/session_header_spec.rb +4 -4
  30. data/spec/lib/ruby_smb/smb1/bit_field/trans_flags_spec.rb +26 -0
  31. data/spec/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_request_spec.rb +47 -0
  32. data/spec/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_response_spec.rb +31 -0
  33. data/spec/lib/ruby_smb/smb1/packet/trans/request_spec.rb +94 -0
  34. data/spec/lib/ruby_smb/smb1/packet/trans/response_spec.rb +85 -0
  35. data/spec/lib/ruby_smb/smb1/packet/trans2/open2_response_spec.rb +1 -1
  36. data/spec/lib/ruby_smb/smb1/pipe_spec.rb +65 -0
  37. data/spec/lib/ruby_smb/smb2/pipe_spec.rb +64 -0
  38. metadata +27 -2
  39. metadata.gz.sig +0 -0
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB1::Packet::Trans::Response do
4
+ subject(:packet) { described_class.new }
5
+
6
+ describe '#smb_header' do
7
+ subject(:header) { packet.smb_header }
8
+
9
+ it 'is a standard SMB Header' do
10
+ expect(header).to be_a RubySMB::SMB1::SMBHeader
11
+ end
12
+
13
+ it 'should have the command set to SMB_COM_NEGOTIATE' do
14
+ expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_TRANSACTION
15
+ end
16
+
17
+ it 'should have the response flag set' do
18
+ expect(header.flags.reply).to eq 1
19
+ end
20
+ end
21
+
22
+ describe '#parameter_block' do
23
+ subject(:parameter_block) { packet.parameter_block }
24
+
25
+ it 'is a standard ParameterBlock' do
26
+ expect(parameter_block).to be_a RubySMB::SMB1::ParameterBlock
27
+ end
28
+
29
+ it { is_expected.to respond_to :total_parameter_count }
30
+ it { is_expected.to respond_to :total_data_count }
31
+ it { is_expected.to respond_to :parameter_count }
32
+ it { is_expected.to respond_to :parameter_offset }
33
+ it { is_expected.to respond_to :parameter_displacement }
34
+ it { is_expected.to respond_to :data_count }
35
+ it { is_expected.to respond_to :data_offset }
36
+ it { is_expected.to respond_to :parameter_displacement }
37
+ it { is_expected.to respond_to :setup_count }
38
+
39
+ describe 'parameter_count' do
40
+ it 'is a count of bytes in the data_block trans_parameters field' do
41
+ packet.data_block.trans_parameters = "\x00\x01\x02\x03"
42
+ expect(parameter_block.parameter_count).to eq 4
43
+ end
44
+ end
45
+
46
+ describe 'parameter_offset' do
47
+ it ' contains the absolute_offset to the data_block trans_parameters field' do
48
+ expect(parameter_block.parameter_offset).to eq packet.data_block.trans_parameters.abs_offset
49
+ end
50
+ end
51
+
52
+ describe 'data_count' do
53
+ it 'is a count of bytes in the data_block trans_data field' do
54
+ packet.data_block.trans_data = "\x00\x01\x02\x03"
55
+ expect(parameter_block.data_count).to eq 4
56
+ end
57
+ end
58
+
59
+ describe 'data_offset' do
60
+ it 'contains the absolute_offset to the data_block trans_data field' do
61
+ expect(parameter_block.data_offset).to eq packet.data_block.trans_data.abs_offset
62
+ end
63
+ end
64
+ end
65
+
66
+ describe '#data_block' do
67
+ subject(:data_block) { packet.data_block }
68
+
69
+ it 'is a Trans DataBlock' do
70
+ expect(data_block).to be_a RubySMB::SMB1::Packet::Trans::DataBlock
71
+ end
72
+
73
+ it { is_expected.to respond_to :trans_parameters }
74
+ it { is_expected.to respond_to :trans_data }
75
+
76
+ it 'should keep #trans_parameters 4-byte aligned' do
77
+ expect(data_block.trans_parameters.abs_offset % 4).to eq 0
78
+ end
79
+
80
+ it 'should keep #trans_data 4-byte aligned' do
81
+ data_block.trans_parameters = 'a'
82
+ expect(data_block.trans_data.abs_offset % 4).to eq 0
83
+ end
84
+ end
85
+ end
@@ -10,7 +10,7 @@ RSpec.describe RubySMB::SMB1::Packet::Trans2::Open2Response do
10
10
  expect(header).to be_a RubySMB::SMB1::SMBHeader
11
11
  end
12
12
 
13
- it 'should have the command set to SMB_COM_NEGOTIATE' do
13
+ it 'should have the command set to SMB_COM_TRANSACTION2' do
14
14
  expect(header.command).to eq RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
15
15
  end
16
16
 
@@ -0,0 +1,65 @@
1
+ RSpec.describe RubySMB::SMB1::Pipe do
2
+
3
+ let(:peek_nmpipe_response) {
4
+ packet = RubySMB::SMB1::Packet::Trans::PeekNmpipeResponse.new
5
+ packet.data_block.trans_parameters.read("\x10\x20\x00\x00\x03\x00")
6
+ packet
7
+ }
8
+
9
+ describe RubySMB::SMB1::Pipe do
10
+ it { expect(described_class).to be < RubySMB::SMB1::File }
11
+ end
12
+
13
+ let(:dispatcher) { RubySMB::Dispatcher::Socket.new(double('socket')) }
14
+ let(:client) { RubySMB::Client.new(dispatcher, username: 'msfadmin', password: 'msfadmin') }
15
+ let(:connect_response) {
16
+ packet = RubySMB::SMB1::Packet::TreeConnectResponse.new
17
+ packet.smb_header.tid = 2051
18
+ packet.parameter_block.guest_access_rights.read("\xff\x01\x1f\x00")
19
+ packet.parameter_block.access_rights.read("\xff\x01\x1f\x01")
20
+ packet
21
+ }
22
+ let(:tree) { RubySMB::SMB1::Tree.new(client: client, share: '\\1.2.3.4\IPC$', response: connect_response) }
23
+ let(:nt_create_andx_response) {
24
+ response = RubySMB::SMB1::Packet::NtCreateAndxResponse.new
25
+ response.parameter_block.ext_file_attributes = { normal: 1 }
26
+ response.parameter_block.fid = 0x4000
27
+ response.parameter_block.last_access_time = DateTime.parse("2017-09-20T1:1:1")
28
+ response.parameter_block.last_change_time = DateTime.parse("2017-09-22T2:2:2")
29
+ response.parameter_block.last_write_time = DateTime.parse("2017-09-25T3:3:3")
30
+ response.parameter_block.end_of_file = 53
31
+ response.parameter_block.allocation_size = 4096
32
+ response
33
+ }
34
+ let(:filename) { 'msf-pipe' }
35
+
36
+ subject(:pipe) {
37
+ described_class.new(tree: tree, response: nt_create_andx_response, name: filename)
38
+ }
39
+
40
+ describe '#peek_available' do
41
+ it 'reads the correct number of bytes available' do
42
+ allow(pipe).to receive(:peek) { peek_nmpipe_response }
43
+ allow(pipe).to receive(:peek_available) { pipe.peek.data_block.trans_parameters.read_data_available }
44
+ expect(pipe.peek_available).to eq(0x2010)
45
+ end
46
+ end
47
+
48
+ describe '#peek_state' do
49
+ it 'reads the correct state of the pipe' do
50
+ allow(pipe).to receive(:peek) { peek_nmpipe_response }
51
+ allow(pipe).to receive(:peek_state) { pipe.peek.data_block.trans_parameters.pipe_state }
52
+ expect(pipe.peek_state).to eq(RubySMB::SMB1::Pipe::STATUS_OK)
53
+ end
54
+ end
55
+
56
+ describe '#is_connected?' do
57
+ it 'identifies that the pipe is connected from the status' do
58
+ allow(pipe).to receive(:peek) { peek_nmpipe_response }
59
+ allow(pipe).to receive(:peek_state) { pipe.peek.data_block.trans_parameters.pipe_state }
60
+ allow(pipe).to receive(:is_connected?) { pipe.peek_state == RubySMB::SMB1::Pipe::STATUS_OK }
61
+ expect(pipe.is_connected?).to eq(true)
62
+ end
63
+ end
64
+
65
+ end
@@ -0,0 +1,64 @@
1
+ RSpec.describe RubySMB::SMB2::Pipe do
2
+
3
+ let(:sock) { double('Socket', peeraddr: '192.168.1.5') }
4
+ let(:dispatcher) { RubySMB::Dispatcher::Socket.new(sock) }
5
+
6
+ let(:client) { RubySMB::Client.new(dispatcher, username: 'msfadmin', password: 'msfadmin') }
7
+ let(:tree_id) { 2049 }
8
+ let(:path) { '\\192.168.1.1\IPC$' }
9
+ let(:connect_response) {
10
+ packet = RubySMB::SMB2::Packet::TreeConnectResponse.new
11
+ packet.smb2_header.tree_id = tree_id
12
+ packet.maximal_access.read("\xff\x01\x1f\x00")
13
+ packet.share_type = 0x01
14
+ packet
15
+ }
16
+
17
+ let(:tree) { RubySMB::SMB2::Tree.new(client: client, share: path, response: connect_response) }
18
+ let(:file_id) { RubySMB::Field::Smb2Fileid.read('\x6d\x01\x00\x00\x00\x00\x00\x00\x\x01\x00\x00\x00\xff\xff\xff\xff') }
19
+ let(:time) { DateTime.now }
20
+ let(:create_response) {
21
+ RubySMB::SMB2::Packet::CreateResponse.new(
22
+ file_id: file_id,
23
+ end_of_file: 108,
24
+ allocation_size: 112,
25
+ last_access: time,
26
+ last_change: time,
27
+ last_write: time
28
+ )
29
+ }
30
+
31
+ let(:ioctl_response) {
32
+ packet = RubySMB::SMB2::Packet::IoctlResponse.new
33
+ packet.buffer = "\x03\x00\x00\x00" + "\x10\x20\x30\x40" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00"
34
+ packet
35
+ }
36
+
37
+ subject(:pipe) { described_class.new(name: 'msf-pipe', response: create_response, tree: tree) }
38
+
39
+ describe '#peek_available' do
40
+ it 'reads the correct number of bytes available' do
41
+ allow(pipe).to receive(:peek) { ioctl_response }
42
+ allow(pipe).to receive(:peek_available) { pipe.peek.buffer.unpack('VV')[1] }
43
+ expect(pipe.peek_available).to eq(0x40302010)
44
+ end
45
+ end
46
+
47
+ describe '#peek_state' do
48
+ it 'reads the correct state of the pipe' do
49
+ allow(pipe).to receive(:peek) { ioctl_response }
50
+ allow(pipe).to receive(:peek_state) { pipe.peek.buffer.unpack('V')[0] }
51
+ expect(pipe.peek_state).to eq(RubySMB::SMB2::Pipe::STATUS_CONNECTED)
52
+ end
53
+ end
54
+
55
+ describe '#is_connected?' do
56
+ it 'identifies that the pipe is connected from the status' do
57
+ allow(pipe).to receive(:peek) { ioctl_response }
58
+ allow(pipe).to receive(:peek_state) { pipe.peek.buffer.unpack('V')[0] }
59
+ allow(pipe).to receive(:is_connected?) { pipe.peek_state == RubySMB::SMB2::Pipe::STATUS_CONNECTED }
60
+ expect(pipe.is_connected?).to eq(true)
61
+ end
62
+ end
63
+
64
+ 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.20
4
+ version: 0.0.21
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: 2018-02-22 00:00:00.000000000 Z
92
+ date: 2018-03-05 00:00:00.000000000 Z
93
93
  dependencies:
94
94
  - !ruby/object:Gem::Dependency
95
95
  name: redcarpet
@@ -229,6 +229,7 @@ files:
229
229
  - examples/negotiate.rb
230
230
  - examples/negotiate_with_netbios_service.rb
231
231
  - examples/net_share_enum_all.rb
232
+ - examples/pipes.rb
232
233
  - examples/read_file.rb
233
234
  - examples/rename_file.rb
234
235
  - examples/tree_connect.rb
@@ -310,6 +311,7 @@ files:
310
311
  - lib/ruby_smb/smb1/bit_field/smb_file_attributes.rb
311
312
  - lib/ruby_smb/smb1/bit_field/smb_nmpipe_status.rb
312
313
  - lib/ruby_smb/smb1/bit_field/trans2_flags.rb
314
+ - lib/ruby_smb/smb1/bit_field/trans_flags.rb
313
315
  - lib/ruby_smb/smb1/bit_field/tree_connect_flags.rb
314
316
  - lib/ruby_smb/smb1/commands.rb
315
317
  - lib/ruby_smb/smb1/create_actions.rb
@@ -342,6 +344,13 @@ files:
342
344
  - lib/ruby_smb/smb1/packet/session_setup_legacy_response.rb
343
345
  - lib/ruby_smb/smb1/packet/session_setup_request.rb
344
346
  - lib/ruby_smb/smb1/packet/session_setup_response.rb
347
+ - lib/ruby_smb/smb1/packet/trans.rb
348
+ - lib/ruby_smb/smb1/packet/trans/data_block.rb
349
+ - lib/ruby_smb/smb1/packet/trans/peek_nmpipe_request.rb
350
+ - lib/ruby_smb/smb1/packet/trans/peek_nmpipe_response.rb
351
+ - lib/ruby_smb/smb1/packet/trans/request.rb
352
+ - lib/ruby_smb/smb1/packet/trans/response.rb
353
+ - lib/ruby_smb/smb1/packet/trans/subcommands.rb
345
354
  - lib/ruby_smb/smb1/packet/trans2.rb
346
355
  - lib/ruby_smb/smb1/packet/trans2/data_block.rb
347
356
  - lib/ruby_smb/smb1/packet/trans2/find_first2_request.rb
@@ -365,6 +374,7 @@ files:
365
374
  - lib/ruby_smb/smb1/packet/write_andx_request.rb
366
375
  - lib/ruby_smb/smb1/packet/write_andx_response.rb
367
376
  - lib/ruby_smb/smb1/parameter_block.rb
377
+ - lib/ruby_smb/smb1/pipe.rb
368
378
  - lib/ruby_smb/smb1/resource_type.rb
369
379
  - lib/ruby_smb/smb1/smb_header.rb
370
380
  - lib/ruby_smb/smb1/tree.rb
@@ -411,6 +421,7 @@ files:
411
421
  - lib/ruby_smb/smb2/packet/tree_disconnect_response.rb
412
422
  - lib/ruby_smb/smb2/packet/write_request.rb
413
423
  - lib/ruby_smb/smb2/packet/write_response.rb
424
+ - lib/ruby_smb/smb2/pipe.rb
414
425
  - lib/ruby_smb/smb2/smb2_header.rb
415
426
  - lib/ruby_smb/smb2/tree.rb
416
427
  - lib/ruby_smb/version.rb
@@ -469,6 +480,7 @@ files:
469
480
  - spec/lib/ruby_smb/smb1/bit_field/smb_file_attributes_spec.rb
470
481
  - spec/lib/ruby_smb/smb1/bit_field/smb_nmpipe_status_spec.rb
471
482
  - spec/lib/ruby_smb/smb1/bit_field/trans2_flags_spec.rb
483
+ - spec/lib/ruby_smb/smb1/bit_field/trans_flags_spec.rb
472
484
  - spec/lib/ruby_smb/smb1/bit_field/tree_connect_flags_spec.rb
473
485
  - spec/lib/ruby_smb/smb1/data_block_spec.rb
474
486
  - spec/lib/ruby_smb/smb1/dialect_spec.rb
@@ -495,6 +507,10 @@ files:
495
507
  - spec/lib/ruby_smb/smb1/packet/session_setup_legacy_response_spec.rb
496
508
  - spec/lib/ruby_smb/smb1/packet/session_setup_request_spec.rb
497
509
  - spec/lib/ruby_smb/smb1/packet/session_setup_response_spec.rb
510
+ - spec/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_request_spec.rb
511
+ - spec/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_response_spec.rb
512
+ - spec/lib/ruby_smb/smb1/packet/trans/request_spec.rb
513
+ - spec/lib/ruby_smb/smb1/packet/trans/response_spec.rb
498
514
  - spec/lib/ruby_smb/smb1/packet/trans2/find_first2_request_spec.rb
499
515
  - spec/lib/ruby_smb/smb1/packet/trans2/find_first2_response_spec.rb
500
516
  - spec/lib/ruby_smb/smb1/packet/trans2/find_information_level/find_file_full_directory_info_spec.rb
@@ -514,6 +530,7 @@ files:
514
530
  - spec/lib/ruby_smb/smb1/packet/write_andx_request_spec.rb
515
531
  - spec/lib/ruby_smb/smb1/packet/write_andx_response_spec.rb
516
532
  - spec/lib/ruby_smb/smb1/parameter_block_spec.rb
533
+ - spec/lib/ruby_smb/smb1/pipe_spec.rb
517
534
  - spec/lib/ruby_smb/smb1/smb_header_spec.rb
518
535
  - spec/lib/ruby_smb/smb1/tree_spec.rb
519
536
  - spec/lib/ruby_smb/smb2/bit_field/directory_access_mask_spec.rb
@@ -551,6 +568,7 @@ files:
551
568
  - spec/lib/ruby_smb/smb2/packet/tree_disconnect_response_spec.rb
552
569
  - spec/lib/ruby_smb/smb2/packet/write_request_spec.rb
553
570
  - spec/lib/ruby_smb/smb2/packet/write_response_spec.rb
571
+ - spec/lib/ruby_smb/smb2/pipe_spec.rb
554
572
  - spec/lib/ruby_smb/smb2/smb2_header_spec.rb
555
573
  - spec/lib/ruby_smb/smb2/tree_spec.rb
556
574
  - spec/lib/ruby_smb_spec.rb
@@ -636,6 +654,7 @@ test_files:
636
654
  - spec/lib/ruby_smb/smb1/bit_field/smb_file_attributes_spec.rb
637
655
  - spec/lib/ruby_smb/smb1/bit_field/smb_nmpipe_status_spec.rb
638
656
  - spec/lib/ruby_smb/smb1/bit_field/trans2_flags_spec.rb
657
+ - spec/lib/ruby_smb/smb1/bit_field/trans_flags_spec.rb
639
658
  - spec/lib/ruby_smb/smb1/bit_field/tree_connect_flags_spec.rb
640
659
  - spec/lib/ruby_smb/smb1/data_block_spec.rb
641
660
  - spec/lib/ruby_smb/smb1/dialect_spec.rb
@@ -662,6 +681,10 @@ test_files:
662
681
  - spec/lib/ruby_smb/smb1/packet/session_setup_legacy_response_spec.rb
663
682
  - spec/lib/ruby_smb/smb1/packet/session_setup_request_spec.rb
664
683
  - spec/lib/ruby_smb/smb1/packet/session_setup_response_spec.rb
684
+ - spec/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_request_spec.rb
685
+ - spec/lib/ruby_smb/smb1/packet/trans/peek_nmpipe_response_spec.rb
686
+ - spec/lib/ruby_smb/smb1/packet/trans/request_spec.rb
687
+ - spec/lib/ruby_smb/smb1/packet/trans/response_spec.rb
665
688
  - spec/lib/ruby_smb/smb1/packet/trans2/find_first2_request_spec.rb
666
689
  - spec/lib/ruby_smb/smb1/packet/trans2/find_first2_response_spec.rb
667
690
  - spec/lib/ruby_smb/smb1/packet/trans2/find_information_level/find_file_full_directory_info_spec.rb
@@ -681,6 +704,7 @@ test_files:
681
704
  - spec/lib/ruby_smb/smb1/packet/write_andx_request_spec.rb
682
705
  - spec/lib/ruby_smb/smb1/packet/write_andx_response_spec.rb
683
706
  - spec/lib/ruby_smb/smb1/parameter_block_spec.rb
707
+ - spec/lib/ruby_smb/smb1/pipe_spec.rb
684
708
  - spec/lib/ruby_smb/smb1/smb_header_spec.rb
685
709
  - spec/lib/ruby_smb/smb1/tree_spec.rb
686
710
  - spec/lib/ruby_smb/smb2/bit_field/directory_access_mask_spec.rb
@@ -718,6 +742,7 @@ test_files:
718
742
  - spec/lib/ruby_smb/smb2/packet/tree_disconnect_response_spec.rb
719
743
  - spec/lib/ruby_smb/smb2/packet/write_request_spec.rb
720
744
  - spec/lib/ruby_smb/smb2/packet/write_response_spec.rb
745
+ - spec/lib/ruby_smb/smb2/pipe_spec.rb
721
746
  - spec/lib/ruby_smb/smb2/smb2_header_spec.rb
722
747
  - spec/lib/ruby_smb/smb2/tree_spec.rb
723
748
  - spec/lib/ruby_smb_spec.rb
metadata.gz.sig CHANGED
Binary file