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
@@ -1,10 +1,8 @@
1
1
  module RubySMB
2
2
  class Client
3
-
4
3
  # This module contains all of the methods for a client to connect to a
5
4
  # remote share or named pipe.
6
5
  module TreeConnect
7
-
8
6
  #
9
7
  # SMB 1 Methods
10
8
  #
@@ -16,7 +14,7 @@ module RubySMB
16
14
  # @return [RubySMB::SMB1::Tree] the connected Tree
17
15
  def smb1_tree_connect(share)
18
16
  request = RubySMB::SMB1::Packet::TreeConnectRequest.new
19
- request.smb_header.tid = 65535
17
+ request.smb_header.tid = 65_535
20
18
  request.data_block.path = share
21
19
  raw_response = send_recv(request)
22
20
  begin
@@ -32,9 +30,9 @@ module RubySMB
32
30
  # @param share [String] the share path to connect to
33
31
  # @param response [RubySMB::SMB1::Packet::TreeConnectResponse] the response packet to parse into our Tree
34
32
  # @return [RubySMB::SMB1::Tree]
35
- def smb1_tree_from_response(share,response)
33
+ def smb1_tree_from_response(share, response)
36
34
  unless response.smb_header.command == RubySMB::SMB1::Commands::SMB_COM_TREE_CONNECT
37
- raise RubySMB::Error::InvalidPacket, "Not a TreeConnectResponse"
35
+ raise RubySMB::Error::InvalidPacket, 'Not a TreeConnectResponse'
38
36
  end
39
37
  unless response.status_code == WindowsError::NTStatus::STATUS_SUCCESS
40
38
  raise RubySMB::Error::UnexpectedStatusCode, response.status_code.name
@@ -43,7 +41,7 @@ module RubySMB
43
41
  end
44
42
 
45
43
  #
46
- # SMB2 Methods
44
+ # SMB 2 Methods
47
45
  #
48
46
 
49
47
  # Sends a request to connect to a remote Tree and returns the
@@ -53,7 +51,7 @@ module RubySMB
53
51
  # @return [RubySMB::SMB2::Tree] the connected Tree
54
52
  def smb2_tree_connect(share)
55
53
  request = RubySMB::SMB2::Packet::TreeConnectRequest.new
56
- request.smb2_header.tree_id = 65535
54
+ request.smb2_header.tree_id = 65_535
57
55
  request.encode_path(share)
58
56
  raw_response = send_recv(request)
59
57
  begin
@@ -69,18 +67,15 @@ module RubySMB
69
67
  # @param share [String] the share path to connect to
70
68
  # @param response [RubySMB::SMB2::Packet::TreeConnectResponse] the response packet to parse into our Tree
71
69
  # @return [RubySMB::SMB2::Tree]
72
- def smb2_tree_from_response(share,response)
70
+ def smb2_tree_from_response(share, response)
73
71
  unless response.smb2_header.command == RubySMB::SMB2::Commands::TREE_CONNECT
74
- raise RubySMB::Error::InvalidPacket, "Not a TreeConnectResponse"
72
+ raise RubySMB::Error::InvalidPacket, 'Not a TreeConnectResponse'
75
73
  end
76
74
  unless response.status_code == WindowsError::NTStatus::STATUS_SUCCESS
77
75
  raise RubySMB::Error::UnexpectedStatusCode, response.status_code.name
78
76
  end
79
77
  RubySMB::SMB2::Tree.new(client: self, share: share, response: response)
80
78
  end
81
-
82
79
  end
83
-
84
-
85
80
  end
