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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8937795d135978de5a71c04da91bdd44ac2d44ce
|
4
|
+
data.tar.gz: 37563d2e539ae97ae98a9fc5df32eeb4d51a408e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 106b8d06d0d2a269d18cb1c92234cc8f885d4c869cb2893fa4ec945045a95decb6b8a1b597c3c20341dac3e22c649d6da06480e75413cdea10988ec4b8c7a481
|
7
|
+
data.tar.gz: 74c2e0a872f71a60b297c42b34c1abf3c15d33377f23b86ba4491c91251970d7b21febb93003ecfbb0a931313610207e8b389f2f5b21c37344399cb6e346171c
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -4,16 +4,17 @@
|
|
4
4
|
[](https://codeclimate.com/github/rapid7/ruby_smb)
|
5
5
|
[](https://coveralls.io/github/rapid7/ruby_smb?branch=master)
|
6
6
|
|
7
|
-
A
|
7
|
+
A native Ruby implementation of the SMB Protocol Family. It currently supports
|
8
|
+
1. [[MS-SMB]](https://msdn.microsoft.com/en-us/library/cc246231.aspx)
|
9
|
+
1. [[MS-SMB2]](http://msdn.microsoft.com/en-us/library/cc246482.aspx)
|
8
10
|
|
9
|
-
|
11
|
+
This library currently include both a Client level, and Packet level support. A user can aprse and manipulate raw
|
12
|
+
SMB packets, or simply use the simple client to perform SMB operations.
|
10
13
|
|
11
|
-
|
14
|
+
See the Wiki for more information on this porject's long-term goals, style guide, and developer tips.
|
12
15
|
|
13
16
|
## Installation
|
14
17
|
|
15
|
-
This gem has not yet been released, but when it is, do this:
|
16
|
-
|
17
18
|
Add this line to your application's Gemfile:
|
18
19
|
|
19
20
|
```ruby
|
@@ -30,7 +31,246 @@ Or install it yourself as:
|
|
30
31
|
|
31
32
|
## Usage
|
32
33
|
|
33
|
-
|
34
|
+
### Defining a packet
|
35
|
+
|
36
|
+
All packets are done in a declarative style with BinData. Nested data structures are used where appropriate to give users
|
37
|
+
the easiest method of adjusting data, all the way down to the bit level in case of bit masks.
|
38
|
+
|
39
|
+
#### SMB1
|
40
|
+
SMB1 Packets are made up of three basic components:
|
41
|
+
1. **The SMB Header** - This is a standard SMB Header. All SMB1 packets use the same SMB header.
|
42
|
+
1. **The Parameter Block** - This is where function parameters are passed across the wire in the packet. Parameter Blocks will always
|
43
|
+
have a 'Word Count' field that gives the size of the Parameter Block in words(2-bytes)
|
44
|
+
1. **The Data Block** - This is the data section of the packet. the Data Block will always have a 'byte count' field that gives the size of
|
45
|
+
the Data block in bytes.
|
46
|
+
|
47
|
+
The SMB Header can always just be declared as a field in the BinData DSL for the packet class, because its structure never changes.
|
48
|
+
For the ParameterBlock and DataBlocks, we always define subclasses for this particular packet. They inherit the 'Word Count' and
|
49
|
+
'Byte Count' fields, along with the auto-calculation routines for those fields, from their ancestors. Any other fields are then
|
50
|
+
defined in our subclass before we start the DSL declarations for the packet.
|
51
|
+
|
52
|
+
Example:
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
module RubySMB
|
56
|
+
module SMB1
|
57
|
+
module Packet
|
58
|
+
|
59
|
+
# This class represents an SMB1 TreeConnect Request Packet as defined in
|
60
|
+
# [2.2.4.7.1 Client Request Extensions](https://msdn.microsoft.com/en-us/library/cc246330.aspx)
|
61
|
+
class TreeConnectRequest < RubySMB::GenericPacket
|
62
|
+
|
63
|
+
# A SMB1 Parameter Block as defined by the {TreeConnectRequest}
|
64
|
+
class ParameterBlock < RubySMB::SMB1::ParameterBlock
|
65
|
+
and_x_block :andx_block
|
66
|
+
tree_connect_flags :flags
|
67
|
+
uint16 :password_length, label: 'Password Length', initial_value: 0x01
|
68
|
+
end
|
69
|
+
|
70
|
+
class DataBlock < RubySMB::SMB1::DataBlock
|
71
|
+
stringz :password, label: 'Password Field', initial_value: '', length: lambda { self.parent.parameter_block.password_length }
|
72
|
+
stringz :path, label: 'Resource Path'
|
73
|
+
stringz :service, label: 'Resource Type', initial_value: '?????'
|
74
|
+
end
|
75
|
+
|
76
|
+
smb_header :smb_header
|
77
|
+
parameter_block :parameter_block
|
78
|
+
data_block :data_block
|
79
|
+
|
80
|
+
def initialize_instance
|
81
|
+
super
|
82
|
+
smb_header.command = RubySMB::SMB1::Commands::SMB_COM_TREE_CONNECT
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
```
|
90
|
+
|
91
|
+
#### SMB2
|
92
|
+
|
93
|
+
SMB2 Packets are far simpler than their older SMB1 counterparts. We still abstract out the SMB2 header since it is the same
|
94
|
+
structure used for every packet. Beyond that, the SMB2 packet is relatively flat in comparison to SMB1.
|
95
|
+
|
96
|
+
Example:
|
97
|
+
```ruby
|
98
|
+
module RubySMB
|
99
|
+
module SMB2
|
100
|
+
module Packet
|
101
|
+
|
102
|
+
# An SMB2 TreeConnectRequest Packet as defined in
|
103
|
+
# [2.2.9 SMB2 TREE_CONNECT Request](https://msdn.microsoft.com/en-us/library/cc246567.aspx)
|
104
|
+
class TreeConnectRequest < RubySMB::GenericPacket
|
105
|
+
endian :little
|
106
|
+
smb2_header :smb2_header
|
107
|
+
uint16 :structure_size, label: 'Structure Size', initial_value: 9
|
108
|
+
uint16 :flags, label: 'Flags', initial_value: 0x00
|
109
|
+
uint16 :path_offset, label: 'Path Offset', initial_value: 0x48
|
110
|
+
uint16 :path_length, label: 'Path Length', initial_value: lambda { self.path.length }
|
111
|
+
string :path, label: 'Path Buffer'
|
112
|
+
|
113
|
+
def initialize_instance
|
114
|
+
super
|
115
|
+
smb2_header.command = RubySMB::SMB2::Commands::TREE_CONNECT
|
116
|
+
end
|
117
|
+
|
118
|
+
def encode_path(path)
|
119
|
+
self.path = path.encode("utf-16le")
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
```
|
126
|
+
|
127
|
+
### Using a Packet class
|
128
|
+
|
129
|
+
#### Manually
|
130
|
+
You can instantiate an instance of a particular packet class, and then reach into the data structure to set or read explicit
|
131
|
+
values in a fairly straightforward manner.
|
132
|
+
|
133
|
+
Example:
|
134
|
+
```ruby
|
135
|
+
2.3.3 :001 > packet = RubySMB::SMB1::Packet::TreeConnectRequest.new
|
136
|
+
=> {:smb_header=>{:protocol=>4283649346, :command=>117, :nt_status=>0, :flags=>{:reply=>0, :opbatch=>0, :oplock=>0, :canonicalized_paths=>1, :case_insensitive=>1, :reserved=>0, :buf_avail=>0, :lock_and_read_ok=>0}, :flags2=>{:reserved1=>0, :is_long_name=>0, :reserved2=>0, :signature_required=>0, :compressed=>0, :security_signature=>0, :eas=>0, :long_names=>1, :unicode=>0, :nt_status=>1, :paging_io=>1, :dfs=>0, :extended_security=>0, :reparse_path=>0}, :pid_high=>0, :security_features=>"\x00\x00\x00\x00\x00\x00\x00\x00", :reserved=>0, :tid=>0, :pid_low=>0, :uid=>0, :mid=>0}, :parameter_block=>{:word_count=>4, :andx_block=>{:andx_command=>255, :andx_reserved=>0, :andx_offset=>0}, :flags=>{:reserved=>0, :extended_response=>1, :extended_signature=>0, :reserved2=>0, :disconnect=>0, :reserved3=>0, :reserved4=>0}, :password_length=>1}, :data_block=>{:byte_count=>8, :password=>"", :path=>"", :service=>"?????"}}
|
137
|
+
2.3.3 :002 > packet.parameter_block
|
138
|
+
=> {:word_count=>4, :andx_block=>{:andx_command=>255, :andx_reserved=>0, :andx_offset=>0}, :flags=>{:reserved=>0, :extended_response=>1, :extended_signature=>0, :reserved2=>0, :disconnect=>0, :reserved3=>0, :reserved4=>0}, :password_length=>1}
|
139
|
+
2.3.3 :003 > packet.parameter_block.flags
|
140
|
+
=> {:reserved=>0, :extended_response=>1, :extended_signature=>0, :reserved2=>0, :disconnect=>0, :reserved3=>0, :reserved4=>0}
|
141
|
+
2.3.3 :004 > packet.parameter_block.flags.extended_signature = 1
|
142
|
+
=> 1
|
143
|
+
2.3.3 :005 > packet.parameter_block.flags
|
144
|
+
=> {:reserved=>0, :extended_response=>1, :extended_signature=>1, :reserved2=>0, :disconnect=>0, :reserved3=>0, :reserved4=>0}
|
145
|
+
2.3.3 :006 >
|
146
|
+
2.3.3 :006 > packet.data_block.password = 'guest'
|
147
|
+
=> "guest"
|
148
|
+
2.3.3 :007 > packet.data_block.password
|
149
|
+
=> "guest"
|
150
|
+
2.3.3 :008 > packet.data_block
|
151
|
+
=> {:byte_count=>13, :password=>"guest", :path=>"", :service=>"?????"}
|
152
|
+
2.3.3 :009 >
|
153
|
+
```
|
154
|
+
|
155
|
+
You can also pass field/value pairs into the packet constructor as arguments, prefilling out certain fields
|
156
|
+
if you wish.
|
157
|
+
|
158
|
+
Example:
|
159
|
+
```ruby
|
160
|
+
2.3.3 :017 > packet = RubySMB::SMB2::Packet::TreeConnectRequest.new(path:'test')
|
161
|
+
=> {:smb2_header=>{:protocol=>4266872130, :structure_size=>64, :credit_charge=>0, :nt_status=>0, :command=>0, :credits=>0, :flags=>{:reserved3=>0, :signed=>0, :related_operations=>0, :async_command=>0, :reply=>0, :reserved2=>0, :reserved1=>0, :replay_operation=>0, :dfs_operation=>0}, :next_command=>0, :message_id=>0, :process_id=>65279, :tree_id=>0, :session_id=>0, :signature=>"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"}, :structure_size=>9, :flags=>0, :path_offset=>72, :path_length=>4, :path=>"test"}
|
162
|
+
2.3.3 :018 > packet.path
|
163
|
+
=> "test"
|
164
|
+
```
|
165
|
+
|
166
|
+
#### Reading from a Binary Blob
|
167
|
+
|
168
|
+
Sometimes you need to read a binary blob and apply one of the packet structures to it.
|
169
|
+
For example, when you are reading a response packet off of the wire, you will need to read the raw response
|
170
|
+
string into an actual packet class. This is done using the #read class method.
|
171
|
+
|
172
|
+
```ruby
|
173
|
+
2.3.3 :014 > blob = "\xFFSMB+\x00\x00\x00\x00\x98\x01`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00"
|
174
|
+
=> "\xFFSMB+\u0000\u0000\u0000\u0000\x98\u0001`\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000"
|
175
|
+
2.3.3 :015 > packet = RubySMB::SMB1::Packet::EchoResponse.read(blob)
|
176
|
+
=> {:smb_header=>{:protocol=>4283649346, :command=>43, :nt_status=>0, :flags=>{:reply=>1, :opbatch=>0, :oplock=>0, :canonicalized_paths=>1, :case_insensitive=>1, :reserved=>0, :buf_avail=>0, :lock_and_read_ok=>0}, :flags2=>{:reserved1=>0, :is_long_name=>0, :reserved2=>0, :signature_required=>0, :compressed=>0, :security_signature=>0, :eas=>0, :long_names=>1, :unicode=>0, :nt_status=>1, :paging_io=>1, :dfs=>0, :extended_security=>0, :reparse_path=>0}, :pid_high=>0, :security_features=>"\x00\x00\x00\x00\x00\x00\x00\x00", :reserved=>0, :tid=>0, :pid_low=>0, :uid=>0, :mid=>0}, :parameter_block=>{:word_count=>1, :sequence_number=>0}, :data_block=>{:byte_count=>0, :data=>""}}
|
177
|
+
2.3.3 :016 >
|
178
|
+
```
|
179
|
+
|
180
|
+
#### Outputting to a Binary Blob
|
181
|
+
Any structure or packet in rubySMB can also be output back into a binary blob using
|
182
|
+
BinData's #to_binary_s method.
|
183
|
+
|
184
|
+
Example:
|
185
|
+
```ruby
|
186
|
+
2.3.3 :012 > packet = RubySMB::SMB1::Packet::EchoResponse.new
|
187
|
+
=> {:smb_header=>{:protocol=>4283649346, :command=>43, :nt_status=>0, :flags=>{:reply=>1, :opbatch=>0, :oplock=>0, :canonicalized_paths=>1, :case_insensitive=>1, :reserved=>0, :buf_avail=>0, :lock_and_read_ok=>0}, :flags2=>{:reserved1=>0, :is_long_name=>0, :reserved2=>0, :signature_required=>0, :compressed=>0, :security_signature=>0, :eas=>0, :long_names=>1, :unicode=>0, :nt_status=>1, :paging_io=>1, :dfs=>0, :extended_security=>0, :reparse_path=>0}, :pid_high=>0, :security_features=>"\x00\x00\x00\x00\x00\x00\x00\x00", :reserved=>0, :tid=>0, :pid_low=>0, :uid=>0, :mid=>0}, :parameter_block=>{:word_count=>1, :sequence_number=>0}, :data_block=>{:byte_count=>0, :data=>""}}
|
188
|
+
2.3.3 :013 > packet.to_binary_s
|
189
|
+
=> "\xFFSMB+\x00\x00\x00\x00\x98\x01`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00"
|
190
|
+
```
|
191
|
+
### Using the Client
|
192
|
+
|
193
|
+
Sitting on top of the packet layer in RubySMB is the RubySMB::Client. This is the level msot users will interact with.
|
194
|
+
It provides fairly simple conveience methods for performing SMB actions. It handles the creation, sending and receiving of packets
|
195
|
+
for the user, relying on reasonable defaults in many cases.
|
196
|
+
|
197
|
+
#### Negotiation
|
198
|
+
|
199
|
+
The RubySMB Client is capabale of multi-protocol negotiation. The user simply specifies whether SMB1 and/or SMB2 should be supported, and
|
200
|
+
the client will negotiate the propper protocol and dialect behind the scenes.
|
201
|
+
|
202
|
+
In the below example, we tell the client that both SMb1 and SMB2 should be supported. The Client will then Negotiate with the
|
203
|
+
server on which version should be used. The user does not have to ever worry about which version was negotiated.
|
204
|
+
Example:
|
205
|
+
```ruby
|
206
|
+
sock = TCPSocket.new address, 445
|
207
|
+
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
208
|
+
|
209
|
+
client = RubySMB::Client.new(dispatcher, smb1: true, smb2: false, username: 'msfadmin', password: 'msfadmin')
|
210
|
+
client.negotiate
|
211
|
+
```
|
212
|
+
|
213
|
+
#### Authentication
|
214
|
+
|
215
|
+
Authentication is achieved via the [ruby ntlm gem](https://rubygems.org/gems/rubyntlm). While the client
|
216
|
+
will not currently attempt older basic authentication on its own, it will attempt an anonymous login, if no
|
217
|
+
user credentials are supplied:
|
218
|
+
|
219
|
+
Authenticated Example:
|
220
|
+
```ruby
|
221
|
+
sock = TCPSocket.new address, 445
|
222
|
+
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
223
|
+
|
224
|
+
client = RubySMB::Client.new(dispatcher, smb1: true, smb2: false, username: 'msfadmin', password: 'msfadmin')
|
225
|
+
client.negotiate
|
226
|
+
client.authenticate
|
227
|
+
```
|
228
|
+
|
229
|
+
Anonymous Example:
|
230
|
+
```ruby
|
231
|
+
sock = TCPSocket.new address, 445
|
232
|
+
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
233
|
+
|
234
|
+
client = RubySMB::Client.new(dispatcher, smb1: true, smb2: false, username: '', password: '')
|
235
|
+
client.negotiate
|
236
|
+
client.authenticate
|
237
|
+
```
|
238
|
+
|
239
|
+
#### Connecting to a Tree
|
240
|
+
|
241
|
+
While there is one Client, that has branching code-paths for SMB1 and SMB2, once you connect to a
|
242
|
+
Tree you will be given a protocol specific Tree object. This Tree object will be responsible for all file operations
|
243
|
+
that are to be conducted on that Tree.
|
244
|
+
|
245
|
+
In the below example we see a simple script to connect to a remote Tree, and list all files in a given sub-directory.
|
246
|
+
Example:
|
247
|
+
```ruby
|
248
|
+
sock = TCPSocket.new address, 445
|
249
|
+
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
250
|
+
|
251
|
+
client = RubySMB::Client.new(dispatcher, smb1: true, smb2: false, username: 'msfadmin', password: 'msfadmin')
|
252
|
+
client.negotiate
|
253
|
+
client.authenticate
|
254
|
+
|
255
|
+
begin
|
256
|
+
tree = client.tree_connect('TEST_SHARE')
|
257
|
+
puts "Connected to #{path} successfully!"
|
258
|
+
rescue StandardError => e
|
259
|
+
puts "Failed to connect to #{path}: #{e.message}"
|
260
|
+
end
|
261
|
+
|
262
|
+
files = tree.list(directory: 'subdir1')
|
263
|
+
|
264
|
+
files.each do |file|
|
265
|
+
create_time = file.create_time.to_datetime.to_s
|
266
|
+
access_time = file.last_access.to_datetime.to_s
|
267
|
+
change_time = file.last_change.to_datetime.to_s
|
268
|
+
file_name = file.file_name.encode("UTF-8")
|
269
|
+
|
270
|
+
puts "FILE: #{file_name}\n\tSIZE(BYTES):#{file.end_of_file}\n\tSIZE_ON_DISK(BYTES):#{file.allocation_size}\n\tCREATED:#{create_time}\n\tACCESSED:#{access_time}\n\tCHANGED:#{change_time}\n\n"
|
271
|
+
end
|
272
|
+
```
|
273
|
+
|
34
274
|
|
35
275
|
## Developer tips
|
36
276
|
You'll want to have Wireshark and perhaps a tool like Impacket (which provides a small SMB client in one of its examples) installed to help with your work:
|
@@ -57,7 +297,7 @@ You'll want to have Wireshark and perhaps a tool like Impacket (which provides a
|
|
57
297
|
|
58
298
|
## Contributing
|
59
299
|
|
60
|
-
1. Fork it ( https://github.com/rapid7/
|
300
|
+
1. Fork it ( https://github.com/rapid7/ruby_smb/fork )
|
61
301
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
62
302
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
63
303
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/examples/anonymous_auth.rb
CHANGED
@@ -6,7 +6,6 @@
|
|
6
6
|
require 'bundler/setup'
|
7
7
|
require 'ruby_smb'
|
8
8
|
|
9
|
-
|
10
9
|
def run_authentication(address, smb1, smb2, username, password)
|
11
10
|
# Create our socket and add it to the dispatcher
|
12
11
|
sock = TCPSocket.new address, 445
|
@@ -14,8 +13,13 @@ def run_authentication(address, smb1, smb2, username, password)
|
|
14
13
|
|
15
14
|
client = RubySMB::Client.new(dispatcher, smb1: smb1, smb2: smb2, username: username, password: password)
|
16
15
|
protocol = client.negotiate
|
17
|
-
status
|
16
|
+
status = client.authenticate
|
18
17
|
puts "#{protocol} : #{status}"
|
18
|
+
if status.name == 'STATUS_SUCCESS'
|
19
|
+
puts "Native OS: #{client.peer_native_os}"
|
20
|
+
puts "Native LAN Manager: #{client.peer_native_lm}"
|
21
|
+
puts "Domain/Workgroup: #{client.primary_domain}"
|
22
|
+
end
|
19
23
|
end
|
20
24
|
|
21
25
|
address = ARGV[0]
|
@@ -24,4 +28,3 @@ password = ''
|
|
24
28
|
|
25
29
|
# Negotiate with only SMB1 enabled
|
26
30
|
run_authentication(address, true, false, username, password)
|
27
|
-
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
# This example script is used for testing the appending to a file.
|
4
|
+
# It will attempt to connect to a specific share and then append to a specified file.
|
5
|
+
# Example usage: ruby append_file.rb 192.168.172.138 msfadmin msfadmin TEST_SHARE test.txt "data to write"
|
6
|
+
# This will try to connect to \\192.168.172.138\TEST_SHARE with the msfadmin:msfadmin credentials
|
7
|
+
# and write "data to write" the end of the file test.txt
|
8
|
+
|
9
|
+
require 'bundler/setup'
|
10
|
+
require 'ruby_smb'
|
11
|
+
|
12
|
+
address = ARGV[0]
|
13
|
+
username = ARGV[1]
|
14
|
+
password = ARGV[2]
|
15
|
+
share = ARGV[3]
|
16
|
+
file = ARGV[4]
|
17
|
+
data = ARGV[5]
|
18
|
+
path = "\\\\#{address}\\#{share}"
|
19
|
+
|
20
|
+
sock = TCPSocket.new address, 445
|
21
|
+
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
22
|
+
|
23
|
+
client = RubySMB::Client.new(dispatcher, smb1: true, smb2: true, username: username, password: password)
|
24
|
+
protocol = client.negotiate
|
25
|
+
status = client.authenticate
|
26
|
+
|
27
|
+
puts "#{protocol} : #{status}"
|
28
|
+
|
29
|
+
begin
|
30
|
+
tree = client.tree_connect(path)
|
31
|
+
puts "Connected to #{path} successfully!"
|
32
|
+
rescue StandardError => e
|
33
|
+
puts "Failed to connect to #{path}: #{e.message}"
|
34
|
+
end
|
35
|
+
|
36
|
+
file = tree.open_file(filename: file, write: true, disposition: RubySMB::Dispositions::FILE_OPEN_IF)
|
37
|
+
|
38
|
+
result = file.append(data: data)
|
39
|
+
puts result.to_s
|
40
|
+
file.close
|
data/examples/authenticate.rb
CHANGED
@@ -6,7 +6,6 @@
|
|
6
6
|
require 'bundler/setup'
|
7
7
|
require 'ruby_smb'
|
8
8
|
|
9
|
-
|
10
9
|
def run_authentication(address, smb1, smb2, username, password)
|
11
10
|
# Create our socket and add it to the dispatcher
|
12
11
|
sock = TCPSocket.new address, 445
|
@@ -14,13 +13,19 @@ def run_authentication(address, smb1, smb2, username, password)
|
|
14
13
|
|
15
14
|
client = RubySMB::Client.new(dispatcher, smb1: smb1, smb2: smb2, username: username, password: password)
|
16
15
|
protocol = client.negotiate
|
17
|
-
status
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
16
|
+
status = client.authenticate
|
17
|
+
puts "#{protocol} : #{status}"
|
18
|
+
if protocol == 'SMB1'
|
19
|
+
puts "Native OS: #{client.peer_native_os}"
|
20
|
+
puts "Native LAN Manager: #{client.peer_native_lm}"
|
22
21
|
end
|
23
|
-
puts "
|
22
|
+
puts "Netbios Name: #{client.default_name}"
|
23
|
+
puts "Netbios Domain: #{client.default_domain}"
|
24
|
+
puts "FQDN of the computer: #{client.dns_host_name}"
|
25
|
+
puts "FQDN of the domain: #{client.dns_domain_name}"
|
26
|
+
puts "FQDN of the forest: #{client.dns_tree_name}"
|
27
|
+
puts "Dialect: #{client.dialect}"
|
28
|
+
puts "OS Version: #{client.os_version}"
|
24
29
|
end
|
25
30
|
|
26
31
|
address = ARGV[0]
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
# This example script is used for testing the deleting of a file.
|
4
|
+
# It will attempt to connect to a specific share and then delete a specified file.
|
5
|
+
# Example usage: ruby delete_file.rb 192.168.172.138 msfadmin msfadmin TEST_SHARE short.txt
|
6
|
+
# This will try to connect to \\192.168.172.138\TEST_SHARE with the msfadmin:msfadmin credentials
|
7
|
+
# and delete the file short.txt
|
8
|
+
|
9
|
+
require 'bundler/setup'
|
10
|
+
require 'ruby_smb'
|
11
|
+
|
12
|
+
address = ARGV[0]
|
13
|
+
username = ARGV[1]
|
14
|
+
password = ARGV[2]
|
15
|
+
share = ARGV[3]
|
16
|
+
file = ARGV[4]
|
17
|
+
path = "\\\\#{address}\\#{share}"
|
18
|
+
|
19
|
+
sock = TCPSocket.new address, 445
|
20
|
+
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
21
|
+
|
22
|
+
client = RubySMB::Client.new(dispatcher, smb1: true, smb2: true, username: username, password: password)
|
23
|
+
|
24
|
+
protocol = client.negotiate
|
25
|
+
status = client.authenticate
|
26
|
+
|
27
|
+
puts "#{protocol} : #{status}"
|
28
|
+
|
29
|
+
begin
|
30
|
+
tree = client.tree_connect(path)
|
31
|
+
puts "Connected to #{path} successfully!"
|
32
|
+
rescue StandardError => e
|
33
|
+
puts "Failed to connect to #{path}: #{e.message}"
|
34
|
+
end
|
35
|
+
|
36
|
+
file = tree.open_file(filename: file, delete: true)
|
37
|
+
|
38
|
+
data = file.delete
|
39
|
+
puts data
|
40
|
+
file.close
|
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
# This example script is used for testing directory listing functionality
|
4
|
+
# It will attempt to connect to a specific share and then list all files in a
|
5
|
+
# specified directory..
|
6
|
+
# Example usage: ruby list_directory.rb 192.168.172.138 msfadmin msfadmin TEST_SHARE subdir1
|
7
|
+
# This will try to connect to \\192.168.172.138\TEST_SHARE with the msfadmin:msfadmin credentials,
|
8
|
+
# and then list the contents of the directory 'subdir1'
|
9
|
+
|
10
|
+
require 'bundler/setup'
|
11
|
+
require 'ruby_smb'
|
12
|
+
|
13
|
+
address = ARGV[0]
|
14
|
+
username = ARGV[1]
|
15
|
+
password = ARGV[2]
|
16
|
+
share = ARGV[3]
|
17
|
+
dir = ARGV[4]
|
18
|
+
path = "\\\\#{address}\\#{share}"
|
19
|
+
|
20
|
+
sock = TCPSocket.new address, 445
|
21
|
+
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
22
|
+
|
23
|
+
client = RubySMB::Client.new(dispatcher, smb1: true, smb2: true, username: username, password: password)
|
24
|
+
protocol = client.negotiate
|
25
|
+
status = client.authenticate
|
26
|
+
|
27
|
+
puts "#{protocol} : #{status}"
|
28
|
+
|
29
|
+
begin
|
30
|
+
tree = client.tree_connect(path)
|
31
|
+
puts "Connected to #{path} successfully!"
|
32
|
+
rescue StandardError => e
|
33
|
+
puts "Failed to connect to #{path}: #{e.message}"
|
34
|
+
end
|
35
|
+
|
36
|
+
files = tree.list(directory: dir)
|
37
|
+
|
38
|
+
files.each do |file|
|
39
|
+
create_time = file.create_time.to_datetime.to_s
|
40
|
+
access_time = file.last_access.to_datetime.to_s
|
41
|
+
change_time = file.last_change.to_datetime.to_s
|
42
|
+
file_name = file.file_name.encode('UTF-8')
|
43
|
+
|
44
|
+
puts "FILE: #{file_name}\n\tSIZE(BYTES):#{file.end_of_file}\n\tSIZE_ON_DISK(BYTES):#{file.allocation_size}\n\tCREATED:#{create_time}\n\tACCESSED:#{access_time}\n\tCHANGED:#{change_time}\n\n"
|
45
|
+
end
|