ruby_smb 0.0.18 → 0.0.19
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.tar.gz.sig +0 -0
- data/README.md +247 -7
- data/examples/anonymous_auth.rb +6 -3
- data/examples/append_file.rb +40 -0
- data/examples/authenticate.rb +12 -7
- data/examples/delete_file.rb +40 -0
- data/examples/list_directory.rb +45 -0
- data/examples/negotiate.rb +0 -1
- data/examples/negotiate_with_netbios_service.rb +36 -0
- data/examples/net_share_enum_all.rb +30 -0
- data/examples/read_file.rb +39 -0
- data/examples/rename_file.rb +41 -0
- data/examples/tree_connect.rb +2 -4
- data/examples/write_file.rb +40 -0
- data/lib/ruby_smb.rb +5 -0
- data/lib/ruby_smb/client.rb +196 -43
- data/lib/ruby_smb/client/authentication.rb +89 -48
- data/lib/ruby_smb/client/echo.rb +1 -4
- data/lib/ruby_smb/client/negotiation.rb +46 -45
- data/lib/ruby_smb/client/signing.rb +9 -16
- data/lib/ruby_smb/client/tree_connect.rb +8 -13
- data/lib/ruby_smb/client/utils.rb +79 -0
- data/lib/ruby_smb/dcerpc.rb +30 -0
- data/lib/ruby_smb/dcerpc/bind.rb +60 -0
- data/lib/ruby_smb/dcerpc/handle.rb +60 -0
- data/lib/ruby_smb/dcerpc/ndr.rb +41 -0
- data/lib/ruby_smb/dcerpc/request.rb +43 -0
- data/lib/ruby_smb/dcerpc/response.rb +46 -0
- data/lib/ruby_smb/dcerpc/srvsvc.rb +17 -0
- data/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all.rb +93 -0
- data/lib/ruby_smb/dcerpc/uuid.rb +28 -0
- data/lib/ruby_smb/dispatcher.rb +7 -3
- data/lib/ruby_smb/dispatcher/base.rb +23 -14
- data/lib/ruby_smb/dispatcher/socket.rb +71 -51
- data/lib/ruby_smb/dispositions.rb +32 -0
- data/lib/ruby_smb/error.rb +24 -18
- data/lib/ruby_smb/field.rb +5 -2
- data/lib/ruby_smb/field/extended_attribute_flag.rb +1 -1
- data/lib/ruby_smb/field/file_time.rb +3 -1
- data/lib/ruby_smb/field/security_descriptor.rb +6 -6
- data/lib/ruby_smb/field/smb2_fileid.rb +11 -0
- data/lib/ruby_smb/field/smb_fea.rb +3 -3
- data/lib/ruby_smb/field/smb_fea_list.rb +3 -3
- data/lib/ruby_smb/field/smb_gea.rb +12 -0
- data/lib/ruby_smb/field/smb_gea_list.rb +13 -0
- data/lib/ruby_smb/field/string16.rb +14 -0
- data/lib/ruby_smb/field/stringz16.rb +3 -7
- data/lib/ruby_smb/field/utime.rb +11 -10
- data/lib/ruby_smb/fscc.rb +12 -0
- data/lib/ruby_smb/fscc/control_codes.rb +26 -0
- data/lib/ruby_smb/{field → fscc}/ea_info_array.rb +12 -14
- data/lib/ruby_smb/fscc/file_attributes.rb +29 -0
- data/lib/ruby_smb/{field → fscc}/file_full_ea_info.rb +5 -5
- data/lib/ruby_smb/fscc/file_information.rb +60 -0
- data/lib/ruby_smb/fscc/file_information/file_both_directory_information.rb +29 -0
- data/lib/ruby_smb/fscc/file_information/file_directory_information.rb +25 -0
- data/lib/ruby_smb/fscc/file_information/file_disposition_information.rb +15 -0
- data/lib/ruby_smb/fscc/file_information/file_full_directory_information.rb +26 -0
- data/lib/ruby_smb/fscc/file_information/file_id_both_directory_information.rb +31 -0
- data/lib/ruby_smb/fscc/file_information/file_id_full_directory_information.rb +28 -0
- data/lib/ruby_smb/fscc/file_information/file_names_information.rb +18 -0
- data/lib/ruby_smb/fscc/file_information/file_rename_information.rb +44 -0
- data/lib/ruby_smb/generic_packet.rb +40 -18
- data/lib/ruby_smb/gss.rb +49 -56
- data/lib/ruby_smb/impersonation_levels.rb +7 -2
- data/lib/ruby_smb/nbss.rb +16 -0
- data/lib/ruby_smb/nbss/negative_session_response.rb +30 -0
- data/lib/ruby_smb/nbss/session_header.rb +13 -0
- data/lib/ruby_smb/nbss/session_request.rb +13 -0
- data/lib/ruby_smb/smb1.rb +20 -17
- data/lib/ruby_smb/smb1/bit_field.rb +3 -0
- data/lib/ruby_smb/smb1/bit_field/create_options.rb +5 -5
- data/lib/ruby_smb/smb1/bit_field/file_status_flags.rb +18 -0
- data/lib/ruby_smb/smb1/bit_field/open2_access_mode.rb +11 -11
- data/lib/ruby_smb/smb1/bit_field/open2_open_mode.rb +1 -1
- data/lib/ruby_smb/smb1/bit_field/optional_support.rb +0 -1
- data/lib/ruby_smb/smb1/bit_field/security_flags.rb +15 -0
- data/lib/ruby_smb/smb1/bit_field/share_access.rb +2 -3
- data/lib/ruby_smb/smb1/bit_field/smb_ext_file_attributes.rb +21 -24
- data/lib/ruby_smb/smb1/bit_field/smb_file_attributes.rb +1 -1
- data/lib/ruby_smb/smb1/commands.rb +5 -0
- data/lib/ruby_smb/smb1/create_actions.rb +3 -5
- data/lib/ruby_smb/smb1/file.rb +289 -0
- data/lib/ruby_smb/smb1/oplock_levels.rb +2 -4
- data/lib/ruby_smb/smb1/packet.rb +10 -0
- data/lib/ruby_smb/smb1/packet/close_request.rb +31 -0
- data/lib/ruby_smb/smb1/packet/close_response.rb +28 -0
- data/lib/ruby_smb/smb1/packet/echo_request.rb +5 -7
- data/lib/ruby_smb/smb1/packet/echo_response.rb +5 -7
- data/lib/ruby_smb/smb1/packet/empty_packet.rb +1 -2
- data/lib/ruby_smb/smb1/packet/logoff_request.rb +1 -4
- data/lib/ruby_smb/smb1/packet/logoff_response.rb +1 -4
- data/lib/ruby_smb/smb1/packet/negotiate_response.rb +22 -0
- data/lib/ruby_smb/smb1/packet/negotiate_response_extended.rb +22 -0
- data/lib/ruby_smb/smb1/packet/nt_create_andx_request.rb +62 -0
- data/lib/ruby_smb/smb1/packet/nt_create_andx_response.rb +66 -0
- data/lib/ruby_smb/smb1/packet/nt_trans.rb +1 -2
- data/lib/ruby_smb/smb1/packet/nt_trans/create_request.rb +19 -13
- data/lib/ruby_smb/smb1/packet/nt_trans/create_response.rb +8 -10
- data/lib/ruby_smb/smb1/packet/nt_trans/request.rb +11 -11
- data/lib/ruby_smb/smb1/packet/nt_trans/response.rb +10 -10
- data/lib/ruby_smb/smb1/packet/nt_trans/subcommands.rb +8 -1
- data/lib/ruby_smb/smb1/packet/read_andx_request.rb +84 -0
- data/lib/ruby_smb/smb1/packet/read_andx_response.rb +47 -0
- data/lib/ruby_smb/smb1/packet/session_setup_legacy_request.rb +2 -6
- data/lib/ruby_smb/smb1/packet/session_setup_legacy_response.rb +1 -4
- data/lib/ruby_smb/smb1/packet/session_setup_request.rb +1 -6
- data/lib/ruby_smb/smb1/packet/session_setup_response.rb +2 -4
- data/lib/ruby_smb/smb1/packet/trans2.rb +8 -2
- data/lib/ruby_smb/smb1/packet/trans2/data_block.rb +6 -7
- data/lib/ruby_smb/smb1/packet/trans2/find_first2_request.rb +77 -0
- data/lib/ruby_smb/smb1/packet/trans2/find_first2_response.rb +87 -0
- data/lib/ruby_smb/smb1/packet/trans2/find_information_level.rb +32 -0
- data/lib/ruby_smb/smb1/packet/trans2/find_information_level/find_file_full_directory_info.rb +45 -0
- data/lib/ruby_smb/smb1/packet/trans2/find_next2_request.rb +77 -0
- data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +86 -0
- data/lib/ruby_smb/smb1/packet/trans2/open2_request.rb +10 -10
- data/lib/ruby_smb/smb1/packet/trans2/open2_response.rb +10 -12
- data/lib/ruby_smb/smb1/packet/trans2/request.rb +15 -17
- data/lib/ruby_smb/smb1/packet/trans2/request_secondary.rb +8 -10
- data/lib/ruby_smb/smb1/packet/trans2/response.rb +11 -13
- data/lib/ruby_smb/smb1/packet/trans2/set_file_information_request.rb +66 -0
- data/lib/ruby_smb/smb1/packet/trans2/set_file_information_response.rb +57 -0
- data/lib/ruby_smb/smb1/packet/trans2/subcommands.rb +5 -2
- data/lib/ruby_smb/smb1/packet/tree_connect_request.rb +4 -6
- data/lib/ruby_smb/smb1/packet/tree_connect_response.rb +5 -7
- data/lib/ruby_smb/smb1/packet/tree_disconnect_request.rb +2 -4
- data/lib/ruby_smb/smb1/packet/tree_disconnect_response.rb +2 -4
- data/lib/ruby_smb/smb1/packet/write_andx_request.rb +68 -0
- data/lib/ruby_smb/smb1/packet/write_andx_response.rb +35 -0
- data/lib/ruby_smb/smb1/resource_type.rb +18 -0
- data/lib/ruby_smb/smb1/tree.rb +188 -5
- data/lib/ruby_smb/smb2.rb +16 -11
- data/lib/ruby_smb/smb2/bit_field.rb +1 -0
- data/lib/ruby_smb/smb2/bit_field/file_access_mask.rb +1 -1
- data/lib/ruby_smb/smb2/bit_field/session_flags.rb +1 -2
- data/lib/ruby_smb/smb2/bit_field/share_flags.rb +4 -6
- data/lib/ruby_smb/smb2/create_context.rb +29 -0
- data/lib/ruby_smb/smb2/file.rb +251 -0
- data/lib/ruby_smb/smb2/info_type.rb +21 -0
- data/lib/ruby_smb/smb2/packet.rb +16 -0
- data/lib/ruby_smb/smb2/packet/close_request.rb +22 -0
- data/lib/ruby_smb/smb2/packet/close_response.rb +29 -0
- data/lib/ruby_smb/smb2/packet/create_request.rb +54 -0
- data/lib/ruby_smb/smb2/packet/create_response.rb +35 -0
- data/lib/ruby_smb/smb2/packet/echo_request.rb +1 -3
- data/lib/ruby_smb/smb2/packet/echo_response.rb +1 -3
- data/lib/ruby_smb/smb2/packet/error_packet.rb +1 -3
- data/lib/ruby_smb/smb2/packet/ioctl_request.rb +54 -0
- data/lib/ruby_smb/smb2/packet/ioctl_response.rb +39 -0
- data/lib/ruby_smb/smb2/packet/logoff_request.rb +1 -4
- data/lib/ruby_smb/smb2/packet/logoff_response.rb +1 -4
- data/lib/ruby_smb/smb2/packet/negotiate_request.rb +1 -1
- data/lib/ruby_smb/smb2/packet/negotiate_response.rb +1 -1
- data/lib/ruby_smb/smb2/packet/query_directory_request.rb +35 -0
- data/lib/ruby_smb/smb2/packet/query_directory_response.rb +45 -0
- data/lib/ruby_smb/smb2/packet/read_request.rb +30 -0
- data/lib/ruby_smb/smb2/packet/read_response.rb +26 -0
- data/lib/ruby_smb/smb2/packet/session_setup_request.rb +2 -5
- data/lib/ruby_smb/smb2/packet/session_setup_response.rb +4 -7
- data/lib/ruby_smb/smb2/packet/set_info_request.rb +58 -0
- data/lib/ruby_smb/smb2/packet/set_info_response.rb +20 -0
- data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +3 -4
- data/lib/ruby_smb/smb2/packet/tree_connect_response.rb +5 -9
- data/lib/ruby_smb/smb2/packet/tree_disconnect_request.rb +1 -4
- data/lib/ruby_smb/smb2/packet/tree_disconnect_response.rb +1 -4
- data/lib/ruby_smb/smb2/packet/write_request.rb +29 -0
- data/lib/ruby_smb/smb2/packet/write_response.rb +26 -0
- data/lib/ruby_smb/smb2/tree.rb +163 -7
- data/lib/ruby_smb/version.rb +1 -1
- data/spec/lib/ruby_smb/client_spec.rb +459 -120
- data/spec/lib/ruby_smb/dcerpc/bind_spec.rb +14 -0
- data/spec/lib/ruby_smb/dcerpc/handle_spec.rb +31 -0
- data/spec/lib/ruby_smb/dcerpc/request_spec.rb +21 -0
- data/spec/lib/ruby_smb/dcerpc/response_spec.rb +15 -0
- data/spec/lib/ruby_smb/dcerpc/srvsvc_spec.rb +13 -0
- data/spec/lib/ruby_smb/dcerpc/uuid_spec.rb +12 -0
- data/spec/lib/ruby_smb/dispatcher/base_spec.rb +26 -0
- data/spec/lib/ruby_smb/dispatcher/socket_spec.rb +118 -18
- data/spec/lib/ruby_smb/field/extended_attribute_flag_spec.rb +0 -3
- data/spec/lib/ruby_smb/field/file_time_spec.rb +4 -2
- data/spec/lib/ruby_smb/field/security_descriptor.rb +0 -1
- data/spec/lib/ruby_smb/field/smb2_fileid_spec.rb +10 -0
- data/spec/lib/ruby_smb/field/smb_fea_list_spec.rb +3 -5
- data/spec/lib/ruby_smb/field/smb_gea_list_spec.rb +37 -0
- data/spec/lib/ruby_smb/field/smb_gea_spec.rb +22 -0
- data/spec/lib/ruby_smb/field/stringz16_spec.rb +7 -9
- data/spec/lib/ruby_smb/field/utime_spec.rb +4 -2
- data/spec/lib/ruby_smb/{field → fscc}/ea_info_array_spec.rb +7 -9
- data/spec/lib/ruby_smb/{field → fscc}/file_full_ea_info_spec.rb +2 -3
- data/spec/lib/ruby_smb/fscc/file_information/file_both_directory_information_spec.rb +71 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_directory_information_spec.rb +68 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_disposition_information_spec.rb +26 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_full_directory_information_spec.rb +69 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_id_both_directory_information_spec.rb +72 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_id_full_directory_information_spec.rb +70 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_names_information_spec.rb +41 -0
- data/spec/lib/ruby_smb/fscc/file_information/file_rename_information_spec.rb +133 -0
- data/spec/lib/ruby_smb/fscc/fscc_file_attributes_spec.rb +143 -0
- data/spec/lib/ruby_smb/generic_packet_spec.rb +46 -21
- data/spec/lib/ruby_smb/nbss/negative_session_response_spec.rb +29 -0
- data/spec/lib/ruby_smb/nbss/session_header_spec.rb +30 -0
- data/spec/lib/ruby_smb/nbss/session_request_spec.rb +30 -0
- data/spec/lib/ruby_smb/smb1/bit_field/create_options_spec.rb +9 -1
- data/spec/lib/ruby_smb/smb1/bit_field/directory_access_mask_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb1/bit_field/file_access_mask_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb1/bit_field/file_status_flags_spec.rb +35 -0
- data/spec/lib/ruby_smb/smb1/bit_field/open2_access_mode_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb1/bit_field/open2_flags_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb1/bit_field/open2_open_mode_spec.rb +0 -1
- data/spec/lib/ruby_smb/smb1/bit_field/optional_support_spec.rb +0 -1
- data/spec/lib/ruby_smb/smb1/bit_field/security_flags_spec.rb +26 -0
- data/spec/lib/ruby_smb/smb1/bit_field/share_access_spec.rb +0 -3
- data/spec/lib/ruby_smb/smb1/bit_field/smb_ext_file_attributes_spec.rb +20 -39
- data/spec/lib/ruby_smb/smb1/bit_field/smb_file_attributes_spec.rb +0 -6
- data/spec/lib/ruby_smb/smb1/bit_field/smb_nmpipe_status_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb1/bit_field/trans2_flags_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb1/bit_field/tree_connect_flags_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb1/file_spec.rb +469 -0
- data/spec/lib/ruby_smb/smb1/packet/close_request_spec.rb +54 -0
- data/spec/lib/ruby_smb/smb1/packet/close_response_spec.rb +45 -0
- data/spec/lib/ruby_smb/smb1/packet/echo_request_spec.rb +1 -4
- data/spec/lib/ruby_smb/smb1/packet/echo_response_spec.rb +1 -4
- data/spec/lib/ruby_smb/smb1/packet/error_packet_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb1/packet/logoff_request_spec.rb +1 -4
- data/spec/lib/ruby_smb/smb1/packet/logoff_response_spec.rb +1 -4
- data/spec/lib/ruby_smb/smb1/packet/negotiate_request_spec.rb +1 -1
- data/spec/lib/ruby_smb/smb1/packet/negotiate_response_extended_spec.rb +37 -0
- data/spec/lib/ruby_smb/smb1/packet/negotiate_response_spec.rb +37 -0
- data/spec/lib/ruby_smb/smb1/packet/nt_create_andx_request_spec.rb +151 -0
- data/spec/lib/ruby_smb/smb1/packet/nt_create_andx_response_spec.rb +157 -0
- data/spec/lib/ruby_smb/smb1/packet/nt_trans/create_request_spec.rb +13 -6
- data/spec/lib/ruby_smb/smb1/packet/nt_trans/create_response_spec.rb +1 -7
- data/spec/lib/ruby_smb/smb1/packet/nt_trans/request_spec.rb +1 -6
- data/spec/lib/ruby_smb/smb1/packet/nt_trans/response_spec.rb +1 -5
- data/spec/lib/ruby_smb/smb1/packet/read_andx_request_spec.rb +149 -0
- data/spec/lib/ruby_smb/smb1/packet/read_andx_response_spec.rb +93 -0
- data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_request_spec.rb +1 -5
- data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_response_spec.rb +1 -5
- data/spec/lib/ruby_smb/smb1/packet/session_setup_request_spec.rb +3 -8
- data/spec/lib/ruby_smb/smb1/packet/session_setup_response_spec.rb +2 -4
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_request_spec.rb +180 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_response_spec.rb +104 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_information_level/find_file_full_directory_info_spec.rb +128 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_request_spec.rb +174 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_response_spec.rb +102 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/open2_request_spec.rb +1 -6
- data/spec/lib/ruby_smb/smb1/packet/trans2/open2_response_spec.rb +2 -7
- data/spec/lib/ruby_smb/smb1/packet/trans2/request_secondary_spec.rb +1 -5
- data/spec/lib/ruby_smb/smb1/packet/trans2/request_spec.rb +1 -5
- data/spec/lib/ruby_smb/smb1/packet/trans2/response_spec.rb +1 -4
- data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_request_spec.rb +98 -0
- data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_response_spec.rb +56 -0
- data/spec/lib/ruby_smb/smb1/packet/tree_connect_request_spec.rb +1 -5
- data/spec/lib/ruby_smb/smb1/packet/tree_connect_response_spec.rb +1 -6
- data/spec/lib/ruby_smb/smb1/packet/tree_disconnect_request_spec.rb +1 -4
- data/spec/lib/ruby_smb/smb1/packet/tree_disconnect_response_spec.rb +1 -4
- data/spec/lib/ruby_smb/smb1/packet/write_andx_request_spec.rb +148 -0
- data/spec/lib/ruby_smb/smb1/packet/write_andx_response_spec.rb +54 -0
- data/spec/lib/ruby_smb/smb1/tree_spec.rb +409 -7
- data/spec/lib/ruby_smb/smb2/bit_field/directory_access_mask_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb2/bit_field/file_access_mask_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb2/bit_field/session_flags_spec.rb +1 -1
- data/spec/lib/ruby_smb/smb2/bit_field/share_capabilities_spec.rb +0 -1
- data/spec/lib/ruby_smb/smb2/bit_field/share_flags_spec.rb +0 -2
- data/spec/lib/ruby_smb/smb2/create_context_spec.rb +42 -0
- data/spec/lib/ruby_smb/smb2/file_spec.rb +233 -0
- data/spec/lib/ruby_smb/smb2/packet/close_request_spec.rb +40 -0
- data/spec/lib/ruby_smb/smb2/packet/close_response_spec.rb +40 -0
- data/spec/lib/ruby_smb/smb2/packet/create_request_spec.rb +101 -0
- data/spec/lib/ruby_smb/smb2/packet/create_response_spec.rb +64 -0
- data/spec/lib/ruby_smb/smb2/packet/echo_request_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb2/packet/echo_response_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb2/packet/ioctl_request_spec.rb +48 -0
- data/spec/lib/ruby_smb/smb2/packet/logoff_request_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb2/packet/logoff_response_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb2/packet/query_directory_request_spec.rb +80 -0
- data/spec/lib/ruby_smb/smb2/packet/query_directory_response_spec.rb +64 -0
- data/spec/lib/ruby_smb/smb2/packet/read_request_spec.rb +43 -0
- data/spec/lib/ruby_smb/smb2/packet/read_response_spec.rb +50 -0
- data/spec/lib/ruby_smb/smb2/packet/session_setup_request_spec.rb +3 -4
- data/spec/lib/ruby_smb/smb2/packet/session_setup_response_spec.rb +2 -3
- data/spec/lib/ruby_smb/smb2/packet/set_info_request_spec.rb +205 -0
- data/spec/lib/ruby_smb/smb2/packet/set_info_response_spec.rb +32 -0
- data/spec/lib/ruby_smb/smb2/packet/tree_connect_request_spec.rb +3 -5
- data/spec/lib/ruby_smb/smb2/packet/tree_connect_response_spec.rb +1 -2
- data/spec/lib/ruby_smb/smb2/packet/tree_disconnect_request_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb2/packet/tree_disconnect_response_spec.rb +1 -3
- data/spec/lib/ruby_smb/smb2/packet/write_request_spec.rb +51 -0
- data/spec/lib/ruby_smb/smb2/packet/write_response_spec.rb +38 -0
- data/spec/lib/ruby_smb/smb2/tree_spec.rb +191 -5
- data/spec/spec_helper.rb +1 -1
- metadata +195 -12
- metadata.gz.sig +0 -0
- data/lib/ruby_smb/smb1/dispositions.rb +0 -36
- data/spec/lib/ruby_smb/dispatcher/dispatcher_base_spec.rb +0 -22
@@ -2,15 +2,14 @@ module RubySMB
|
|
2
2
|
class Client
|
3
3
|
# This module holds all the backend client methods for authentication.
|
4
4
|
module Authentication
|
5
|
-
|
6
5
|
# Responsible for handling Authentication and Session Setup for
|
7
6
|
# the SMB Client. It returns the final Status code from the authentication
|
8
7
|
# exchange.
|
9
8
|
#
|
10
9
|
# @return [WindowsError::NTStatus] the NTStatus object from the SessionSetup exchange.
|
11
10
|
def authenticate
|
12
|
-
if
|
13
|
-
if
|
11
|
+
if smb1
|
12
|
+
if username.empty? && password.empty?
|
14
13
|
smb1_anonymous_auth
|
15
14
|
else
|
16
15
|
smb1_authenticate
|
@@ -33,9 +32,11 @@ module RubySMB
|
|
33
32
|
response = smb1_anonymous_auth_response(raw_response)
|
34
33
|
response_code = response.status_code
|
35
34
|
|
36
|
-
if response_code
|
37
|
-
self.user_id
|
38
|
-
self.peer_native_os = response.data_block.native_os
|
35
|
+
if response_code == WindowsError::NTStatus::STATUS_SUCCESS
|
36
|
+
self.user_id = response.smb_header.uid
|
37
|
+
self.peer_native_os = response.data_block.native_os.to_s
|
38
|
+
self.peer_native_lm = response.data_block.native_lan_man.to_s
|
39
|
+
self.primary_domain = response.data_block.primary_domain.to_s
|
39
40
|
end
|
40
41
|
|
41
42
|
response_code
|
@@ -46,7 +47,7 @@ module RubySMB
|
|
46
47
|
def smb1_anonymous_auth_request
|
47
48
|
packet = RubySMB::SMB1::Packet::SessionSetupLegacyRequest.new
|
48
49
|
packet.data_block.oem_password = "\x00"
|
49
|
-
packet.parameter_block.max_buffer_size =
|
50
|
+
packet.parameter_block.max_buffer_size = self.max_buffer_size
|
50
51
|
packet.parameter_block.max_mpx_count = 50
|
51
52
|
packet.parameter_block.capabilities.extended_security = 0
|
52
53
|
packet
|
@@ -65,20 +66,30 @@ module RubySMB
|
|
65
66
|
packet
|
66
67
|
end
|
67
68
|
|
68
|
-
# Handles the SMB1 NTLMSSP 4-way handshake for Authentication
|
69
|
+
# Handles the SMB1 NTLMSSP 4-way handshake for Authentication and store
|
70
|
+
# information about the peer/server.
|
69
71
|
def smb1_authenticate
|
70
72
|
response = smb1_ntlmssp_negotiate
|
71
73
|
challenge_packet = smb1_ntlmssp_challenge_packet(response)
|
74
|
+
|
75
|
+
# Store the available OS information before going forward.
|
76
|
+
@peer_native_os = challenge_packet.data_block.native_os.to_s
|
77
|
+
@peer_native_lm = challenge_packet.data_block.native_lan_man.to_s
|
78
|
+
|
72
79
|
user_id = challenge_packet.smb_header.uid
|
73
|
-
|
74
|
-
|
80
|
+
type2_b64_message = smb1_type2_message(challenge_packet)
|
81
|
+
type3_message = @ntlm_client.init_context(type2_b64_message)
|
82
|
+
|
83
|
+
@session_key = @ntlm_client.session_key
|
84
|
+
challenge_message = @ntlm_client.session.challenge_message
|
85
|
+
store_target_info(challenge_message.target_info) if challenge_message.has_flag?(:TARGET_INFO)
|
86
|
+
@os_version = extract_os_version(challenge_message.os_version.to_s)
|
87
|
+
|
88
|
+
raw = smb1_ntlmssp_authenticate(type3_message, user_id)
|
75
89
|
response = smb1_ntlmssp_final_packet(raw)
|
76
90
|
response_code = response.status_code
|
77
91
|
|
78
|
-
if response_code
|
79
|
-
self.user_id = user_id
|
80
|
-
self.peer_native_os = response.data_block.native_os
|
81
|
-
end
|
92
|
+
@user_id = user_id if response_code == WindowsError::NTStatus::STATUS_SUCCESS
|
82
93
|
|
83
94
|
response_code
|
84
95
|
end
|
@@ -92,31 +103,28 @@ module RubySMB
|
|
92
103
|
send_recv(packet)
|
93
104
|
end
|
94
105
|
|
95
|
-
# Takes the
|
96
|
-
#
|
97
|
-
# and receives the raw response
|
106
|
+
# Takes the NTLM Type 3 (authenticate) message and calls the routines to
|
107
|
+
# build the Auth packet, sends the packet and receives the raw response.
|
98
108
|
#
|
99
|
-
# @param
|
109
|
+
# @param type3_message [String] the NTLM Type 3 message
|
100
110
|
# @param user_id [Integer] the temporary user ID from the Type 2 response
|
101
111
|
# @return [String] the raw binary response from the server
|
102
|
-
def smb1_ntlmssp_authenticate(
|
103
|
-
packet = smb1_ntlmssp_auth_packet(
|
112
|
+
def smb1_ntlmssp_authenticate(type3_message, user_id)
|
113
|
+
packet = smb1_ntlmssp_auth_packet(type3_message, user_id)
|
104
114
|
send_recv(packet)
|
105
115
|
end
|
106
116
|
|
107
117
|
# Generates the {RubySMB::SMB1::Packet::SessionSetupRequest} packet
|
108
118
|
# with the NTLM Type 3 (Auth) message in the security_blob field.
|
109
119
|
#
|
110
|
-
# @param
|
120
|
+
# @param type3_message [String] the NTLM Type 3 message
|
111
121
|
# @param user_id [Integer] the temporary user ID from the Type 2 response
|
112
122
|
# @return [RubySMB::SMB1::Packet::SessionSetupRequest] the second authentication packet to send
|
113
|
-
def smb1_ntlmssp_auth_packet(
|
114
|
-
type3_message = ntlm_client.init_context(type2_string)
|
115
|
-
self.session_key = ntlm_client.session_key
|
123
|
+
def smb1_ntlmssp_auth_packet(type3_message, user_id)
|
116
124
|
packet = RubySMB::SMB1::Packet::SessionSetupRequest.new
|
117
125
|
packet.smb_header.uid = user_id
|
118
126
|
packet.set_type3_blob(type3_message.serialize)
|
119
|
-
packet.parameter_block.max_buffer_size =
|
127
|
+
packet.parameter_block.max_buffer_size = self.max_buffer_size
|
120
128
|
packet.parameter_block.max_mpx_count = 50
|
121
129
|
packet.smb_header.flags2.extended_security = 1
|
122
130
|
packet
|
@@ -131,7 +139,7 @@ module RubySMB
|
|
131
139
|
type1_message = ntlm_client.init_context
|
132
140
|
packet = RubySMB::SMB1::Packet::SessionSetupRequest.new
|
133
141
|
packet.set_type1_blob(type1_message.serialize)
|
134
|
-
packet.parameter_block.max_buffer_size =
|
142
|
+
packet.parameter_block.max_buffer_size = self.max_buffer_size
|
135
143
|
packet.parameter_block.max_mpx_count = 50
|
136
144
|
packet.smb_header.flags2.extended_security = 1
|
137
145
|
packet
|
@@ -156,7 +164,7 @@ module RubySMB
|
|
156
164
|
packet = RubySMB::SMB1::Packet::SessionSetupResponse.read(raw_response)
|
157
165
|
status_code = packet.status_code
|
158
166
|
|
159
|
-
unless status_code.name ==
|
167
|
+
unless status_code.name == 'STATUS_MORE_PROCESSING_REQUIRED'
|
160
168
|
raise RubySMB::Error::UnexpectedStatusCode, status_code.to_s
|
161
169
|
end
|
162
170
|
|
@@ -172,24 +180,32 @@ module RubySMB
|
|
172
180
|
# @return [String] the base64 encoded NTLM Challenge (Type2 Message) from the response
|
173
181
|
def smb1_type2_message(response_packet)
|
174
182
|
sec_blob = response_packet.data_block.security_blob
|
175
|
-
ntlmssp_offset = sec_blob.index(
|
183
|
+
ntlmssp_offset = sec_blob.index('NTLMSSP')
|
176
184
|
type2_blob = sec_blob.slice(ntlmssp_offset..-1)
|
177
|
-
[type2_blob].pack(
|
185
|
+
[type2_blob].pack('m')
|
178
186
|
end
|
179
187
|
|
180
188
|
#
|
181
189
|
# SMB 2 Methods
|
182
190
|
#
|
183
191
|
|
184
|
-
# Handles the
|
192
|
+
# Handles the SMB2 NTLMSSP 4-way handshake for Authentication and store
|
193
|
+
# information about the peer/server.
|
185
194
|
def smb2_authenticate
|
186
195
|
response = smb2_ntlmssp_negotiate
|
187
196
|
challenge_packet = smb2_ntlmssp_challenge_packet(response)
|
188
|
-
session_id = challenge_packet.smb2_header.session_id
|
189
|
-
|
190
|
-
|
191
|
-
|
197
|
+
@session_id = challenge_packet.smb2_header.session_id
|
198
|
+
type2_b64_message = smb2_type2_message(challenge_packet)
|
199
|
+
type3_message = @ntlm_client.init_context(type2_b64_message)
|
200
|
+
|
201
|
+
@session_key = @ntlm_client.session_key
|
202
|
+
challenge_message = ntlm_client.session.challenge_message
|
203
|
+
store_target_info(challenge_message.target_info) if challenge_message.has_flag?(:TARGET_INFO)
|
204
|
+
@os_version = extract_os_version(challenge_message.os_version.to_s)
|
205
|
+
|
206
|
+
raw = smb2_ntlmssp_authenticate(type3_message, @session_id)
|
192
207
|
response = smb2_ntlmssp_final_packet(raw)
|
208
|
+
|
193
209
|
response.status_code
|
194
210
|
end
|
195
211
|
|
@@ -206,7 +222,7 @@ module RubySMB
|
|
206
222
|
def smb2_ntlmssp_challenge_packet(raw_response)
|
207
223
|
packet = RubySMB::SMB2::Packet::SessionSetupResponse.read(raw_response)
|
208
224
|
status_code = packet.status_code
|
209
|
-
unless status_code.name ==
|
225
|
+
unless status_code.name == 'STATUS_MORE_PROCESSING_REQUIRED'
|
210
226
|
raise RubySMB::Error::UnexpectedStatusCode, status_code.to_s
|
211
227
|
end
|
212
228
|
|
@@ -247,39 +263,64 @@ module RubySMB
|
|
247
263
|
# @return [String] the base64 encoded NTLM Challenge (Type2 Message) from the response
|
248
264
|
def smb2_type2_message(response_packet)
|
249
265
|
sec_blob = response_packet.buffer
|
250
|
-
ntlmssp_offset = sec_blob.index(
|
266
|
+
ntlmssp_offset = sec_blob.index('NTLMSSP')
|
251
267
|
type2_blob = sec_blob.slice(ntlmssp_offset..-1)
|
252
|
-
[type2_blob].pack(
|
268
|
+
[type2_blob].pack('m')
|
253
269
|
end
|
254
270
|
|
255
|
-
# Takes the
|
256
|
-
#
|
257
|
-
# and receives the raw response
|
271
|
+
# Takes the NTLM Type 3 (authenticate) message and calls the routines to
|
272
|
+
# build the Auth packet, sends the packet and receives the raw response.
|
258
273
|
#
|
259
|
-
# @param
|
274
|
+
# @param type3_message [String] the NTLM Type 3 message
|
260
275
|
# @param user_id [Integer] the temporary user ID from the Type 2 response
|
261
276
|
# @return [String] the raw binary response from the server
|
262
|
-
def smb2_ntlmssp_authenticate(
|
263
|
-
packet = smb2_ntlmssp_auth_packet(
|
277
|
+
def smb2_ntlmssp_authenticate(type3_message, user_id)
|
278
|
+
packet = smb2_ntlmssp_auth_packet(type3_message, user_id)
|
264
279
|
send_recv(packet)
|
265
280
|
end
|
266
281
|
|
267
282
|
# Generates the {RubySMB::SMB2::Packet::SessionSetupRequest} packet
|
268
283
|
# with the NTLM Type 3 (Auth) message in the security_blob field.
|
269
284
|
#
|
270
|
-
# @param
|
285
|
+
# @param type3_message [String] the NTLM Type 3 message
|
271
286
|
# @param session_id [Integer] the temporary session id from the Type 2 response
|
272
287
|
# @return [RubySMB::SMB2::Packet::SessionSetupRequest] the second authentication packet to send
|
273
|
-
def smb2_ntlmssp_auth_packet(
|
274
|
-
type3_message = ntlm_client.init_context(type2_string)
|
275
|
-
self.session_key = ntlm_client.session_key
|
288
|
+
def smb2_ntlmssp_auth_packet(type3_message, session_id)
|
276
289
|
packet = RubySMB::SMB2::Packet::SessionSetupRequest.new
|
277
290
|
packet.smb2_header.session_id = session_id
|
278
291
|
packet.set_type3_blob(type3_message.serialize)
|
279
292
|
packet
|
280
293
|
end
|
281
294
|
|
295
|
+
# Extract and store useful information about the peer/server from the
|
296
|
+
# NTLM Type 2 (challenge) TargetInfo fields.
|
297
|
+
#
|
298
|
+
# @param target_info_str [String] the Target Info string
|
299
|
+
def store_target_info(target_info_str)
|
300
|
+
target_info = Net::NTLM::TargetInfo.new(target_info_str)
|
301
|
+
{
|
302
|
+
Net::NTLM::TargetInfo::MSV_AV_NB_COMPUTER_NAME => :@default_name,
|
303
|
+
Net::NTLM::TargetInfo::MSV_AV_NB_DOMAIN_NAME => :@default_domain,
|
304
|
+
Net::NTLM::TargetInfo::MSV_AV_DNS_COMPUTER_NAME => :@dns_host_name,
|
305
|
+
Net::NTLM::TargetInfo::MSV_AV_DNS_DOMAIN_NAME => :@dns_domain_name,
|
306
|
+
Net::NTLM::TargetInfo::MSV_AV_DNS_TREE_NAME => :@dns_tree_name
|
307
|
+
}.each do |constant, attribute|
|
308
|
+
if target_info.av_pairs[constant]
|
309
|
+
value = target_info.av_pairs[constant].dup
|
310
|
+
value.force_encoding('UTF-16LE')
|
311
|
+
instance_variable_set(attribute, value.encode('UTF-8'))
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
282
315
|
|
316
|
+
# Extract the peer/server version number from the NTLM Type 2 (challenge)
|
317
|
+
# Version field.
|
318
|
+
#
|
319
|
+
# @param version [String] the version number as a binary string
|
320
|
+
# @return [String] the formated version number (<major>.<minor>.<build>)
|
321
|
+
def extract_os_version(version)
|
322
|
+
version.unpack('CCS').join('.')
|
323
|
+
end
|
283
324
|
end
|
284
325
|
end
|
285
|
-
end
|
326
|
+
end
|
data/lib/ruby_smb/client/echo.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
module RubySMB
|
2
2
|
class Client
|
3
|
-
|
4
3
|
# Contains the methods for doing ECHO commands
|
5
4
|
module Echo
|
6
|
-
|
7
5
|
# Sends an ECHO request packet and returns the
|
8
6
|
# last response packet.
|
9
7
|
#
|
@@ -21,7 +19,6 @@ module RubySMB
|
|
21
19
|
RubySMB::SMB1::Packet::EchoResponse.read(raw_response)
|
22
20
|
end
|
23
21
|
|
24
|
-
|
25
22
|
# Sends an ECHO request packet and returns the
|
26
23
|
# response packet.
|
27
24
|
#
|
@@ -33,4 +30,4 @@ module RubySMB
|
|
33
30
|
end
|
34
31
|
end
|
35
32
|
end
|
36
|
-
end
|
33
|
+
end
|
@@ -3,37 +3,38 @@ module RubySMB
|
|
3
3
|
class Client
|
4
4
|
# This module holds all of the methods backing the {RubySMB::Client#negotiate} method
|
5
5
|
module Negotiation
|
6
|
-
|
7
6
|
# Handles the entire SMB Multi-Protocol Negotiation from the
|
8
7
|
# Client to the Server. It sets state on the client appropriate
|
9
8
|
# to the protocol and capabilites negotiated during the exchange.
|
9
|
+
# It also keeps track of the negotiated dialect.
|
10
10
|
#
|
11
11
|
# @return [void]
|
12
12
|
def negotiate
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
13
|
+
request_packet = negotiate_request
|
14
|
+
raw_response = send_recv(request_packet)
|
15
|
+
response_packet = negotiate_response(raw_response)
|
16
|
+
# The list of dialect identifiers sent to the server is stored
|
17
|
+
# internally to be able to retrieve the negotiated dialect later on.
|
18
|
+
# This is only valid for SMB1.
|
19
|
+
response_packet.dialects = request_packet.dialects if response_packet.respond_to? :dialects=
|
20
|
+
parse_negotiate_response(response_packet)
|
21
|
+
rescue RubySMB::Error::InvalidPacket, Errno::ECONNRESET
|
22
|
+
error = 'Unable to Negotiate with remote host'
|
23
|
+
error << ', SMB1 may be disabled' if smb1 && !smb2
|
24
|
+
raise RubySMB::Error::NegotiationFailure, error
|
24
25
|
end
|
25
26
|
|
26
|
-
# Creates
|
27
|
-
#
|
27
|
+
# Creates the first Negotiate Request Packet according to the SMB version
|
28
|
+
# used.
|
28
29
|
#
|
29
|
-
# @return [
|
30
|
+
# @return [RubySMB::SMB1::Packet::NegotiateRequest] a SMB1 Negotiate Request packet if SMB1 is used
|
31
|
+
# @return [RubySMB::SMB1::Packet::NegotiateRequest] a SMB2 Negotiate Request packet if SMB2 is used
|
30
32
|
def negotiate_request
|
31
33
|
if smb1
|
32
|
-
|
34
|
+
smb1_negotiate_request
|
33
35
|
elsif smb2
|
34
|
-
|
36
|
+
smb2_negotiate_request
|
35
37
|
end
|
36
|
-
send_recv(request)
|
37
38
|
end
|
38
39
|
|
39
40
|
# Takes the raw response data from the server and tries
|
@@ -48,57 +49,57 @@ module RubySMB
|
|
48
49
|
if smb1
|
49
50
|
begin
|
50
51
|
packet = RubySMB::SMB1::Packet::NegotiateResponseExtended.read raw_data
|
51
|
-
rescue
|
52
|
+
rescue StandardError => e
|
52
53
|
raise RubySMB::Error::InvalidPacket, "Not a Valid SMB1 Negoitate Response #{e.message}"
|
53
54
|
end
|
54
|
-
if packet.valid?
|
55
|
-
response = packet
|
56
|
-
end
|
55
|
+
response = packet if packet.valid?
|
57
56
|
end
|
58
57
|
if smb2 && response.nil?
|
59
58
|
begin
|
60
59
|
packet = RubySMB::SMB2::Packet::NegotiateResponse.read raw_data
|
61
|
-
rescue
|
60
|
+
rescue StandardError => e
|
62
61
|
raise RubySMB::Error::InvalidPacket, "Not a Valid SMB2 Negoitate Response #{e.message}"
|
63
62
|
end
|
64
63
|
response = packet
|
65
64
|
end
|
66
65
|
if response.nil?
|
67
|
-
raise RubySMB::Error::InvalidPacket,
|
66
|
+
raise RubySMB::Error::InvalidPacket, 'No Valid Negotiate Response found'
|
68
67
|
end
|
69
68
|
response
|
70
69
|
end
|
71
70
|
|
72
71
|
# Sets the supported SMB Protocol and whether or not
|
73
72
|
# Signing is enabled based on the Negotiate Response Packet.
|
73
|
+
# It also stores the negotiated dialect.
|
74
74
|
#
|
75
75
|
# @param packet [RubySMB::SMB1::Packet::NegotiateResponseExtended] if SMB1 was negotiated
|
76
76
|
# @param packet [RubySMB::SMB2::Packet::NegotiateResponse] if SMB2 was negotiated
|
77
|
-
# @return [
|
77
|
+
# @return [String] The SMB version as a string ('SMB1', 'SMB2')
|
78
78
|
def parse_negotiate_response(packet)
|
79
79
|
case packet
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
80
|
+
when RubySMB::SMB1::Packet::NegotiateResponseExtended
|
81
|
+
self.smb1 = true
|
82
|
+
self.smb2 = false
|
83
|
+
if packet.parameter_block.security_mode.security_signatures_required == 1
|
84
|
+
self.signing_required = true
|
85
|
+
else
|
86
|
+
self.signing_required = false
|
87
|
+
end
|
88
|
+
self.dialect = packet.negotiated_dialect.to_s
|
89
|
+
'SMB1'
|
90
|
+
when RubySMB::SMB2::Packet::NegotiateResponse
|
91
|
+
self.smb1 = false
|
92
|
+
self.smb2 = true
|
93
|
+
self.signing_required = if packet.security_mode.signing_required == 1
|
94
|
+
true
|
95
|
+
else
|
96
|
+
false
|
97
|
+
end
|
98
|
+
self.dialect = "0x%04x" % packet.dialect_revision
|
99
|
+
'SMB2'
|
98
100
|
end
|
99
101
|
end
|
100
102
|
|
101
|
-
|
102
103
|
# Create a {RubySMB::SMB1::Packet::NegotiateRequest} packet with the
|
103
104
|
# dialects filled in based on the protocol options set on the Client.
|
104
105
|
#
|
@@ -130,4 +131,4 @@ module RubySMB
|
|
130
131
|
end
|
131
132
|
end
|
132
133
|
end
|
133
|
-
end
|
134
|
+
end
|
@@ -1,9 +1,7 @@
|
|
1
1
|
module RubySMB
|
2
2
|
class Client
|
3
|
-
|
4
3
|
# Contains the methods for handling packet signing
|
5
4
|
module Signing
|
6
|
-
|
7
5
|
# The NTLM Session Key used for signing
|
8
6
|
# @!attribute [rw] session_key
|
9
7
|
# @return [String]
|
@@ -16,17 +14,15 @@ module RubySMB
|
|
16
14
|
# @param packet [RubySMB::GenericPacket] the packet to sign
|
17
15
|
# @return [RubySMB::GenericPacket] the packet, signed if needed
|
18
16
|
def smb1_sign(packet)
|
19
|
-
if
|
17
|
+
if signing_required && !session_key.empty?
|
20
18
|
# Pack the Sequence counter into a int64le
|
21
|
-
packed_sequence_counter = [
|
19
|
+
packed_sequence_counter = [sequence_counter].pack('Q<')
|
22
20
|
packet.smb_header.security_features = packed_sequence_counter
|
23
|
-
signature = OpenSSL::Digest::MD5.digest(
|
21
|
+
signature = OpenSSL::Digest::MD5.digest(session_key + packet.to_binary_s)[0, 8]
|
24
22
|
packet.smb_header.security_features = signature
|
25
23
|
self.sequence_counter += 1
|
26
|
-
packet
|
27
|
-
else
|
28
|
-
packet
|
29
24
|
end
|
25
|
+
packet
|
30
26
|
end
|
31
27
|
|
32
28
|
# Take an SMB2 packet and checks to see if it should be signed.
|
@@ -36,17 +32,14 @@ module RubySMB
|
|
36
32
|
# @param packet [RubySMB::GenericPacket] the packet to sign
|
37
33
|
# @return [RubySMB::GenericPacket] the packet, signed if needed
|
38
34
|
def smb2_sign(packet)
|
39
|
-
if
|
35
|
+
if signing_required && !session_key.empty?
|
40
36
|
packet.smb2_header.flags.signed = 1
|
41
37
|
packet.smb2_header.signature = "\x00" * 16
|
42
|
-
hmac = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new,
|
43
|
-
packet.smb2_header.signature = hmac[0,16]
|
44
|
-
packet
|
45
|
-
else
|
46
|
-
packet
|
38
|
+
hmac = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new, session_key, packet.to_binary_s)
|
39
|
+
packet.smb2_header.signature = hmac[0, 16]
|
47
40
|
end
|
41
|
+
packet
|
48
42
|
end
|
49
|
-
|
50
43
|
end
|
51
44
|
end
|
52
|
-
end
|
45
|
+
end
|