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
@@ -0,0 +1,26 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileFullDirectoryInformation Class as defined in
5
+ # [2.4.14 FileFullDirectoryInformation](https://msdn.microsoft.com/en-us/library/cc232068.aspx)
6
+ class FileFullDirectoryInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_FULL_DIRECTORY_INFORMATION
8
+
9
+ endian :little
10
+
11
+ uint32 :next_offset, label: 'Next Entry Offset'
12
+ uint32 :file_index, label: 'File Index'
13
+ file_time :create_time, label: 'Create Time'
14
+ file_time :last_access, label: 'Last Accessed Time'
15
+ file_time :last_write, label: 'Last Write Time'
16
+ file_time :last_change, label: 'Last Modified Time'
17
+ uint64 :end_of_file, label: 'End of File'
18
+ uint64 :allocation_size, label: 'Allocated Size'
19
+ file_attributes :file_attributes, label: 'File Attributes'
20
+ uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
21
+ uint32 :ea_size, label: 'Extended Attributes Size'
22
+ string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,31 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileIdBothDirectoryInformation Class as defined in
5
+ # [2.4.17 FileIdBothDirectoryInformation](https://msdn.microsoft.com/en-us/library/cc232070.aspx)
6
+ class FileIdBothDirectoryInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_ID_BOTH_DIRECTORY_INFORMATION
8
+
9
+ endian :little
10
+
11
+ uint32 :next_offset, label: 'Next Entry Offset'
12
+ uint32 :file_index, label: 'File Index'
13
+ file_time :create_time, label: 'Create Time'
14
+ file_time :last_access, label: 'Last Accessed Time'
15
+ file_time :last_write, label: 'Last Write Time'
16
+ file_time :last_change, label: 'Last Modified Time'
17
+ uint64 :end_of_file, label: 'End of File'
18
+ uint64 :allocation_size, label: 'Allocated Size'
19
+ file_attributes :file_attributes, label: 'File Attributes'
20
+ uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
21
+ uint32 :ea_size, label: 'Extended Attributes Size'
22
+ uint8 :short_name_length, label: 'Short Name Length'
23
+ uint8 :reserved, label: 'Reserved Space'
24
+ string16 :short_name, label: 'File Short Name', length: 24
25
+ uint16 :reserved2, label: 'Reserved Space'
26
+ uint64 :file_id, label: 'File Id'
27
+ string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,28 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileIdDirectoryInformation Class as defined in
5
+ # [2.4.18 FileIdFullDirectoryInformation](https://msdn.microsoft.com/en-us/library/cc232071.aspx)
6
+ class FileIdFullDirectoryInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_ID_FULL_DIRECTORY_INFORMATION
8
+
9
+ endian :little
10
+
11
+ uint32 :next_offset, label: 'Next Entry Offset'
12
+ uint32 :file_index, label: 'File Index'
13
+ file_time :create_time, label: 'Create Time'
14
+ file_time :last_access, label: 'Last Accessed Time'
15
+ file_time :last_write, label: 'Last Write Time'
16
+ file_time :last_change, label: 'Last Modified Time'
17
+ uint64 :end_of_file, label: 'End of File'
18
+ uint64 :allocation_size, label: 'Allocated Size'
19
+ file_attributes :file_attributes, label: 'File Attributes'
20
+ uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
21
+ uint32 :ea_size, label: 'Extended Attributes Size'
22
+ uint32 :reserved, label: 'Reserved Space'
23
+ uint64 :file_id, label: 'File ID'
24
+ string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,18 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileNamesInformation Class as defined in
5
+ # [2.4.26 FileNamesInformation](https://msdn.microsoft.com/en-us/library/cc232077.aspx)
6
+ class FileNamesInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_NAMES_INFORMATION
8
+
9
+ endian :little
10
+
11
+ uint32 :next_offset, label: 'Next Entry Offset'
12
+ uint32 :file_index, label: 'File Index'
13
+ uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
14
+ string16 :file_name, label: 'File Name', read_length: -> { file_name_length }
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,44 @@
1
+ module RubySMB
2
+ module Fscc
3
+ module FileInformation
4
+ # The FileRenameInformation Class as defined in
5
+ # [2.4.34.2 FileRenameInformation](https://msdn.microsoft.com/en-us/library/cc704597.aspx)
6
+ class FileRenameInformation < BinData::Record
7
+ CLASS_LEVEL = FileInformation::FILE_ID_FULL_DIRECTORY_INFORMATION
8
+
9
+ endian :little
10
+
11
+ uint8 :replace_if_exists, label: 'Replace If Exists'
12
+
13
+ choice :reserved, selection: -> { get_smb_version } do
14
+ uint24 1, label: 'Reserved Space'
15
+ uint56 2, label: 'Reserved Space'
16
+ end
17
+
18
+ choice :root_directory, selection: -> { get_smb_version } do
19
+ uint32 1, label: 'Root Directory', initial_value: 0
20
+ uint64 2, label: 'Root Directory', initial_value: 0
21
+ end
22
+
23
+ uint32 :file_name_length, label: 'File Name Length', initial_value: -> { file_name.do_num_bytes }
24
+ string :file_name, label: 'File Name', read_length: -> { file_name_length }
25
+
26
+ def get_smb_version(obj = self)
27
+ # Return version 1 by default in case the structure is not part of a
28
+ # SMB packet. This way, we can still instantiate this structure
29
+ # independently without breaking the "choice" logic.
30
+ return 1 if obj.nil?
31
+ smb_version = if obj.respond_to?(:smb_header)
32
+ 1
33
+ elsif obj.respond_to?(:smb2_header)
34
+ 2
35
+ else
36
+ get_smb_version(obj.parent)
37
+ end
38
+ return smb_version
39
+ end
40
+
41
+ end
42
+ end
43
+ end
44
+ end
@@ -21,16 +21,38 @@ module RubySMB
21
21
  display_str
