ruby_smb 0.0.12 → 0.0.13
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 +4 -4
- checksums.yaml.gz.sig +1 -2
- data/lib/ruby_smb/client/authentication.rb +1 -1
- data/lib/ruby_smb/client/echo.rb +36 -0
- data/lib/ruby_smb/client/tree_connect.rb +1 -1
- data/lib/ruby_smb/client.rb +17 -0
- data/lib/ruby_smb/dispatcher/socket.rb +21 -14
- data/lib/ruby_smb/error.rb +3 -0
- data/lib/ruby_smb/field/ea_info_array.rb +58 -0
- data/lib/ruby_smb/field/extended_attribute_flag.rb +10 -0
- data/lib/ruby_smb/field/file_full_ea_info.rb +15 -0
- data/lib/ruby_smb/field/security_descriptor.rb +42 -0
- data/lib/ruby_smb/field/smb_fea.rb +14 -0
- data/lib/ruby_smb/field/smb_fea_list.rb +13 -0
- data/lib/ruby_smb/field/utime.rb +54 -0
- data/lib/ruby_smb/field.rb +7 -0
- data/lib/ruby_smb/generic_packet.rb +8 -4
- data/lib/ruby_smb/impersonation_levels.rb +22 -0
- data/lib/ruby_smb/smb1/bit_field/create_options.rb +38 -0
- data/lib/ruby_smb/smb1/bit_field/file_access_mask.rb +1 -1
- data/lib/ruby_smb/smb1/bit_field/open2_access_mode.rb +42 -0
- data/lib/ruby_smb/smb1/bit_field/open2_flags.rb +18 -0
- data/lib/ruby_smb/smb1/bit_field/open2_open_mode.rb +17 -0
- data/lib/ruby_smb/smb1/bit_field/share_access.rb +20 -0
- data/lib/ruby_smb/smb1/bit_field/smb_ext_file_attributes.rb +35 -0
- data/lib/ruby_smb/smb1/bit_field/smb_file_attributes.rb +26 -0
- data/lib/ruby_smb/smb1/bit_field/smb_nmpipe_status.rb +19 -0
- data/lib/ruby_smb/smb1/bit_field/trans2_flags.rb +15 -0
- data/lib/ruby_smb/smb1/bit_field.rb +9 -0
- data/lib/ruby_smb/smb1/commands.rb +10 -6
- data/lib/ruby_smb/smb1/create_actions.rb +22 -0
- data/lib/ruby_smb/smb1/dispositions.rb +36 -0
- data/lib/ruby_smb/smb1/oplock_levels.rb +19 -0
- data/lib/ruby_smb/smb1/packet/echo_request.rb +30 -0
- data/lib/ruby_smb/smb1/packet/echo_response.rb +31 -0
- data/lib/ruby_smb/smb1/packet/empty_packet.rb +14 -0
- data/lib/ruby_smb/smb1/packet/nt_trans/create_request.rb +85 -0
- data/lib/ruby_smb/smb1/packet/nt_trans/create_response.rb +61 -0
- data/lib/ruby_smb/smb1/packet/nt_trans/request.rb +47 -0
- data/lib/ruby_smb/smb1/packet/nt_trans/response.rb +44 -0
- data/lib/ruby_smb/smb1/packet/nt_trans/subcommands.rb +11 -0
- data/lib/ruby_smb/smb1/packet/nt_trans.rb +16 -0
- data/lib/ruby_smb/smb1/packet/trans2/data_block.rb +32 -0
- data/lib/ruby_smb/smb1/packet/trans2/open2_request.rb +60 -0
- data/lib/ruby_smb/smb1/packet/trans2/open2_response.rb +65 -0
- data/lib/ruby_smb/smb1/packet/trans2/request.rb +52 -0
- data/lib/ruby_smb/smb1/packet/trans2/request_secondary.rb +39 -0
- data/lib/ruby_smb/smb1/packet/trans2/response.rb +48 -0
- data/lib/ruby_smb/smb1/packet/trans2/subcommands.rb +12 -0
- data/lib/ruby_smb/smb1/packet/trans2.rb +18 -0
- data/lib/ruby_smb/smb1/packet.rb +5 -1
- data/lib/ruby_smb/smb1.rb +3 -0
- data/lib/ruby_smb/smb2/bit_field/{share_capabailities.rb → share_capabilities.rb} +0 -0
- data/lib/ruby_smb/smb2/bit_field/{smb2_capabailities.rb → smb2_capabilities.rb} +0 -0
- data/lib/ruby_smb/smb2/bit_field.rb +2 -2
- data/lib/ruby_smb/smb2/packet/echo_request.rb +21 -0
- data/lib/ruby_smb/smb2/packet/echo_response.rb +22 -0
- data/lib/ruby_smb/smb2/packet.rb +2 -0
- data/lib/ruby_smb/version.rb +1 -1
- data/ruby_smb.gemspec +2 -0
- data/spec/lib/ruby_smb/client_spec.rb +46 -0
- data/spec/lib/ruby_smb/field/ea_info_array_spec.rb +51 -0
- data/spec/lib/ruby_smb/field/extended_attribute_flag_spec.rb +16 -0
- data/spec/lib/ruby_smb/field/file_full_ea_info_spec.rb +35 -0
- data/spec/lib/ruby_smb/field/security_descriptor.rb +194 -0
- data/spec/lib/ruby_smb/field/smb_fea_list_spec.rb +38 -0
- data/spec/lib/ruby_smb/field/smb_fea_spec.rb +27 -0
- data/spec/lib/ruby_smb/field/utime_spec.rb +59 -0
- data/spec/lib/ruby_smb/smb1/bit_field/create_options_spec.rb +181 -0
- data/spec/lib/ruby_smb/smb1/bit_field/open2_access_mode_spec.rb +81 -0
- data/spec/lib/ruby_smb/smb1/bit_field/open2_flags_spec.rb +62 -0
- data/spec/lib/ruby_smb/smb1/bit_field/open2_open_mode_spec.rb +27 -0
- data/spec/lib/ruby_smb/smb1/bit_field/share_access_spec.rb +38 -0
- data/spec/lib/ruby_smb/smb1/bit_field/smb_ext_file_attributes_spec.rb +144 -0
- data/spec/lib/ruby_smb/smb1/bit_field/smb_file_attributes_spec.rb +113 -0
- data/spec/lib/ruby_smb/smb1/bit_field/smb_nmpipe_status_spec.rb +53 -0
- data/spec/lib/ruby_smb/smb1/bit_field/trans2_flags_spec.rb +28 -0
- data/spec/lib/ruby_smb/smb1/packet/echo_request_spec.rb +44 -0
- data/spec/lib/ruby_smb/smb1/packet/echo_response_spec.rb +44 -0
- data/spec/lib/ruby_smb/smb1/packet/error_packet_spec.rb +1 -1
- data/spec/lib/ruby_smb/smb1/packet/nt_trans/create_request_spec.rb +194 -0
- data/spec/lib/ruby_smb/smb1/packet/nt_trans/create_response_spec.rb +124 -0
- data/spec/lib/ruby_smb/smb1/packet/nt_trans/request_spec.rb +91 -0
- data/spec/lib/ruby_smb/smb1/packet/nt_trans/response_spec.rb +75 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/open2_request_spec.rb +112 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/open2_response_spec.rb +107 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/request_secondary_spec.rb +77 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/request_spec.rb +98 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/response_spec.rb +88 -0
- data/spec/lib/ruby_smb/smb2/packet/echo_request_spec.rb +30 -0
- data/spec/lib/ruby_smb/smb2/packet/echo_response_spec.rb +30 -0
- data/spec/lib/ruby_smb/smb2/packet/negotiate_request_spec.rb +1 -1
- data/spec/lib/ruby_smb/smb2/packet/negotiate_response_spec.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +104 -7
- metadata.gz.sig +0 -0
- data/lib/ruby_smb/smb1/packet/error_packet.rb +0 -14
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
module RubySMB
|
|
2
|
+
module SMB1
|
|
3
|
+
module Packet
|
|
4
|
+
module Trans2
|
|
5
|
+
|
|
6
|
+
# This class represents an SMB1 Trans2 Open2 Response Packet as defined in
|
|
7
|
+
# [2.2.6.1.2 Response](https://msdn.microsoft.com/en-us/library/ee441545.aspx)
|
|
8
|
+
class Open2Response < RubySMB::GenericPacket
|
|
9
|
+
|
|
10
|
+
class ParameterBlock < RubySMB::SMB1::Packet::Trans2::Response::ParameterBlock
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class Trans2Parameters < BinData::Record
|
|
14
|
+
endian :little
|
|
15
|
+
uint8 :fid, label: 'File ID'
|
|
16
|
+
smb_file_attributes :file_attributes, label: 'File Attributes'
|
|
17
|
+
utime :creation_time, label: 'Creation Time'
|
|
18
|
+
open2_access_mode :access_mode, label: 'AccessMode'
|
|
19
|
+
uint16 :resource_type, label: 'Resource Type'
|
|
20
|
+
smb_nmpipe_status :nmpipe_status, label: 'Named Pipe Status'
|
|
21
|
+
|
|
22
|
+
struct :action_taken do
|
|
23
|
+
endian :little
|
|
24
|
+
bit6 :reserved, label: 'Reserved Space'
|
|
25
|
+
bit2 :open_result, label: 'Open Result'
|
|
26
|
+
# byte boundary
|
|
27
|
+
bit1 :lock_status, label: 'Lock Status'
|
|
28
|
+
resume_byte_alignment
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
uint32 :reserved, label: 'Reserved Space'
|
|
32
|
+
uint16 :extended_attribute_offset, label: 'Extended Attribute Offset'
|
|
33
|
+
uint32 :extended_attribute_length, label: 'Extended Attribute Length'
|
|
34
|
+
|
|
35
|
+
# Returns the length of the Trans2Parameters struct
|
|
36
|
+
# in number of bytes
|
|
37
|
+
def length
|
|
38
|
+
self.do_num_bytes
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class DataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
|
|
43
|
+
string :pad1, length: lambda { pad1_length }
|
|
44
|
+
trans2_parameters :trans2_parameters, label: 'Trans2 Parameters'
|
|
45
|
+
string :pad2, length: lambda { pad2_length }
|
|
46
|
+
string :trans2_data, label: 'Trans2 Data', length: 0
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
smb_header :smb_header
|
|
50
|
+
parameter_block :parameter_block
|
|
51
|
+
data_block :data_block
|
|
52
|
+
|
|
53
|
+
def initialize_instance
|
|
54
|
+
super
|
|
55
|
+
smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
|
56
|
+
parameter_block.setup << RubySMB::SMB1::Packet::Trans2::Subcommands::OPEN2
|
|
57
|
+
smb_header.flags.reply = 1
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module RubySMB
|
|
2
|
+
module SMB1
|
|
3
|
+
module Packet
|
|
4
|
+
module Trans2
|
|
5
|
+
|
|
6
|
+
# This class represents a generic SMB1 Trans2 Request Packet as defined in
|
|
7
|
+
# [2.2.4.46.1 Request](https://msdn.microsoft.com/en-us/library/ee442192.aspx)
|
|
8
|
+
class Request < RubySMB::GenericPacket
|
|
9
|
+
|
|
10
|
+
class ParameterBlock < RubySMB::SMB1::ParameterBlock
|
|
11
|
+
uint16 :total_parameter_count, label: 'Total Parameter Count(bytes)'
|
|
12
|
+
uint16 :total_data_count, label: 'Total Data Count(bytes)'
|
|
13
|
+
uint16 :max_parameter_count, label: 'Max Parameter Count(bytes)'
|
|
14
|
+
uint16 :max_data_count, label: 'Max Data Count(bytes)'
|
|
15
|
+
uint8 :max_setup_count, label: 'Max Setup Count'
|
|
16
|
+
uint8 :reserved, label: 'Reserved Space', value: 0x00
|
|
17
|
+
trans2_flags :flags
|
|
18
|
+
uint32 :timeout, label: 'Timeout', initial_value: 0x00000000
|
|
19
|
+
uint16 :reserved2, label: 'Reserved Space', value: 0x00
|
|
20
|
+
uint16 :parameter_count, label: 'Parameter Count(bytes)', value: lambda {self.parent.data_block.trans2_parameters.length}
|
|
21
|
+
uint16 :parameter_offset, label: 'Parameter Offset', value: lambda {self.parent.data_block.trans2_parameters.abs_offset}
|
|
22
|
+
uint16 :data_count, label: 'Data Count(bytes)', value: lambda {self.parent.data_block.trans2_data.length}
|
|
23
|
+
uint16 :data_offset, label: 'Data Offset', value: lambda {self.parent.data_block.trans2_data.abs_offset}
|
|
24
|
+
uint8 :setup_count, label: 'Setup Count', value: lambda {setup.length}
|
|
25
|
+
uint8 :reserved3, label: 'Reserved Space', value: 0x00
|
|
26
|
+
|
|
27
|
+
array :setup, type: :uint16, initial_length: 0
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class DataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
|
|
31
|
+
uint8 :name, label: 'Name', initial_value: 0x00
|
|
32
|
+
string :pad1, length: lambda { pad1_length }
|
|
33
|
+
string :trans2_parameters, label: 'Trans2 Parameters'
|
|
34
|
+
string :pad2, length: lambda { pad2_length }
|
|
35
|
+
string :trans2_data, label: 'Trans2 Data'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
smb_header :smb_header
|
|
39
|
+
parameter_block :parameter_block
|
|
40
|
+
data_block :data_block
|
|
41
|
+
|
|
42
|
+
def initialize_instance
|
|
43
|
+
super
|
|
44
|
+
smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module RubySMB
|
|
2
|
+
module SMB1
|
|
3
|
+
module Packet
|
|
4
|
+
module Trans2
|
|
5
|
+
|
|
6
|
+
# This class represents a generic SMB1 Trans2 Secondary Request Packet as defined in
|
|
7
|
+
# [2.2.4.47.1 Request](https://msdn.microsoft.com/en-us/library/ee442105.aspx)
|
|
8
|
+
class RequestSecondary < RubySMB::GenericPacket
|
|
9
|
+
|
|
10
|
+
class ParameterBlock < RubySMB::SMB1::ParameterBlock
|
|
11
|
+
uint16 :total_parameter_count, label: 'Total Parameter Count(bytes)'
|
|
12
|
+
uint16 :total_data_count, label: 'Total Data Count(bytes)'
|
|
13
|
+
uint16 :parameter_count, label: 'Parameter Count(bytes)', value: lambda {self.parent.data_block.trans2_parameters.length}
|
|
14
|
+
uint16 :parameter_offset, label: 'Parameter Offset', value: lambda {self.parent.data_block.trans2_parameters.abs_offset}
|
|
15
|
+
uint16 :parameter_displacement, label: 'Parameter Displacement'
|
|
16
|
+
uint16 :data_count, label: 'Data Count(bytes)', value: lambda {self.parent.data_block.trans2_data.length}
|
|
17
|
+
uint16 :data_offset, label: 'Data Offset', value: lambda {self.parent.data_block.trans2_data.abs_offset}
|
|
18
|
+
uint16 :data_displacement, label: 'Data Displacement'
|
|
19
|
+
uint16 :fid, label: 'FileID'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class DataBlock < RubySMB::SMB1::Packet::Trans2::Request::DataBlock
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
smb_header :smb_header
|
|
26
|
+
parameter_block :parameter_block
|
|
27
|
+
data_block :data_block
|
|
28
|
+
|
|
29
|
+
def initialize_instance
|
|
30
|
+
super
|
|
31
|
+
smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2_SECONDARY
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module RubySMB
|
|
2
|
+
module SMB1
|
|
3
|
+
module Packet
|
|
4
|
+
module Trans2
|
|
5
|
+
|
|
6
|
+
# This class represents a generic SMB1 Trans2 Response Packet as defined in
|
|
7
|
+
# [2.2.4.46.2 Response](https://msdn.microsoft.com/en-us/library/ee441550.aspx)
|
|
8
|
+
class Response < RubySMB::GenericPacket
|
|
9
|
+
|
|
10
|
+
class ParameterBlock < RubySMB::SMB1::ParameterBlock
|
|
11
|
+
uint16 :total_parameter_count, label: 'Total Parameter Count(bytes)'
|
|
12
|
+
uint16 :total_data_count, label: 'Total Data Count(bytes)'
|
|
13
|
+
uint16 :reserved, label: 'Reserved Space', value: 0x00
|
|
14
|
+
uint16 :parameter_count, label: 'Parameter Count(bytes)', value: lambda {self.parent.data_block.trans2_parameters.length}
|
|
15
|
+
uint16 :parameter_offset, label: 'Parameter Offset', value: lambda {self.parent.data_block.trans2_parameters.abs_offset}
|
|
16
|
+
uint16 :parameter_displacement, label: 'Parameter Displacement'
|
|
17
|
+
uint16 :data_count, label: 'Data Count(bytes)', value: lambda {self.parent.data_block.trans2_data.length}
|
|
18
|
+
uint16 :data_offset, label: 'Data Offset', value: lambda {self.parent.data_block.trans2_data.abs_offset}
|
|
19
|
+
uint16 :data_displacement, label: 'Data Displacement'
|
|
20
|
+
uint8 :setup_count, label: 'Setup Count', value: lambda {setup.length}
|
|
21
|
+
uint8 :reserved2, label: 'Reserved Space', value: 0x00
|
|
22
|
+
|
|
23
|
+
array :setup, type: :uint16, initial_length: 0
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
class DataBlock < RubySMB::SMB1::Packet::Trans2::DataBlock
|
|
27
|
+
string :pad1, length: lambda { pad1_length }
|
|
28
|
+
string :trans2_parameters, label: 'Trans2 Parameters'
|
|
29
|
+
string :pad2, length: lambda { pad2_length }
|
|
30
|
+
string :trans2_data, label: 'Trans2 Data'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
smb_header :smb_header
|
|
34
|
+
parameter_block :parameter_block
|
|
35
|
+
data_block :data_block
|
|
36
|
+
|
|
37
|
+
def initialize_instance
|
|
38
|
+
super
|
|
39
|
+
smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TRANSACTION2
|
|
40
|
+
smb_header.flags.reply = 1
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module RubySMB
|
|
2
|
+
module SMB1
|
|
3
|
+
module Packet
|
|
4
|
+
|
|
5
|
+
# Namespace for the Transaction2 sub-protocol documented in
|
|
6
|
+
# [2.2.4.46 SMB_COM_TRANSACTION2 (0x32)](https://msdn.microsoft.com/en-us/library/ee441652.aspx)
|
|
7
|
+
module Trans2
|
|
8
|
+
require 'ruby_smb/smb1/packet/trans2/data_block'
|
|
9
|
+
require 'ruby_smb/smb1/packet/trans2/subcommands'
|
|
10
|
+
require 'ruby_smb/smb1/packet/trans2/request'
|
|
11
|
+
require 'ruby_smb/smb1/packet/trans2/request_secondary'
|
|
12
|
+
require 'ruby_smb/smb1/packet/trans2/response'
|
|
13
|
+
require 'ruby_smb/smb1/packet/trans2/open2_request'
|
|
14
|
+
require 'ruby_smb/smb1/packet/trans2/open2_response'
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
data/lib/ruby_smb/smb1/packet.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module RubySMB
|
|
2
2
|
module SMB1
|
|
3
3
|
module Packet
|
|
4
|
-
require 'ruby_smb/smb1/packet/
|
|
4
|
+
require 'ruby_smb/smb1/packet/empty_packet'
|
|
5
5
|
require 'ruby_smb/smb1/packet/negotiate_request'
|
|
6
6
|
require 'ruby_smb/smb1/packet/negotiate_response'
|
|
7
7
|
require 'ruby_smb/smb1/packet/negotiate_response_extended'
|
|
@@ -13,6 +13,10 @@ module RubySMB
|
|
|
13
13
|
require 'ruby_smb/smb1/packet/tree_disconnect_response'
|
|
14
14
|
require 'ruby_smb/smb1/packet/logoff_request'
|
|
15
15
|
require 'ruby_smb/smb1/packet/logoff_response'
|
|
16
|
+
require 'ruby_smb/smb1/packet/echo_request'
|
|
17
|
+
require 'ruby_smb/smb1/packet/echo_response'
|
|
18
|
+
require 'ruby_smb/smb1/packet/trans2'
|
|
19
|
+
require 'ruby_smb/smb1/packet/nt_trans'
|
|
16
20
|
end
|
|
17
21
|
end
|
|
18
22
|
end
|
data/lib/ruby_smb/smb1.rb
CHANGED
|
@@ -4,6 +4,9 @@ module RubySMB::SMB1
|
|
|
4
4
|
# Protocol ID value. Translates to \xFFSMB
|
|
5
5
|
SMB_PROTOCOL_ID = 0xFF534D42
|
|
6
6
|
|
|
7
|
+
require 'ruby_smb/smb1/dispositions'
|
|
8
|
+
require 'ruby_smb/smb1/create_actions'
|
|
9
|
+
require 'ruby_smb/smb1/oplock_levels'
|
|
7
10
|
require 'ruby_smb/smb1/commands'
|
|
8
11
|
require 'ruby_smb/smb1/andx_block'
|
|
9
12
|
require 'ruby_smb/smb1/bit_field'
|
|
File without changes
|
|
File without changes
|
|
@@ -4,12 +4,12 @@ module RubySMB
|
|
|
4
4
|
require 'ruby_smb/smb2/bit_field/smb2_header_flags'
|
|
5
5
|
require 'ruby_smb/smb2/bit_field/smb2_security_mode'
|
|
6
6
|
require 'ruby_smb/smb2/bit_field/smb2_security_mode_single'
|
|
7
|
-
require 'ruby_smb/smb2/bit_field/
|
|
7
|
+
require 'ruby_smb/smb2/bit_field/smb2_capabilities'
|
|
8
8
|
require 'ruby_smb/smb2/bit_field/session_flags'
|
|
9
9
|
require 'ruby_smb/smb2/bit_field/directory_access_mask'
|
|
10
10
|
require 'ruby_smb/smb2/bit_field/file_access_mask'
|
|
11
11
|
require 'ruby_smb/smb2/bit_field/share_flags'
|
|
12
|
-
require 'ruby_smb/smb2/bit_field/
|
|
12
|
+
require 'ruby_smb/smb2/bit_field/share_capabilities'
|
|
13
13
|
end
|
|
14
14
|
end
|
|
15
15
|
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module RubySMB
|
|
2
|
+
module SMB2
|
|
3
|
+
module Packet
|
|
4
|
+
|
|
5
|
+
# An SMB2 Echo Request Packet as defined in
|
|
6
|
+
# [2.2.28 SMB2 ECHO Request](https://msdn.microsoft.com/en-us/library/cc246540.aspx)
|
|
7
|
+
class EchoRequest < RubySMB::GenericPacket
|
|
8
|
+
endian :little
|
|
9
|
+
smb2_header :smb2_header
|
|
10
|
+
uint16 :structure_size, label: 'Structure Size', initial_value: 4
|
|
11
|
+
uint16 :reserved
|
|
12
|
+
|
|
13
|
+
def initialize_instance
|
|
14
|
+
super
|
|
15
|
+
smb2_header.command = RubySMB::SMB2::Commands::ECHO
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module RubySMB
|
|
2
|
+
module SMB2
|
|
3
|
+
module Packet
|
|
4
|
+
|
|
5
|
+
# An SMB2 Echo response Packet as defined in
|
|
6
|
+
# [2.2.29 SMB2 ECHO Response](https://msdn.microsoft.com/en-us/library/cc246541.aspx)
|
|
7
|
+
class EchoResponse < RubySMB::GenericPacket
|
|
8
|
+
endian :little
|
|
9
|
+
smb2_header :smb2_header
|
|
10
|
+
uint16 :structure_size, label: 'Structure Size', initial_value: 4
|
|
11
|
+
uint16 :reserved
|
|
12
|
+
|
|
13
|
+
def initialize_instance
|
|
14
|
+
super
|
|
15
|
+
smb2_header.command = RubySMB::SMB2::Commands::ECHO
|
|
16
|
+
smb2_header.flags.reply = 1
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
data/lib/ruby_smb/smb2/packet.rb
CHANGED
|
@@ -12,6 +12,8 @@ module RubySMB
|
|
|
12
12
|
require 'ruby_smb/smb2/packet/tree_disconnect_response'
|
|
13
13
|
require 'ruby_smb/smb2/packet/logoff_request'
|
|
14
14
|
require 'ruby_smb/smb2/packet/logoff_response'
|
|
15
|
+
require 'ruby_smb/smb2/packet/echo_request'
|
|
16
|
+
require 'ruby_smb/smb2/packet/echo_response'
|
|
15
17
|
end
|
|
16
18
|
end
|
|
17
19
|
end
|
data/lib/ruby_smb/version.rb
CHANGED
data/ruby_smb.gemspec
CHANGED
|
@@ -745,4 +745,50 @@ RSpec.describe RubySMB::Client do
|
|
|
745
745
|
|
|
746
746
|
end
|
|
747
747
|
end
|
|
748
|
+
|
|
749
|
+
context 'Echo command' do
|
|
750
|
+
context 'with SMB1' do
|
|
751
|
+
let(:echo_request) { RubySMB::SMB1::Packet::EchoRequest.new }
|
|
752
|
+
let(:echo_response) {
|
|
753
|
+
packet = RubySMB::SMB1::Packet::EchoResponse.new
|
|
754
|
+
packet.smb_header.nt_status = 0x00000080
|
|
755
|
+
packet
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
before(:each) do
|
|
759
|
+
allow(RubySMB::SMB2::Packet::EchoRequest).to receive(:new).and_return(echo_request)
|
|
760
|
+
end
|
|
761
|
+
|
|
762
|
+
it 'sets the echo_count on the request packet' do
|
|
763
|
+
modified_request = echo_request
|
|
764
|
+
modified_request.parameter_block.echo_count = 5
|
|
765
|
+
expect(smb1_client).to receive(:send_recv).with(modified_request).and_return(echo_response.to_binary_s)
|
|
766
|
+
expect(dispatcher).to receive(:recv_packet).exactly(4).times.and_return(echo_response.to_binary_s)
|
|
767
|
+
smb1_client.smb1_echo(count: 5)
|
|
768
|
+
end
|
|
769
|
+
|
|
770
|
+
it 'sets the data on the request packet' do
|
|
771
|
+
modified_request = echo_request
|
|
772
|
+
modified_request.data_block.data = "DEADBEEF"
|
|
773
|
+
expect(smb1_client).to receive(:send_recv).with(modified_request).and_return(echo_response.to_binary_s)
|
|
774
|
+
smb1_client.smb1_echo(data: "DEADBEEF")
|
|
775
|
+
end
|
|
776
|
+
|
|
777
|
+
it 'returns the NT status code' do
|
|
778
|
+
expect(smb1_client).to receive(:send_recv).and_return(echo_response.to_binary_s)
|
|
779
|
+
expect(smb1_client.echo).to eq WindowsError::NTStatus::STATUS_ABANDONED
|
|
780
|
+
end
|
|
781
|
+
end
|
|
782
|
+
|
|
783
|
+
context 'with SMB2' do
|
|
784
|
+
let(:echo_request) { RubySMB::SMB2::Packet::EchoRequest.new }
|
|
785
|
+
let(:echo_response) { RubySMB::SMB2::Packet::EchoResponse.new }
|
|
786
|
+
|
|
787
|
+
it '#smb2_echo sends an Echo Request and returns a response' do
|
|
788
|
+
allow(RubySMB::SMB2::Packet::EchoRequest).to receive(:new).and_return(echo_request)
|
|
789
|
+
expect(smb2_client).to receive(:send_recv).with(echo_request).and_return(echo_response.to_binary_s)
|
|
790
|
+
expect(smb2_client.smb2_echo).to eq echo_response
|
|
791
|
+
end
|
|
792
|
+
end
|
|
793
|
+
end
|
|
748
794
|
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe RubySMB::Field::EaInfoArray do
|
|
4
|
+
subject(:info_array) { described_class.new(type: :file_full_ea_info) }
|
|
5
|
+
let(:first_ea) {
|
|
6
|
+
ea = RubySMB::Field::FileFullEaInfo.new
|
|
7
|
+
ea.ea_name = 'First'
|
|
8
|
+
ea.ea_value = 'First Value'
|
|
9
|
+
ea
|
|
10
|
+
}
|
|
11
|
+
let(:second_ea) {
|
|
12
|
+
ea = RubySMB::Field::FileFullEaInfo.new
|
|
13
|
+
ea.ea_name = 'Second'
|
|
14
|
+
ea.ea_value = 'Second Value'
|
|
15
|
+
ea
|
|
16
|
+
}
|
|
17
|
+
let(:additional_ea) {
|
|
18
|
+
ea = RubySMB::Field::FileFullEaInfo.new
|
|
19
|
+
ea.ea_name = 'Additional'
|
|
20
|
+
ea.ea_value = 'Additional Value'
|
|
21
|
+
ea
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
it 'updates the offset of the first element when a second is appended' do
|
|
25
|
+
info_array << first_ea
|
|
26
|
+
info_array << second_ea
|
|
27
|
+
expect(info_array[0].next_entry_offset).to eq info_array[1].rel_offset
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'sets the last offset to 0' do
|
|
31
|
+
info_array << first_ea
|
|
32
|
+
expect(info_array[0].next_entry_offset).to eq 0
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it 'updates offset when setting a particular element' do
|
|
36
|
+
info_array << first_ea
|
|
37
|
+
info_array << second_ea
|
|
38
|
+
info_array[0] = additional_ea
|
|
39
|
+
expect(info_array[0].next_entry_offset).to eq info_array[1].rel_offset
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'raises an error when inserting an invalid object' do
|
|
43
|
+
expect{ info_array << "Foo" }.to raise_error(ArgumentError)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'raises an error when setting an invalid value' do
|
|
47
|
+
expect{ info_array[0] = "Foo" }.to raise_error(ArgumentError)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
RSpec.describe RubySMB::Field::ExtendedAttributeFlag do
|
|
2
|
+
subject(:flag) { described_class.new }
|
|
3
|
+
|
|
4
|
+
it { is_expected.to respond_to :file_need_ea }
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
describe 'file_need_ea' do
|
|
8
|
+
it 'should be a 1-bit field per the SMB spec' do
|
|
9
|
+
expect(flag.file_need_ea).to be_a BinData::Bit1
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
it_behaves_like 'bit field with one flag set', :file_need_ea, 'C', 0x80
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe RubySMB::Field::FileFullEaInfo do
|
|
4
|
+
subject(:info) { described_class.new }
|
|
5
|
+
|
|
6
|
+
it { is_expected.to respond_to :next_entry_offset }
|
|
7
|
+
it { is_expected.to respond_to :flags }
|
|
8
|
+
it { is_expected.to respond_to :ea_name_length }
|
|
9
|
+
it { is_expected.to respond_to :ea_value_length }
|
|
10
|
+
it { is_expected.to respond_to :ea_name }
|
|
11
|
+
it { is_expected.to respond_to :ea_value }
|
|
12
|
+
|
|
13
|
+
it 'is little endian' do
|
|
14
|
+
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe '#flags' do
|
|
18
|
+
it 'is an extended_attribute_flag' do
|
|
19
|
+
expect(info.flags).to be_a RubySMB::Field::ExtendedAttributeFlag
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe '#ea_name_length' do
|
|
24
|
+
it 'stores the length of the #ea_name field' do
|
|
25
|
+
expect(info.ea_name_length).to eq info.ea_name.do_num_bytes
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe '#ea_value_length' do
|
|
30
|
+
it 'stores the length of the #ea_value field' do
|
|
31
|
+
expect(info.ea_value_length).to eq info.ea_value.do_num_bytes
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|