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
@@ -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
|