22
22
  end
23
23
 
24
-
25
24
  def packet_smb_version
26
25
  class_name = self.class.to_s
27
26
  case class_name
28
- when /SMB1/
29
- 'SMB1'
30
- when /SMB2/
31
- 'SMB2'
32
- else
33
- ''
27
+ when /SMB1/
28
+ 'SMB1'
29
+ when /SMB2/
30
+ 'SMB2'
31
+ else
32
+ ''
33
+ end
34
+ end
35
+
36
+ # Overrides the class #read method with some automatic
37
+ # exception handling. If an {EOFError} is thrown, it will try
38
+ # to read the data into the protocol specific empty ErrorPacket
39
+ # so that the NTstatus code can be read. We re-raise the exception
40
+ # in the event that it is not an SMB1 or SMB2 packet, or if it is
41
+ # already an error packet.
42
+ def self.read(val)
43
+ begin
44
+ super(val)
45
+ rescue EOFError => e
46
+ case self.to_s
47
+ when /EmptyPacket|ErrorPacket/
48
+ raise e
49
+ when /SMB1/
50
+ RubySMB::SMB1::Packet::EmptyPacket.read(val)
51
+ when /SMB2/
52
+ RubySMB::SMB2::Packet::ErrorPacket.read(val)
53
+ else
54
+ raise e
55
+ end
34
56
  end
35
57
  end
36
58
 
@@ -38,10 +60,10 @@ module RubySMB
38
60
  value = -1
39
61
  smb_version = packet_smb_version
40
62
  case smb_version
41
- when 'SMB1'
42
- value = self.smb_header.nt_status.value
43
- when 'SMB2'
44
- value = self.smb2_header.nt_status.value
63
+ when 'SMB1'
64
+ value = smb_header.nt_status.value
65
+ when 'SMB2'
66
+ value = smb2_header.nt_status.value
45
67
  end
46
68
  status_code = WindowsError::NTStatus.find_by_retval(value).first
47
69
  if status_code.nil?
@@ -50,8 +72,6 @@ module RubySMB
50
72
  status_code
51
73
  end
52
74
 
53
- private
54
-
55
75
  # Returns an array of hashes representing the
56
76
  # fields for this record.
57
77
  #
@@ -77,7 +97,7 @@ module RubySMB
77
97
  name.capitalize!
78
98
  end
79
99
  formatted_name = "\n" + ("\t" * depth) + name
80
- formatted_string = sprintf '%-30s %-10s %s', formatted_name, class_str, field[:label]
100
+ formatted_string = format '%-30s %-10s %s', formatted_name, class_str, field[:label]
81
101
  field[:fields].each do |sub_field|
82
102
  formatted_string << format_field(sub_field, (depth + 1))
83
103
  end
@@ -110,6 +130,8 @@ module RubySMB
110
130
  field_hashes
111
131
  end
112
132
 
133
+ private
134
+
113
135
  # Takes a hash representation of a field in the packet structure and formats it
114
136
  # into a string representing the contents of that field.
115
137
  #
@@ -135,8 +157,8 @@ module RubySMB
135
157
  if field[:class].ancestors.include? BinData::Record
136
158
  field_str = label
137
159
  else
138
- value = self.send(name)
139
- field_str = sprintf '%-30s %s', label, value
160
+ value = send(name)
161
+ field_str = format '%-30s %s', label, value
140
162
  end
141
163
  else
142
164
  parent = self
@@ -146,7 +168,7 @@ module RubySMB
146
168
  value = parent.send(name)
147
169
  label = field[:label] || name.to_s.capitalize
