ruby_smb 0.0.20 → 0.0.21

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