ruby_smb 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/examples/tree_connect.rb +27 -0
  5. data/lib/ruby_smb/client.rb +25 -2
  6. data/lib/ruby_smb/client/authentication.rb +5 -6
  7. data/lib/ruby_smb/client/negotiation.rb +2 -3
  8. data/lib/ruby_smb/client/signing.rb +6 -2
  9. data/lib/ruby_smb/client/tree_connect.rb +86 -0
  10. data/lib/ruby_smb/generic_packet.rb +1 -1
  11. data/lib/ruby_smb/smb1.rb +1 -1
  12. data/lib/ruby_smb/smb1/bit_field.rb +4 -0
  13. data/lib/ruby_smb/smb1/bit_field/directory_access_mask.rb +38 -0
  14. data/lib/ruby_smb/smb1/bit_field/file_access_mask.rb +38 -0
  15. data/lib/ruby_smb/smb1/bit_field/optional_support.rb +19 -0
  16. data/lib/ruby_smb/smb1/bit_field/tree_connect_flags.rb +18 -0
  17. data/lib/ruby_smb/smb1/commands.rb +2 -0
  18. data/lib/ruby_smb/smb1/packet.rb +4 -0
  19. data/lib/ruby_smb/smb1/packet/tree_connect_request.rb +34 -0
  20. data/lib/ruby_smb/smb1/packet/tree_connect_response.rb +74 -0
  21. data/lib/ruby_smb/smb1/packet/tree_disconnect_request.rb +29 -0
  22. data/lib/ruby_smb/smb1/packet/tree_disconnect_response.rb +30 -0
  23. data/lib/ruby_smb/smb1/tree.rb +55 -0
  24. data/lib/ruby_smb/smb2.rb +1 -0
  25. data/lib/ruby_smb/smb2/bit_field.rb +4 -0
  26. data/lib/ruby_smb/smb2/bit_field/directory_access_mask.rb +38 -0
  27. data/lib/ruby_smb/smb2/bit_field/file_access_mask.rb +38 -0
  28. data/lib/ruby_smb/smb2/bit_field/share_capabailities.rb +21 -0
  29. data/lib/ruby_smb/smb2/bit_field/share_flags.rb +75 -0
  30. data/lib/ruby_smb/smb2/packet.rb +5 -0
  31. data/lib/ruby_smb/smb2/packet/error_packet.rb +15 -0
  32. data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +27 -0
  33. data/lib/ruby_smb/smb2/packet/tree_connect_response.rb +50 -0
  34. data/lib/ruby_smb/smb2/packet/tree_disconnect_request.rb +21 -0
  35. data/lib/ruby_smb/smb2/packet/tree_disconnect_response.rb +22 -0
  36. data/lib/ruby_smb/smb2/smb2_header.rb +3 -3
  37. data/lib/ruby_smb/smb2/tree.rb +51 -0
  38. data/lib/ruby_smb/version.rb +1 -1
  39. data/ruby_smb.gemspec +1 -1
  40. data/spec/lib/ruby_smb/client_spec.rb +114 -4
  41. data/spec/lib/ruby_smb/smb1/bit_field/directory_access_mask_spec.rb +190 -0
  42. data/spec/lib/ruby_smb/smb1/bit_field/file_access_mask_spec.rb +190 -0
  43. data/spec/lib/ruby_smb/smb1/bit_field/optional_support_spec.rb +52 -0
  44. data/spec/lib/ruby_smb/smb1/bit_field/tree_connect_flags_spec.rb +37 -0
  45. data/spec/lib/ruby_smb/smb1/packet/tree_connect_request_spec.rb +53 -0
  46. data/spec/lib/ruby_smb/smb1/packet/tree_connect_response_spec.rb +86 -0
  47. data/spec/lib/ruby_smb/smb1/packet/tree_disconnect_request_spec.rb +40 -0
  48. data/spec/lib/ruby_smb/smb1/packet/tree_disconnect_response_spec.rb +40 -0
  49. data/spec/lib/ruby_smb/smb1/tree_spec.rb +55 -0
  50. data/spec/lib/ruby_smb/smb2/bit_field/directory_access_mask_spec.rb +190 -0
  51. data/spec/lib/ruby_smb/smb2/bit_field/file_access_mask_spec.rb +190 -0
  52. data/spec/lib/ruby_smb/smb2/bit_field/share_capabilities_spec.rb +54 -0
  53. data/spec/lib/ruby_smb/smb2/bit_field/share_flags_spec.rb +184 -0
  54. data/spec/lib/ruby_smb/smb2/packet/tree_connect_request_spec.rb +49 -0
  55. data/spec/lib/ruby_smb/smb2/packet/tree_connect_response_spec.rb +57 -0
  56. data/spec/lib/ruby_smb/smb2/packet/tree_disconnect_request_spec.rb +30 -0
  57. data/spec/lib/ruby_smb/smb2/packet/tree_disconnect_response_spec.rb +30 -0
  58. data/spec/lib/ruby_smb/smb2/tree_spec.rb +54 -0
  59. metadata +63 -6
  60. metadata.gz.sig +0 -0
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB1::Packet::TreeDisconnectResponse 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_TREE_DISCONNECT
16
+ end
17
+
18
+ it 'should not 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
+ end
30
+
31
+ describe '#data_block' do
32
+ subject(:data_block) { packet.data_block }
33
+
34
+ it 'is a standard DataBlock' do
35
+ expect(data_block).to be_a RubySMB::SMB1::DataBlock
36
+ end
37
+ end
38
+
39
+
40
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RubySMB::SMB1::Tree do
4
+ let(:dispatcher) { RubySMB::Dispatcher::Socket.new(nil) }
5
+
6
+ let(:client) { RubySMB::Client.new(dispatcher, username: 'msfadmin', password: 'msfadmin') }
7
+ let(:tree_id) { 2049 }
8
+ let(:path) { '\\192.168.1.1\example' }
9
+ let(:response) {
10
+ packet = RubySMB::SMB1::Packet::TreeConnectResponse.new
11
+ packet.smb_header.tid = tree_id
12
+ packet.parameter_block.access_rights.read("\xff\x01\x1f\x00")
13
+ packet.data_block.service = 'A:'
14
+ packet
15
+ }
16
+ subject(:tree) {
17
+ described_class.new(client:client, share:path, response:response )
18
+ }
19
+
20
+ it { is_expected.to respond_to :client }
21
+ it { is_expected.to respond_to :guest_permissions }
22
+ it { is_expected.to respond_to :permissions }
23
+ it { is_expected.to respond_to :share }
24
+ it { is_expected.to respond_to :id }
25
+
26
+ it 'inherits the client that spawned it' do
27
+ expect(tree.client).to eq client
28
+ end
29
+
30
+ it 'inherits the permissions from the response packet' do
31
+ expect(tree.permissions).to eq response.parameter_block.access_rights
32
+ end
33
+
34
+ it 'inherits the Tree id from the response packet' do
35
+ expect(tree.id).to eq response.smb_header.tid
36
+ end
37
+
38
+ describe '#disconnect!' do
39
+ let(:disco_req) { RubySMB::SMB1::Packet::TreeDisconnectRequest.new }
40
+ let(:disco_resp) { RubySMB::SMB1::Packet::TreeDisconnectResponse.new }
41
+
42
+ it 'sends a TreeDisconnectRequest with the Tree ID in the header' do
43
+ allow(RubySMB::SMB1::Packet::TreeDisconnectRequest).to receive(:new).and_return(disco_req)
44
+ modified_req = disco_req
45
+ modified_req.smb_header.tid = tree.id
46
+ expect(client).to receive(:send_recv).with(modified_req).and_return(disco_resp.to_binary_s)
47
+ tree.disconnect!
48
+ end
49
+
50
+ it 'returns the NTStatus code from the response' do
51
+ allow(client).to receive(:send_recv).and_return(disco_resp.to_binary_s)
52
+ expect(tree.disconnect!).to eq disco_resp.status_code
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,190 @@
1
+ RSpec.describe RubySMB::SMB2::BitField::DirectoryAccessMask do
2
+ subject(:flags) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :read_attr }
5
+ it { is_expected.to respond_to :delete_child }
6
+ it { is_expected.to respond_to :traverse }
7
+ it { is_expected.to respond_to :write_ea }
8
+ it { is_expected.to respond_to :read_ea }
9
+ it { is_expected.to respond_to :add_subdir }
10
+ it { is_expected.to respond_to :add_file }
11
+ it { is_expected.to respond_to :list }
12
+ it { is_expected.to respond_to :write_attr }
13
+ it { is_expected.to respond_to :synchronize }
14
+ it { is_expected.to respond_to :write_owner }
15
+ it { is_expected.to respond_to :write_dac }
16
+ it { is_expected.to respond_to :read_control }
17
+ it { is_expected.to respond_to :delete_access }
18
+ it { is_expected.to respond_to :generic_read }
19
+ it { is_expected.to respond_to :generic_write }
20
+ it { is_expected.to respond_to :generic_execute }
21
+ it { is_expected.to respond_to :generic_all }
22
+ it { is_expected.to respond_to :maximum }
23
+ it { is_expected.to respond_to :system_security }
24
+
25
+ it 'is little endian' do
26
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
27
+ end
28
+
29
+ describe '#list' do
30
+ it 'should be a 1-bit field per the SMB spec' do
31
+ expect(flags.list).to be_a BinData::Bit1
32
+ end
33
+
34
+ it_behaves_like 'bit field with one flag set', :list, 'V', 0x00000001
35
+ end
36
+
37
+
38
+ describe '#add_file' do
39
+ it 'should be a 1-bit field per the SMB spec' do
40
+ expect(flags.add_file).to be_a BinData::Bit1
41
+ end
42
+
43
+ it_behaves_like 'bit field with one flag set', :add_file, 'V', 0x00000002
44
+ end
45
+
46
+ describe '#add_subdir' do
47
+ it 'should be a 1-bit field per the SMB spec' do
48
+ expect(flags.add_subdir).to be_a BinData::Bit1
49
+ end
50
+
51
+ it_behaves_like 'bit field with one flag set', :add_subdir, 'V', 0x00000004
52
+ end
53
+
54
+ describe '#read_ea' do
55
+ it 'should be a 1-bit field per the SMB spec' do
56
+ expect(flags.read_ea).to be_a BinData::Bit1
57
+ end
58
+
59
+ it_behaves_like 'bit field with one flag set', :read_ea, 'V', 0x00000008
60
+ end
61
+
62
+ describe '#write_ea' do
63
+ it 'should be a 1-bit field per the SMB spec' do
64
+ expect(flags.write_ea).to be_a BinData::Bit1
65
+ end
66
+
67
+ it_behaves_like 'bit field with one flag set', :write_ea, 'V', 0x00000010
68
+ end
69
+
70
+ describe '#traverse' do
71
+ it 'should be a 1-bit field per the SMB spec' do
72
+ expect(flags.traverse).to be_a BinData::Bit1
73
+ end
74
+
75
+ it_behaves_like 'bit field with one flag set', :traverse, 'V', 0x00000020
76
+ end
77
+
78
+ describe '#delete_child' do
79
+ it 'should be a 1-bit field per the SMB spec' do
80
+ expect(flags.delete_child).to be_a BinData::Bit1
81
+ end
82
+
83
+ it_behaves_like 'bit field with one flag set', :delete_child, 'V', 0x00000040
84
+ end
85
+
86
+ describe '#read_attr' do
87
+ it 'should be a 1-bit field per the SMB spec' do
88
+ expect(flags.read_attr).to be_a BinData::Bit1
89
+ end
90
+
91
+ it_behaves_like 'bit field with one flag set', :read_attr, 'V', 0x00000080
92
+ end
93
+
94
+ describe '#write_attr' do
95
+ it 'should be a 1-bit field per the SMB spec' do
96
+ expect(flags.write_attr).to be_a BinData::Bit1
97
+ end
98
+
99
+ it_behaves_like 'bit field with one flag set', :write_attr, 'V', 0x00000100
100
+ end
101
+
102
+ describe '#delete_access' do
103
+ it 'should be a 1-bit field per the SMB spec' do
104
+ expect(flags.delete_access).to be_a BinData::Bit1
105
+ end
106
+
107
+ it_behaves_like 'bit field with one flag set', :delete_access, 'V', 0x00010000
108
+ end
109
+
110
+ describe '#read_control' do
111
+ it 'should be a 1-bit field per the SMB spec' do
112
+ expect(flags.read_control).to be_a BinData::Bit1
113
+ end
114
+
115
+ it_behaves_like 'bit field with one flag set', :read_control, 'V', 0x00020000
116
+ end
117
+
118
+ describe '#write_dac' do
119
+ it 'should be a 1-bit field per the SMB spec' do
120
+ expect(flags.write_dac).to be_a BinData::Bit1
121
+ end
122
+
123
+ it_behaves_like 'bit field with one flag set', :write_dac, 'V', 0x00040000
124
+ end
125
+
126
+ describe '#write_owner' do
127
+ it 'should be a 1-bit field per the SMB spec' do
128
+ expect(flags.write_owner).to be_a BinData::Bit1
129
+ end
130
+
131
+ it_behaves_like 'bit field with one flag set', :write_owner, 'V', 0x00080000
132
+ end
133
+
134
+ describe '#synchronize' do
135
+ it 'should be a 1-bit field per the SMB spec' do
136
+ expect(flags.synchronize).to be_a BinData::Bit1
137
+ end
138
+
139
+ it_behaves_like 'bit field with one flag set', :synchronize, 'V', 0x00100000
140
+ end
141
+
142
+ describe '#system_security' do
143
+ it 'should be a 1-bit field per the SMB spec' do
144
+ expect(flags.system_security).to be_a BinData::Bit1
145
+ end
146
+
147
+ it_behaves_like 'bit field with one flag set', :system_security, 'V', 0x01000000
148
+ end
149
+
150
+ describe '#maximum' do
151
+ it 'should be a 1-bit field per the SMB spec' do
152
+ expect(flags.maximum).to be_a BinData::Bit1
153
+ end
154
+
155
+ it_behaves_like 'bit field with one flag set', :maximum, 'V', 0x02000000
156
+ end
157
+
158
+ describe '#generic_all' do
159
+ it 'should be a 1-bit field per the SMB spec' do
160
+ expect(flags.generic_all).to be_a BinData::Bit1
161
+ end
162
+
163
+ it_behaves_like 'bit field with one flag set', :generic_all, 'V', 0x10000000
164
+ end
165
+
166
+ describe '#generic_execute' do
167
+ it 'should be a 1-bit field per the SMB spec' do
168
+ expect(flags.generic_execute).to be_a BinData::Bit1
169
+ end
170
+
171
+ it_behaves_like 'bit field with one flag set', :generic_execute, 'V', 0x20000000
172
+ end
173
+
174
+ describe '#generic_write' do
175
+ it 'should be a 1-bit field per the SMB spec' do
176
+ expect(flags.generic_write).to be_a BinData::Bit1
177
+ end
178
+
179
+ it_behaves_like 'bit field with one flag set', :generic_write, 'V', 0x40000000
180
+ end
181
+
182
+ describe '#generic_read' do
183
+ it 'should be a 1-bit field per the SMB spec' do
184
+ expect(flags.generic_read).to be_a BinData::Bit1
185
+ end
186
+
187
+ it_behaves_like 'bit field with one flag set', :generic_read, 'V', 0x80000000
188
+ end
189
+
190
+ end
@@ -0,0 +1,190 @@
1
+ RSpec.describe RubySMB::SMB2::BitField::FileAccessMask do
2
+ subject(:flags) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :read_attr }
5
+ it { is_expected.to respond_to :delete_child }
6
+ it { is_expected.to respond_to :execute }
7
+ it { is_expected.to respond_to :write_ea }
8
+ it { is_expected.to respond_to :read_ea }
9
+ it { is_expected.to respond_to :append_data }
10
+ it { is_expected.to respond_to :write_data }
11
+ it { is_expected.to respond_to :read_data }
12
+ it { is_expected.to respond_to :write_attr }
13
+ it { is_expected.to respond_to :synchronize }
14
+ it { is_expected.to respond_to :write_owner }
15
+ it { is_expected.to respond_to :write_dac }
16
+ it { is_expected.to respond_to :read_control }
17
+ it { is_expected.to respond_to :delete_access }
18
+ it { is_expected.to respond_to :generic_read }
19
+ it { is_expected.to respond_to :generic_write }
20
+ it { is_expected.to respond_to :generic_execute }
21
+ it { is_expected.to respond_to :generic_all }
22
+ it { is_expected.to respond_to :maximum }
23
+ it { is_expected.to respond_to :system_security }
24
+
25
+ it 'is little endian' do
26
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
27
+ end
28
+
29
+ describe '#read_data' do
30
+ it 'should be a 1-bit field per the SMB spec' do
31
+ expect(flags.read_data).to be_a BinData::Bit1
32
+ end
33
+
34
+ it_behaves_like 'bit field with one flag set', :read_data, 'V', 0x00000001
35
+ end
36
+
37
+
38
+ describe '#write_data' do
39
+ it 'should be a 1-bit field per the SMB spec' do
40
+ expect(flags.write_data).to be_a BinData::Bit1
41
+ end
42
+
43
+ it_behaves_like 'bit field with one flag set', :write_data, 'V', 0x00000002
44
+ end
45
+
46
+ describe '#append_data' do
47
+ it 'should be a 1-bit field per the SMB spec' do
48
+ expect(flags.append_data).to be_a BinData::Bit1
49
+ end
50
+
51
+ it_behaves_like 'bit field with one flag set', :append_data, 'V', 0x00000004
52
+ end
53
+
54
+ describe '#read_ea' do
55
+ it 'should be a 1-bit field per the SMB spec' do
56
+ expect(flags.read_ea).to be_a BinData::Bit1
57
+ end
58
+
59
+ it_behaves_like 'bit field with one flag set', :read_ea, 'V', 0x00000008
60
+ end
61
+
62
+ describe '#write_ea' do
63
+ it 'should be a 1-bit field per the SMB spec' do
64
+ expect(flags.write_ea).to be_a BinData::Bit1
65
+ end
66
+
67
+ it_behaves_like 'bit field with one flag set', :write_ea, 'V', 0x00000010
68
+ end
69
+
70
+ describe '#execute' do
71
+ it 'should be a 1-bit field per the SMB spec' do
72
+ expect(flags.execute).to be_a BinData::Bit1
73
+ end
74
+
75
+ it_behaves_like 'bit field with one flag set', :execute, 'V', 0x00000020
76
+ end
77
+
78
+ describe '#delete_child' do
79
+ it 'should be a 1-bit field per the SMB spec' do
80
+ expect(flags.delete_child).to be_a BinData::Bit1
81
+ end
82
+
83
+ it_behaves_like 'bit field with one flag set', :delete_child, 'V', 0x00000040
84
+ end
85
+
86
+ describe '#read_attr' do
87
+ it 'should be a 1-bit field per the SMB spec' do
88
+ expect(flags.read_attr).to be_a BinData::Bit1
89
+ end
90
+
91
+ it_behaves_like 'bit field with one flag set', :read_attr, 'V', 0x00000080
92
+ end
93
+
94
+ describe '#write_attr' do
95
+ it 'should be a 1-bit field per the SMB spec' do
96
+ expect(flags.write_attr).to be_a BinData::Bit1
97
+ end
98
+
99
+ it_behaves_like 'bit field with one flag set', :write_attr, 'V', 0x00000100
100
+ end
101
+
102
+ describe '#delete_access' do
103
+ it 'should be a 1-bit field per the SMB spec' do
104
+ expect(flags.delete_access).to be_a BinData::Bit1
105
+ end
106
+
107
+ it_behaves_like 'bit field with one flag set', :delete_access, 'V', 0x00010000
108
+ end
109
+
110
+ describe '#read_control' do
111
+ it 'should be a 1-bit field per the SMB spec' do
112
+ expect(flags.read_control).to be_a BinData::Bit1
113
+ end
114
+
115
+ it_behaves_like 'bit field with one flag set', :read_control, 'V', 0x00020000
116
+ end
117
+
118
+ describe '#write_dac' do
119
+ it 'should be a 1-bit field per the SMB spec' do
120
+ expect(flags.write_dac).to be_a BinData::Bit1
121
+ end
122
+
123
+ it_behaves_like 'bit field with one flag set', :write_dac, 'V', 0x00040000
124
+ end
125
+
126
+ describe '#write_owner' do
127
+ it 'should be a 1-bit field per the SMB spec' do
128
+ expect(flags.write_owner).to be_a BinData::Bit1
129
+ end
130
+
131
+ it_behaves_like 'bit field with one flag set', :write_owner, 'V', 0x00080000
132
+ end
133
+
134
+ describe '#synchronize' do
135
+ it 'should be a 1-bit field per the SMB spec' do
136
+ expect(flags.synchronize).to be_a BinData::Bit1
137
+ end
138
+
139
+ it_behaves_like 'bit field with one flag set', :synchronize, 'V', 0x00100000
140
+ end
141
+
142
+ describe '#system_security' do
143
+ it 'should be a 1-bit field per the SMB spec' do
144
+ expect(flags.system_security).to be_a BinData::Bit1
145
+ end
146
+
147
+ it_behaves_like 'bit field with one flag set', :system_security, 'V', 0x01000000
148
+ end
149
+
150
+ describe '#maximum' do
151
+ it 'should be a 1-bit field per the SMB spec' do
152
+ expect(flags.maximum).to be_a BinData::Bit1
153
+ end
154
+
155
+ it_behaves_like 'bit field with one flag set', :maximum, 'V', 0x02000000
156
+ end
157
+
158
+ describe '#generic_all' do
159
+ it 'should be a 1-bit field per the SMB spec' do
160
+ expect(flags.generic_all).to be_a BinData::Bit1
161
+ end
162
+
163
+ it_behaves_like 'bit field with one flag set', :generic_all, 'V', 0x10000000
164
+ end
165
+
166
+ describe '#generic_execute' do
167
+ it 'should be a 1-bit field per the SMB spec' do
168
+ expect(flags.generic_execute).to be_a BinData::Bit1
169
+ end
170
+
171
+ it_behaves_like 'bit field with one flag set', :generic_execute, 'V', 0x20000000
172
+ end
173
+
174
+ describe '#generic_write' do
175
+ it 'should be a 1-bit field per the SMB spec' do
176
+ expect(flags.generic_write).to be_a BinData::Bit1
177
+ end
178
+
179
+ it_behaves_like 'bit field with one flag set', :generic_write, 'V', 0x40000000
180
+ end
181
+
182
+ describe '#generic_read' do
183
+ it 'should be a 1-bit field per the SMB spec' do
184
+ expect(flags.generic_read).to be_a BinData::Bit1
185
+ end
186
+
187
+ it_behaves_like 'bit field with one flag set', :generic_read, 'V', 0x80000000
188
+ end
189
+
190
+ end