148
170
  label = "\n" + ("\t" * depth) + label
149
- field_str = sprintf '%-30s %s', label, value
171
+ field_str = format '%-30s %s', label, value
150
172
  end
151
173
  end
152
174
  my_parents << name
@@ -173,7 +195,7 @@ module RubySMB
173
195
  value = sub_field.send(name)
174
196
  label ||= name
175
197
  label = "\n" + "\t" * depth + label
176
- sub_field_str = sprintf '%-30s %s', label, value
198
+ sub_field_str = format '%-30s %s', label, value
177
199
  array_field_str << sub_field_str
178
200
  end
179
201
  end
data/lib/ruby_smb/gss.rb CHANGED
@@ -1,27 +1,25 @@
1
1
  module RubySMB
2
-
3
2
  # module containing methods required for using the [GSS-API](http://www.rfc-editor.org/rfc/rfc2743.txt)
4
3
  # for Secure Protected Negotiation(SPNEGO) in SMB Authentication.
5
4
  module Gss
6
-
7
5
  # Cargo culted from Rex. Hacked Together ASN1 encoding that works for our GSS purposes
8
6
  # @todo Document these magic numbers
9
7
  def self.asn1encode(str = '')
10
8
  # If the high bit of the first byte is 1, it contains the number of
11
9
  # length bytes that follow
12
10
  case str.length
13
- when 0..0x7F
14
- encoded_string = [str.length].pack('C') + str
15
- when 0x80..0xFF
16
- encoded_string = [0x81, str.length].pack('CC') + str
17
- when 0x100..0xFFFF
18
- encoded_string = [0x82, str.length].pack('Cn') + str
19
- when 0x10000..0xffffff
20
- encoded_string = [0x83, str.length >> 16, str.length & 0xFFFF].pack('CCn') + str
21
- when 0x1000000..0xffffffff
22
- encoded_string = [0x84, str.length].pack('CN') + str
23
- else
24
- raise RubySMB::Error::ASN1Encoding, "Source string is too long. Size is #{str.length}"
11
+ when 0..0x7F
12
+ encoded_string = [str.length].pack('C') + str
13
+ when 0x80..0xFF
14
+ encoded_string = [0x81, str.length].pack('CC') + str
15
+ when 0x100..0xFFFF
16
+ encoded_string = [0x82, str.length].pack('Cn') + str
17
+ when 0x10000..0xffffff
18
+ encoded_string = [0x83, str.length >> 16, str.length & 0xFFFF].pack('CCn') + str
19
+ when 0x1000000..0xffffffff
20
+ encoded_string = [0x84, str.length].pack('CN') + str
21
+ else
22
+ raise RubySMB::Error::ASN1Encoding, "Source string is too long. Size is #{str.length}"
25
23
  end
26
24
  encoded_string
27
25
  end
@@ -29,71 +27,69 @@ module RubySMB
29
27
  # Create a GSS Security Blob of an NTLM Type 1 Message.
30
28
  # This code has been cargo culted and needs to be researched
31
29
  # and refactored into something better later.
32
- #@todo Refactor this into non-magical code
30
+ # @todo Refactor this into non-magical code
33
31
  def self.gss_type1(type1)
