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
|
@@ -9,11 +9,11 @@
|
|
|
9
9
|
require 'bundler/setup'
|
|
10
10
|
require 'ruby_smb'
|
|
11
11
|
|
|
12
|
-
def run_negotiation(address, smb1, smb2, netbios_name)
|
|
12
|
+
def run_negotiation(address, smb1, smb2, smb3, netbios_name)
|
|
13
13
|
sock = TCPSocket.new address, 139
|
|
14
14
|
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
|
15
15
|
|
|
16
|
-
client = RubySMB::Client.new(dispatcher, smb1: smb1, smb2: smb2, username: 'msfadmin', password: 'msfadmin')
|
|
16
|
+
client = RubySMB::Client.new(dispatcher, smb1: smb1, smb2: smb2, smb3: smb3, username: 'msfadmin', password: 'msfadmin')
|
|
17
17
|
begin
|
|
18
18
|
client.session_request(netbios_name)
|
|
19
19
|
rescue RubySMB::Error::NetBiosSessionService => e
|
|
@@ -28,9 +28,13 @@ end
|
|
|
28
28
|
address = ARGV[0]
|
|
29
29
|
netbios_name = ARGV[1] || '*SMBSERVER'
|
|
30
30
|
|
|
31
|
+
# Negotiate with SMB1, SMB2 and SMB3 enabled on the client
|
|
32
|
+
run_negotiation(ARGV[0], true, true, true, netbios_name)
|
|
31
33
|
# Negotiate with both SMB1 and SMB2 enabled on the client
|
|
32
|
-
run_negotiation(ARGV[0], true, true, netbios_name)
|
|
34
|
+
run_negotiation(ARGV[0], true, true, false, netbios_name)
|
|
33
35
|
# Negotiate with only SMB1 enabled
|
|
34
|
-
run_negotiation(ARGV[0], true, false, netbios_name)
|
|
36
|
+
run_negotiation(ARGV[0], true, false, false, netbios_name)
|
|
35
37
|
# Negotiate with only SMB2 enabled
|
|
36
|
-
run_negotiation(ARGV[0], false, true, netbios_name)
|
|
38
|
+
run_negotiation(ARGV[0], false, true, false, netbios_name)
|
|
39
|
+
# Negotiate with only SMB3 enabled
|
|
40
|
+
run_negotiation(ARGV[0], false, false, true, netbios_name)
|
|
@@ -8,15 +8,17 @@
|
|
|
8
8
|
require 'bundler/setup'
|
|
9
9
|
require 'ruby_smb'
|
|
10
10
|
|
|
11
|
-
address
|
|
12
|
-
username
|
|
13
|
-
password
|
|
11
|
+
address = ARGV[0]
|
|
12
|
+
username = ARGV[1]
|
|
13
|
+
password = ARGV[2]
|
|
14
|
+
smb_versions = ARGV[3]&.split(',') || ['1','2','3']
|
|
15
|
+
|
|
14
16
|
path = "\\\\#{address}\\IPC$"
|
|
15
17
|
|
|
16
18
|
sock = TCPSocket.new address, 445
|
|
17
19
|
dispatcher = RubySMB::Dispatcher::Socket.new(sock, read_timeout: 60)
|
|
18
20
|
|
|
19
|
-
client = RubySMB::Client.new(dispatcher, smb1:
|
|
21
|
+
client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
|
|
20
22
|
protocol = client.negotiate
|
|
21
23
|
status = client.authenticate
|
|
22
24
|
|
data/examples/pipes.rb
CHANGED
|
@@ -10,25 +10,24 @@
|
|
|
10
10
|
require 'bundler/setup'
|
|
11
11
|
require 'ruby_smb'
|
|
12
12
|
|
|
13
|
-
address
|
|
14
|
-
pipename
|
|
15
|
-
username
|
|
16
|
-
password
|
|
17
|
-
|
|
13
|
+
address = ARGV[0]
|
|
14
|
+
pipename = ARGV[1]
|
|
15
|
+
username = ARGV[2]
|
|
16
|
+
password = ARGV[3]
|
|
17
|
+
smb_versions = ARGV[4]&.split(',') || ['1','2','3']
|
|
18
18
|
|
|
19
19
|
sock = TCPSocket.new(address, 445)
|
|
20
20
|
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
|
|
23
|
+
smbver = client.negotiate
|
|
24
|
+
|
|
25
|
+
if smbver == 'SMB1'
|
|
26
|
+
puts "ServerMaxBuffer: #{client.server_max_buffer_size}"
|
|
27
|
+
else
|
|
25
28
|
puts "ServerMaxRead: #{client.server_max_read_size}"
|
|
26
29
|
puts "ServerMaxWrite: #{client.server_max_write_size}"
|
|
27
30
|
puts "ServerMaxTrans: #{client.server_max_transact_size}"
|
|
28
|
-
elsif smbver == 1
|
|
29
|
-
client = RubySMB::Client.new(dispatcher, smb2: false, username: username, password: password)
|
|
30
|
-
client.negotiate
|
|
31
|
-
puts "ServerMaxBuffer: #{client.server_max_buffer_size}"
|
|
32
31
|
end
|
|
33
32
|
|
|
34
33
|
client.authenticate
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/usr/bin/ruby
|
|
2
|
+
|
|
3
|
+
# This example script is used for testing remote service status and start type query.
|
|
4
|
+
# It will attempt to connect to a host and query the status and start type of the provided service.
|
|
5
|
+
# Example usage: ruby query_service_status.rb 192.168.172.138 msfadmin msfadmin "RemoteRegistry"
|
|
6
|
+
# This will try to connect to \\192.168.172.138 with the msfadmin:msfadmin credentialas and get the status and start type of the "RemoteRegistry" service.
|
|
7
|
+
|
|
8
|
+
require 'bundler/setup'
|
|
9
|
+
require 'ruby_smb'
|
|
10
|
+
|
|
11
|
+
address = ARGV[0]
|
|
12
|
+
username = ARGV[1]
|
|
13
|
+
password = ARGV[2]
|
|
14
|
+
service = ARGV[3]
|
|
15
|
+
smb_versions = ARGV[4]&.split(',') || ['1','2','3']
|
|
16
|
+
|
|
17
|
+
sock = TCPSocket.new address, 445
|
|
18
|
+
dispatcher = RubySMB::Dispatcher::Socket.new(sock, read_timeout: 60)
|
|
19
|
+
|
|
20
|
+
client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
|
|
21
|
+
protocol = client.negotiate
|
|
22
|
+
status = client.authenticate
|
|
23
|
+
|
|
24
|
+
puts "#{protocol} : #{status}"
|
|
25
|
+
|
|
26
|
+
tree = client.tree_connect("\\\\#{address}\\IPC$")
|
|
27
|
+
svcctl = tree.open_file(filename: 'svcctl', write: true, read: true)
|
|
28
|
+
|
|
29
|
+
puts('Binding to \\svcctl...')
|
|
30
|
+
svcctl.bind(endpoint: RubySMB::Dcerpc::Svcctl)
|
|
31
|
+
puts('Bound to \\svcctl')
|
|
32
|
+
|
|
33
|
+
puts('Opening Service Control Manager')
|
|
34
|
+
scm_handle = svcctl.open_sc_manager_w(address)
|
|
35
|
+
|
|
36
|
+
svc_handle = svcctl.open_service_w(scm_handle, service)
|
|
37
|
+
svc_status = svcctl.query_service_status(svc_handle)
|
|
38
|
+
|
|
39
|
+
puts
|
|
40
|
+
case svc_status.dw_current_state
|
|
41
|
+
when RubySMB::Dcerpc::Svcctl::SERVICE_RUNNING
|
|
42
|
+
puts("Service #{service} is running")
|
|
43
|
+
when RubySMB::Dcerpc::Svcctl::SERVICE_STOPPED
|
|
44
|
+
puts("Service #{service} is in stopped state")
|
|
45
|
+
end
|
|
46
|
+
puts
|
|
47
|
+
|
|
48
|
+
svc_config = svcctl.query_service_config(svc_handle)
|
|
49
|
+
|
|
50
|
+
service_type = 'Service type: '
|
|
51
|
+
case svc_config.dw_service_type
|
|
52
|
+
when RubySMB::Dcerpc::Svcctl::SERVICE_KERNEL_DRIVER
|
|
53
|
+
service_type << 'Driver service'
|
|
54
|
+
when RubySMB::Dcerpc::Svcctl::SERVICE_FILE_SYSTEM_DRIVER
|
|
55
|
+
service_type << 'File system driver service'
|
|
56
|
+
when RubySMB::Dcerpc::Svcctl::SERVICE_WIN32_OWN_PROCESS
|
|
57
|
+
service_type << 'Service that runs in its own process'
|
|
58
|
+
when RubySMB::Dcerpc::Svcctl::SERVICE_WIN32_SHARE_PROCESS
|
|
59
|
+
service_type << 'Service that shares a process with other services'
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
start_type = 'Service start type: '
|
|
63
|
+
case svc_config.dw_start_type
|
|
64
|
+
when RubySMB::Dcerpc::Svcctl::SERVICE_DISABLED
|
|
65
|
+
start_type << 'Service is disabled'
|
|
66
|
+
when RubySMB::Dcerpc::Svcctl::SERVICE_BOOT_START, RubySMB::Dcerpc::Svcctl::SERVICE_SYSTEM_START
|
|
67
|
+
start_type << 'Service starts when the system boots up (driver)'
|
|
68
|
+
when RubySMB::Dcerpc::Svcctl::SERVICE_AUTO_START
|
|
69
|
+
start_type << 'Service starts automatically during system startup'
|
|
70
|
+
when RubySMB::Dcerpc::Svcctl::SERVICE_DEMAND_START
|
|
71
|
+
start_type << 'Service starts manually'
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
error_control = 'Error control: '
|
|
75
|
+
case svc_config.dw_error_control
|
|
76
|
+
when RubySMB::Dcerpc::Svcctl::SERVICE_ERROR_IGNORE
|
|
77
|
+
error_control << 'SERVICE_ERROR_IGNORE'
|
|
78
|
+
when RubySMB::Dcerpc::Svcctl::SERVICE_ERROR_NORMAL
|
|
79
|
+
error_control << 'SERVICE_ERROR_NORMAL'
|
|
80
|
+
when RubySMB::Dcerpc::Svcctl::SERVICE_ERROR_SEVERE
|
|
81
|
+
error_control << 'SERVICE_ERROR_SEVERE'
|
|
82
|
+
when RubySMB::Dcerpc::Svcctl::SERVICE_ERROR_CRITICAL
|
|
83
|
+
error_control << 'SERVICE_ERROR_CRITICAL'
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
puts service_type
|
|
87
|
+
puts start_type
|
|
88
|
+
puts error_control
|
|
89
|
+
puts "Binary path: #{svc_config.lp_binary_path_name.to_s.encode('utf-8')}"
|
|
90
|
+
puts "Load ordering service group: #{svc_config.lp_load_order_group.to_s.encode('utf-8')}"
|
|
91
|
+
puts "Service group tag ID: #{svc_config.dw_tag_id.to_s.encode('utf-8')}"
|
|
92
|
+
puts "Dependencies: #{svc_config.lp_dependencies.to_s.encode('utf-8')}"
|
|
93
|
+
puts "Service start name: #{svc_config.lp_service_start_name.to_s.encode('utf-8')}"
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
if svcctl
|
|
97
|
+
svcctl.close_service_handle(svc_handle) if svc_handle
|
|
98
|
+
svcctl.close_service_handle(scm_handle) if scm_handle
|
|
99
|
+
svcctl.close
|
|
100
|
+
end
|
|
101
|
+
client.disconnect!
|
|
102
|
+
|
data/examples/read_file.rb
CHANGED
|
@@ -9,17 +9,19 @@
|
|
|
9
9
|
require 'bundler/setup'
|
|
10
10
|
require 'ruby_smb'
|
|
11
11
|
|
|
12
|
-
address
|
|
13
|
-
username
|
|
14
|
-
password
|
|
15
|
-
share
|
|
16
|
-
file
|
|
12
|
+
address = ARGV[0]
|
|
13
|
+
username = ARGV[1]
|
|
14
|
+
password = ARGV[2]
|
|
15
|
+
share = ARGV[3]
|
|
16
|
+
file = ARGV[4]
|
|
17
|
+
smb_versions = ARGV[5]&.split(',') || ['1','2','3']
|
|
18
|
+
|
|
17
19
|
path = "\\\\#{address}\\#{share}"
|
|
18
20
|
|
|
19
21
|
sock = TCPSocket.new address, 445
|
|
20
22
|
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
|
21
23
|
|
|
22
|
-
client = RubySMB::Client.new(dispatcher, smb1:
|
|
24
|
+
client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
|
|
23
25
|
protocol = client.negotiate
|
|
24
26
|
status = client.authenticate
|
|
25
27
|
|
|
@@ -8,16 +8,17 @@
|
|
|
8
8
|
require 'bundler/setup'
|
|
9
9
|
require 'ruby_smb'
|
|
10
10
|
|
|
11
|
-
address
|
|
12
|
-
username
|
|
13
|
-
password
|
|
11
|
+
address = ARGV[0]
|
|
12
|
+
username = ARGV[1]
|
|
13
|
+
password = ARGV[2]
|
|
14
14
|
registry_key = ARGV[3]
|
|
15
|
-
value_name
|
|
15
|
+
value_name = ARGV[4]
|
|
16
|
+
smb_versions = ARGV[5]&.split(',') || ['1','2','3']
|
|
16
17
|
|
|
17
18
|
sock = TCPSocket.new address, 445
|
|
18
19
|
dispatcher = RubySMB::Dispatcher::Socket.new(sock, read_timeout: 60)
|
|
19
20
|
|
|
20
|
-
client = RubySMB::Client.new(dispatcher, smb1:
|
|
21
|
+
client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
|
|
21
22
|
protocol = client.negotiate
|
|
22
23
|
status = client.authenticate
|
|
23
24
|
|
data/examples/rename_file.rb
CHANGED
|
@@ -9,18 +9,20 @@
|
|
|
9
9
|
require 'bundler/setup'
|
|
10
10
|
require 'ruby_smb'
|
|
11
11
|
|
|
12
|
-
address
|
|
13
|
-
username
|
|
14
|
-
password
|
|
15
|
-
share
|
|
16
|
-
file
|
|
17
|
-
new_name
|
|
12
|
+
address = ARGV[0]
|
|
13
|
+
username = ARGV[1]
|
|
14
|
+
password = ARGV[2]
|
|
15
|
+
share = ARGV[3]
|
|
16
|
+
file = ARGV[4]
|
|
17
|
+
new_name = ARGV[5]
|
|
18
|
+
smb_versions = ARGV[6]&.split(',') || ['1','2','3']
|
|
19
|
+
|
|
18
20
|
path = "\\\\#{address}\\#{share}"
|
|
19
21
|
|
|
20
22
|
sock = TCPSocket.new address, 445
|
|
21
23
|
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
|
22
24
|
|
|
23
|
-
client = RubySMB::Client.new(dispatcher, smb1:
|
|
25
|
+
client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
|
|
24
26
|
|
|
25
27
|
protocol = client.negotiate
|
|
26
28
|
status = client.authenticate
|
data/examples/tree_connect.rb
CHANGED
|
@@ -8,16 +8,18 @@
|
|
|
8
8
|
require 'bundler/setup'
|
|
9
9
|
require 'ruby_smb'
|
|
10
10
|
|
|
11
|
-
address
|
|
12
|
-
username
|
|
13
|
-
password
|
|
14
|
-
share
|
|
11
|
+
address = ARGV[0]
|
|
12
|
+
username = ARGV[1]
|
|
13
|
+
password = ARGV[2]
|
|
14
|
+
share = ARGV[3]
|
|
15
|
+
smb_versions = ARGV[4]&.split(',') || ['1','2','3']
|
|
16
|
+
|
|
15
17
|
path = "\\\\#{address}\\#{share}"
|
|
16
18
|
|
|
17
19
|
sock = TCPSocket.new address, 445
|
|
18
20
|
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
|
19
21
|
|
|
20
|
-
client = RubySMB::Client.new(dispatcher, smb1:
|
|
22
|
+
client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
|
|
21
23
|
protocol = client.negotiate
|
|
22
24
|
status = client.authenticate
|
|
23
25
|
|
data/examples/write_file.rb
CHANGED
|
@@ -9,18 +9,20 @@
|
|
|
9
9
|
require 'bundler/setup'
|
|
10
10
|
require 'ruby_smb'
|
|
11
11
|
|
|
12
|
-
address
|
|
13
|
-
username
|
|
14
|
-
password
|
|
15
|
-
share
|
|
16
|
-
file
|
|
17
|
-
data
|
|
12
|
+
address = ARGV[0]
|
|
13
|
+
username = ARGV[1]
|
|
14
|
+
password = ARGV[2]
|
|
15
|
+
share = ARGV[3]
|
|
16
|
+
file = ARGV[4]
|
|
17
|
+
data = ARGV[5]
|
|
18
|
+
smb_versions = ARGV[6]&.split(',') || ['1','2','3']
|
|
19
|
+
|
|
18
20
|
path = "\\\\#{address}\\#{share}"
|
|
19
21
|
|
|
20
22
|
sock = TCPSocket.new address, 445
|
|
21
23
|
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
|
22
24
|
|
|
23
|
-
client = RubySMB::Client.new(dispatcher, smb1:
|
|
25
|
+
client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
|
|
24
26
|
protocol = client.negotiate
|
|
25
27
|
status = client.authenticate
|
|
26
28
|
|
|
@@ -60,8 +60,7 @@ module RubySMB
|
|
|
60
60
|
raise RubySMB::Error::InvalidPacket.new(
|
|
61
61
|
expected_proto: RubySMB::SMB1::SMB_PROTOCOL_ID,
|
|
62
62
|
expected_cmd: RubySMB::SMB1::Packet::SessionSetupLegacyResponse::COMMAND,
|
|
63
|
-
|
|
64
|
-
received_cmd: packet.smb_header.command
|
|
63
|
+
packet: packet
|
|
65
64
|
)
|
|
66
65
|
end
|
|
67
66
|
packet
|
|
@@ -154,8 +153,7 @@ module RubySMB
|
|
|
154
153
|
raise RubySMB::Error::InvalidPacket.new(
|
|
155
154
|
expected_proto: RubySMB::SMB1::SMB_PROTOCOL_ID,
|
|
156
155
|
expected_cmd: RubySMB::SMB1::Packet::SessionSetupResponse::COMMAND,
|
|
157
|
-
|
|
158
|
-
received_cmd: packet.smb_header.command
|
|
156
|
+
packet: packet
|
|
159
157
|
)
|
|
160
158
|
end
|
|
161
159
|
packet
|
|
@@ -168,8 +166,7 @@ module RubySMB
|
|
|
168
166
|
raise RubySMB::Error::InvalidPacket.new(
|
|
169
167
|
expected_proto: RubySMB::SMB1::SMB_PROTOCOL_ID,
|
|
170
168
|
expected_cmd: RubySMB::SMB1::Packet::SessionSetupResponse::COMMAND,
|
|
171
|
-
|
|
172
|
-
received_cmd: packet.smb_header.command
|
|
169
|
+
packet: packet
|
|
173
170
|
)
|
|
174
171
|
end
|
|
175
172
|
|
|
@@ -236,8 +233,7 @@ module RubySMB
|
|
|
236
233
|
raise RubySMB::Error::InvalidPacket.new(
|
|
237
234
|
expected_proto: RubySMB::SMB2::SMB2_PROTOCOL_ID,
|
|
238
235
|
expected_cmd: RubySMB::SMB2::Packet::SessionSetupResponse::COMMAND,
|
|
239
|
-
|
|
240
|
-
received_cmd: packet.smb2_header.command
|
|
236
|
+
packet: packet
|
|
241
237
|
)
|
|
242
238
|
end
|
|
243
239
|
|
|
@@ -251,8 +247,7 @@ module RubySMB
|
|
|
251
247
|
raise RubySMB::Error::InvalidPacket.new(
|
|
252
248
|
expected_proto: RubySMB::SMB2::SMB2_PROTOCOL_ID,
|
|
253
249
|
expected_cmd: RubySMB::SMB2::Packet::SessionSetupResponse::COMMAND,
|
|
254
|
-
|
|
255
|
-
received_cmd: packet.smb2_header.command
|
|
250
|
+
packet: packet
|
|
256
251
|
)
|
|
257
252
|
end
|
|
258
253
|
|
data/lib/ruby_smb/client/echo.rb
CHANGED
|
@@ -21,8 +21,7 @@ module RubySMB
|
|
|
21
21
|
raise RubySMB::Error::InvalidPacket.new(
|
|
22
22
|
expected_proto: RubySMB::SMB1::SMB_PROTOCOL_ID,
|
|
23
23
|
expected_cmd: RubySMB::SMB1::Packet::EchoResponse::COMMAND,
|
|
24
|
-
|
|
25
|
-
received_cmd: response.smb_header.command
|
|
24
|
+
packet: response
|
|
26
25
|
)
|
|
27
26
|
end
|
|
28
27
|
response
|
|
@@ -40,8 +39,7 @@ module RubySMB
|
|
|
40
39
|
raise RubySMB::Error::InvalidPacket.new(
|
|
41
40
|
expected_proto: RubySMB::SMB2::SMB2_PROTOCOL_ID,
|
|
42
41
|
expected_cmd: RubySMB::SMB2::Packet::EchoResponse::COMMAND,
|
|
43
|
-
|
|
44
|
-
received_cmd: response.smb2_header.command
|
|
42
|
+
packet: response
|
|
45
43
|
)
|
|
46
44
|
end
|
|
47
45
|
response
|
|
@@ -57,15 +57,20 @@ module RubySMB
|
|
|
57
57
|
|
|
58
58
|
# Takes the raw response data from the server and tries
|
|
59
59
|
# parse it into a valid Response packet object.
|
|
60
|
-
# This method currently assumes that all SMB1 will use Extended Security.
|
|
61
60
|
#
|
|
62
61
|
# @param raw_data [String] the raw binary response from the server
|
|
63
62
|
# @return [RubySMB::SMB1::Packet::NegotiateResponseExtended] when the response is an SMB1 Extended Security Negotiate Response Packet
|
|
63
|
+
# @return [RubySMB::SMB1::Packet::NegotiateResponse] when the response is an SMB1 Negotiate Response Packet
|
|
64
64
|
# @return [RubySMB::SMB2::Packet::NegotiateResponse] when the response is an SMB2 Negotiate Response Packet
|
|
65
65
|
def negotiate_response(raw_data)
|
|
66
66
|
response = nil
|
|
67
67
|
if smb1
|
|
68
68
|
packet = RubySMB::SMB1::Packet::NegotiateResponseExtended.read raw_data
|
|
69
|
+
|
|
70
|
+
unless packet.valid?
|
|
71
|
+
packet = RubySMB::SMB1::Packet::NegotiateResponse.read raw_data
|
|
72
|
+
end
|
|
73
|
+
|
|
69
74
|
response = packet if packet.valid?
|
|
70
75
|
end
|
|
71
76
|
if (smb2 || smb3) && response.nil?
|
|
@@ -74,25 +79,16 @@ module RubySMB
|
|
|
74
79
|
end
|
|
75
80
|
if response.nil?
|
|
76
81
|
if packet.packet_smb_version == 'SMB1'
|
|
77
|
-
extended_security = if packet.is_a? RubySMB::SMB1::Packet::NegotiateResponseExtended
|
|
78
|
-
packet.parameter_block.capabilities.extended_security
|
|
79
|
-
else
|
|
80
|
-
"n/a"
|
|
81
|
-
end
|
|
82
82
|
raise RubySMB::Error::InvalidPacket.new(
|
|
83
83
|
expected_proto: RubySMB::SMB1::SMB_PROTOCOL_ID,
|
|
84
|
-
expected_cmd: RubySMB::SMB1::Packet::
|
|
85
|
-
|
|
86
|
-
received_proto: packet.smb_header.protocol,
|
|
87
|
-
received_cmd: packet.smb_header.command,
|
|
88
|
-
received_custom: "extended_security=#{extended_security}"
|
|
84
|
+
expected_cmd: RubySMB::SMB1::Packet::NegotiateResponse::COMMAND,
|
|
85
|
+
packet: packet
|
|
89
86
|
)
|
|
90
87
|
elsif packet.packet_smb_version == 'SMB2'
|
|
91
88
|
raise RubySMB::Error::InvalidPacket.new(
|
|
92
89
|
expected_proto: RubySMB::SMB2::SMB2_PROTOCOL_ID,
|
|
93
90
|
expected_cmd: RubySMB::SMB2::Packet::NegotiateResponse::COMMAND,
|
|
94
|
-
|
|
95
|
-
received_cmd: packet.smb2_header.command
|
|
91
|
+
packet: packet
|
|
96
92
|
)
|
|
97
93
|
else
|
|
98
94
|
raise RubySMB::Error::InvalidPacket, 'Unknown SMB protocol version'
|
|
@@ -125,7 +121,7 @@ module RubySMB
|
|
|
125
121
|
'SMB1'
|
|
126
122
|
when RubySMB::SMB2::Packet::NegotiateResponse
|
|
127
123
|
self.smb1 = false
|
|
128
|
-
unless packet.dialect_revision.to_i ==
|
|
124
|
+
unless packet.dialect_revision.to_i == RubySMB::SMB2::SMB2_WILDCARD_REVISION
|
|
129
125
|
self.smb2 = packet.dialect_revision.to_i >= 0x0200 && packet.dialect_revision.to_i < 0x0300
|
|
130
126
|
self.smb3 = packet.dialect_revision.to_i >= 0x0300 && packet.dialect_revision.to_i < 0x0400
|
|
131
127
|
end
|
|
@@ -140,6 +136,7 @@ module RubySMB
|
|
|
140
136
|
self.server_guid = packet.server_guid
|
|
141
137
|
self.server_start_time = packet.server_start_time.to_time if packet.server_start_time != 0
|
|
142
138
|
self.server_system_time = packet.system_time.to_time if packet.system_time != 0
|
|
139
|
+
self.server_supports_multi_credit = self.dialect != '0x0202' && packet&.capabilities&.large_mtu == 1
|
|
143
140
|
case self.dialect
|
|
144
141
|
when '0x02ff'
|
|
145
142
|
when '0x0300', '0x0302'
|
|
@@ -276,8 +273,8 @@ module RubySMB
|
|
|
276
273
|
context_type: RubySMB::SMB2::NegotiateContext::SMB2_COMPRESSION_CAPABILITIES
|
|
277
274
|
)
|
|
278
275
|
# Adding all possible compression algorithm even if we don't support
|
|
279
|
-
# them yet. This will force the server to disclose the
|
|
280
|
-
# algorithms in the
|
|
276
|
+
# them yet. This will force the server to disclose the supported
|
|
277
|
+
# algorithms in the response.
|
|
281
278
|
nc.data.compression_algorithms << RubySMB::SMB2::CompressionCapabilities::LZNT1
|
|
282
279
|
nc.data.compression_algorithms << RubySMB::SMB2::CompressionCapabilities::LZ77
|
|
283
280
|
nc.data.compression_algorithms << RubySMB::SMB2::CompressionCapabilities::LZ77_Huffman
|
|
@@ -33,8 +33,7 @@ module RubySMB
|
|
|
33
33
|
raise RubySMB::Error::InvalidPacket.new(
|
|
34
34
|
expected_proto: RubySMB::SMB1::SMB_PROTOCOL_ID,
|
|
35
35
|
expected_cmd: RubySMB::SMB1::Packet::TreeConnectResponse::COMMAND,
|
|
36
|
-
|
|
37
|
-
received_cmd: response.smb_header.command
|
|
36
|
+
packet: response
|
|
38
37
|
)
|
|
39
38
|
end
|
|
40
39
|
unless response.status_code == WindowsError::NTStatus::STATUS_SUCCESS
|
|
@@ -73,8 +72,7 @@ module RubySMB
|
|
|
73
72
|
raise RubySMB::Error::InvalidPacket.new(
|
|
74
73
|
expected_proto: RubySMB::SMB2::SMB2_PROTOCOL_ID,
|
|
75
74
|
expected_cmd: RubySMB::SMB2::Packet::TreeConnectResponse::COMMAND,
|
|
76
|
-
|
|
77
|
-
received_cmd: response.smb2_header.command
|
|
75
|
+
packet: response
|
|
78
76
|
)
|
|
79
77
|
end
|
|
80
78
|
unless response.status_code == WindowsError::NTStatus::STATUS_SUCCESS
|
|
@@ -24,19 +24,25 @@ module RubySMB
|
|
|
24
24
|
last_tree.id
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
-
def open(path, disposition=RubySMB::Dispositions::FILE_OPEN, write: false, read: true)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
27
|
+
def open(path, disposition=RubySMB::Dispositions::FILE_OPEN, write: false, read: true, pipe: false)
|
|
28
|
+
if pipe
|
|
29
|
+
file = last_tree.open_pipe(filename: path, write: write, read: read, disposition: disposition)
|
|
30
|
+
else
|
|
31
|
+
file = last_tree.open_file(filename: path, write: write, read: read, disposition: disposition)
|
|
32
|
+
end
|
|
33
|
+
@last_file_id = if file.respond_to?(:guid)
|
|
34
|
+
# SMB2 uses guid
|
|
35
|
+
file.guid.to_binary_s
|
|
36
|
+
elsif file.respond_to?(:fid)
|
|
37
|
+
# SMB1 uses fid
|
|
38
|
+
file.fid.to_binary_s
|
|
39
|
+
end
|
|
40
|
+
@open_files[@last_file_id] = file
|
|
41
|
+
@last_file_id
|
|
36
42
|
end
|
|
37
43
|
|
|
38
44
|
def create_pipe(path, disposition=RubySMB::Dispositions::FILE_OPEN_IF)
|
|
39
|
-
open(path
|
|
45
|
+
open(path, disposition, write: true, read: true, pipe: true)
|
|
40
46
|
end
|
|
41
47
|
|
|
42
48
|
#Writes data to an open file handle
|
|
@@ -6,7 +6,7 @@ module RubySMB
|
|
|
6
6
|
share = "\\\\#{host}\\IPC$"
|
|
7
7
|
tree = @tree_connects.find {|tree| tree.share == share}
|
|
8
8
|
tree = tree_connect(share) unless tree
|
|
9
|
-
named_pipe = tree.
|
|
9
|
+
named_pipe = tree.open_pipe(filename: "winreg", write: true, read: true)
|
|
10
10
|
if block_given?
|
|
11
11
|
res = yield named_pipe
|
|
12
12
|
named_pipe.close
|