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