34
- "\x60".force_encoding("binary") + self.asn1encode(
35
- "\x06".force_encoding("binary") + self.asn1encode(
36
- "\x2b\x06\x01\x05\x05\x02".force_encoding("binary")
32
+ "\x60".force_encoding('binary') + asn1encode(
33
+ "\x06".force_encoding('binary') + asn1encode(
34
+ "\x2b\x06\x01\x05\x05\x02".force_encoding('binary')
37
35
  ) +
38
- "\xa0".force_encoding("binary") + self.asn1encode(
39
- "\x30".force_encoding("binary") + self.asn1encode(
40
- "\xa0".force_encoding("binary") + self.asn1encode(
41
- "\x30".force_encoding("binary") + self.asn1encode(
42
- "\x06".force_encoding("binary") + self.asn1encode(
43
- "\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a".force_encoding("binary")
36
+ "\xa0".force_encoding('binary') + asn1encode(
37
+ "\x30".force_encoding('binary') + asn1encode(
38
+ "\xa0".force_encoding('binary') + asn1encode(
39
+ "\x30".force_encoding('binary') + asn1encode(
40
+ "\x06".force_encoding('binary') + asn1encode(
41
+ "\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a".force_encoding('binary')
42
+ )
43
+ )
44
+ ) +
45
+ "\xa2".force_encoding('binary') + asn1encode(
46
+ "\x04".force_encoding('binary') + asn1encode(
47
+ type1
48
+ )
44
49
  )
45
- )
46
- ) +
47
- "\xa2".force_encoding("binary") + self.asn1encode(
48
- "\x04".force_encoding("binary") + self.asn1encode(
49
- type1
50
- )
51
50
  )
52
51
  )
53
- )
54
52
  )
55
53
  end
56
54
 
57
-
58
55
  # Create a GSS Security Blob of an NTLM Type 2 Message.
59
56
  # This code has been cargo culted and needs to be researched
60
57
  # and refactored into something better later.
61
58
  def self.gss_type2(type2)
62
-
63
59
  blob =
64
- "\xa1" + self.asn1encode(
65
- "\x30" + self.asn1encode(
66
- "\xa0" + self.asn1encode(
67
- "\x0a" + self.asn1encode(
60
+ "\xa1" + asn1encode(
61
+ "\x30" + asn1encode(
62
+ "\xa0" + asn1encode(
63
+ "\x0a" + asn1encode(
68
64
  "\x01"
69
65
  )
70
66
  ) +
71
- "\xa1" + self.asn1encode(
72
- "\x06" + self.asn1encode(
73
- "\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a"
74
- )
75
- ) +
76
- "\xa2" + self.asn1encode(
77
- "\x04" + self.asn1encode(
78
- type2
67
+ "\xa1" + asn1encode(
68
+ "\x06" + asn1encode(
69
+ "\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a"
70
+ )
71
+ ) +
72
+ "\xa2" + asn1encode(
73
+ "\x04" + asn1encode(
74
+ type2
75
+ )
79
76
  )
80
- )
81
77
  )
82
78
  )
83
79
 
84
- return blob
80
+ blob
85
81
  end
86
82
 
87
83
  # Create a GSS Security Blob of an NTLM Type 3 Message.
88
84
  # This code has been cargo culted and needs to be researched
89
85
  # and refactored into something better later.
90
- #@todo Refactor this into non-magical code
86
+ # @todo Refactor this into non-magical code
91
87
  def self.gss_type3(type3)
92
88
  gss =
93
- "\xa1".force_encoding("binary") + self.asn1encode(
94
- "\x30".force_encoding("binary") + self.asn1encode(
95
- "\xa2".force_encoding("binary") + self.asn1encode(
96
- "\x04".force_encoding("binary") + self.asn1encode(
89
+ "\xa1".force_encoding('binary') + asn1encode(
90
+ "\x30".force_encoding('binary') + asn1encode(
91
+ "\xa2".force_encoding('binary') + asn1encode(
92
+ "\x04".force_encoding('binary') + asn1encode(
97
93
  type3
98
94
  )
99
95
  )
@@ -102,8 +98,5 @@ module RubySMB
102
98
 
103
99
  gss
104
100
  end
105
-
106
-
107
-
108
101
  end
109
- end
102
+ end
@@ -1,6 +1,7 @@
1
1
  module RubySMB
2
2
  # Contains constants for the various Impersonation levels as defined in
3
- # [2.2.4.64.1 Request](https://msdn.microsoft.com/en-us/library/ee442175.aspx)
3
+ # [2.2.4.64.1 Request](https://msdn.microsoft.com/en-us/library/ee442175.aspx) and
4
+ # [2.2.4.9.1 Client Request Extensions](https://msdn.microsoft.com/en-us/library/cc246332.aspx)
4
5
  # See also [Impersonation Levels](https://msdn.microsoft.com/en-us/library/ms686632(v=vs.85).aspx)
5
6
  module ImpersonationLevels
6
7
  # The client is anonymous to the server. The server process can impersonate the client, but the impersonation
@@ -18,5 +19,9 @@ module RubySMB
18
19
  # that are on the same computer as the server.
19
20
  SEC_IMPERSONATE = 0x00000002
20
21
 
22
+ # The most powerful impersonation level. When this level is selected, the server (whether local or remote)
23
+ # can impersonate the client's security context while acting on behalf of the client. During impersonation,
24
+ # the client's credentials (both local and network) can be passed to any number of computers.
25
+ SEC_DELEGATE = 0x00000003
21
26
  end
22
- end
27
+ end
@@ -0,0 +1,16 @@
1
+ module RubySMB
2
+ # Namespace for all of the NetBIOS packets used by RubySMB
3
+ module Nbss
4
+ # Session Packet Types
5
+ SESSION_MESSAGE = 0x00
6
+ SESSION_REQUEST = 0x81
7
+ POSITIVE_SESSION_RESPONSE = 0x82
8
+ NEGATIVE_SESSION_RESPONSE = 0x83
9
+ RETARGET_SESSION_RESPONSE = 0x84
10
+ SESSION_KEEP_ALIVE = 0x85
11
+
12
+ require 'ruby_smb/nbss/session_header'
13
+ require 'ruby_smb/nbss/session_request'
14
+ require 'ruby_smb/nbss/negative_session_response'
15
+ end
16
+ end