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.
Files changed (298) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +247 -7
  5. data/examples/anonymous_auth.rb +6 -3
  6. data/examples/append_file.rb +40 -0
  7. data/examples/authenticate.rb +12 -7
  8. data/examples/delete_file.rb +40 -0
  9. data/examples/list_directory.rb +45 -0
  10. data/examples/negotiate.rb +0 -1
  11. data/examples/negotiate_with_netbios_service.rb +36 -0
  12. data/examples/net_share_enum_all.rb +30 -0
  13. data/examples/read_file.rb +39 -0
  14. data/examples/rename_file.rb +41 -0
  15. data/examples/tree_connect.rb +2 -4
  16. data/examples/write_file.rb +40 -0
  17. data/lib/ruby_smb.rb +5 -0
  18. data/lib/ruby_smb/client.rb +196 -43
  19. data/lib/ruby_smb/client/authentication.rb +89 -48
  20. data/lib/ruby_smb/client/echo.rb +1 -4
  21. data/lib/ruby_smb/client/negotiation.rb +46 -45
  22. data/lib/ruby_smb/client/signing.rb +9 -16
  23. data/lib/ruby_smb/client/tree_connect.rb +8 -13
  24. data/lib/ruby_smb/client/utils.rb +79 -0
  25. data/lib/ruby_smb/dcerpc.rb +30 -0
  26. data/lib/ruby_smb/dcerpc/bind.rb +60 -0
  27. data/lib/ruby_smb/dcerpc/handle.rb +60 -0
  28. data/lib/ruby_smb/dcerpc/ndr.rb +41 -0
  29. data/lib/ruby_smb/dcerpc/request.rb +43 -0
  30. data/lib/ruby_smb/dcerpc/response.rb +46 -0
  31. data/lib/ruby_smb/dcerpc/srvsvc.rb +17 -0
  32. data/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all.rb +93 -0
  33. data/lib/ruby_smb/dcerpc/uuid.rb +28 -0
  34. data/lib/ruby_smb/dispatcher.rb +7 -3
  35. data/lib/ruby_smb/dispatcher/base.rb +23 -14
  36. data/lib/ruby_smb/dispatcher/socket.rb +71 -51
  37. data/lib/ruby_smb/dispositions.rb +32 -0
  38. data/lib/ruby_smb/error.rb +24 -18
  39. data/lib/ruby_smb/field.rb +5 -2
  40. data/lib/ruby_smb/field/extended_attribute_flag.rb +1 -1
  41. data/lib/ruby_smb/field/file_time.rb +3 -1
  42. data/lib/ruby_smb/field/security_descriptor.rb +6 -6
  43. data/lib/ruby_smb/field/smb2_fileid.rb +11 -0
  44. data/lib/ruby_smb/field/smb_fea.rb +3 -3
  45. data/lib/ruby_smb/field/smb_fea_list.rb +3 -3
  46. data/lib/ruby_smb/field/smb_gea.rb +12 -0
  47. data/lib/ruby_smb/field/smb_gea_list.rb +13 -0
  48. data/lib/ruby_smb/field/string16.rb +14 -0
  49. data/lib/ruby_smb/field/stringz16.rb +3 -7
  50. data/lib/ruby_smb/field/utime.rb +11 -10
  51. data/lib/ruby_smb/fscc.rb +12 -0
  52. data/lib/ruby_smb/fscc/control_codes.rb +26 -0
  53. data/lib/ruby_smb/{field → fscc}/ea_info_array.rb +12 -14
  54. data/lib/ruby_smb/fscc/file_attributes.rb +29 -0
  55. data/lib/ruby_smb/{field → fscc}/file_full_ea_info.rb +5 -5
  56. data/lib/ruby_smb/fscc/file_information.rb +60 -0
  57. data/lib/ruby_smb/fscc/file_information/file_both_directory_information.rb +29 -0
  58. data/lib/ruby_smb/fscc/file_information/file_directory_information.rb +25 -0
  59. data/lib/ruby_smb/fscc/file_information/file_disposition_information.rb +15 -0
  60. data/lib/ruby_smb/fscc/file_information/file_full_directory_information.rb +26 -0
  61. data/lib/ruby_smb/fscc/file_information/file_id_both_directory_information.rb +31 -0
  62. data/lib/ruby_smb/fscc/file_information/file_id_full_directory_information.rb +28 -0
  63. data/lib/ruby_smb/fscc/file_information/file_names_information.rb +18 -0
  64. data/lib/ruby_smb/fscc/file_information/file_rename_information.rb +44 -0
  65. data/lib/ruby_smb/generic_packet.rb +40 -18
  66. data/lib/ruby_smb/gss.rb +49 -56
  67. data/lib/ruby_smb/impersonation_levels.rb +7 -2
  68. data/lib/ruby_smb/nbss.rb +16 -0
  69. data/lib/ruby_smb/nbss/negative_session_response.rb +30 -0
  70. data/lib/ruby_smb/nbss/session_header.rb +13 -0
  71. data/lib/ruby_smb/nbss/session_request.rb +13 -0
  72. data/lib/ruby_smb/smb1.rb +20 -17
  73. data/lib/ruby_smb/smb1/bit_field.rb +3 -0
  74. data/lib/ruby_smb/smb1/bit_field/create_options.rb +5 -5
  75. data/lib/ruby_smb/smb1/bit_field/file_status_flags.rb +18 -0
  76. data/lib/ruby_smb/smb1/bit_field/open2_access_mode.rb +11 -11
  77. data/lib/ruby_smb/smb1/bit_field/open2_open_mode.rb +1 -1
  78. data/lib/ruby_smb/smb1/bit_field/optional_support.rb +0 -1
  79. data/lib/ruby_smb/smb1/bit_field/security_flags.rb +15 -0
  80. data/lib/ruby_smb/smb1/bit_field/share_access.rb +2 -3
  81. data/lib/ruby_smb/smb1/bit_field/smb_ext_file_attributes.rb +21 -24
  82. data/lib/ruby_smb/smb1/bit_field/smb_file_attributes.rb +1 -1
  83. data/lib/ruby_smb/smb1/commands.rb +5 -0
  84. data/lib/ruby_smb/smb1/create_actions.rb +3 -5
  85. data/lib/ruby_smb/smb1/file.rb +289 -0
  86. data/lib/ruby_smb/smb1/oplock_levels.rb +2 -4
  87. data/lib/ruby_smb/smb1/packet.rb +10 -0
  88. data/lib/ruby_smb/smb1/packet/close_request.rb +31 -0
  89. data/lib/ruby_smb/smb1/packet/close_response.rb +28 -0
  90. data/lib/ruby_smb/smb1/packet/echo_request.rb +5 -7
  91. data/lib/ruby_smb/smb1/packet/echo_response.rb +5 -7
  92. data/lib/ruby_smb/smb1/packet/empty_packet.rb +1 -2
  93. data/lib/ruby_smb/smb1/packet/logoff_request.rb +1 -4
  94. data/lib/ruby_smb/smb1/packet/logoff_response.rb +1 -4
  95. data/lib/ruby_smb/smb1/packet/negotiate_response.rb +22 -0
  96. data/lib/ruby_smb/smb1/packet/negotiate_response_extended.rb +22 -0
  97. data/lib/ruby_smb/smb1/packet/nt_create_andx_request.rb +62 -0
  98. data/lib/ruby_smb/smb1/packet/nt_create_andx_response.rb +66 -0
  99. data/lib/ruby_smb/smb1/packet/nt_trans.rb +1 -2
  100. data/lib/ruby_smb/smb1/packet/nt_trans/create_request.rb +19 -13
  101. data/lib/ruby_smb/smb1/packet/nt_trans/create_response.rb +8 -10
  102. data/lib/ruby_smb/smb1/packet/nt_trans/request.rb +11 -11
  103. data/lib/ruby_smb/smb1/packet/nt_trans/response.rb +10 -10
  104. data/lib/ruby_smb/smb1/packet/nt_trans/subcommands.rb +8 -1
  105. data/lib/ruby_smb/smb1/packet/read_andx_request.rb +84 -0
  106. data/lib/ruby_smb/smb1/packet/read_andx_response.rb +47 -0
  107. data/lib/ruby_smb/smb1/packet/session_setup_legacy_request.rb +2 -6
  108. data/lib/ruby_smb/smb1/packet/session_setup_legacy_response.rb +1 -4
  109. data/lib/ruby_smb/smb1/packet/session_setup_request.rb +1 -6
  110. data/lib/ruby_smb/smb1/packet/session_setup_response.rb +2 -4
  111. data/lib/ruby_smb/smb1/packet/trans2.rb +8 -2
  112. data/lib/ruby_smb/smb1/packet/trans2/data_block.rb +6 -7
  113. data/lib/ruby_smb/smb1/packet/trans2/find_first2_request.rb +77 -0
  114. data/lib/ruby_smb/smb1/packet/trans2/find_first2_response.rb +87 -0
  115. data/lib/ruby_smb/smb1/packet/trans2/find_information_level.rb +32 -0
  116. data/lib/ruby_smb/smb1/packet/trans2/find_information_level/find_file_full_directory_info.rb +45 -0
  117. data/lib/ruby_smb/smb1/packet/trans2/find_next2_request.rb +77 -0
  118. data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +86 -0
  119. data/lib/ruby_smb/smb1/packet/trans2/open2_request.rb +10 -10
  120. data/lib/ruby_smb/smb1/packet/trans2/open2_response.rb +10 -12
  121. data/lib/ruby_smb/smb1/packet/trans2/request.rb +15 -17
  122. data/lib/ruby_smb/smb1/packet/trans2/request_secondary.rb +8 -10
  123. data/lib/ruby_smb/smb1/packet/trans2/response.rb +11 -13
  124. data/lib/ruby_smb/smb1/packet/trans2/set_file_information_request.rb +66 -0
  125. data/lib/ruby_smb/smb1/packet/trans2/set_file_information_response.rb +57 -0
  126. data/lib/ruby_smb/smb1/packet/trans2/subcommands.rb +5 -2
  127. data/lib/ruby_smb/smb1/packet/tree_connect_request.rb +4 -6
  128. data/lib/ruby_smb/smb1/packet/tree_connect_response.rb +5 -7
  129. data/lib/ruby_smb/smb1/packet/tree_disconnect_request.rb +2 -4
  130. data/lib/ruby_smb/smb1/packet/tree_disconnect_response.rb +2 -4
  131. data/lib/ruby_smb/smb1/packet/write_andx_request.rb +68 -0
  132. data/lib/ruby_smb/smb1/packet/write_andx_response.rb +35 -0
  133. data/lib/ruby_smb/smb1/resource_type.rb +18 -0
  134. data/lib/ruby_smb/smb1/tree.rb +188 -5
  135. data/lib/ruby_smb/smb2.rb +16 -11
  136. data/lib/ruby_smb/smb2/bit_field.rb +1 -0
  137. data/lib/ruby_smb/smb2/bit_field/file_access_mask.rb +1 -1
  138. data/lib/ruby_smb/smb2/bit_field/session_flags.rb +1 -2
  139. data/lib/ruby_smb/smb2/bit_field/share_flags.rb +4 -6
  140. data/lib/ruby_smb/smb2/create_context.rb +29 -0
  141. data/lib/ruby_smb/smb2/file.rb +251 -0
  142. data/lib/ruby_smb/smb2/info_type.rb +21 -0
  143. data/lib/ruby_smb/smb2/packet.rb +16 -0
  144. data/lib/ruby_smb/smb2/packet/close_request.rb +22 -0
  145. data/lib/ruby_smb/smb2/packet/close_response.rb +29 -0
  146. data/lib/ruby_smb/smb2/packet/create_request.rb +54 -0
  147. data/lib/ruby_smb/smb2/packet/create_response.rb +35 -0
  148. data/lib/ruby_smb/smb2/packet/echo_request.rb +1 -3
  149. data/lib/ruby_smb/smb2/packet/echo_response.rb +1 -3
  150. data/lib/ruby_smb/smb2/packet/error_packet.rb +1 -3
  151. data/lib/ruby_smb/smb2/packet/ioctl_request.rb +54 -0
  152. data/lib/ruby_smb/smb2/packet/ioctl_response.rb +39 -0
  153. data/lib/ruby_smb/smb2/packet/logoff_request.rb +1 -4
  154. data/lib/ruby_smb/smb2/packet/logoff_response.rb +1 -4
  155. data/lib/ruby_smb/smb2/packet/negotiate_request.rb +1 -1
  156. data/lib/ruby_smb/smb2/packet/negotiate_response.rb +1 -1
  157. data/lib/ruby_smb/smb2/packet/query_directory_request.rb +35 -0
  158. data/lib/ruby_smb/smb2/packet/query_directory_response.rb +45 -0
  159. data/lib/ruby_smb/smb2/packet/read_request.rb +30 -0
  160. data/lib/ruby_smb/smb2/packet/read_response.rb +26 -0
  161. data/lib/ruby_smb/smb2/packet/session_setup_request.rb +2 -5
  162. data/lib/ruby_smb/smb2/packet/session_setup_response.rb +4 -7
  163. data/lib/ruby_smb/smb2/packet/set_info_request.rb +58 -0
  164. data/lib/ruby_smb/smb2/packet/set_info_response.rb +20 -0
  165. data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +3 -4
  166. data/lib/ruby_smb/smb2/packet/tree_connect_response.rb +5 -9
  167. data/lib/ruby_smb/smb2/packet/tree_disconnect_request.rb +1 -4
  168. data/lib/ruby_smb/smb2/packet/tree_disconnect_response.rb +1 -4
  169. data/lib/ruby_smb/smb2/packet/write_request.rb +29 -0
  170. data/lib/ruby_smb/smb2/packet/write_response.rb +26 -0
  171. data/lib/ruby_smb/smb2/tree.rb +163 -7
  172. data/lib/ruby_smb/version.rb +1 -1
  173. data/spec/lib/ruby_smb/client_spec.rb +459 -120
  174. data/spec/lib/ruby_smb/dcerpc/bind_spec.rb +14 -0
  175. data/spec/lib/ruby_smb/dcerpc/handle_spec.rb +31 -0
  176. data/spec/lib/ruby_smb/dcerpc/request_spec.rb +21 -0
  177. data/spec/lib/ruby_smb/dcerpc/response_spec.rb +15 -0
  178. data/spec/lib/ruby_smb/dcerpc/srvsvc_spec.rb +13 -0
  179. data/spec/lib/ruby_smb/dcerpc/uuid_spec.rb +12 -0
  180. data/spec/lib/ruby_smb/dispatcher/base_spec.rb +26 -0
  181. data/spec/lib/ruby_smb/dispatcher/socket_spec.rb +118 -18
  182. data/spec/lib/ruby_smb/field/extended_attribute_flag_spec.rb +0 -3
  183. data/spec/lib/ruby_smb/field/file_time_spec.rb +4 -2
  184. data/spec/lib/ruby_smb/field/security_descriptor.rb +0 -1
  185. data/spec/lib/ruby_smb/field/smb2_fileid_spec.rb +10 -0
  186. data/spec/lib/ruby_smb/field/smb_fea_list_spec.rb +3 -5
  187. data/spec/lib/ruby_smb/field/smb_gea_list_spec.rb +37 -0
  188. data/spec/lib/ruby_smb/field/smb_gea_spec.rb +22 -0
  189. data/spec/lib/ruby_smb/field/stringz16_spec.rb +7 -9
  190. data/spec/lib/ruby_smb/field/utime_spec.rb +4 -2
  191. data/spec/lib/ruby_smb/{field → fscc}/ea_info_array_spec.rb +7 -9
  192. data/spec/lib/ruby_smb/{field → fscc}/file_full_ea_info_spec.rb +2 -3
  193. data/spec/lib/ruby_smb/fscc/file_information/file_both_directory_information_spec.rb +71 -0
  194. data/spec/lib/ruby_smb/fscc/file_information/file_directory_information_spec.rb +68 -0
  195. data/spec/lib/ruby_smb/fscc/file_information/file_disposition_information_spec.rb +26 -0
  196. data/spec/lib/ruby_smb/fscc/file_information/file_full_directory_information_spec.rb +69 -0
  197. data/spec/lib/ruby_smb/fscc/file_information/file_id_both_directory_information_spec.rb +72 -0
  198. data/spec/lib/ruby_smb/fscc/file_information/file_id_full_directory_information_spec.rb +70 -0
  199. data/spec/lib/ruby_smb/fscc/file_information/file_names_information_spec.rb +41 -0
  200. data/spec/lib/ruby_smb/fscc/file_information/file_rename_information_spec.rb +133 -0
  201. data/spec/lib/ruby_smb/fscc/fscc_file_attributes_spec.rb +143 -0
  202. data/spec/lib/ruby_smb/generic_packet_spec.rb +46 -21
  203. data/spec/lib/ruby_smb/nbss/negative_session_response_spec.rb +29 -0
  204. data/spec/lib/ruby_smb/nbss/session_header_spec.rb +30 -0
  205. data/spec/lib/ruby_smb/nbss/session_request_spec.rb +30 -0
  206. data/spec/lib/ruby_smb/smb1/bit_field/create_options_spec.rb +9 -1
  207. data/spec/lib/ruby_smb/smb1/bit_field/directory_access_mask_spec.rb +0 -2
  208. data/spec/lib/ruby_smb/smb1/bit_field/file_access_mask_spec.rb +0 -2
  209. data/spec/lib/ruby_smb/smb1/bit_field/file_status_flags_spec.rb +35 -0
  210. data/spec/lib/ruby_smb/smb1/bit_field/open2_access_mode_spec.rb +1 -3
  211. data/spec/lib/ruby_smb/smb1/bit_field/open2_flags_spec.rb +0 -2
  212. data/spec/lib/ruby_smb/smb1/bit_field/open2_open_mode_spec.rb +0 -1
  213. data/spec/lib/ruby_smb/smb1/bit_field/optional_support_spec.rb +0 -1
  214. data/spec/lib/ruby_smb/smb1/bit_field/security_flags_spec.rb +26 -0
  215. data/spec/lib/ruby_smb/smb1/bit_field/share_access_spec.rb +0 -3
  216. data/spec/lib/ruby_smb/smb1/bit_field/smb_ext_file_attributes_spec.rb +20 -39
  217. data/spec/lib/ruby_smb/smb1/bit_field/smb_file_attributes_spec.rb +0 -6
  218. data/spec/lib/ruby_smb/smb1/bit_field/smb_nmpipe_status_spec.rb +0 -2
  219. data/spec/lib/ruby_smb/smb1/bit_field/trans2_flags_spec.rb +0 -2
  220. data/spec/lib/ruby_smb/smb1/bit_field/tree_connect_flags_spec.rb +0 -2
  221. data/spec/lib/ruby_smb/smb1/file_spec.rb +469 -0
  222. data/spec/lib/ruby_smb/smb1/packet/close_request_spec.rb +54 -0
  223. data/spec/lib/ruby_smb/smb1/packet/close_response_spec.rb +45 -0
  224. data/spec/lib/ruby_smb/smb1/packet/echo_request_spec.rb +1 -4
  225. data/spec/lib/ruby_smb/smb1/packet/echo_response_spec.rb +1 -4
  226. data/spec/lib/ruby_smb/smb1/packet/error_packet_spec.rb +1 -3
  227. data/spec/lib/ruby_smb/smb1/packet/logoff_request_spec.rb +1 -4
  228. data/spec/lib/ruby_smb/smb1/packet/logoff_response_spec.rb +1 -4
  229. data/spec/lib/ruby_smb/smb1/packet/negotiate_request_spec.rb +1 -1
  230. data/spec/lib/ruby_smb/smb1/packet/negotiate_response_extended_spec.rb +37 -0
  231. data/spec/lib/ruby_smb/smb1/packet/negotiate_response_spec.rb +37 -0
  232. data/spec/lib/ruby_smb/smb1/packet/nt_create_andx_request_spec.rb +151 -0
  233. data/spec/lib/ruby_smb/smb1/packet/nt_create_andx_response_spec.rb +157 -0
  234. data/spec/lib/ruby_smb/smb1/packet/nt_trans/create_request_spec.rb +13 -6
  235. data/spec/lib/ruby_smb/smb1/packet/nt_trans/create_response_spec.rb +1 -7
  236. data/spec/lib/ruby_smb/smb1/packet/nt_trans/request_spec.rb +1 -6
  237. data/spec/lib/ruby_smb/smb1/packet/nt_trans/response_spec.rb +1 -5
  238. data/spec/lib/ruby_smb/smb1/packet/read_andx_request_spec.rb +149 -0
  239. data/spec/lib/ruby_smb/smb1/packet/read_andx_response_spec.rb +93 -0
  240. data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_request_spec.rb +1 -5
  241. data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_response_spec.rb +1 -5
  242. data/spec/lib/ruby_smb/smb1/packet/session_setup_request_spec.rb +3 -8
  243. data/spec/lib/ruby_smb/smb1/packet/session_setup_response_spec.rb +2 -4
  244. data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_request_spec.rb +180 -0
  245. data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_response_spec.rb +104 -0
  246. data/spec/lib/ruby_smb/smb1/packet/trans2/find_information_level/find_file_full_directory_info_spec.rb +128 -0
  247. data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_request_spec.rb +174 -0
  248. data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_response_spec.rb +102 -0
  249. data/spec/lib/ruby_smb/smb1/packet/trans2/open2_request_spec.rb +1 -6
  250. data/spec/lib/ruby_smb/smb1/packet/trans2/open2_response_spec.rb +2 -7
  251. data/spec/lib/ruby_smb/smb1/packet/trans2/request_secondary_spec.rb +1 -5
  252. data/spec/lib/ruby_smb/smb1/packet/trans2/request_spec.rb +1 -5
  253. data/spec/lib/ruby_smb/smb1/packet/trans2/response_spec.rb +1 -4
  254. data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_request_spec.rb +98 -0
  255. data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_response_spec.rb +56 -0
  256. data/spec/lib/ruby_smb/smb1/packet/tree_connect_request_spec.rb +1 -5
  257. data/spec/lib/ruby_smb/smb1/packet/tree_connect_response_spec.rb +1 -6
  258. data/spec/lib/ruby_smb/smb1/packet/tree_disconnect_request_spec.rb +1 -4
  259. data/spec/lib/ruby_smb/smb1/packet/tree_disconnect_response_spec.rb +1 -4
  260. data/spec/lib/ruby_smb/smb1/packet/write_andx_request_spec.rb +148 -0
  261. data/spec/lib/ruby_smb/smb1/packet/write_andx_response_spec.rb +54 -0
  262. data/spec/lib/ruby_smb/smb1/tree_spec.rb +409 -7
  263. data/spec/lib/ruby_smb/smb2/bit_field/directory_access_mask_spec.rb +0 -2
  264. data/spec/lib/ruby_smb/smb2/bit_field/file_access_mask_spec.rb +0 -2
  265. data/spec/lib/ruby_smb/smb2/bit_field/session_flags_spec.rb +1 -1
  266. data/spec/lib/ruby_smb/smb2/bit_field/share_capabilities_spec.rb +0 -1
  267. data/spec/lib/ruby_smb/smb2/bit_field/share_flags_spec.rb +0 -2
  268. data/spec/lib/ruby_smb/smb2/create_context_spec.rb +42 -0
  269. data/spec/lib/ruby_smb/smb2/file_spec.rb +233 -0
  270. data/spec/lib/ruby_smb/smb2/packet/close_request_spec.rb +40 -0
  271. data/spec/lib/ruby_smb/smb2/packet/close_response_spec.rb +40 -0
  272. data/spec/lib/ruby_smb/smb2/packet/create_request_spec.rb +101 -0
  273. data/spec/lib/ruby_smb/smb2/packet/create_response_spec.rb +64 -0
  274. data/spec/lib/ruby_smb/smb2/packet/echo_request_spec.rb +1 -3
  275. data/spec/lib/ruby_smb/smb2/packet/echo_response_spec.rb +1 -3
  276. data/spec/lib/ruby_smb/smb2/packet/ioctl_request_spec.rb +48 -0
  277. data/spec/lib/ruby_smb/smb2/packet/logoff_request_spec.rb +1 -3
  278. data/spec/lib/ruby_smb/smb2/packet/logoff_response_spec.rb +1 -3
  279. data/spec/lib/ruby_smb/smb2/packet/query_directory_request_spec.rb +80 -0
  280. data/spec/lib/ruby_smb/smb2/packet/query_directory_response_spec.rb +64 -0
  281. data/spec/lib/ruby_smb/smb2/packet/read_request_spec.rb +43 -0
  282. data/spec/lib/ruby_smb/smb2/packet/read_response_spec.rb +50 -0
  283. data/spec/lib/ruby_smb/smb2/packet/session_setup_request_spec.rb +3 -4
  284. data/spec/lib/ruby_smb/smb2/packet/session_setup_response_spec.rb +2 -3
  285. data/spec/lib/ruby_smb/smb2/packet/set_info_request_spec.rb +205 -0
  286. data/spec/lib/ruby_smb/smb2/packet/set_info_response_spec.rb +32 -0
  287. data/spec/lib/ruby_smb/smb2/packet/tree_connect_request_spec.rb +3 -5
  288. data/spec/lib/ruby_smb/smb2/packet/tree_connect_response_spec.rb +1 -2
  289. data/spec/lib/ruby_smb/smb2/packet/tree_disconnect_request_spec.rb +1 -3
  290. data/spec/lib/ruby_smb/smb2/packet/tree_disconnect_response_spec.rb +1 -3
  291. data/spec/lib/ruby_smb/smb2/packet/write_request_spec.rb +51 -0
  292. data/spec/lib/ruby_smb/smb2/packet/write_response_spec.rb +38 -0
  293. data/spec/lib/ruby_smb/smb2/tree_spec.rb +191 -5
  294. data/spec/spec_helper.rb +1 -1
  295. metadata +195 -12
  296. metadata.gz.sig +0 -0
  297. data/lib/ruby_smb/smb1/dispositions.rb +0 -36
  298. 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: 6d2fbdf3236d278f2f5aa3aaab501f54af77825a
