ruby_smb 2.0.2 → 3.0.0
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 +46 -0
- data/README.md +0 -1
- data/examples/anonymous_auth.rb +3 -3
- data/examples/append_file.rb +10 -8
- data/examples/auth_capture.rb +71 -0
- data/examples/authenticate.rb +9 -5
- data/examples/delete_file.rb +8 -6
- data/examples/dump_secrets_from_sid.rb +207 -0
- data/examples/enum_domain_users.rb +75 -0
- data/examples/enum_registry_key.rb +5 -4
- data/examples/enum_registry_values.rb +5 -4
- data/examples/get_computer_info.rb +42 -0
- data/examples/list_directory.rb +8 -6
- data/examples/negotiate_with_netbios_service.rb +9 -5
- data/examples/net_share_enum_all.rb +6 -4
- data/examples/pipes.rb +11 -12
- data/examples/query_service_status.rb +102 -0
- data/examples/read_file.rb +8 -6
- data/examples/read_registry_key_value.rb +6 -5
- data/examples/rename_file.rb +9 -7
- data/examples/tree_connect.rb +7 -5
- data/examples/write_file.rb +9 -7
- data/lib/ruby_smb/client/authentication.rb +5 -10
- data/lib/ruby_smb/client/echo.rb +2 -4
- data/lib/ruby_smb/client/negotiation.rb +13 -16
- data/lib/ruby_smb/client/tree_connect.rb +2 -4
- data/lib/ruby_smb/client/utils.rb +16 -10
- data/lib/ruby_smb/client/winreg.rb +1 -1
- data/lib/ruby_smb/client.rb +102 -75
- data/lib/ruby_smb/compression/lznt1.rb +164 -0
- data/lib/ruby_smb/compression.rb +7 -0
- 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 +20 -0
- data/lib/ruby_smb/dcerpc/ndr.rb +1204 -80
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_request.rb +27 -0
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_request.rb +27 -0
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_request.rb +24 -0
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_response.rb +24 -0
- data/lib/ruby_smb/dcerpc/netlogon.rb +102 -0
- 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 +85 -19
- 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 +34 -0
- 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 +36 -0
- data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_request.rb +25 -0
- data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/svcctl/control_service_request.rb +26 -0
- data/lib/ruby_smb/dcerpc/svcctl/control_service_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request.rb +25 -0
- data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/svcctl/open_service_w_request.rb +23 -0
- data/lib/ruby_smb/dcerpc/svcctl/open_service_w_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request.rb +25 -0
- data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response.rb +45 -0
- data/lib/ruby_smb/dcerpc/svcctl/query_service_status_request.rb +23 -0
- data/lib/ruby_smb/dcerpc/svcctl/query_service_status_response.rb +27 -0
- data/lib/ruby_smb/dcerpc/svcctl/service_status.rb +26 -0
- data/lib/ruby_smb/dcerpc/svcctl/start_service_w_request.rb +27 -0
- data/lib/ruby_smb/dcerpc/svcctl/start_service_w_response.rb +25 -0
- data/lib/ruby_smb/dcerpc/svcctl.rb +477 -0
- 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 +62 -0
- data/lib/ruby_smb/dcerpc/winreg/create_key_response.rb +36 -0
- data/lib/ruby_smb/dcerpc/winreg/enum_key_request.rb +2 -19
- 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 +6 -7
- data/lib/ruby_smb/dcerpc/winreg/open_root_key_response.rb +2 -2
- data/lib/ruby_smb/dcerpc/winreg/query_info_key_request.rb +1 -1
- data/lib/ruby_smb/dcerpc/winreg/query_info_key_response.rb +9 -18
- data/lib/ruby_smb/dcerpc/winreg/query_value_request.rb +4 -13
- 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 +28 -0
- data/lib/ruby_smb/dcerpc/winreg/save_key_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/winreg.rb +99 -22
- 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 +45 -11
- data/lib/ruby_smb/dialect.rb +45 -0
- data/lib/ruby_smb/dispatcher/base.rb +1 -1
- data/lib/ruby_smb/dispatcher/socket.rb +2 -2
- data/lib/ruby_smb/error.rb +21 -5
- data/lib/ruby_smb/field/file_time.rb +1 -1
- data/lib/ruby_smb/field/string16.rb +5 -1
- data/lib/ruby_smb/field/stringz16.rb +17 -1
- data/lib/ruby_smb/generic_packet.rb +11 -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/nbss/session_header.rb +4 -4
- 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/file.rb +10 -25
- 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/packet/trans2/find_first2_response.rb +0 -1
- data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +0 -1
- data/lib/ruby_smb/smb1/packet/trans2/open2_response.rb +1 -2
- data/lib/ruby_smb/smb1/packet/trans2/set_file_information_response.rb +1 -13
- data/lib/ruby_smb/smb1/pipe.rb +12 -6
- data/lib/ruby_smb/smb1/tree.rb +13 -9
- data/lib/ruby_smb/smb2/file.rb +33 -33
- data/lib/ruby_smb/smb2/negotiate_context.rb +18 -2
- data/lib/ruby_smb/smb2/packet/compression_transform_header.rb +4 -0
- 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 +13 -6
- data/lib/ruby_smb/smb2/tree.rb +21 -11
- data/lib/ruby_smb/smb2.rb +3 -1
- data/lib/ruby_smb/version.rb +1 -1
- data/lib/ruby_smb.rb +5 -3
- data/spec/lib/ruby_smb/client_spec.rb +199 -86
- data/spec/lib/ruby_smb/compression/lznt1_spec.rb +32 -0
- 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 +3977 -239
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_request_spec.rb +69 -0
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_response_spec.rb +53 -0
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_request_spec.rb +69 -0
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_response_spec.rb +37 -0
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_request_spec.rb +45 -0
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_response_spec.rb +37 -0
- 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 +162 -0
- 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 +168 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_request_spec.rb +30 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_request_spec.rb +39 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request_spec.rb +68 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_request_spec.rb +53 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response_spec.rb +152 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_request_spec.rb +30 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/service_status_spec.rb +76 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_request_spec.rb +47 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_response_spec.rb +30 -0
- data/spec/lib/ruby_smb/dcerpc/svcctl_spec.rb +508 -0
- 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 +73 -0
- data/spec/lib/ruby_smb/dcerpc/winreg/create_key_response_spec.rb +44 -0
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_request_spec.rb +4 -56
- 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 -20
- 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_request_spec.rb +0 -4
- 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 +18 -42
- data/spec/lib/ruby_smb/dcerpc/winreg/regsam_spec.rb +4 -0
- data/spec/lib/ruby_smb/dcerpc/winreg/save_key_request_spec.rb +45 -0
- data/spec/lib/ruby_smb/dcerpc/winreg/save_key_response_spec.rb +22 -0
- data/spec/lib/ruby_smb/dcerpc/winreg_spec.rb +219 -62
- 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/dispatcher/socket_spec.rb +10 -10
- data/spec/lib/ruby_smb/error_spec.rb +34 -5
- data/spec/lib/ruby_smb/field/string16_spec.rb +22 -0
- data/spec/lib/ruby_smb/field/stringz16_spec.rb +12 -0
- data/spec/lib/ruby_smb/generic_packet_spec.rb +7 -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/nbss/session_header_spec.rb +4 -11
- 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/file_spec.rb +2 -4
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_response_spec.rb +0 -1
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_response_spec.rb +0 -1
- data/spec/lib/ruby_smb/smb1/packet/trans2/open2_response_spec.rb +0 -5
- data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_response_spec.rb +0 -6
- data/spec/lib/ruby_smb/smb1/pipe_spec.rb +20 -14
- data/spec/lib/ruby_smb/smb1/tree_spec.rb +22 -0
- data/spec/lib/ruby_smb/smb2/file_spec.rb +61 -9
- data/spec/lib/ruby_smb/smb2/negotiate_context_spec.rb +2 -2
- data/spec/lib/ruby_smb/smb2/pipe_spec.rb +20 -14
- data/spec/lib/ruby_smb/smb2/tree_spec.rb +58 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/support/bin_helper.rb +9 -0
- data.tar.gz.sig +0 -0
- metadata +229 -23
- metadata.gz.sig +0 -0
- data/.travis.yml +0 -6
- data/lib/ruby_smb/client/signing.rb +0 -64
- data/lib/ruby_smb/dcerpc/rrp_unicode_string.rb +0 -35
- data/spec/lib/ruby_smb/dcerpc/rrp_unicode_string_spec.rb +0 -98
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
module RubySMB
|
|
2
|
+
module Dcerpc
|
|
3
|
+
module Wkssvc
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
# [2.2.5.3 WKSTA_INFO_102](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-wkst/49c75566-2d4f-481a-bf32-7eb5627cb4ea)
|
|
7
|
+
class WkstaInfo102 < Ndr::NdrStruct
|
|
8
|
+
default_parameter byte_align: 4
|
|
9
|
+
endian :little
|
|
10
|
+
|
|
11
|
+
ndr_uint32 :wki102_platform_id
|
|
12
|
+
ndr_wide_stringz_ptr :wki102_computername
|
|
13
|
+
ndr_wide_stringz_ptr :wki102_langroup
|
|
14
|
+
ndr_uint32 :wki102_ver_major
|
|
15
|
+
ndr_uint32 :wki102_ver_minor
|
|
16
|
+
ndr_wide_stringz_ptr :wki102_lanroot
|
|
17
|
+
ndr_uint32 :wki102_logged_on_users
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
class PwkstaInfo102 < WkstaInfo102
|
|
21
|
+
extend Ndr::PointerClassPlugin
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# [2.2.5.2 WKSTA_INFO_101](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-wkst/98876691-3684-4b0c-bb43-3a8ac4705149)
|
|
25
|
+
class WkstaInfo101 < Ndr::NdrStruct
|
|
26
|
+
default_parameter byte_align: 4
|
|
27
|
+
endian :little
|
|
28
|
+
|
|
29
|
+
ndr_uint32 :wki101_platform_id
|
|
30
|
+
ndr_wide_stringz_ptr :wki101_computername
|
|
31
|
+
ndr_wide_stringz_ptr :wki101_langroup
|
|
32
|
+
ndr_uint32 :wki101_ver_major
|
|
33
|
+
ndr_uint32 :wki101_ver_minor
|
|
34
|
+
ndr_wide_stringz_ptr :wki101_lanroot
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class PwkstaInfo101 < WkstaInfo101
|
|
38
|
+
extend Ndr::PointerClassPlugin
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# [2.2.5.1 WKSTA_INFO_100](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-wkst/23275f4a-4e51-49d6-bdb5-f58519a3ea8a)
|
|
42
|
+
class WkstaInfo100 < Ndr::NdrStruct
|
|
43
|
+
default_parameter byte_align: 4
|
|
44
|
+
endian :little
|
|
45
|
+
|
|
46
|
+
ndr_uint32 :wki100_platform_id
|
|
47
|
+
ndr_wide_stringz_ptr :wki100_computername
|
|
48
|
+
ndr_wide_stringz_ptr :wki100_langroup
|
|
49
|
+
ndr_uint32 :wki100_ver_major
|
|
50
|
+
ndr_uint32 :wki100_ver_minor
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
class PwkstaInfo100 < WkstaInfo100
|
|
54
|
+
extend Ndr::PointerClassPlugin
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
class LpwkstaInfo < Ndr::NdrStruct
|
|
58
|
+
default_parameter byte_align: 4
|
|
59
|
+
endian :little
|
|
60
|
+
|
|
61
|
+
ndr_uint32 :level
|
|
62
|
+
choice :info, selection: :level, byte_align: 4 do
|
|
63
|
+
pwksta_info100 WKSTA_INFO_100
|
|
64
|
+
pwksta_info101 WKSTA_INFO_101
|
|
65
|
+
pwksta_info102 WKSTA_INFO_102
|
|
66
|
+
#TODO: pwksta_info_502 0x000001F6
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# [3.2.4.1 NetrWkstaGetInfo (Opnum 0)](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-wkst/4af41d6f-b800-4de1-af5b-0b15a85f8e04)
|
|
71
|
+
class NetrWkstaGetInfoResponse < BinData::Record
|
|
72
|
+
attr_reader :opnum
|
|
73
|
+
|
|
74
|
+
endian :little
|
|
75
|
+
|
|
76
|
+
lpwksta_info :wksta_info
|
|
77
|
+
ndr_uint32 :error_status
|
|
78
|
+
|
|
79
|
+
def initialize_instance
|
|
80
|
+
super
|
|
81
|
+
@opnum = NETR_WKSTA_GET_INFO
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
module RubySMB
|
|
2
|
+
module Dcerpc
|
|
3
|
+
module Wkssvc
|
|
4
|
+
|
|
5
|
+
UUID = '6BFFD098-A112-3610-9833-46C3F87E345A'
|
|
6
|
+
VER_MAJOR = 1
|
|
7
|
+
VER_MINOR = 0
|
|
8
|
+
|
|
9
|
+
# Operation numbers
|
|
10
|
+
NETR_WKSTA_GET_INFO = 0x0000
|
|
11
|
+
|
|
12
|
+
PLATFORM_ID = {
|
|
13
|
+
0x0000012C => "DOS",
|
|
14
|
+
0x00000190 => "OS2",
|
|
15
|
+
0x000001F4 => "Win",
|
|
16
|
+
0x00000258 => "OSF",
|
|
17
|
+
0x000002BC => "VMS"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
# Information Level
|
|
21
|
+
WKSTA_INFO_100 = 0x00000064
|
|
22
|
+
WKSTA_INFO_101 = 0x00000065
|
|
23
|
+
WKSTA_INFO_102 = 0x00000066
|
|
24
|
+
#TODO: WKSTA_INFO_502 = 0x000001F6
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
require 'ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_request'
|
|
28
|
+
require 'ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_response'
|
|
29
|
+
|
|
30
|
+
# Returns details about a computer environment, including
|
|
31
|
+
# platform-specific information, the names of the domain and local
|
|
32
|
+
# computer, and the operating system version.
|
|
33
|
+
#
|
|
34
|
+
# @param server_name [optional, String] String that identifies the server (optional
|
|
35
|
+
# since it is ignored by the server)
|
|
36
|
+
# @param server_name [optional, Integer] The information level of the data (default: WKSTA_INFO_100)
|
|
37
|
+
# @return [RubySMB::Dcerpc::Wkssvc::WkstaInfo100, RubySMB::Dcerpc::Wkssvc::WkstaInfo101,
|
|
38
|
+
# RubySMB::Dcerpc::Wkssvc::WkstaInfo102] The structure containing the requested information
|
|
39
|
+
# @raise [RubySMB::Dcerpc::Error::InvalidPacket] if the response is not a
|
|
40
|
+
# NetrWkstaGetInfoResponse packet
|
|
41
|
+
# @raise [RubySMB::Dcerpc::Error::WkssvcError] if the response error status
|
|
42
|
+
# is not STATUS_SUCCESS
|
|
43
|
+
def netr_wksta_get_info(server_name: "\x00", level: WKSTA_INFO_100)
|
|
44
|
+
wkst_netr_wksta_get_info_request = NetrWkstaGetInfoRequest.new(
|
|
45
|
+
server_name: server_name,
|
|
46
|
+
level: level
|
|
47
|
+
)
|
|
48
|
+
response = dcerpc_request(wkst_netr_wksta_get_info_request)
|
|
49
|
+
begin
|
|
50
|
+
wkst_netr_wksta_get_info_response = NetrWkstaGetInfoResponse.read(response)
|
|
51
|
+
rescue IOError
|
|
52
|
+
raise RubySMB::Dcerpc::Error::InvalidPacket, 'Error reading WkstNetrWkstaGetInfoResponse'
|
|
53
|
+
end
|
|
54
|
+
unless wkst_netr_wksta_get_info_response.error_status == WindowsError::NTStatus::STATUS_SUCCESS
|
|
55
|
+
raise RubySMB::Dcerpc::Error::WkssvcError,
|
|
56
|
+
"Error returned with netr_wksta_get_info: "\
|
|
57
|
+
"#{WindowsError::NTStatus.find_by_retval(wkst_netr_wksta_get_info_response.error_status.value).join(',')}"
|
|
58
|
+
end
|
|
59
|
+
wkst_netr_wksta_get_info_response.wksta_info.info
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
data/lib/ruby_smb/dcerpc.rb
CHANGED
|
@@ -3,46 +3,80 @@ module RubySMB
|
|
|
3
3
|
MAX_XMIT_FRAG = 4280
|
|
4
4
|
MAX_RECV_FRAG = 4280
|
|
5
5
|
|
|
6
|
+
# Auth Levels
|
|
7
|
+
#[2.2.1.1.8 Authentication Levels](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rpce/425a7c53-c33a-4868-8e5b-2a850d40dc73)
|
|
8
|
+
RPC_C_AUTHN_LEVEL_DEFAULT = 0
|
|
9
|
+
RPC_C_AUTHN_LEVEL_NONE = 1
|
|
10
|
+
RPC_C_AUTHN_LEVEL_CONNECT = 2
|
|
11
|
+
RPC_C_AUTHN_LEVEL_CALL = 3
|
|
12
|
+
RPC_C_AUTHN_LEVEL_PKT = 4
|
|
13
|
+
RPC_C_AUTHN_LEVEL_PKT_INTEGRITY = 5
|
|
14
|
+
RPC_C_AUTHN_LEVEL_PKT_PRIVACY = 6
|
|
15
|
+
|
|
16
|
+
## Auth Types
|
|
17
|
+
# [2.2.1.1.7 Security Providers](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rpce/d4097450-c62f-484b-872f-ddf59a7a0d36)
|
|
18
|
+
RPC_C_AUTHN_NONE = 0x00
|
|
19
|
+
RPC_C_AUTHN_GSS_NEGOTIATE = 0x09
|
|
20
|
+
RPC_C_AUTHN_WINNT = 0x0A
|
|
21
|
+
RPC_C_AUTHN_GSS_SCHANNEL = 0x0E
|
|
22
|
+
RPC_C_AUTHN_GSS_KERBEROS = 0x10
|
|
23
|
+
RPC_C_AUTHN_NETLOGON = 0x44
|
|
24
|
+
RPC_C_AUTHN_DEFAULT = 0xFF
|
|
25
|
+
|
|
26
|
+
#[Authorisation Services](https://pubs.opengroup.org/onlinepubs/9629399/chap13.htm#tagcjh_18_01_02_03)
|
|
27
|
+
DCE_C_AUTHZ_NAME = 1
|
|
28
|
+
DCE_C_AUTHZ_DCE = 2
|
|
29
|
+
|
|
6
30
|
require 'windows_error/win32'
|
|
7
31
|
require 'ruby_smb/dcerpc/error'
|
|
8
32
|
require 'ruby_smb/dcerpc/uuid'
|
|
9
33
|
require 'ruby_smb/dcerpc/ndr'
|
|
10
34
|
require 'ruby_smb/dcerpc/ptypes'
|
|
11
35
|
require 'ruby_smb/dcerpc/p_syntax_id_t'
|
|
12
|
-
require 'ruby_smb/dcerpc/
|
|
36
|
+
require 'ruby_smb/dcerpc/rrp_rpc_unicode_string'
|
|
37
|
+
require 'ruby_smb/dcerpc/rpc_security_attributes'
|
|
13
38
|
require 'ruby_smb/dcerpc/pdu_header'
|
|
14
39
|
require 'ruby_smb/dcerpc/srvsvc'
|
|
40
|
+
require 'ruby_smb/dcerpc/svcctl'
|
|
15
41
|
require 'ruby_smb/dcerpc/winreg'
|
|
42
|
+
require 'ruby_smb/dcerpc/netlogon'
|
|
43
|
+
require 'ruby_smb/dcerpc/samr'
|
|
44
|
+
require 'ruby_smb/dcerpc/wkssvc'
|
|
45
|
+
require 'ruby_smb/dcerpc/epm'
|
|
46
|
+
require 'ruby_smb/dcerpc/drsr'
|
|
47
|
+
require 'ruby_smb/dcerpc/sec_trailer'
|
|
16
48
|
require 'ruby_smb/dcerpc/request'
|
|
17
49
|
require 'ruby_smb/dcerpc/response'
|
|
50
|
+
require 'ruby_smb/dcerpc/rpc_auth3'
|
|
18
51
|
require 'ruby_smb/dcerpc/bind'
|
|
19
52
|
require 'ruby_smb/dcerpc/bind_ack'
|
|
20
53
|
|
|
21
54
|
|
|
55
|
+
|
|
22
56
|
# Bind to the remote server interface endpoint.
|
|
23
57
|
#
|
|
24
58
|
# @param options [Hash] the options to pass to the Bind request packet. At least, :endpoint must but provided with an existing Dcerpc class
|
|
25
|
-
# @return [
|
|
26
|
-
# @raise [
|
|
27
|
-
# @raise [
|
|
59
|
+
# @return [BindAck] the BindAck response packet
|
|
60
|
+
# @raise [Error::InvalidPacket] if an invalid packet is received
|
|
61
|
+
# @raise [Error::BindError] if the response is not a BindAck packet or if the Bind result code is not ACCEPTANCE
|
|
28
62
|
def bind(options={})
|
|
29
|
-
bind_req =
|
|
63
|
+
bind_req = Bind.new(options)
|
|
30
64
|
write(data: bind_req.to_binary_s)
|
|
31
65
|
@size = 1024
|
|
32
66
|
dcerpc_raw_response = read()
|
|
33
67
|
begin
|
|
34
|
-
dcerpc_response =
|
|
68
|
+
dcerpc_response = BindAck.read(dcerpc_raw_response)
|
|
35
69
|
rescue IOError
|
|
36
|
-
raise
|
|
70
|
+
raise Error::InvalidPacket, "Error reading the DCERPC response"
|
|
37
71
|
end
|
|
38
|
-
unless dcerpc_response.pdu_header.ptype ==
|
|
39
|
-
raise
|
|
72
|
+
unless dcerpc_response.pdu_header.ptype == PTypes::BIND_ACK
|
|
73
|
+
raise Error::BindError, "Not a BindAck packet"
|
|
40
74
|
end
|
|
41
75
|
|
|
42
76
|
res_list = dcerpc_response.p_result_list
|
|
43
77
|
if res_list.n_results == 0 ||
|
|
44
|
-
res_list.p_results[0].result !=
|
|
45
|
-
raise
|
|
78
|
+
res_list.p_results[0].result != BindAck::ACCEPTANCE
|
|
79
|
+
raise Error::BindError,
|
|
46
80
|
"Bind Failed (Result: #{res_list.p_results[0].result}, Reason: #{res_list.p_results[0].reason})"
|
|
47
81
|
end
|
|
48
82
|
@tree.client.max_buffer_size = dcerpc_response.max_xmit_frag
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module RubySMB
|
|
2
|
+
# Definitions that define metadata around a particular SMB dialect. This is useful for grouping dialects into a
|
|
3
|
+
# hierarchy as well as printing them as human readable strings with varying degrees of specificity.
|
|
4
|
+
module Dialect
|
|
5
|
+
# the order (taxonomic ranking) of the family, 2 and 3 are intentionally combined
|
|
6
|
+
ORDER_SMB1 = 'SMB1'.freeze
|
|
7
|
+
ORDER_SMB2 = 'SMB2'.freeze
|
|
8
|
+
|
|
9
|
+
# the family of the dialect
|
|
10
|
+
FAMILY_SMB1 = 'SMB 1'.freeze
|
|
11
|
+
FAMILY_SMB2 = 'SMB 2.x'.freeze
|
|
12
|
+
FAMILY_SMB3 = 'SMB 3.x'.freeze
|
|
13
|
+
|
|
14
|
+
# the major version of the dialect
|
|
15
|
+
VERSION_SMB1 = 'SMB v1'.freeze
|
|
16
|
+
VERSION_SMB2 = 'SMB v2'.freeze
|
|
17
|
+
VERSION_SMB3 = 'SMB v3'.freeze
|
|
18
|
+
|
|
19
|
+
# the names are meant to be human readable and may change in the future, use the #dialect, #order and #family
|
|
20
|
+
# attributes for any programmatic comparisons
|
|
21
|
+
Definition = Struct.new(:dialect, :order, :family, :version_name, :full_name) do
|
|
22
|
+
alias_method :short_name, :version_name
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
ALL = [
|
|
26
|
+
Definition.new('NT LM 0.12', ORDER_SMB1, FAMILY_SMB1, VERSION_SMB1, 'SMB v1 (NT LM 0.12)'.freeze),
|
|
27
|
+
Definition.new('0x0202', ORDER_SMB2, FAMILY_SMB2, VERSION_SMB2, 'SMB v2.0.2'.freeze),
|
|
28
|
+
Definition.new('0x0210', ORDER_SMB2, FAMILY_SMB2, VERSION_SMB2, 'SMB v2.1'.freeze),
|
|
29
|
+
Definition.new('0x02ff', ORDER_SMB2, FAMILY_SMB2, VERSION_SMB2, 'SMB 2.???'.freeze), # wildcard revision
|
|
30
|
+
Definition.new('0x0300', ORDER_SMB2, FAMILY_SMB3, VERSION_SMB3, 'SMB v3.0'.freeze),
|
|
31
|
+
Definition.new('0x0302', ORDER_SMB2, FAMILY_SMB3, VERSION_SMB3, 'SMB v3.0.2'.freeze),
|
|
32
|
+
Definition.new('0x0311', ORDER_SMB2, FAMILY_SMB3, VERSION_SMB3, 'SMB v3.1.1'.freeze)
|
|
33
|
+
].map { |definition| [definition.dialect, definition] }.to_h
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Retrieve a dialect definition. The definition contains metadata describing the particular dialect.
|
|
37
|
+
#
|
|
38
|
+
# @param [Integer, String] dialect the dialect to retrieve the definition for
|
|
39
|
+
# @return [Definition, nil] the definition if it was found
|
|
40
|
+
def self.[](dialect)
|
|
41
|
+
dialect = '0x%04x' % dialect if dialect.is_a? Integer
|
|
42
|
+
ALL[dialect]
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -9,7 +9,7 @@ module RubySMB
|
|
|
9
9
|
def nbss(packet)
|
|
10
10
|
nbss = RubySMB::Nbss::SessionHeader.new
|
|
11
11
|
nbss.session_packet_type = RubySMB::Nbss::SESSION_MESSAGE
|
|
12
|
-
nbss.
|
|
12
|
+
nbss.stream_protocol_length = packet.do_num_bytes.to_i
|
|
13
13
|
nbss.to_binary_s
|
|
14
14
|
end
|
|
15
15
|
|
|
@@ -55,7 +55,7 @@ module RubySMB
|
|
|
55
55
|
|
|
56
56
|
# Read a packet off the wire and parse it into a string
|
|
57
57
|
#
|
|
58
|
-
# @param full_response [Boolean] whether to include the NetBios Session Service header in the
|
|
58
|
+
# @param full_response [Boolean] whether to include the NetBios Session Service header in the response
|
|
59
59
|
# @return [String] the raw response (including the NetBios Session Service header if full_response is true)
|
|
60
60
|
# @raise [RubySMB::Error::NetBiosSessionService] if there's an error reading the first 4 bytes,
|
|
61
61
|
# which are assumed to be the NetBiosSessionService header.
|
|
@@ -74,7 +74,7 @@ module RubySMB
|
|
|
74
74
|
raise ::RubySMB::Error::NetBiosSessionService, 'NBSS Header is missing'
|
|
75
75
|
end
|
|
76
76
|
|
|
77
|
-
length = nbss_header.
|
|
77
|
+
length = nbss_header.stream_protocol_length
|
|
78
78
|
data = full_response ? nbss_header.to_binary_s : ''
|
|
79
79
|
if length > 0
|
|
80
80
|
if IO.select([@tcp_socket], nil, nil, @read_timeout).nil?
|
data/lib/ruby_smb/error.rb
CHANGED
|
@@ -16,23 +16,26 @@ module RubySMB
|
|
|
16
16
|
# Raised when trying to parse raw binary into a Packet and the data
|
|
17
17
|
# is invalid.
|
|
18
18
|
class InvalidPacket < RubySMBError
|
|
19
|
+
attr_reader :status_code
|
|
19
20
|
def initialize(args = nil)
|
|
20
21
|
if args.nil?
|
|
21
22
|
super
|
|
22
23
|
elsif args.is_a? String
|
|
23
24
|
super(args)
|
|
24
25
|
elsif args.is_a? Hash
|
|
25
|
-
expected_proto = args[:expected_proto] ? translate_protocol(args[:expected_proto]) :
|
|
26
|
-
expected_cmd = args[:expected_cmd] ||
|
|
27
|
-
received_proto = args[:
|
|
28
|
-
received_cmd = args[:
|
|
26
|
+
expected_proto = args[:expected_proto] ? translate_protocol(args[:expected_proto]) : '???'
|
|
27
|
+
expected_cmd = args[:expected_cmd] || '???'
|
|
28
|
+
received_proto = args[:packet]&.packet_smb_version || '???'
|
|
29
|
+
received_cmd = get_cmd(args[:packet]) || '???'
|
|
30
|
+
@status_code = args[:packet]&.status_code
|
|
29
31
|
super(
|
|
30
32
|
"Expecting #{expected_proto} protocol "\
|
|
31
33
|
"with command=#{expected_cmd}"\
|
|
32
34
|
"#{(" (" + args[:expected_custom] + ")") if args[:expected_custom]}, "\
|
|
33
35
|
"got #{received_proto} protocol "\
|
|
34
36
|
"with command=#{received_cmd}"\
|
|
35
|
-
"#{(" (" + args[:received_custom] + ")") if args[:received_custom]}"
|
|
37
|
+
"#{(" (" + args[:received_custom] + ")") if args[:received_custom]}"\
|
|
38
|
+
"#{(", Status: #{@status_code}") if @status_code}"
|
|
36
39
|
)
|
|
37
40
|
else
|
|
38
41
|
raise ArgumentError, "InvalidPacket expects a String or a Hash, got a #{args.class}"
|
|
@@ -50,6 +53,19 @@ module RubySMB
|
|
|
50
53
|
end
|
|
51
54
|
end
|
|
52
55
|
private :translate_protocol
|
|
56
|
+
|
|
57
|
+
def get_cmd(packet)
|
|
58
|
+
return nil unless packet
|
|
59
|
+
case packet.packet_smb_version
|
|
60
|
+
when 'SMB1'
|
|
61
|
+
packet.smb_header.command
|
|
62
|
+
when 'SMB2'
|
|
63
|
+
packet.smb2_header.command
|
|
64
|
+
else
|
|
65
|
+
nil
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
private :get_cmd
|
|
53
69
|
end
|
|
54
70
|
|
|
55
71
|
# Raised when a response packet has a NTStatus code that was unexpected.
|
|
@@ -3,7 +3,7 @@ require 'date'
|
|
|
3
3
|
module RubySMB
|
|
4
4
|
module Field
|
|
5
5
|
# Represents a Windows FILETIME structure as defined in
|
|
6
|
-
# [FILETIME
|
|
6
|
+
# [2.3.3 FILETIME](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/2c57429b-fdd4-488f-b5fc-9e4cf020fcdf).aspx)
|
|
7
7
|
class FileTime < BinData::Primitive
|
|
8
8
|
# Difference between the Windows and Unix epochs, in 100ns intervals
|
|
9
9
|
EPOCH_DIFF_100NS = 116_444_736_000_000_000
|
|
@@ -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
|
|
@@ -25,12 +25,17 @@ module RubySMB
|
|
|
25
25
|
# @see BinData::Stringz
|
|
26
26
|
def read_and_return_value(io)
|
|
27
27
|
max_length = eval_parameter(:max_length)
|
|
28
|
+
if max_length && max_length % 2 != 0
|
|
29
|
+
raise ArgumentError, "[Stringz16] #max_length should be a multiple of "\
|
|
30
|
+
"two, since it is Unicode (got #{max_length})"
|
|
31
|
+
end
|
|
28
32
|
str = ''
|
|
29
33
|
i = 0
|
|
30
34
|
ch = nil
|
|
31
35
|
|
|
32
36
|
# read until double NULL-byte or we have read in the max number of bytes
|
|
33
|
-
|
|
37
|
+
loop do
|
|
38
|
+
break if ch == "\0\0" || (max_length && i == max_length)
|
|
34
39
|
ch = io.readbytes(2)
|
|
35
40
|
str << ch
|
|
36
41
|
i += 2
|
|
@@ -46,6 +51,17 @@ module RubySMB
|
|
|
46
51
|
def truncate_after_first_zero_byte!(str)
|
|
47
52
|
str.sub!(/([^\0]*\0\0\0).*/, '\1')
|
|
48
53
|
end
|
|
54
|
+
|
|
55
|
+
def trim_to!(str, max_length = nil)
|
|
56
|
+
if max_length
|
|
57
|
+
max_length = 2 if max_length < 2
|
|
58
|
+
str.slice!(max_length..-1)
|
|
59
|
+
if str.length == max_length && str[-2, 2] != "\0\0"
|
|
60
|
+
str[-2, 2] = "\0\0"
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
49
65
|
end
|
|
50
66
|
end
|
|
51
67
|
end
|
|
@@ -49,7 +49,17 @@ module RubySMB
|
|
|
49
49
|
when /SMB1/
|
|
50
50
|
packet = RubySMB::SMB1::Packet::EmptyPacket.read(val)
|
|
51
51
|
when /SMB2/
|
|
52
|
-
|
|
52
|
+
begin
|
|
53
|
+
packet = RubySMB::SMB2::Packet::ErrorPacket.read(val)
|
|
54
|
+
rescue RubySMB::Error::InvalidPacket
|
|
55
|
+
# Handle the case where an SMB2 error packet is expected, but the
|
|
56
|
+
# server sent an SMB1 empty packet instead. This behavior has been
|
|
57
|
+
# observed with older versions of Samba when something goes wrong
|
|
58
|
+
# on the server side. We just want to give it a chance and try to
|
|
59
|
+
# parse it as an SMB1 empty packet to keep information and avoid
|
|
60
|
+
# failing as much as possible.
|
|
61
|
+
packet = RubySMB::SMB1::Packet::EmptyPacket.read(val)
|
|
62
|
+
end
|
|
53
63
|
else
|
|
54
64
|
raise RubySMB::Error::InvalidPacket, 'Not a valid SMB packet'
|
|
55
65
|
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module RubySMB
|
|
2
|
+
module Gss
|
|
3
|
+
module Provider
|
|
4
|
+
module Authenticator
|
|
5
|
+
#
|
|
6
|
+
# The base class for a GSS provider's unique authenticator. This provides a common interface and is not usable
|
|
7
|
+
# on it's own. The provider-specific authentication logic is defined within this authenticator class which
|
|
8
|
+
# actually runs the authentication routine.
|
|
9
|
+
#
|
|
10
|
+
class Base
|
|
11
|
+
# @param [Provider::Base] provider the GSS provider that this instance is an authenticator for
|
|
12
|
+
# @param server_client the client instance that this will be an authenticator for
|
|
13
|
+
def initialize(provider, server_client)
|
|
14
|
+
@provider = provider
|
|
15
|
+
@server_client = server_client
|
|
16
|
+
@session_key = nil
|
|
17
|
+
reset!
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
#
|
|
21
|
+
# Process a GSS authentication buffer. If no buffer is specified, the request is assumed to be the first in
|
|
22
|
+
# the negotiation sequence.
|
|
23
|
+
#
|
|
24
|
+
# @param [String, nil] buffer the request GSS request buffer that should be processed
|
|
25
|
+
# @return [Gss::Provider::Result] the result of the processed GSS request
|
|
26
|
+
def process(request_buffer=nil)
|
|
27
|
+
raise NotImplementedError
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
#
|
|
31
|
+
# Reset the authenticator's state, wiping anything related to a partial or complete authentication process.
|
|
32
|
+
#
|
|
33
|
+
def reset!
|
|
34
|
+
@session_key = nil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
attr_accessor :session_key
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|