86
- end
81
+ end
@@ -0,0 +1,79 @@
1
+ module RubySMB
2
+ class Client # This module holds all of the methods backing the {RubySMB::Client#open_file} method
3
+ module Utils
4
+
5
+ attr_accessor :tree_connects
6
+ attr_accessor :open_files
7
+
8
+ attr_accessor :use_ntlmv2, :usentlm2_session, :send_lm, :use_lanman_key, :send_ntlm, :spnopt
9
+ attr_accessor :evasion_opts
10
+
11
+ attr_accessor :native_os, :native_lm, :verify_signature, :auth_user
12
+
13
+ attr_accessor :last_file_id
14
+
15
+ def last_tree
16
+ @tree_connects.last
17
+ end
18
+
19
+ def last_file
20
+ @open_files[@last_file_id]
21
+ end
22
+
23
+ def last_tree_id
24
+ last_tree.id
25
+ end
26
+
27
+ def open(path, disposition=RubySMB::Dispositions::FILE_OPEN, access, write: false, read: true)
28
+ file = last_tree.open_file(filename: path, write: write, read: read, disposition: disposition)
29
+ @last_file_id = if file.respond_to?(:guid)
30
+ file.guid.to_binary_s
31
+ elsif file.respond_to?(:fid)
32
+ file.fid.to_binary_s
33
+ end
34
+ @open_files[@last_file_id] = file
35
+ end
36
+
37
+ def create_pipe(path, disposition=RubySMB::Dispositions::FILE_OPEN_IF, impersonation)
38
+ open(path.gsub(/\\/, ''), disposition, nil, write: true, read: true)
39
+ end
40
+
41
+ #Writes data to an open file handle
42
+ def write(file_id, offset = 0, data = '', do_recv = true)
43
+ @open_files[file_id].send_recv_write(data: data, offset: offset)
44
+ end
45
+
46
+ def read(file_id, offset = 0, length = last_file.size_on_disk)
47
+ offset = 0
48
+ length = last_file.size_on_disk
49
+ data = @open_files[file_id].send_recv_read(read_length: length, offset: offset)
50
+ data.bytes
51
+ end
52
+
53
+ def close(file_id, tree_id)
54
+ @open_files[file_id.to_binary_s].close
55
+ end
56
+
57
+ def tree_disconnect(share)
58
+ @tree_connects.detect{|tree| tree.id == share }.disconnect!
59
+ end
60
+
61
+ def native_os
62
+ @peer_native
63
+ end
64
+
65
+ def native_lm
66
+ @native_lm
67
+ end
68
+
69
+ def verify_signature
70
+ @signing_required
71
+ end
72
+
73
+ def auth_user
74
+ @username
75
+ end
76
+
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,30 @@
1
+ module RubySMB
2
+ # DCERPC PDU's
3
+ # http://pubs.opengroup.org/onlinepubs/9629399/
4
+ module Dcerpc
5
+
6
+ class PduHeader < BinData::Record
7
+ endian :little
8
+
9
+ #common fields
10
+ uint8 :rpc_vers # 00:01 RPC version
11
+ uint8 :rpc_vers_minor # 01:01 minor version
12
+ uint8 :ptype # 02:01 request PDU
13
+ uint8 :pfc_flags # 03:01 flags
14
+
15
+ uint32 :packed_drep # 04:04 NDR data rep format label
16
+
17
+ uint16 :frag_length # 08:02 total length of fragment
18
+ uint16 :auth_length # 10:02 length of auth_value
19
+ uint32 :call_id # 12:04 call identifier
20
+ end
21
+
22
+ require 'ruby_smb/dcerpc/uuid'
23
+ require 'ruby_smb/dcerpc/ndr'
24
+ require 'ruby_smb/dcerpc/request'
25
+ require 'ruby_smb/dcerpc/response'
26
+ require 'ruby_smb/dcerpc/handle'
27
+ require 'ruby_smb/dcerpc/srvsvc'
28
+ require 'ruby_smb/dcerpc/bind'
29
+ end
30
+ end
@@ -0,0 +1,60 @@
1
+ module RubySMB
2
+ module Dcerpc
3
+ # The FileDirectoryInformation Class as defined in
4
+ # http://pubs.opengroup.org/onlinepubs/9629399/chap12.htm
5
+
6
+ class PContElemT < BinData::Record
7
+ endian :little
8
+
9
+ uint16 :p_cont_id
10
+ uint8 :n_transfer_syn, initial_value: 1
11
+ uint8 :reserved
12
+ choice :abstract_syntax, selection: -> {endpoint} do
13
+ srv_svc_syntax Srvsvc
14
+ end
15
+ array :transfer_syntaxes, type: :ndr_syntax, initial_length: -> { n_transfer_syn }
16
+ end
17
+
18
+ class PContListT < BinData::Record
19
+ endian :little
20
+
21
+ uint8 :n_context_elem, initial_value: -> { 1 }
22
+ uint8 :reserved
23
+ uint16 :reserved2
24
+ array :p_cont_elem, type: :p_cont_elem_t, initial_length: -> {n_context_elem},
25
+ endpoint: -> {endpoint}
26
+ end
27
+
28
+ class Bind < BinData::Record
29
+ endian :little
30
+
31
+ uint8 :rpc_vers, label: 'RPC version', initial_value: 5
32
+ uint8 :rpc_vers_minor, label: 'minor version'
33
+ uint8 :ptype, label: 'bind PDU', initial_value: 11
34
+ #uint8 :pfc_flags, label: 'flags', initial_value: 0x03
35
+ struct :pfc_flags do
36
+ bit1 :object
37
+ bit1 :maybe
38
+ bit1 :did_not_execute
39
+ bit1 :multiplex
40
+ bit1 :reserved
41
+ bit1 :cancel
42
+ bit1 :last_frag, initial_value: 1
43
+ bit1 :first_frag, initial_value: 1
44
+ end
45
+
46
+ uint32 :packed_drep, label: 'NDR data rep format label', initial_value: 16
47
+
48
+ uint16 :frag_length, label: 'total length of fragment', initial_value: 72
49
+ uint16 :auth_length, label: 'length of auth_value'
50
+ uint32 :call_id, label: 'call identifier', initial_value: 1
51
+
52
+ uint16 :max_xmit_frag, label: 'max transmit frag size', initial_value: 65535
53
+ uint16 :max_recv_frag, label: 'max receive frag size', initial_value: 65535
54
+ uint32 :assoc_group_id, label: 'ncarnation of client-server assoc group'
55
+
56
+ p_cont_list_t :p_context_elem, endpoint: -> { endpoint }
57
+ string :auth_verifier_co_t
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,60 @@
1
+ module RubySMB
2
+ module Dcerpc
3
+ class Handle
4
+
5
+ attr_accessor :pipe
6
+ attr_accessor :last_msg
7
+ attr_accessor :response
8
+
9
+ PTYPES = [
10
+ RubySMB::Dcerpc::Request,
11
+ nil,
12
+ RubySMB::Dcerpc::Response
13
+ ]
14
+
15
+ # @param [RubySMB::SMB2::File] named_pipe
16
+ # @return [RubySMB::Dcerpc::Handle]
17
+ def initialize(named_pipe)
18
+ @pipe = named_pipe
19
+ end
20
+
21
+ # @param [Class] endpoint
22
+ def bind(options={})
23
+ ioctl_request(RubySMB::Dcerpc::Bind.new(options))
24
+ end
25
+
26
+ # @param [Hash] options
27
+ def request(opnum:, stub:, options:{})
28
+ ioctl_request(
29
+ RubySMB::Dcerpc::Request.new(
30
+ opnum: opnum,
31
+ stub: stub.new(options).to_binary_s
32
+ )
33
+ )
34
+ end
35
+
36
+ # @param [BinData::Record] action
37
+ # @param [Hash] options
38
+ def ioctl_request(action, options={})
39
+ request = @pipe.set_header_fields(RubySMB::SMB2::Packet::IoctlRequest.new(options))
40
+ request.ctl_code = 0x0011C017
41
+ request.flags.is_fsctl = 0x00000001
42
+ request.buffer = action.to_binary_s
43
+ @last_msg = @pipe.tree.client.send_recv(request)
44
+ handle_msg(RubySMB::SMB2::Packet::IoctlResponse.read(@last_msg))
45
+ end
46
+
47
+ # @param [BinData::Record] msg
48
+ def handle_msg(msg)
49
+ data = msg.buffer.to_binary_s
50
+ headz = RubySMB::Dcerpc::PduHeader.read(data)
51
+ pdu = PTYPES[headz.ptype]
52
+ if pdu
53
+ dcerpc_response_stub = pdu.read(msg.output_data).stub
54
+ @response = dcerpc_response_stub.to_binary_s
55
+ end
56
+ data
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,41 @@
1
+ module RubySMB
2
+ module Dcerpc
3
+
4
+ class NdrSyntax < BinData::Record
5
+ endian :little
6
+ uuid :if_uuid, initial_value: '8a885d04-1ceb-11c9-9fe8-08002b104860'
7
+ uint16 :if_ver, initial_value: 2
8
+ uint16 :if_ver_minor, initial_value: 0
9
+ end
10
+
11
+ class NdrString < BinData::Record
12
+ endian :little
13
+
14
+ uint32 :max_count, initial_value: -> { str.length }
15
+ uint32 :offset, initial_value: 0
16
+ uint32 :actual_count, initial_value: -> { str.length }
17
+ stringz16 :str, read_length: -> { actual_count }
18
+
19
+ def assign(v)
20
+ self.max_count = v.size
21
+ self.actual_count = v.size
22
+ self.str = v
23
+ end
24
+ end
25
+
26
+ class NdrLpStr < BinData::Record
27
+ endian :little
28
+
29
+ uint32 :referent_identifier
30
+ ndr_string :ndr_str
31
+
32
+ def assign(v)
33
+ self.ndr_str = v
34
+ end
35
+
36
+ def to_s
37
+ self.ndr_str.str
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,43 @@
1
+ module RubySMB
2
+ module Dcerpc
3
+ #http://pubs.opengroup.org/onlinepubs/9629399/chap12.htm
4
+ class Request < BinData::Record
5
+ endian :little
6
+
7
+ #common fields
8
+ uint8 :rpc_vers, initial_value: 5 # 00:01 RPC version
9
+ uint8 :rpc_vers_minor # 01:01 minor version
10
+ uint8 :ptype # 02:01 request PDU
11
+ struct :pfc_flags do
12
+ bit1 :object
13
+ bit1 :maybe
14
+ bit1 :did_not_execute
15
+ bit1 :multiplex
16
+ bit1 :reserved
17
+ bit1 :cancel
18
+ bit1 :last_frag, initial_value: 1
19
+ bit1 :first_frag, initial_value: 1
20
+ end
21
+
22
+ uint32 :packed_drep, initial_value: 0x00000010 # 04:04 NDR data rep format label
23
+
24
+ uint16 :frag_length, initial_value: -> { self.do_num_bytes } # 08:02 total length of fragment
25
+ uint16 :auth_length # 10:02 length of auth_value
26
+ uint32 :call_id # 12:04 call identifier
27
+
28
+ #needed on request, response, fault
29
+
30
+ uint32 :alloc_hint, initial_value: -> {stub.do_num_bytes} # 16:04 allocation hint
31
+ uint16 :p_cont_id # 20:02 pres context, i.e. data rep
32
+ uint16 :opnum # 22:02 operation #within the interface
33
+
34
+ # optional field for request, only present if the PFC_OBJECT_UUID field is non-zero
35
+
36
+ string :stub, read_length: -> {alloc_hint} # stub data, 8-octet aligned
37
+ string :auth_verifier_co_t # optional authentication verifier
38
+ # following fields present iff auth_length != 0 */
39
+
40
+ #auth_verifier_co_t auth_verifier # xx:yy
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,46 @@
1
+ module RubySMB
2
+ module Dcerpc
3
+ #http://pubs.opengroup.org/onlinepubs/9629399/chap12.htm
4
+ class Response < BinData::Record
5
+ endian :little
6
+
7
+ #common fields
8
+ uint8 :rpc_vers # 00:01 RPC version
9
+ uint8 :rpc_vers_minor # 01:01 minor version
10
+ uint8 :ptype # 02:01 request PDU
11
+ struct :pfc_flags do
12
+ bit1 :object
13
+ bit1 :maybe
14
+ bit1 :did_not_execute
15
+ bit1 :multiplex
16
+ bit1 :reserved
17
+ bit1 :cancel
18
+ bit1 :last_frag, initial_value: 1
19
+ bit1 :first_frag, initial_value: 1
20
+ end
21
+
22
+ uint32 :packed_drep # 04:04 NDR data rep format label
23
+
24
+ uint16 :frag_length # 08:02 total length of fragment
25
+ uint16 :auth_length # 10:02 length of auth_value
26
+ uint32 :call_id # 12:04 call identifier
27
+
28
+ #needed on request, response, fault
29
+
30
+ uint32 :alloc_hint # 16:04 allocation hint
31
+ uint16 :p_cont_id # 20:02 pres context, i.e. data rep
32
+ uint16 :cancel_count # 22:02 operation #within the interface
33
+
34
+ # optional field for request, only present if the PFC_OBJECT_UUID field is non-zero
35
+
36
+ string :stub, length: -> {alloc_hint}
37
+
38
+ # stub data, 8-octet aligned
39
+
40
+ # optional authentication verifier
41
+ # following fields present iff auth_length != 0 */
42
+
43
+ #auth_verifier_co_t auth_verifier # xx:yy
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,17 @@
1
+ module RubySMB
2
+ module Dcerpc
3
+ module Srvsvc
4
+
5
+ class SrvSvcHandle < Dcerpc::NdrLpStr; end
6
+
7
+ class SrvSvcSyntax < BinData::Record
8
+ endian :little
9
+ uuid :if_uuid, initial_value: '4b324fc8-1670-01d3-1278-5a47bf6ee188'
10
+ uint16 :if_ver, initial_value: 3
11
+ uint16 :if_ver_minor, initial_value: 0
12
+ end
13
+
14
+ require 'ruby_smb/dcerpc/srvsvc/net_share_enum_all'
15
+ end
16
+ end
17
+ end