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
@@ -0,0 +1,26 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileFullDirectoryInformation Class as defined in
|
5
|
+
# [2.4.14 FileFullDirectoryInformation](https://msdn.microsoft.com/en-us/library/cc232068.aspx)
|
6
|
+
class FileFullDirectoryInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_FULL_DIRECTORY_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
uint32 :next_offset, label: 'Next Entry Offset'
|
12
|
+
uint32 :file_index, label: 'File Index'
|
13
|
+
file_time :create_time, label: 'Create Time'
|
14
|
+
file_time :last_access, label: 'Last Accessed Time'
|
15
|
+
file_time :last_write, label: 'Last Write Time'
|
16
|
+
file_time :last_change, label: 'Last Modified Time'
|
17
|
+
uint64 :end_of_file, label: 'End of File'
|
18
|
+
uint64 :allocation_size, label: 'Allocated Size'
|
19
|
+
file_attributes :file_attributes, label: 'File Attributes'
|
20
|
+
uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
|
21
|
+
uint32 :ea_size, label: 'Extended Attributes Size'
|
22
|
+
string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileIdBothDirectoryInformation Class as defined in
|
5
|
+
# [2.4.17 FileIdBothDirectoryInformation](https://msdn.microsoft.com/en-us/library/cc232070.aspx)
|
6
|
+
class FileIdBothDirectoryInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_ID_BOTH_DIRECTORY_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
uint32 :next_offset, label: 'Next Entry Offset'
|
12
|
+
uint32 :file_index, label: 'File Index'
|
13
|
+
file_time :create_time, label: 'Create Time'
|
14
|
+
file_time :last_access, label: 'Last Accessed Time'
|
15
|
+
file_time :last_write, label: 'Last Write Time'
|
16
|
+
file_time :last_change, label: 'Last Modified Time'
|
17
|
+
uint64 :end_of_file, label: 'End of File'
|
18
|
+
uint64 :allocation_size, label: 'Allocated Size'
|
19
|
+
file_attributes :file_attributes, label: 'File Attributes'
|
20
|
+
uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
|
21
|
+
uint32 :ea_size, label: 'Extended Attributes Size'
|
22
|
+
uint8 :short_name_length, label: 'Short Name Length'
|
23
|
+
uint8 :reserved, label: 'Reserved Space'
|
24
|
+
string16 :short_name, label: 'File Short Name', length: 24
|
25
|
+
uint16 :reserved2, label: 'Reserved Space'
|
26
|
+
uint64 :file_id, label: 'File Id'
|
27
|
+
string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileIdDirectoryInformation Class as defined in
|
5
|
+
# [2.4.18 FileIdFullDirectoryInformation](https://msdn.microsoft.com/en-us/library/cc232071.aspx)
|
6
|
+
class FileIdFullDirectoryInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_ID_FULL_DIRECTORY_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
uint32 :next_offset, label: 'Next Entry Offset'
|
12
|
+
uint32 :file_index, label: 'File Index'
|
13
|
+
file_time :create_time, label: 'Create Time'
|
14
|
+
file_time :last_access, label: 'Last Accessed Time'
|
15
|
+
file_time :last_write, label: 'Last Write Time'
|
16
|
+
file_time :last_change, label: 'Last Modified Time'
|
17
|
+
uint64 :end_of_file, label: 'End of File'
|
18
|
+
uint64 :allocation_size, label: 'Allocated Size'
|
19
|
+
file_attributes :file_attributes, label: 'File Attributes'
|
20
|
+
uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
|
21
|
+
uint32 :ea_size, label: 'Extended Attributes Size'
|
22
|
+
uint32 :reserved, label: 'Reserved Space'
|
23
|
+
uint64 :file_id, label: 'File ID'
|
24
|
+
string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileNamesInformation Class as defined in
|
5
|
+
# [2.4.26 FileNamesInformation](https://msdn.microsoft.com/en-us/library/cc232077.aspx)
|
6
|
+
class FileNamesInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_NAMES_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
uint32 :next_offset, label: 'Next Entry Offset'
|
12
|
+
uint32 :file_index, label: 'File Index'
|
13
|
+
uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
|
14
|
+
string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module RubySMB
|
2
|
+
module Fscc
|
3
|
+
module FileInformation
|
4
|
+
# The FileRenameInformation Class as defined in
|
5
|
+
# [2.4.34.2 FileRenameInformation](https://msdn.microsoft.com/en-us/library/cc704597.aspx)
|
6
|
+
class FileRenameInformation < BinData::Record
|
7
|
+
CLASS_LEVEL = FileInformation::FILE_ID_FULL_DIRECTORY_INFORMATION
|
8
|
+
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
uint8 :replace_if_exists, label: 'Replace If Exists'
|
12
|
+
|
13
|
+
choice :reserved, selection: -> { get_smb_version } do
|
14
|
+
uint24 1, label: 'Reserved Space'
|
15
|
+
uint56 2, label: 'Reserved Space'
|
16
|
+
end
|
17
|
+
|
18
|
+
choice :root_directory, selection: -> { get_smb_version } do
|
19
|
+
uint32 1, label: 'Root Directory', initial_value: 0
|
20
|
+
uint64 2, label: 'Root Directory', initial_value: 0
|
21
|
+
end
|
22
|
+
|
23
|
+
uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
|
24
|
+
string :file_name, label: 'File Name', read_length: -> { file_name_length }
|
25
|
+
|
26
|
+
def get_smb_version(obj = self)
|
27
|
+
# Return version 1 by default in case the structure is not part of a
|
28
|
+
# SMB packet. This way, we can still instantiate this structure
|
29
|
+
# independently without breaking the "choice" logic.
|
30
|
+
return 1 if obj.nil?
|
31
|
+
smb_version = if obj.respond_to?(:smb_header)
|
32
|
+
1
|
33
|
+
elsif obj.respond_to?(:smb2_header)
|
34
|
+
2
|
35
|
+
else
|
36
|
+
get_smb_version(obj.parent)
|
37
|
+
end
|
38
|
+
return smb_version
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -21,16 +21,38 @@ module RubySMB
|
|
21
21
|
display_str
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
24
|
def packet_smb_version
|
26
25
|
class_name = self.class.to_s
|
27
26
|
case class_name
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
27
|
+
when /SMB1/
|
28
|
+
'SMB1'
|
29
|
+
when /SMB2/
|
30
|
+
'SMB2'
|
31
|
+
else
|
32
|
+
''
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Overrides the class #read method with some automatic
|
37
|
+
# exception handling. If an {EOFError} is thrown, it will try
|
38
|
+
# to read the data into the protocol specific empty ErrorPacket
|
39
|
+
# so that the NTstatus code can be read. We re-raise the exception
|
40
|
+
# in the event that it is not an SMB1 or SMB2 packet, or if it is
|
41
|
+
# already an error packet.
|
42
|
+
def self.read(val)
|
43
|
+
begin
|
44
|
+
super(val)
|
45
|
+
rescue EOFError => e
|
46
|
+
case self.to_s
|
47
|
+
when /EmptyPacket|ErrorPacket/
|
48
|
+
raise e
|
49
|
+
when /SMB1/
|
50
|
+
RubySMB::SMB1::Packet::EmptyPacket.read(val)
|
51
|
+
when /SMB2/
|
52
|
+
RubySMB::SMB2::Packet::ErrorPacket.read(val)
|
53
|
+
else
|
54
|
+
raise e
|
55
|
+
end
|
34
56
|
end
|
35
57
|
end
|
36
58
|
|
@@ -38,10 +60,10 @@ module RubySMB
|
|
38
60
|
value = -1
|
39
61
|
smb_version = packet_smb_version
|
40
62
|
case smb_version
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
63
|
+
when 'SMB1'
|
64
|
+
value = smb_header.nt_status.value
|
65
|
+
when 'SMB2'
|
66
|
+
value = smb2_header.nt_status.value
|
45
67
|
end
|
46
68
|
status_code = WindowsError::NTStatus.find_by_retval(value).first
|
47
69
|
if status_code.nil?
|
@@ -50,8 +72,6 @@ module RubySMB
|
|
50
72
|
status_code
|
51
73
|
end
|
52
74
|
|
53
|
-
private
|
54
|
-
|
55
75
|
# Returns an array of hashes representing the
|
56
76
|
# fields for this record.
|
57
77
|
#
|
@@ -77,7 +97,7 @@ module RubySMB
|
|
77
97
|
name.capitalize!
|
78
98
|
end
|
79
99
|
formatted_name = "\n" + ("\t" * depth) + name
|
80
|
-
formatted_string =
|
100
|
+
formatted_string = format '%-30s %-10s %s', formatted_name, class_str, field[:label]
|
81
101
|
field[:fields].each do |sub_field|
|
82
102
|
formatted_string << format_field(sub_field, (depth + 1))
|
83
103
|
end
|
@@ -110,6 +130,8 @@ module RubySMB
|
|
110
130
|
field_hashes
|
111
131
|
end
|
112
132
|
|
133
|
+
private
|
134
|
+
|
113
135
|
# Takes a hash representation of a field in the packet structure and formats it
|
114
136
|
# into a string representing the contents of that field.
|
115
137
|
#
|
@@ -135,8 +157,8 @@ module RubySMB
|
|
135
157
|
if field[:class].ancestors.include? BinData::Record
|
136
158
|
field_str = label
|
137
159
|
else
|
138
|
-
value =
|
139
|
-
field_str =
|
160
|
+
value = send(name)
|
161
|
+
field_str = format '%-30s %s', label, value
|
140
162
|
end
|
141
163
|
else
|
142
164
|
parent = self
|
@@ -146,7 +168,7 @@ module RubySMB
|
|
146
168
|
value = parent.send(name)
|
147
169
|
label = field[:label] || name.to_s.capitalize
|
148
170
|
label = "\n" + ("\t" * depth) + label
|
149
|
-
field_str =
|
171
|
+
field_str = format '%-30s %s', label, value
|
150
172
|
end
|
151
173
|
end
|
152
174
|
my_parents << name
|
@@ -173,7 +195,7 @@ module RubySMB
|
|
173
195
|
value = sub_field.send(name)
|
174
196
|
label ||= name
|
175
197
|
label = "\n" + "\t" * depth + label
|
176
|
-
sub_field_str =
|
198
|
+
sub_field_str = format '%-30s %s', label, value
|
177
199
|
array_field_str << sub_field_str
|
178
200
|
end
|
179
201
|
end
|
data/lib/ruby_smb/gss.rb
CHANGED
@@ -1,27 +1,25 @@
|
|
1
1
|
module RubySMB
|
2
|
-
|
3
2
|
# module containing methods required for using the [GSS-API](http://www.rfc-editor.org/rfc/rfc2743.txt)
|
4
3
|
# for Secure Protected Negotiation(SPNEGO) in SMB Authentication.
|
5
4
|
module Gss
|
6
|
-
|
7
5
|
# Cargo culted from Rex. Hacked Together ASN1 encoding that works for our GSS purposes
|
8
6
|
# @todo Document these magic numbers
|
9
7
|
def self.asn1encode(str = '')
|
10
8
|
# If the high bit of the first byte is 1, it contains the number of
|
11
9
|
# length bytes that follow
|
12
10
|
case str.length
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
11
|
+
when 0..0x7F
|
12
|
+
encoded_string = [str.length].pack('C') + str
|
13
|
+
when 0x80..0xFF
|
14
|
+
encoded_string = [0x81, str.length].pack('CC') + str
|
15
|
+
when 0x100..0xFFFF
|
16
|
+
encoded_string = [0x82, str.length].pack('Cn') + str
|
17
|
+
when 0x10000..0xffffff
|
18
|
+
encoded_string = [0x83, str.length >> 16, str.length & 0xFFFF].pack('CCn') + str
|
19
|
+
when 0x1000000..0xffffffff
|
20
|
+
encoded_string = [0x84, str.length].pack('CN') + str
|
21
|
+
else
|
22
|
+
raise RubySMB::Error::ASN1Encoding, "Source string is too long. Size is #{str.length}"
|
25
23
|
end
|
26
24
|
encoded_string
|
27
25
|
end
|
@@ -29,71 +27,69 @@ module RubySMB
|
|
29
27
|
# Create a GSS Security Blob of an NTLM Type 1 Message.
|
30
28
|
# This code has been cargo culted and needs to be researched
|
31
29
|
# and refactored into something better later.
|
32
|
-
|
30
|
+
# @todo Refactor this into non-magical code
|
33
31
|
def self.gss_type1(type1)
|
34
|
-
"\x60".force_encoding(
|
35
|
-
"\x06".force_encoding(
|
36
|
-
"\x2b\x06\x01\x05\x05\x02".force_encoding(
|
32
|
+
"\x60".force_encoding('binary') + asn1encode(
|
33
|
+
"\x06".force_encoding('binary') + asn1encode(
|
34
|
+
"\x2b\x06\x01\x05\x05\x02".force_encoding('binary')
|
37
35
|
) +
|
38
|
-
"\xa0".force_encoding(
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
36
|
+
"\xa0".force_encoding('binary') + asn1encode(
|
37
|
+
"\x30".force_encoding('binary') + asn1encode(
|
38
|
+
"\xa0".force_encoding('binary') + asn1encode(
|
39
|
+
"\x30".force_encoding('binary') + asn1encode(
|
40
|
+
"\x06".force_encoding('binary') + asn1encode(
|
41
|
+
"\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a".force_encoding('binary')
|
42
|
+
)
|
43
|
+
)
|
44
|
+
) +
|
45
|
+
"\xa2".force_encoding('binary') + asn1encode(
|
46
|
+
"\x04".force_encoding('binary') + asn1encode(
|
47
|
+
type1
|
48
|
+
)
|
44
49
|
)
|
45
|
-
)
|
46
|
-
) +
|
47
|
-
"\xa2".force_encoding("binary") + self.asn1encode(
|
48
|
-
"\x04".force_encoding("binary") + self.asn1encode(
|
49
|
-
type1
|
50
|
-
)
|
51
50
|
)
|
52
51
|
)
|
53
|
-
)
|
54
52
|
)
|
55
53
|
end
|
56
54
|
|
57
|
-
|
58
55
|
# Create a GSS Security Blob of an NTLM Type 2 Message.
|
59
56
|
# This code has been cargo culted and needs to be researched
|
60
57
|
# and refactored into something better later.
|
61
58
|
def self.gss_type2(type2)
|
62
|
-
|
63
59
|
blob =
|
64
|
-
"\xa1" +
|
65
|
-
"\x30" +
|
66
|
-
"\xa0" +
|
67
|
-
"\x0a" +
|
60
|
+
"\xa1" + asn1encode(
|
61
|
+
"\x30" + asn1encode(
|
62
|
+
"\xa0" + asn1encode(
|
63
|
+
"\x0a" + asn1encode(
|
68
64
|
"\x01"
|
69
65
|
)
|
70
66
|
) +
|
71
|
-
"\xa1" +
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
"\xa2" +
|
77
|
-
|
78
|
-
|
67
|
+
"\xa1" + asn1encode(
|
68
|
+
"\x06" + asn1encode(
|
69
|
+
"\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a"
|
70
|
+
)
|
71
|
+
) +
|
72
|
+
"\xa2" + asn1encode(
|
73
|
+
"\x04" + asn1encode(
|
74
|
+
type2
|
75
|
+
)
|
79
76
|
)
|
80
|
-
)
|
81
77
|
)
|
82
78
|
)
|
83
79
|
|
84
|
-
|
80
|
+
blob
|
85
81
|
end
|
86
82
|
|
87
83
|
# Create a GSS Security Blob of an NTLM Type 3 Message.
|
88
84
|
# This code has been cargo culted and needs to be researched
|
89
85
|
# and refactored into something better later.
|
90
|
-
|
86
|
+
# @todo Refactor this into non-magical code
|
91
87
|
def self.gss_type3(type3)
|
92
88
|
gss =
|
93
|
-
"\xa1".force_encoding(
|
94
|
-
"\x30".force_encoding(
|
95
|
-
"\xa2".force_encoding(
|
96
|
-
"\x04".force_encoding(
|
89
|
+
"\xa1".force_encoding('binary') + asn1encode(
|
90
|
+
"\x30".force_encoding('binary') + asn1encode(
|
91
|
+
"\xa2".force_encoding('binary') + asn1encode(
|
92
|
+
"\x04".force_encoding('binary') + asn1encode(
|
97
93
|
type3
|
98
94
|
)
|
99
95
|
)
|
@@ -102,8 +98,5 @@ module RubySMB
|
|
102
98
|
|
103
99
|
gss
|
104
100
|
end
|
105
|
-
|
106
|
-
|
107
|
-
|
108
101
|
end
|
109
|
-
end
|
102
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module RubySMB
|
2
2
|
# Contains constants for the various Impersonation levels as defined in
|
3
|
-
# [2.2.4.64.1 Request](https://msdn.microsoft.com/en-us/library/ee442175.aspx)
|
3
|
+
# [2.2.4.64.1 Request](https://msdn.microsoft.com/en-us/library/ee442175.aspx) and
|
4
|
+
# [2.2.4.9.1 Client Request Extensions](https://msdn.microsoft.com/en-us/library/cc246332.aspx)
|
4
5
|
# See also [Impersonation Levels](https://msdn.microsoft.com/en-us/library/ms686632(v=vs.85).aspx)
|
5
6
|
module ImpersonationLevels
|
6
7
|
# The client is anonymous to the server. The server process can impersonate the client, but the impersonation
|
@@ -18,5 +19,9 @@ module RubySMB
|
|
18
19
|
# that are on the same computer as the server.
|
19
20
|
SEC_IMPERSONATE = 0x00000002
|
20
21
|
|
22
|
+
# The most powerful impersonation level. When this level is selected, the server (whether local or remote)
|
23
|
+
# can impersonate the client's security context while acting on behalf of the client. During impersonation,
|
24
|
+
# the client's credentials (both local and network) can be passed to any number of computers.
|
25
|
+
SEC_DELEGATE = 0x00000003
|
21
26
|
end
|
22
|
-
end
|
27
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module RubySMB
|
2
|
+
# Namespace for all of the NetBIOS packets used by RubySMB
|
3
|
+
module Nbss
|
4
|
+
# Session Packet Types
|
5
|
+
SESSION_MESSAGE = 0x00
|
6
|
+
SESSION_REQUEST = 0x81
|
7
|
+
POSITIVE_SESSION_RESPONSE = 0x82
|
8
|
+
NEGATIVE_SESSION_RESPONSE = 0x83
|
9
|
+
RETARGET_SESSION_RESPONSE = 0x84
|
10
|
+
SESSION_KEEP_ALIVE = 0x85
|
11
|
+
|
12
|
+
require 'ruby_smb/nbss/session_header'
|
13
|
+
require 'ruby_smb/nbss/session_request'
|
14
|
+
require 'ruby_smb/nbss/negative_session_response'
|
15
|
+
end
|
16
|
+
end
|