ruby_smb 2.0.12 → 2.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 +0 -0
- data/.github/workflows/verify.yml +1 -1
- data/examples/dump_secrets_from_sid.rb +207 -0
- data/examples/enum_domain_users.rb +75 -0
- data/examples/get_computer_info.rb +42 -0
- data/examples/query_service_status.rb +42 -4
- data/lib/ruby_smb/client.rb +3 -14
- data/lib/ruby_smb/dcerpc/bind.rb +28 -20
- data/lib/ruby_smb/dcerpc/bind_ack.rb +29 -28
- data/lib/ruby_smb/dcerpc/client.rb +542 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_bind_request.rb +24 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_bind_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_crack_names_request.rb +57 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_crack_names_response.rb +76 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_domain_controller_info_request.rb +46 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_domain_controller_info_response.rb +168 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_extensions.rb +56 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_get_nc_changes_request.rb +121 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_get_nc_changes_response.rb +118 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_unbind_request.rb +24 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_unbind_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/drsr.rb +909 -0
- data/lib/ruby_smb/dcerpc/epm/epm_ept_map_request.rb +26 -0
- data/lib/ruby_smb/dcerpc/epm/epm_ept_map_response.rb +25 -0
- data/lib/ruby_smb/dcerpc/epm/epm_twrt.rb +211 -0
- data/lib/ruby_smb/dcerpc/epm.rb +75 -0
- data/lib/ruby_smb/dcerpc/error.rb +17 -0
- data/lib/ruby_smb/dcerpc/ndr.rb +1159 -297
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_request.rb +3 -13
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_response.rb +3 -3
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_request.rb +3 -13
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_request.rb +3 -11
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/netlogon.rb +5 -4
- data/lib/ruby_smb/dcerpc/p_syntax_id_t.rb +4 -3
- data/lib/ruby_smb/dcerpc/pdu_header.rb +7 -7
- data/lib/ruby_smb/dcerpc/ptypes.rb +1 -0
- data/lib/ruby_smb/dcerpc/request.rb +79 -32
- data/lib/ruby_smb/dcerpc/response.rb +45 -10
- data/lib/ruby_smb/dcerpc/rpc_auth3.rb +28 -0
- data/lib/ruby_smb/dcerpc/rpc_security_attributes.rb +11 -11
- data/lib/ruby_smb/dcerpc/rrp_rpc_unicode_string.rb +118 -0
- data/lib/ruby_smb/dcerpc/samr/rpc_sid.rb +150 -0
- data/lib/ruby_smb/dcerpc/samr/samr_close_handle_request.rb +23 -0
- data/lib/ruby_smb/dcerpc/samr/samr_close_handle_response.rb +24 -0
- data/lib/ruby_smb/dcerpc/samr/samr_connect_request.rb +32 -0
- data/lib/ruby_smb/dcerpc/samr/samr_connect_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_request.rb +26 -0
- data/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_response.rb +55 -0
- data/lib/ruby_smb/dcerpc/samr/samr_get_alias_membership_request.rb +48 -0
- data/lib/ruby_smb/dcerpc/samr/samr_get_alias_membership_response.rb +38 -0
- data/lib/ruby_smb/dcerpc/samr/samr_get_groups_for_user_request.rb +23 -0
- data/lib/ruby_smb/dcerpc/samr/samr_get_groups_for_user_response.rb +48 -0
- data/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_request.rb +24 -0
- data/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_response.rb +25 -0
- data/lib/ruby_smb/dcerpc/samr/samr_open_domain_request.rb +27 -0
- data/lib/ruby_smb/dcerpc/samr/samr_open_domain_response.rb +24 -0
- data/lib/ruby_smb/dcerpc/samr/samr_open_user_request.rb +26 -0
- data/lib/ruby_smb/dcerpc/samr/samr_open_user_response.rb +24 -0
- data/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_request.rb +23 -0
- data/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/samr.rb +613 -0
- data/lib/ruby_smb/dcerpc/sec_trailer.rb +26 -0
- data/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all.rb +56 -79
- data/lib/ruby_smb/dcerpc/srvsvc.rb +27 -4
- data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request.rb +13 -25
- data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response.rb +2 -2
- data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl/control_service_request.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl/control_service_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request.rb +4 -14
- data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl/open_service_w_request.rb +3 -11
- data/lib/ruby_smb/dcerpc/svcctl/open_service_w_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response.rb +12 -11
- data/lib/ruby_smb/dcerpc/svcctl/query_service_status_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl/service_status.rb +9 -8
- data/lib/ruby_smb/dcerpc/svcctl/start_service_w_request.rb +3 -3
- data/lib/ruby_smb/dcerpc/svcctl/start_service_w_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl.rb +1 -3
- data/lib/ruby_smb/dcerpc/uuid.rb +3 -0
- data/lib/ruby_smb/dcerpc/winreg/close_key_response.rb +2 -2
- data/lib/ruby_smb/dcerpc/winreg/create_key_request.rb +2 -13
- data/lib/ruby_smb/dcerpc/winreg/create_key_response.rb +3 -3
- data/lib/ruby_smb/dcerpc/winreg/enum_key_request.rb +3 -20
- data/lib/ruby_smb/dcerpc/winreg/enum_key_response.rb +3 -20
- data/lib/ruby_smb/dcerpc/winreg/enum_value_request.rb +5 -14
- data/lib/ruby_smb/dcerpc/winreg/enum_value_response.rb +5 -14
- data/lib/ruby_smb/dcerpc/winreg/open_key_request.rb +1 -9
- data/lib/ruby_smb/dcerpc/winreg/open_key_response.rb +4 -3
- data/lib/ruby_smb/dcerpc/winreg/open_root_key_request.rb +5 -6
- data/lib/ruby_smb/dcerpc/winreg/open_root_key_response.rb +2 -2
- data/lib/ruby_smb/dcerpc/winreg/query_info_key_response.rb +9 -18
- data/lib/ruby_smb/dcerpc/winreg/query_value_request.rb +4 -14
- data/lib/ruby_smb/dcerpc/winreg/query_value_response.rb +7 -15
- data/lib/ruby_smb/dcerpc/winreg/regsam.rb +3 -1
- data/lib/ruby_smb/dcerpc/winreg/save_key_request.rb +0 -9
- data/lib/ruby_smb/dcerpc/winreg/save_key_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/winreg.rb +10 -14
- data/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_request.rb +26 -0
- data/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_response.rb +88 -0
- data/lib/ruby_smb/dcerpc/wkssvc.rb +65 -0
- data/lib/ruby_smb/dcerpc.rb +41 -11
- data/lib/ruby_smb/field/file_time.rb +1 -1
- data/lib/ruby_smb/field/string16.rb +5 -1
- data/lib/ruby_smb/ntlm.rb +18 -2
- data/lib/ruby_smb/smb1/pipe.rb +4 -0
- data/lib/ruby_smb/smb2/pipe.rb +4 -0
- data/lib/ruby_smb/version.rb +1 -1
- data/spec/lib/ruby_smb/client_spec.rb +1 -2
- data/spec/lib/ruby_smb/dcerpc/bind_ack_spec.rb +69 -41
- data/spec/lib/ruby_smb/dcerpc/bind_spec.rb +75 -21
- data/spec/lib/ruby_smb/dcerpc/client_spec.rb +714 -0
- data/spec/lib/ruby_smb/dcerpc/drsr_spec.rb +2169 -0
- data/spec/lib/ruby_smb/dcerpc/ndr_spec.rb +3792 -1373
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_request_spec.rb +4 -4
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_request_spec.rb +4 -4
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_request_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/p_syntax_id_t_spec.rb +18 -4
- data/spec/lib/ruby_smb/dcerpc/pdu_header_spec.rb +27 -1
- data/spec/lib/ruby_smb/dcerpc/request_spec.rb +76 -11
- data/spec/lib/ruby_smb/dcerpc/response_spec.rb +99 -9
- data/spec/lib/ruby_smb/dcerpc/rpc_auth3_spec.rb +75 -0
- data/spec/lib/ruby_smb/dcerpc/rpc_security_attributes_spec.rb +29 -28
- data/spec/lib/ruby_smb/dcerpc/rrp_rpc_unicode_string_spec.rb +340 -0
- data/spec/lib/ruby_smb/dcerpc/samr/rpc_sid_spec.rb +116 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_close_handle_request_spec.rb +40 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_close_handle_response_spec.rb +48 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_connect_request_spec.rb +56 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_connect_response_spec.rb +47 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_request_spec.rb +63 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_response_spec.rb +265 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_request_spec.rb +52 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_response_spec.rb +36 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_open_domain_request_spec.rb +56 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_open_domain_response_spec.rb +48 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_request_spec.rb +48 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_response_spec.rb +42 -0
- data/spec/lib/ruby_smb/dcerpc/samr_spec.rb +420 -0
- data/spec/lib/ruby_smb/dcerpc/sec_trailer_spec.rb +92 -0
- data/spec/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all_spec.rb +149 -110
- data/spec/lib/ruby_smb/dcerpc/srvsvc_spec.rb +21 -17
- data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request_spec.rb +56 -79
- data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response_spec.rb +4 -4
- data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_request_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request_spec.rb +19 -29
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_request_spec.rb +9 -15
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response_spec.rb +22 -22
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl/service_status_spec.rb +18 -14
- data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_request_spec.rb +5 -4
- data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl_spec.rb +1 -5
- data/spec/lib/ruby_smb/dcerpc/uuid_spec.rb +15 -23
- data/spec/lib/ruby_smb/dcerpc/winreg/close_key_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/winreg/create_key_request_spec.rb +4 -41
- data/spec/lib/ruby_smb/dcerpc/winreg/create_key_response_spec.rb +4 -4
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_request_spec.rb +4 -52
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_response_spec.rb +4 -56
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_request_spec.rb +10 -34
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_response_spec.rb +10 -34
- data/spec/lib/ruby_smb/dcerpc/winreg/open_key_request_spec.rb +2 -26
- data/spec/lib/ruby_smb/dcerpc/winreg/open_key_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_request_spec.rb +17 -25
- data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_response_spec.rb +20 -44
- data/spec/lib/ruby_smb/dcerpc/winreg/query_value_request_spec.rb +8 -32
- data/spec/lib/ruby_smb/dcerpc/winreg/query_value_response_spec.rb +10 -22
- data/spec/lib/ruby_smb/dcerpc/winreg/regsam_spec.rb +4 -0
- data/spec/lib/ruby_smb/dcerpc/winreg/save_key_request_spec.rb +0 -12
- data/spec/lib/ruby_smb/dcerpc/winreg/save_key_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/winreg_spec.rb +18 -47
- data/spec/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_request_spec.rb +43 -0
- data/spec/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_response_spec.rb +410 -0
- data/spec/lib/ruby_smb/dcerpc/wkssvc_spec.rb +70 -0
- data/spec/lib/ruby_smb/field/string16_spec.rb +22 -0
- data/spec/lib/ruby_smb/gss/provider/ntlm/os_version_spec.rb +1 -1
- data/spec/lib/ruby_smb/smb1/pipe_spec.rb +18 -37
- data/spec/lib/ruby_smb/smb2/pipe_spec.rb +18 -16
- data/spec/support/bin_helper.rb +9 -0
- data.tar.gz.sig +0 -0
- metadata +96 -5
- metadata.gz.sig +0 -0
- data/lib/ruby_smb/dcerpc/rrp_unicode_string.rb +0 -38
- data/spec/lib/ruby_smb/dcerpc/rrp_unicode_string_spec.rb +0 -135
|
@@ -3,12 +3,16 @@ module RubySMB
|
|
|
3
3
|
# Represents a String in UTF-16LE
|
|
4
4
|
class String16 < BinData::String
|
|
5
5
|
def assign(val)
|
|
6
|
-
super(val.encode('utf-16le'))
|
|
6
|
+
super(val.to_s.encode('utf-16le')).force_encoding('utf-16le')
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
def snapshot
|
|
10
10
|
super.force_encoding('utf-16le')
|
|
11
11
|
end
|
|
12
|
+
|
|
13
|
+
def read_and_return_value(io)
|
|
14
|
+
super.force_encoding('utf-16le')
|
|
15
|
+
end
|
|
12
16
|
end
|
|
13
17
|
end
|
|
14
18
|
end
|
data/lib/ruby_smb/ntlm.rb
CHANGED
|
@@ -28,13 +28,29 @@ module RubySMB
|
|
|
28
28
|
:KEY56 => 1 << 31
|
|
29
29
|
}.freeze
|
|
30
30
|
|
|
31
|
+
DEFAULT_CLIENT_FLAGS =
|
|
32
|
+
NEGOTIATE_FLAGS[:UNICODE] |
|
|
33
|
+
NEGOTIATE_FLAGS[:SIGN] |
|
|
34
|
+
NEGOTIATE_FLAGS[:SEAL] |
|
|
35
|
+
NEGOTIATE_FLAGS[:REQUEST_TARGET] |
|
|
36
|
+
NEGOTIATE_FLAGS[:NTLM] |
|
|
37
|
+
NEGOTIATE_FLAGS[:ALWAYS_SIGN] |
|
|
38
|
+
NEGOTIATE_FLAGS[:EXTENDED_SECURITY] |
|
|
39
|
+
NEGOTIATE_FLAGS[:KEY128] |
|
|
40
|
+
NEGOTIATE_FLAGS[:KEY_EXCHANGE] |
|
|
41
|
+
NEGOTIATE_FLAGS[:KEY56] |
|
|
42
|
+
NEGOTIATE_FLAGS[:TARGET_INFO] |
|
|
43
|
+
NEGOTIATE_FLAGS[:VERSION_INFO]
|
|
44
|
+
|
|
45
|
+
# [[MS-NLMP] 2.2.2.10 VERSION](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nlmp/b1a6ceb2-f8ad-462b-b5af-f18527c48175)
|
|
31
46
|
class OSVersion < BinData::Record
|
|
32
|
-
endian :
|
|
47
|
+
endian :little
|
|
33
48
|
|
|
34
49
|
uint8 :major
|
|
35
50
|
uint8 :minor
|
|
36
51
|
uint16 :build
|
|
37
|
-
|
|
52
|
+
uint24 :reserved
|
|
53
|
+
uint8 :ntlm_revision, initial_value: 15
|
|
38
54
|
|
|
39
55
|
def to_s
|
|
40
56
|
"Version #{major}.#{minor} (Build #{build}); NTLM Current Revision #{ntlm_revision}"
|
data/lib/ruby_smb/smb1/pipe.rb
CHANGED
|
@@ -24,6 +24,10 @@ module RubySMB
|
|
|
24
24
|
extend RubySMB::Dcerpc::Svcctl
|
|
25
25
|
when 'winreg', '\\winreg'
|
|
26
26
|
extend RubySMB::Dcerpc::Winreg
|
|
27
|
+
when 'samr', '\\samr'
|
|
28
|
+
extend RubySMB::Dcerpc::Samr
|
|
29
|
+
when 'wkssvc', '\\wkssvc'
|
|
30
|
+
extend RubySMB::Dcerpc::Wkssvc
|
|
27
31
|
end
|
|
28
32
|
super(tree: tree, response: response, name: name)
|
|
29
33
|
end
|
data/lib/ruby_smb/smb2/pipe.rb
CHANGED
|
@@ -21,6 +21,10 @@ module RubySMB
|
|
|
21
21
|
extend RubySMB::Dcerpc::Svcctl
|
|
22
22
|
when 'winreg', '\\winreg'
|
|
23
23
|
extend RubySMB::Dcerpc::Winreg
|
|
24
|
+
when 'samr', '\\samr'
|
|
25
|
+
extend RubySMB::Dcerpc::Samr
|
|
26
|
+
when 'wkssvc', '\\wkssvc'
|
|
27
|
+
extend RubySMB::Dcerpc::Wkssvc
|
|
24
28
|
end
|
|
25
29
|
super(tree: tree, response: response, name: name)
|
|
26
30
|
end
|
data/lib/ruby_smb/version.rb
CHANGED
|
@@ -126,8 +126,7 @@ RSpec.describe RubySMB::Client do
|
|
|
126
126
|
expect(password).to eq(password)
|
|
127
127
|
expect(opt[:workstation]).to eq(local_workstation)
|
|
128
128
|
expect(opt[:domain]).to eq(domain)
|
|
129
|
-
flags =
|
|
130
|
-
Net::NTLM::FLAGS[:TARGET_INFO] | 0x02000000 ^ Net::NTLM::FLAGS[:OEM]
|
|
129
|
+
flags = RubySMB::NTLM::DEFAULT_CLIENT_FLAGS
|
|
131
130
|
expect(opt[:flags]).to eq(flags)
|
|
132
131
|
end
|
|
133
132
|
|
|
@@ -7,7 +7,8 @@ RSpec.describe RubySMB::Dcerpc::BindAck do
|
|
|
7
7
|
it { is_expected.to respond_to :assoc_group_id }
|
|
8
8
|
it { is_expected.to respond_to :sec_addr }
|
|
9
9
|
it { is_expected.to respond_to :p_result_list }
|
|
10
|
-
it { is_expected.to respond_to :
|
|
10
|
+
it { is_expected.to respond_to :sec_trailer }
|
|
11
|
+
it { is_expected.to respond_to :auth_value }
|
|
11
12
|
|
|
12
13
|
it 'is little endian' do
|
|
13
14
|
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
|
@@ -26,8 +27,8 @@ RSpec.describe RubySMB::Dcerpc::BindAck do
|
|
|
26
27
|
end
|
|
27
28
|
|
|
28
29
|
describe '#max_xmit_frag' do
|
|
29
|
-
it 'should be a
|
|
30
|
-
expect(packet.max_xmit_frag).to be_a
|
|
30
|
+
it 'should be a NdrUint16' do
|
|
31
|
+
expect(packet.max_xmit_frag).to be_a RubySMB::Dcerpc::Ndr::NdrUint16
|
|
31
32
|
end
|
|
32
33
|
|
|
33
34
|
it 'should have a default value of 0xFFFF' do
|
|
@@ -36,8 +37,8 @@ RSpec.describe RubySMB::Dcerpc::BindAck do
|
|
|
36
37
|
end
|
|
37
38
|
|
|
38
39
|
describe '#max_recv_frag' do
|
|
39
|
-
it 'should be a
|
|
40
|
-
expect(packet.max_recv_frag).to be_a
|
|
40
|
+
it 'should be a NdrUint16' do
|
|
41
|
+
expect(packet.max_recv_frag).to be_a RubySMB::Dcerpc::Ndr::NdrUint16
|
|
41
42
|
end
|
|
42
43
|
|
|
43
44
|
it 'should have a default value of 0xFFFF' do
|
|
@@ -46,15 +47,8 @@ RSpec.describe RubySMB::Dcerpc::BindAck do
|
|
|
46
47
|
end
|
|
47
48
|
|
|
48
49
|
describe '#assoc_group_id' do
|
|
49
|
-
it 'should be a
|
|
50
|
-
expect(packet.assoc_group_id).to be_a
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
describe '#pad' do
|
|
55
|
-
it 'should keep #p_result_list 4-byte aligned' do
|
|
56
|
-
packet.sec_addr.port_spec = "test"
|
|
57
|
-
expect(packet.p_result_list.abs_offset % 4).to eq 0
|
|
50
|
+
it 'should be a NdrUint32' do
|
|
51
|
+
expect(packet.assoc_group_id).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
|
|
58
52
|
end
|
|
59
53
|
end
|
|
60
54
|
|
|
@@ -64,45 +58,49 @@ RSpec.describe RubySMB::Dcerpc::BindAck do
|
|
|
64
58
|
end
|
|
65
59
|
end
|
|
66
60
|
|
|
67
|
-
describe '#
|
|
68
|
-
it 'should be a
|
|
69
|
-
expect(packet.
|
|
61
|
+
describe '#sec_trailer' do
|
|
62
|
+
it 'should be a SecTrailer structure' do
|
|
63
|
+
expect(packet.sec_trailer).to be_a RubySMB::Dcerpc::SecTrailer
|
|
70
64
|
end
|
|
71
65
|
|
|
72
66
|
it 'should not exist if the #auth_length PDU header field is 0' do
|
|
73
67
|
packet.pdu_header.auth_length = 0
|
|
74
|
-
expect(packet.
|
|
68
|
+
expect(packet.sec_trailer?).to be false
|
|
75
69
|
end
|
|
76
70
|
|
|
77
71
|
it 'should exist only if the #auth_length PDU header field is greater than 0' do
|
|
78
72
|
packet.pdu_header.auth_length = 10
|
|
79
|
-
expect(packet.
|
|
73
|
+
expect(packet.sec_trailer?).to be true
|
|
80
74
|
end
|
|
75
|
+
end
|
|
81
76
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
packet.
|
|
85
|
-
packet.auth_verifier.read(auth_verifier)
|
|
86
|
-
expect(packet.auth_verifier).to eq(auth_verifier[0,6])
|
|
77
|
+
describe '#auth_value' do
|
|
78
|
+
it 'should be a string' do
|
|
79
|
+
expect(packet.auth_value).to be_a BinData::String
|
|
87
80
|
end
|
|
88
|
-
end
|
|
89
81
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
packet.
|
|
93
|
-
expect(packet.pad_length).to eq 0
|
|
82
|
+
it 'should not exist if the #auth_length PDU header field is 0' do
|
|
83
|
+
packet.pdu_header.auth_length = 0
|
|
84
|
+
expect(packet.auth_value?).to be false
|
|
94
85
|
end
|
|
95
86
|
|
|
96
|
-
it '
|
|
97
|
-
packet.
|
|
98
|
-
expect(packet.
|
|
87
|
+
it 'should exist only if the #auth_length PDU header field is greater than 0' do
|
|
88
|
+
packet.pdu_header.auth_length = 10
|
|
89
|
+
expect(packet.auth_value?).to be true
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it 'reads #auth_length bytes' do
|
|
93
|
+
auth_value = '12345678'
|
|
94
|
+
packet.pdu_header.auth_length = 6
|
|
95
|
+
packet.auth_value.read(auth_value)
|
|
96
|
+
expect(packet.auth_value).to eq(auth_value[0,6])
|
|
99
97
|
end
|
|
100
98
|
end
|
|
101
99
|
|
|
102
100
|
it 'reads its own binary representation and output the same packet' do
|
|
103
101
|
packet.sec_addr.port_spec = "port spec"
|
|
104
102
|
packet.p_result_list.n_results = 2
|
|
105
|
-
packet.
|
|
103
|
+
packet.auth_value = '123456'
|
|
106
104
|
packet.pdu_header.auth_length = 6
|
|
107
105
|
binary = packet.to_binary_s
|
|
108
106
|
expect(described_class.read(binary)).to eq(packet)
|
|
@@ -119,9 +117,13 @@ RSpec.describe RubySMB::Dcerpc::PortAnyT do
|
|
|
119
117
|
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
|
120
118
|
end
|
|
121
119
|
|
|
120
|
+
it 'has a default alignment of 2 bytes' do
|
|
121
|
+
expect(described_class.default_parameters[:byte_align]).to eq 2
|
|
122
|
+
end
|
|
123
|
+
|
|
122
124
|
describe '#str_length' do
|
|
123
|
-
it 'should be a
|
|
124
|
-
expect(packet.str_length).to be_a
|
|
125
|
+
it 'should be a NdrUint16' do
|
|
126
|
+
expect(packet.str_length).to be_a RubySMB::Dcerpc::Ndr::NdrUint16
|
|
125
127
|
end
|
|
126
128
|
|
|
127
129
|
it 'should be the size of #port_spec string, including the NULL terminator' do
|
|
@@ -148,15 +150,33 @@ RSpec.describe RubySMB::Dcerpc::PResultListT do
|
|
|
148
150
|
subject(:packet) { described_class.new }
|
|
149
151
|
|
|
150
152
|
it { is_expected.to respond_to :n_results }
|
|
153
|
+
it { is_expected.to respond_to :reserved }
|
|
154
|
+
it { is_expected.to respond_to :reserved2 }
|
|
151
155
|
it { is_expected.to respond_to :p_results }
|
|
152
156
|
|
|
153
157
|
it 'is little endian' do
|
|
154
158
|
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
|
155
159
|
end
|
|
156
160
|
|
|
161
|
+
it 'has a default alignment of 4 bytes' do
|
|
162
|
+
expect(described_class.default_parameters[:byte_align]).to eq 4
|
|
163
|
+
end
|
|
164
|
+
|
|
157
165
|
describe '#n_results' do
|
|
158
|
-
it 'should be a
|
|
159
|
-
expect(packet.n_results).to be_a
|
|
166
|
+
it 'should be a NdrUint8' do
|
|
167
|
+
expect(packet.n_results).to be_a RubySMB::Dcerpc::Ndr::NdrUint8
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
describe '#reserved' do
|
|
172
|
+
it 'should be a NdrUint8' do
|
|
173
|
+
expect(packet.reserved).to be_a RubySMB::Dcerpc::Ndr::NdrUint8
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
describe '#reserved2' do
|
|
178
|
+
it 'should be a NdrUint16' do
|
|
179
|
+
expect(packet.reserved2).to be_a RubySMB::Dcerpc::Ndr::NdrUint16
|
|
160
180
|
end
|
|
161
181
|
end
|
|
162
182
|
|
|
@@ -172,6 +192,10 @@ RSpec.describe RubySMB::Dcerpc::PResultListT do
|
|
|
172
192
|
packet.n_results = n_elements
|
|
173
193
|
expect(packet.p_results.size).to eq n_elements
|
|
174
194
|
end
|
|
195
|
+
|
|
196
|
+
it 'has a default alignment of 4 bytes' do
|
|
197
|
+
expect(packet.p_results.get_parameter(:byte_align)).to eq 4
|
|
198
|
+
end
|
|
175
199
|
end
|
|
176
200
|
|
|
177
201
|
it 'reads its own binary representation and output the same packet' do
|
|
@@ -192,15 +216,19 @@ RSpec.describe RubySMB::Dcerpc::PResultT do
|
|
|
192
216
|
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
|
193
217
|
end
|
|
194
218
|
|
|
219
|
+
it 'has a default alignment of 4 bytes' do
|
|
220
|
+
expect(described_class.default_parameters[:byte_align]).to eq 4
|
|
221
|
+
end
|
|
222
|
+
|
|
195
223
|
describe '#result' do
|
|
196
|
-
it 'should be a
|
|
197
|
-
expect(packet.result).to be_a
|
|
224
|
+
it 'should be a NdrUint16' do
|
|
225
|
+
expect(packet.result).to be_a RubySMB::Dcerpc::Ndr::NdrUint16
|
|
198
226
|
end
|
|
199
227
|
end
|
|
200
228
|
|
|
201
229
|
describe '#reason' do
|
|
202
|
-
it 'should be a
|
|
203
|
-
expect(packet.reason).to be_a
|
|
230
|
+
it 'should be a NdrUint16' do
|
|
231
|
+
expect(packet.reason).to be_a RubySMB::Dcerpc::Ndr::NdrUint16
|
|
204
232
|
end
|
|
205
233
|
end
|
|
206
234
|
|
|
@@ -17,7 +17,8 @@ RSpec.describe RubySMB::Dcerpc::Bind do
|
|
|
17
17
|
it { is_expected.to respond_to :max_recv_frag }
|
|
18
18
|
it { is_expected.to respond_to :assoc_group_id }
|
|
19
19
|
it { is_expected.to respond_to :p_context_list }
|
|
20
|
-
it { is_expected.to respond_to :
|
|
20
|
+
it { is_expected.to respond_to :sec_trailer }
|
|
21
|
+
it { is_expected.to respond_to :auth_value }
|
|
21
22
|
|
|
22
23
|
it 'is little endian' do
|
|
23
24
|
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
|
@@ -36,8 +37,8 @@ RSpec.describe RubySMB::Dcerpc::Bind do
|
|
|
36
37
|
end
|
|
37
38
|
|
|
38
39
|
describe '#max_xmit_frag' do
|
|
39
|
-
it 'should be
|
|
40
|
-
expect(packet.max_xmit_frag).to be_a
|
|
40
|
+
it 'should be NdrUint16' do
|
|
41
|
+
expect(packet.max_xmit_frag).to be_a RubySMB::Dcerpc::Ndr::NdrUint16
|
|
41
42
|
end
|
|
42
43
|
|
|
43
44
|
it 'should have a default value of 0xFFFF' do
|
|
@@ -46,8 +47,8 @@ RSpec.describe RubySMB::Dcerpc::Bind do
|
|
|
46
47
|
end
|
|
47
48
|
|
|
48
49
|
describe '#max_recv_frag' do
|
|
49
|
-
it 'should be
|
|
50
|
-
expect(packet.max_recv_frag).to be_a
|
|
50
|
+
it 'should be NdrUint16' do
|
|
51
|
+
expect(packet.max_recv_frag).to be_a RubySMB::Dcerpc::Ndr::NdrUint16
|
|
51
52
|
end
|
|
52
53
|
|
|
53
54
|
it 'should have a default value of 0xFFFF' do
|
|
@@ -56,8 +57,8 @@ RSpec.describe RubySMB::Dcerpc::Bind do
|
|
|
56
57
|
end
|
|
57
58
|
|
|
58
59
|
describe '#assoc_group_id' do
|
|
59
|
-
it 'should be
|
|
60
|
-
expect(packet.assoc_group_id).to be_a
|
|
60
|
+
it 'should be NdrUint32' do
|
|
61
|
+
expect(packet.assoc_group_id).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
|
|
61
62
|
end
|
|
62
63
|
end
|
|
63
64
|
|
|
@@ -71,32 +72,48 @@ RSpec.describe RubySMB::Dcerpc::Bind do
|
|
|
71
72
|
end
|
|
72
73
|
end
|
|
73
74
|
|
|
74
|
-
describe '#
|
|
75
|
+
describe '#sec_trailer' do
|
|
76
|
+
it 'should be SecTrailer structure' do
|
|
77
|
+
expect(packet.sec_trailer).to be_a RubySMB::Dcerpc::SecTrailer
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it 'should not exist if the #auth_length PDU header field is 0' do
|
|
81
|
+
packet.pdu_header.auth_length = 0
|
|
82
|
+
expect(packet.sec_trailer?).to be false
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it 'should exist only if the #auth_length PDU header field is greater than 0' do
|
|
86
|
+
packet.pdu_header.auth_length = 10
|
|
87
|
+
expect(packet.sec_trailer?).to be true
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
describe '#auth_value' do
|
|
75
92
|
it 'should be a string' do
|
|
76
|
-
expect(packet.
|
|
93
|
+
expect(packet.auth_value).to be_a BinData::String
|
|
77
94
|
end
|
|
78
95
|
|
|
79
96
|
it 'should not exist if the #auth_length PDU header field is 0' do
|
|
80
97
|
packet.pdu_header.auth_length = 0
|
|
81
|
-
expect(packet.
|
|
98
|
+
expect(packet.auth_value?).to be false
|
|
82
99
|
end
|
|
83
100
|
|
|
84
101
|
it 'should exist only if the #auth_length PDU header field is greater than 0' do
|
|
85
102
|
packet.pdu_header.auth_length = 10
|
|
86
|
-
expect(packet.
|
|
103
|
+
expect(packet.auth_value?).to be true
|
|
87
104
|
end
|
|
88
105
|
|
|
89
106
|
it 'reads #auth_length bytes' do
|
|
90
|
-
|
|
107
|
+
auth_value = '12345678'
|
|
91
108
|
packet.pdu_header.auth_length = 6
|
|
92
|
-
packet.
|
|
93
|
-
expect(packet.
|
|
109
|
+
packet.auth_value.read(auth_value)
|
|
110
|
+
expect(packet.auth_value).to eq(auth_value[0,6])
|
|
94
111
|
end
|
|
95
112
|
end
|
|
96
113
|
|
|
97
114
|
it 'reads its own binary representation and output the same packet' do
|
|
98
115
|
packet = described_class.new(endpoint: endpoint)
|
|
99
|
-
packet.
|
|
116
|
+
packet.auth_value = '123456'
|
|
100
117
|
packet.pdu_header.auth_length = 6
|
|
101
118
|
binary = packet.to_binary_s
|
|
102
119
|
expect(described_class.read(binary)).to eq(packet)
|
|
@@ -118,15 +135,21 @@ RSpec.describe RubySMB::Dcerpc::PContListT do
|
|
|
118
135
|
subject(:packet) { described_class.new }
|
|
119
136
|
|
|
120
137
|
it { is_expected.to respond_to :n_context_elem }
|
|
138
|
+
it { is_expected.to respond_to :reserved }
|
|
139
|
+
it { is_expected.to respond_to :reserved2 }
|
|
121
140
|
it { is_expected.to respond_to :p_cont_elem }
|
|
122
141
|
|
|
123
142
|
it 'is little endian' do
|
|
124
143
|
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
|
125
144
|
end
|
|
126
145
|
|
|
146
|
+
it 'has a default alignment of 4 bytes' do
|
|
147
|
+
expect(described_class.default_parameters[:byte_align]).to eq 4
|
|
148
|
+
end
|
|
149
|
+
|
|
127
150
|
describe '#n_context_elem' do
|
|
128
|
-
it 'should be
|
|
129
|
-
expect(packet.n_context_elem).to be_a
|
|
151
|
+
it 'should be NdrUint8' do
|
|
152
|
+
expect(packet.n_context_elem).to be_a RubySMB::Dcerpc::Ndr::NdrUint8
|
|
130
153
|
end
|
|
131
154
|
|
|
132
155
|
it 'should have the default value 1' do
|
|
@@ -134,6 +157,18 @@ RSpec.describe RubySMB::Dcerpc::PContListT do
|
|
|
134
157
|
end
|
|
135
158
|
end
|
|
136
159
|
|
|
160
|
+
describe '#reserved' do
|
|
161
|
+
it 'should be NdrUint8' do
|
|
162
|
+
expect(packet.reserved).to be_a RubySMB::Dcerpc::Ndr::NdrUint8
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
describe '#reserved2' do
|
|
167
|
+
it 'should be NdrUint16' do
|
|
168
|
+
expect(packet.reserved2).to be_a RubySMB::Dcerpc::Ndr::NdrUint16
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
137
172
|
describe '#p_cont_elem' do
|
|
138
173
|
it 'should be an array of type PContElemT' do
|
|
139
174
|
expect(packet.p_cont_elem).to be_a BinData::Array
|
|
@@ -150,6 +185,10 @@ RSpec.describe RubySMB::Dcerpc::PContListT do
|
|
|
150
185
|
it 'should have an #endpoint parameter' do
|
|
151
186
|
expect(packet.p_cont_elem.has_parameter?(:endpoint)).to be true
|
|
152
187
|
end
|
|
188
|
+
|
|
189
|
+
it 'has a default alignment of 4 bytes' do
|
|
190
|
+
expect(packet.p_cont_elem.get_parameter(:byte_align)).to eq 4
|
|
191
|
+
end
|
|
153
192
|
end
|
|
154
193
|
|
|
155
194
|
it 'reads its own binary representation and output the same packet' do
|
|
@@ -175,6 +214,7 @@ RSpec.describe RubySMB::Dcerpc::PContElemT do
|
|
|
175
214
|
|
|
176
215
|
it { is_expected.to respond_to :p_cont_id }
|
|
177
216
|
it { is_expected.to respond_to :n_transfer_syn }
|
|
217
|
+
it { is_expected.to respond_to :reserved }
|
|
178
218
|
it { is_expected.to respond_to :abstract_syntax }
|
|
179
219
|
it { is_expected.to respond_to :transfer_syntaxes }
|
|
180
220
|
|
|
@@ -182,15 +222,19 @@ RSpec.describe RubySMB::Dcerpc::PContElemT do
|
|
|
182
222
|
expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
|
|
183
223
|
end
|
|
184
224
|
|
|
225
|
+
it 'has a default alignment of 4 bytes' do
|
|
226
|
+
expect(described_class.default_parameters[:byte_align]).to eq 4
|
|
227
|
+
end
|
|
228
|
+
|
|
185
229
|
describe '#p_cont_id' do
|
|
186
|
-
it 'should be
|
|
187
|
-
expect(packet.p_cont_id).to be_a
|
|
230
|
+
it 'should be NdrUint16' do
|
|
231
|
+
expect(packet.p_cont_id).to be_a RubySMB::Dcerpc::Ndr::NdrUint16
|
|
188
232
|
end
|
|
189
233
|
end
|
|
190
234
|
|
|
191
235
|
describe '#n_transfer_syn' do
|
|
192
|
-
it 'should be
|
|
193
|
-
expect(packet.n_transfer_syn).to be_a
|
|
236
|
+
it 'should be NdrUint8' do
|
|
237
|
+
expect(packet.n_transfer_syn).to be_a RubySMB::Dcerpc::Ndr::NdrUint8
|
|
194
238
|
end
|
|
195
239
|
|
|
196
240
|
it 'should have the default value 1' do
|
|
@@ -198,6 +242,12 @@ RSpec.describe RubySMB::Dcerpc::PContElemT do
|
|
|
198
242
|
end
|
|
199
243
|
end
|
|
200
244
|
|
|
245
|
+
describe '#reserved' do
|
|
246
|
+
it 'should be NdrUint8' do
|
|
247
|
+
expect(packet.reserved).to be_a RubySMB::Dcerpc::Ndr::NdrUint8
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
|
|
201
251
|
describe '#abstract_syntax' do
|
|
202
252
|
it 'should be a PSyntaxIdT structure' do
|
|
203
253
|
expect(packet.abstract_syntax).to be_a RubySMB::Dcerpc::PSyntaxIdT
|
|
@@ -251,6 +301,10 @@ RSpec.describe RubySMB::Dcerpc::PContElemT do
|
|
|
251
301
|
expect(packet.transfer_syntaxes[0].if_ver_major).to eq RubySMB::Dcerpc::Ndr::VER_MAJOR
|
|
252
302
|
expect(packet.transfer_syntaxes[0].if_ver_minor).to eq RubySMB::Dcerpc::Ndr::VER_MINOR
|
|
253
303
|
end
|
|
304
|
+
|
|
305
|
+
it 'has a default alignment of 4 bytes' do
|
|
306
|
+
expect(packet.transfer_syntaxes.get_parameter(:byte_align)).to eq 4
|
|
307
|
+
end
|
|
254
308
|
end
|
|
255
309
|
|
|
256
310
|
it 'reads its own binary representation and output the same packet' do
|