4
- data.tar.gz: 343846b15a2d19332d87f1d15e87285f922dea23
3
+ metadata.gz: 8937795d135978de5a71c04da91bdd44ac2d44ce
4
+ data.tar.gz: 37563d2e539ae97ae98a9fc5df32eeb4d51a408e
5
5
  SHA512:
6
- metadata.gz: 1a413b93e68d6ba6b1c17e8f78d815265757c173a6420fcc6a1faab6871f7bd7d009b65a1304439cf7463ee088bc903c1ac8262bfbd84ea6010a025e6658369d
7
- data.tar.gz: f8de75f184d0242dd36f0cec9fb0f0c23778eceba43ff5e91f06501d610380eb8f50ca3debcf495093ce6ea6e724c4c916338944e4f9a66fc389b2d57c1868d9
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
  [![Code Climate](https://codeclimate.com/github/rapid7/ruby_smb.png)](https://codeclimate.com/github/rapid7/ruby_smb)
5
5
  [![Coverage Status](https://coveralls.io/repos/github/rapid7/ruby_smb/badge.svg?branch=master)](https://coveralls.io/github/rapid7/ruby_smb?branch=master)
6
6
 
7
- A packet parsing and manipulation library for the SMB family of protocols.
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
- See Microsoft's [[MS-SMB2]](http://msdn.microsoft.com/en-us/library/cc246482.aspx)
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
- It supports authentication via NTLM using the [ruby ntlm gem](https://rubygems.org/gems/rubyntlm)
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
- Updated Usage Docs coming soon
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/smb2/fork )
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`)
@@ -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 = client.authenticate
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
@@ -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 = client.authenticate
18
- if client.peer_native_os
19
- native_os = "(#{client.peer_native_os})"
20
- else
21
- native_os = ''
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 "#{protocol} : #{status} #{native_os}"
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