ruby_smb 2.0.9 → 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 +5 -15
- data/examples/auth_capture.rb +71 -0
- 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/negotiation.rb +1 -1
- data/lib/ruby_smb/client.rb +10 -20
- 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/dialect.rb +45 -0
- data/lib/ruby_smb/dispatcher/base.rb +1 -1
- data/lib/ruby_smb/field/file_time.rb +1 -1
- data/lib/ruby_smb/field/string16.rb +5 -1
- data/lib/ruby_smb/gss/provider/authenticator.rb +42 -0
- data/lib/ruby_smb/gss/provider/ntlm.rb +303 -0
- data/lib/ruby_smb/gss/provider.rb +35 -0
- data/lib/ruby_smb/gss.rb +56 -63
- data/lib/ruby_smb/ntlm.rb +61 -0
- data/lib/ruby_smb/server/server_client/negotiation.rb +156 -0
- data/lib/ruby_smb/server/server_client/session_setup.rb +82 -0
- data/lib/ruby_smb/server/server_client.rb +162 -0
- data/lib/ruby_smb/server.rb +54 -0
- data/lib/ruby_smb/signing.rb +59 -0
- data/lib/ruby_smb/smb1/packet/negotiate_response.rb +11 -11
- data/lib/ruby_smb/smb1/packet/negotiate_response_extended.rb +1 -1
- data/lib/ruby_smb/smb1/packet/session_setup_request.rb +1 -1
- data/lib/ruby_smb/smb1/pipe.rb +4 -0
- data/lib/ruby_smb/smb1/tree.rb +1 -1
- data/lib/ruby_smb/smb2/negotiate_context.rb +18 -2
- data/lib/ruby_smb/smb2/packet/negotiate_request.rb +9 -0
- data/lib/ruby_smb/smb2/packet/negotiate_response.rb +0 -1
- data/lib/ruby_smb/smb2/packet/session_setup_response.rb +2 -2
- data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +1 -1
- data/lib/ruby_smb/smb2/pipe.rb +4 -0
- data/lib/ruby_smb/smb2/tree.rb +1 -1
- data/lib/ruby_smb/smb2.rb +3 -1
- data/lib/ruby_smb/version.rb +1 -1
- data/lib/ruby_smb.rb +2 -1
- data/spec/lib/ruby_smb/client_spec.rb +8 -11
- 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/account_spec.rb +32 -0
- data/spec/lib/ruby_smb/gss/provider/ntlm/authenticator_spec.rb +101 -0
- data/spec/lib/ruby_smb/gss/provider/ntlm/os_version_spec.rb +32 -0
- data/spec/lib/ruby_smb/gss/provider/ntlm_spec.rb +113 -0
- data/spec/lib/ruby_smb/server/server_client_spec.rb +156 -0
- data/spec/lib/ruby_smb/server_spec.rb +32 -0
- data/spec/lib/ruby_smb/smb1/pipe_spec.rb +18 -37
- data/spec/lib/ruby_smb/smb1/tree_spec.rb +4 -4
- data/spec/lib/ruby_smb/smb2/negotiate_context_spec.rb +2 -2
- data/spec/lib/ruby_smb/smb2/pipe_spec.rb +18 -16
- data/spec/lib/ruby_smb/smb2/tree_spec.rb +5 -5
- data/spec/support/bin_helper.rb +9 -0
- data.tar.gz.sig +2 -1
- metadata +119 -6
- metadata.gz.sig +0 -0
- data/lib/ruby_smb/client/signing.rb +0 -64
- data/lib/ruby_smb/dcerpc/rrp_unicode_string.rb +0 -38
- data/spec/lib/ruby_smb/dcerpc/rrp_unicode_string_spec.rb +0 -135
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/smb2/tree.rb
CHANGED
|
@@ -61,7 +61,7 @@ module RubySMB
|
|
|
61
61
|
opts = opts.dup
|
|
62
62
|
opts[:filename] = opts[:filename].dup
|
|
63
63
|
opts[:filename] = opts[:filename][1..-1] if opts[:filename].start_with? '\\'
|
|
64
|
-
open_file(opts)
|
|
64
|
+
open_file(**opts)
|
|
65
65
|
end
|
|
66
66
|
|
|
67
67
|
def open_file(filename:, attributes: nil, options: nil, disposition: RubySMB::Dispositions::FILE_OPEN,
|
data/lib/ruby_smb/smb2.rb
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
module RubySMB
|
|
2
2
|
# A packet parsing and manipulation library for the SMB2 protocol
|
|
3
3
|
#
|
|
4
|
-
# [[MS-SMB2] Server
|
|
4
|
+
# [[MS-SMB2] Server Message Block (SMB) Protocol Versions 2 and 3](https://msdn.microsoft.com/en-us/library/cc246482.aspx)
|
|
5
5
|
module SMB2
|
|
6
6
|
# Protocol ID value. Translates to \xFESMB
|
|
7
7
|
SMB2_PROTOCOL_ID = 0xFE534D42
|
|
8
|
+
# Wildcard revision, see: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/63abf97c-0d09-47e2-88d6-6bfa552949a5
|
|
9
|
+
SMB2_WILDCARD_REVISION = 0x02ff
|
|
8
10
|
|
|
9
11
|
require 'ruby_smb/smb2/info_type'
|
|
10
12
|
require 'ruby_smb/smb2/commands'
|
data/lib/ruby_smb/version.rb
CHANGED
data/lib/ruby_smb.rb
CHANGED
|
@@ -21,10 +21,11 @@ module RubySMB
|
|
|
21
21
|
require 'ruby_smb/generic_packet'
|
|
22
22
|
require 'ruby_smb/dispatcher'
|
|
23
23
|
require 'ruby_smb/version'
|
|
24
|
-
require 'ruby_smb/version'
|
|
25
24
|
require 'ruby_smb/smb2'
|
|
26
25
|
require 'ruby_smb/smb1'
|
|
27
26
|
require 'ruby_smb/client'
|
|
28
27
|
require 'ruby_smb/crypto'
|
|
29
28
|
require 'ruby_smb/compression'
|
|
29
|
+
require 'ruby_smb/server'
|
|
30
|
+
require 'ruby_smb/dialect'
|
|
30
31
|
end
|
|
@@ -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
|
|
|
@@ -209,6 +208,8 @@ RSpec.describe RubySMB::Client do
|
|
|
209
208
|
|
|
210
209
|
context 'when signing' do
|
|
211
210
|
it 'calls #smb1_sign if it is an SMB1 packet' do
|
|
211
|
+
allow(client).to receive(:signing_required).and_return(true)
|
|
212
|
+
allow(client).to receive(:session_key).and_return(Random.new.bytes(16))
|
|
212
213
|
expect(client).to receive(:smb1_sign).with(smb1_request).and_call_original
|
|
213
214
|
client.send_recv(smb1_request)
|
|
214
215
|
end
|
|
@@ -223,15 +224,11 @@ RSpec.describe RubySMB::Client do
|
|
|
223
224
|
|
|
224
225
|
it 'calls #smb2_sign if it is an SMB2 client' do
|
|
225
226
|
allow(smb2_client).to receive(:is_status_pending?).and_return(false)
|
|
227
|
+
allow(smb2_client).to receive(:signing_required).and_return(true)
|
|
228
|
+
allow(smb2_client).to receive(:session_key).and_return(Random.new.bytes(16))
|
|
226
229
|
expect(smb2_client).to receive(:smb2_sign).with(smb2_request).and_call_original
|
|
227
230
|
smb2_client.send_recv(smb2_request)
|
|
228
231
|
end
|
|
229
|
-
|
|
230
|
-
it 'calls #smb3_sign if it is an SMB3 client' do
|
|
231
|
-
allow(smb3_client).to receive(:is_status_pending?).and_return(false)
|
|
232
|
-
expect(smb3_client).to receive(:smb3_sign).with(smb2_request).and_call_original
|
|
233
|
-
smb3_client.send_recv(smb2_request)
|
|
234
|
-
end
|
|
235
232
|
end
|
|
236
233
|
end
|
|
237
234
|
|
|
@@ -2087,7 +2084,7 @@ RSpec.describe RubySMB::Client do
|
|
|
2087
2084
|
it 'generates the HMAC based on the packet and the NTLM session key and signs the packet with it' do
|
|
2088
2085
|
smb2_client.session_key = 'foo'
|
|
2089
2086
|
smb2_client.signing_required = true
|
|
2090
|
-
expect(OpenSSL::HMAC).to receive(:digest).with(instance_of(OpenSSL::Digest
|
|
2087
|
+
expect(OpenSSL::HMAC).to receive(:digest).with(instance_of(OpenSSL::Digest), smb2_client.session_key, request1.to_binary_s).and_return(fake_hmac)
|
|
2091
2088
|
expect(smb2_client.smb2_sign(request1).smb2_header.signature).to eq fake_hmac
|
|
2092
2089
|
end
|
|
2093
2090
|
end
|
|
@@ -2187,7 +2184,7 @@ RSpec.describe RubySMB::Client do
|
|
|
2187
2184
|
smb3_client.dialect = '0x0202'
|
|
2188
2185
|
expect { smb3_client.smb3_sign(request) }.to raise_error(
|
|
2189
2186
|
RubySMB::Error::SigningError,
|
|
2190
|
-
'Dialect is incompatible with SMBv3 signing'
|
|
2187
|
+
'Dialect "0x0202" is incompatible with SMBv3 signing'
|
|
2191
2188
|
)
|
|
2192
2189
|
end
|
|
2193
2190
|
end
|
|
@@ -2237,7 +2234,7 @@ RSpec.describe RubySMB::Client do
|
|
|
2237
2234
|
smb3_client.dialect = '0x0202'
|
|
2238
2235
|
expect { smb3_client.smb3_sign(request) }.to raise_error(
|
|
2239
2236
|
RubySMB::Error::SigningError,
|
|
2240
|
-
'Dialect is incompatible with SMBv3 signing'
|
|
2237
|
+
'Dialect "0x0202" is incompatible with SMBv3 signing'
|
|
2241
2238
|
)
|
|
2242
2239
|
end
|
|
2243
2240
|
end
|
|
@@ -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
|