ruby_smb 0.0.18 → 0.0.19
Sign up to get free protection for your applications and to get access to all the features.
- 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
|