ruby_smb 2.0.2 → 3.0.0

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 (285) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.github/workflows/verify.yml +46 -0
  4. data/README.md +0 -1
  5. data/examples/anonymous_auth.rb +3 -3
  6. data/examples/append_file.rb +10 -8
  7. data/examples/auth_capture.rb +71 -0
  8. data/examples/authenticate.rb +9 -5
  9. data/examples/delete_file.rb +8 -6
  10. data/examples/dump_secrets_from_sid.rb +207 -0
  11. data/examples/enum_domain_users.rb +75 -0
  12. data/examples/enum_registry_key.rb +5 -4
  13. data/examples/enum_registry_values.rb +5 -4
  14. data/examples/get_computer_info.rb +42 -0
  15. data/examples/list_directory.rb +8 -6
  16. data/examples/negotiate_with_netbios_service.rb +9 -5
  17. data/examples/net_share_enum_all.rb +6 -4
  18. data/examples/pipes.rb +11 -12
  19. data/examples/query_service_status.rb +102 -0
  20. data/examples/read_file.rb +8 -6
  21. data/examples/read_registry_key_value.rb +6 -5
  22. data/examples/rename_file.rb +9 -7
  23. data/examples/tree_connect.rb +7 -5
  24. data/examples/write_file.rb +9 -7
  25. data/lib/ruby_smb/client/authentication.rb +5 -10
  26. data/lib/ruby_smb/client/echo.rb +2 -4
  27. data/lib/ruby_smb/client/negotiation.rb +13 -16
  28. data/lib/ruby_smb/client/tree_connect.rb +2 -4
  29. data/lib/ruby_smb/client/utils.rb +16 -10
  30. data/lib/ruby_smb/client/winreg.rb +1 -1
  31. data/lib/ruby_smb/client.rb +102 -75
  32. data/lib/ruby_smb/compression/lznt1.rb +164 -0
  33. data/lib/ruby_smb/compression.rb +7 -0
  34. data/lib/ruby_smb/dcerpc/bind.rb +28 -20
  35. data/lib/ruby_smb/dcerpc/bind_ack.rb +29 -28
  36. data/lib/ruby_smb/dcerpc/client.rb +542 -0
  37. data/lib/ruby_smb/dcerpc/drsr/drs_bind_request.rb +24 -0
  38. data/lib/ruby_smb/dcerpc/drsr/drs_bind_response.rb +26 -0
  39. data/lib/ruby_smb/dcerpc/drsr/drs_crack_names_request.rb +57 -0
  40. data/lib/ruby_smb/dcerpc/drsr/drs_crack_names_response.rb +76 -0
  41. data/lib/ruby_smb/dcerpc/drsr/drs_domain_controller_info_request.rb +46 -0
  42. data/lib/ruby_smb/dcerpc/drsr/drs_domain_controller_info_response.rb +168 -0
  43. data/lib/ruby_smb/dcerpc/drsr/drs_extensions.rb +56 -0
  44. data/lib/ruby_smb/dcerpc/drsr/drs_get_nc_changes_request.rb +121 -0
  45. data/lib/ruby_smb/dcerpc/drsr/drs_get_nc_changes_response.rb +118 -0
  46. data/lib/ruby_smb/dcerpc/drsr/drs_unbind_request.rb +24 -0
  47. data/lib/ruby_smb/dcerpc/drsr/drs_unbind_response.rb +26 -0
  48. data/lib/ruby_smb/dcerpc/drsr.rb +909 -0
  49. data/lib/ruby_smb/dcerpc/epm/epm_ept_map_request.rb +26 -0
  50. data/lib/ruby_smb/dcerpc/epm/epm_ept_map_response.rb +25 -0
  51. data/lib/ruby_smb/dcerpc/epm/epm_twrt.rb +211 -0
  52. data/lib/ruby_smb/dcerpc/epm.rb +75 -0
  53. data/lib/ruby_smb/dcerpc/error.rb +20 -0
  54. data/lib/ruby_smb/dcerpc/ndr.rb +1204 -80
  55. data/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_request.rb +27 -0
  56. data/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_response.rb +26 -0
  57. data/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_request.rb +27 -0
  58. data/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_response.rb +23 -0
  59. data/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_request.rb +24 -0
  60. data/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_response.rb +24 -0
  61. data/lib/ruby_smb/dcerpc/netlogon.rb +102 -0
  62. data/lib/ruby_smb/dcerpc/p_syntax_id_t.rb +4 -3
  63. data/lib/ruby_smb/dcerpc/pdu_header.rb +7 -7
  64. data/lib/ruby_smb/dcerpc/ptypes.rb +1 -0
  65. data/lib/ruby_smb/dcerpc/request.rb +85 -19
  66. data/lib/ruby_smb/dcerpc/response.rb +45 -10
  67. data/lib/ruby_smb/dcerpc/rpc_auth3.rb +28 -0
  68. data/lib/ruby_smb/dcerpc/rpc_security_attributes.rb +34 -0
  69. data/lib/ruby_smb/dcerpc/rrp_rpc_unicode_string.rb +118 -0
  70. data/lib/ruby_smb/dcerpc/samr/rpc_sid.rb +150 -0
  71. data/lib/ruby_smb/dcerpc/samr/samr_close_handle_request.rb +23 -0
  72. data/lib/ruby_smb/dcerpc/samr/samr_close_handle_response.rb +24 -0
  73. data/lib/ruby_smb/dcerpc/samr/samr_connect_request.rb +32 -0
  74. data/lib/ruby_smb/dcerpc/samr/samr_connect_response.rb +23 -0
  75. data/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_request.rb +26 -0
  76. data/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_response.rb +55 -0
  77. data/lib/ruby_smb/dcerpc/samr/samr_get_alias_membership_request.rb +48 -0
  78. data/lib/ruby_smb/dcerpc/samr/samr_get_alias_membership_response.rb +38 -0
  79. data/lib/ruby_smb/dcerpc/samr/samr_get_groups_for_user_request.rb +23 -0
  80. data/lib/ruby_smb/dcerpc/samr/samr_get_groups_for_user_response.rb +48 -0
  81. data/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_request.rb +24 -0
  82. data/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_response.rb +25 -0
  83. data/lib/ruby_smb/dcerpc/samr/samr_open_domain_request.rb +27 -0
  84. data/lib/ruby_smb/dcerpc/samr/samr_open_domain_response.rb +24 -0
  85. data/lib/ruby_smb/dcerpc/samr/samr_open_user_request.rb +26 -0
  86. data/lib/ruby_smb/dcerpc/samr/samr_open_user_response.rb +24 -0
  87. data/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_request.rb +23 -0
  88. data/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_response.rb +23 -0
  89. data/lib/ruby_smb/dcerpc/samr.rb +613 -0
  90. data/lib/ruby_smb/dcerpc/sec_trailer.rb +26 -0
  91. data/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all.rb +56 -79
  92. data/lib/ruby_smb/dcerpc/srvsvc.rb +27 -4
  93. data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request.rb +36 -0
  94. data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response.rb +26 -0
  95. data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_request.rb +25 -0
  96. data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response.rb +26 -0
  97. data/lib/ruby_smb/dcerpc/svcctl/control_service_request.rb +26 -0
  98. data/lib/ruby_smb/dcerpc/svcctl/control_service_response.rb +26 -0
  99. data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request.rb +25 -0
  100. data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response.rb +23 -0
  101. data/lib/ruby_smb/dcerpc/svcctl/open_service_w_request.rb +23 -0
  102. data/lib/ruby_smb/dcerpc/svcctl/open_service_w_response.rb +23 -0
  103. data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request.rb +25 -0
  104. data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response.rb +45 -0
  105. data/lib/ruby_smb/dcerpc/svcctl/query_service_status_request.rb +23 -0
  106. data/lib/ruby_smb/dcerpc/svcctl/query_service_status_response.rb +27 -0
  107. data/lib/ruby_smb/dcerpc/svcctl/service_status.rb +26 -0
  108. data/lib/ruby_smb/dcerpc/svcctl/start_service_w_request.rb +27 -0
  109. data/lib/ruby_smb/dcerpc/svcctl/start_service_w_response.rb +25 -0
  110. data/lib/ruby_smb/dcerpc/svcctl.rb +477 -0
  111. data/lib/ruby_smb/dcerpc/uuid.rb +3 -0
  112. data/lib/ruby_smb/dcerpc/winreg/close_key_response.rb +2 -2
  113. data/lib/ruby_smb/dcerpc/winreg/create_key_request.rb +62 -0
  114. data/lib/ruby_smb/dcerpc/winreg/create_key_response.rb +36 -0
  115. data/lib/ruby_smb/dcerpc/winreg/enum_key_request.rb +2 -19
  116. data/lib/ruby_smb/dcerpc/winreg/enum_key_response.rb +3 -20
  117. data/lib/ruby_smb/dcerpc/winreg/enum_value_request.rb +5 -14
  118. data/lib/ruby_smb/dcerpc/winreg/enum_value_response.rb +5 -14
  119. data/lib/ruby_smb/dcerpc/winreg/open_key_request.rb +1 -9
  120. data/lib/ruby_smb/dcerpc/winreg/open_key_response.rb +4 -3
  121. data/lib/ruby_smb/dcerpc/winreg/open_root_key_request.rb +6 -7
  122. data/lib/ruby_smb/dcerpc/winreg/open_root_key_response.rb +2 -2
  123. data/lib/ruby_smb/dcerpc/winreg/query_info_key_request.rb +1 -1
  124. data/lib/ruby_smb/dcerpc/winreg/query_info_key_response.rb +9 -18
  125. data/lib/ruby_smb/dcerpc/winreg/query_value_request.rb +4 -13
  126. data/lib/ruby_smb/dcerpc/winreg/query_value_response.rb +7 -15
  127. data/lib/ruby_smb/dcerpc/winreg/regsam.rb +3 -1
  128. data/lib/ruby_smb/dcerpc/winreg/save_key_request.rb +28 -0
  129. data/lib/ruby_smb/dcerpc/winreg/save_key_response.rb +23 -0
  130. data/lib/ruby_smb/dcerpc/winreg.rb +99 -22
  131. data/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_request.rb +26 -0
  132. data/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_response.rb +88 -0
  133. data/lib/ruby_smb/dcerpc/wkssvc.rb +65 -0
  134. data/lib/ruby_smb/dcerpc.rb +45 -11
  135. data/lib/ruby_smb/dialect.rb +45 -0
  136. data/lib/ruby_smb/dispatcher/base.rb +1 -1
  137. data/lib/ruby_smb/dispatcher/socket.rb +2 -2
  138. data/lib/ruby_smb/error.rb +21 -5
  139. data/lib/ruby_smb/field/file_time.rb +1 -1
  140. data/lib/ruby_smb/field/string16.rb +5 -1
  141. data/lib/ruby_smb/field/stringz16.rb +17 -1
  142. data/lib/ruby_smb/generic_packet.rb +11 -1
  143. data/lib/ruby_smb/gss/provider/authenticator.rb +42 -0
  144. data/lib/ruby_smb/gss/provider/ntlm.rb +303 -0
  145. data/lib/ruby_smb/gss/provider.rb +35 -0
  146. data/lib/ruby_smb/gss.rb +56 -63
  147. data/lib/ruby_smb/nbss/session_header.rb +4 -4
  148. data/lib/ruby_smb/ntlm.rb +61 -0
  149. data/lib/ruby_smb/server/server_client/negotiation.rb +156 -0
  150. data/lib/ruby_smb/server/server_client/session_setup.rb +82 -0
  151. data/lib/ruby_smb/server/server_client.rb +162 -0
  152. data/lib/ruby_smb/server.rb +54 -0
  153. data/lib/ruby_smb/signing.rb +59 -0
  154. data/lib/ruby_smb/smb1/file.rb +10 -25
  155. data/lib/ruby_smb/smb1/packet/negotiate_response.rb +11 -11
  156. data/lib/ruby_smb/smb1/packet/negotiate_response_extended.rb +1 -1
  157. data/lib/ruby_smb/smb1/packet/session_setup_request.rb +1 -1
  158. data/lib/ruby_smb/smb1/packet/trans2/find_first2_response.rb +0 -1
  159. data/lib/ruby_smb/smb1/packet/trans2/find_next2_response.rb +0 -1
  160. data/lib/ruby_smb/smb1/packet/trans2/open2_response.rb +1 -2
  161. data/lib/ruby_smb/smb1/packet/trans2/set_file_information_response.rb +1 -13
  162. data/lib/ruby_smb/smb1/pipe.rb +12 -6
  163. data/lib/ruby_smb/smb1/tree.rb +13 -9
  164. data/lib/ruby_smb/smb2/file.rb +33 -33
  165. data/lib/ruby_smb/smb2/negotiate_context.rb +18 -2
  166. data/lib/ruby_smb/smb2/packet/compression_transform_header.rb +4 -0
  167. data/lib/ruby_smb/smb2/packet/negotiate_request.rb +9 -0
  168. data/lib/ruby_smb/smb2/packet/negotiate_response.rb +0 -1
  169. data/lib/ruby_smb/smb2/packet/session_setup_response.rb +2 -2
  170. data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +1 -1
  171. data/lib/ruby_smb/smb2/pipe.rb +13 -6
  172. data/lib/ruby_smb/smb2/tree.rb +21 -11
  173. data/lib/ruby_smb/smb2.rb +3 -1
  174. data/lib/ruby_smb/version.rb +1 -1
  175. data/lib/ruby_smb.rb +5 -3
  176. data/spec/lib/ruby_smb/client_spec.rb +199 -86
  177. data/spec/lib/ruby_smb/compression/lznt1_spec.rb +32 -0
  178. data/spec/lib/ruby_smb/dcerpc/bind_ack_spec.rb +69 -41
  179. data/spec/lib/ruby_smb/dcerpc/bind_spec.rb +75 -21
  180. data/spec/lib/ruby_smb/dcerpc/client_spec.rb +714 -0
  181. data/spec/lib/ruby_smb/dcerpc/drsr_spec.rb +2169 -0
  182. data/spec/lib/ruby_smb/dcerpc/ndr_spec.rb +3977 -239
  183. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_request_spec.rb +69 -0
  184. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_response_spec.rb +53 -0
  185. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_request_spec.rb +69 -0
  186. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_response_spec.rb +37 -0
  187. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_request_spec.rb +45 -0
  188. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_response_spec.rb +37 -0
  189. data/spec/lib/ruby_smb/dcerpc/p_syntax_id_t_spec.rb +18 -4
  190. data/spec/lib/ruby_smb/dcerpc/pdu_header_spec.rb +27 -1
  191. data/spec/lib/ruby_smb/dcerpc/request_spec.rb +76 -11
  192. data/spec/lib/ruby_smb/dcerpc/response_spec.rb +99 -9
  193. data/spec/lib/ruby_smb/dcerpc/rpc_auth3_spec.rb +75 -0
  194. data/spec/lib/ruby_smb/dcerpc/rpc_security_attributes_spec.rb +162 -0
  195. data/spec/lib/ruby_smb/dcerpc/rrp_rpc_unicode_string_spec.rb +340 -0
  196. data/spec/lib/ruby_smb/dcerpc/samr/rpc_sid_spec.rb +116 -0
  197. data/spec/lib/ruby_smb/dcerpc/samr/samr_close_handle_request_spec.rb +40 -0
  198. data/spec/lib/ruby_smb/dcerpc/samr/samr_close_handle_response_spec.rb +48 -0
  199. data/spec/lib/ruby_smb/dcerpc/samr/samr_connect_request_spec.rb +56 -0
  200. data/spec/lib/ruby_smb/dcerpc/samr/samr_connect_response_spec.rb +47 -0
  201. data/spec/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_request_spec.rb +63 -0
  202. data/spec/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_response_spec.rb +265 -0
  203. data/spec/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_request_spec.rb +52 -0
  204. data/spec/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_response_spec.rb +36 -0
  205. data/spec/lib/ruby_smb/dcerpc/samr/samr_open_domain_request_spec.rb +56 -0
  206. data/spec/lib/ruby_smb/dcerpc/samr/samr_open_domain_response_spec.rb +48 -0
  207. data/spec/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_request_spec.rb +48 -0
  208. data/spec/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_response_spec.rb +42 -0
  209. data/spec/lib/ruby_smb/dcerpc/samr_spec.rb +420 -0
  210. data/spec/lib/ruby_smb/dcerpc/sec_trailer_spec.rb +92 -0
  211. data/spec/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all_spec.rb +149 -110
  212. data/spec/lib/ruby_smb/dcerpc/srvsvc_spec.rb +21 -17
  213. data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request_spec.rb +168 -0
  214. data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response_spec.rb +38 -0
  215. data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_request_spec.rb +30 -0
  216. data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response_spec.rb +38 -0
  217. data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_request_spec.rb +39 -0
  218. data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_response_spec.rb +38 -0
  219. data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request_spec.rb +68 -0
  220. data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response_spec.rb +38 -0
  221. data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_request_spec.rb +53 -0
  222. data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_response_spec.rb +38 -0
  223. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request_spec.rb +38 -0
  224. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response_spec.rb +152 -0
  225. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_request_spec.rb +30 -0
  226. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_response_spec.rb +38 -0
  227. data/spec/lib/ruby_smb/dcerpc/svcctl/service_status_spec.rb +76 -0
  228. data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_request_spec.rb +47 -0
  229. data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_response_spec.rb +30 -0
  230. data/spec/lib/ruby_smb/dcerpc/svcctl_spec.rb +508 -0
  231. data/spec/lib/ruby_smb/dcerpc/uuid_spec.rb +15 -23
  232. data/spec/lib/ruby_smb/dcerpc/winreg/close_key_response_spec.rb +2 -2
  233. data/spec/lib/ruby_smb/dcerpc/winreg/create_key_request_spec.rb +73 -0
  234. data/spec/lib/ruby_smb/dcerpc/winreg/create_key_response_spec.rb +44 -0
  235. data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_request_spec.rb +4 -56
  236. data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_response_spec.rb +4 -56
  237. data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_request_spec.rb +10 -34
  238. data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_response_spec.rb +10 -34
  239. data/spec/lib/ruby_smb/dcerpc/winreg/open_key_request_spec.rb +2 -26
  240. data/spec/lib/ruby_smb/dcerpc/winreg/open_key_response_spec.rb +2 -2
  241. data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_request_spec.rb +17 -20
  242. data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_response_spec.rb +2 -2
  243. data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_request_spec.rb +0 -4
  244. data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_response_spec.rb +20 -44
  245. data/spec/lib/ruby_smb/dcerpc/winreg/query_value_request_spec.rb +8 -32
  246. data/spec/lib/ruby_smb/dcerpc/winreg/query_value_response_spec.rb +18 -42
  247. data/spec/lib/ruby_smb/dcerpc/winreg/regsam_spec.rb +4 -0
  248. data/spec/lib/ruby_smb/dcerpc/winreg/save_key_request_spec.rb +45 -0
  249. data/spec/lib/ruby_smb/dcerpc/winreg/save_key_response_spec.rb +22 -0
  250. data/spec/lib/ruby_smb/dcerpc/winreg_spec.rb +219 -62
  251. data/spec/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_request_spec.rb +43 -0
  252. data/spec/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_response_spec.rb +410 -0
  253. data/spec/lib/ruby_smb/dcerpc/wkssvc_spec.rb +70 -0
  254. data/spec/lib/ruby_smb/dispatcher/socket_spec.rb +10 -10
  255. data/spec/lib/ruby_smb/error_spec.rb +34 -5
  256. data/spec/lib/ruby_smb/field/string16_spec.rb +22 -0
  257. data/spec/lib/ruby_smb/field/stringz16_spec.rb +12 -0
  258. data/spec/lib/ruby_smb/generic_packet_spec.rb +7 -0
  259. data/spec/lib/ruby_smb/gss/provider/ntlm/account_spec.rb +32 -0
  260. data/spec/lib/ruby_smb/gss/provider/ntlm/authenticator_spec.rb +101 -0
  261. data/spec/lib/ruby_smb/gss/provider/ntlm/os_version_spec.rb +32 -0
  262. data/spec/lib/ruby_smb/gss/provider/ntlm_spec.rb +113 -0
  263. data/spec/lib/ruby_smb/nbss/session_header_spec.rb +4 -11
  264. data/spec/lib/ruby_smb/server/server_client_spec.rb +156 -0
  265. data/spec/lib/ruby_smb/server_spec.rb +32 -0
  266. data/spec/lib/ruby_smb/smb1/file_spec.rb +2 -4
  267. data/spec/lib/ruby_smb/smb1/packet/trans2/find_first2_response_spec.rb +0 -1
  268. data/spec/lib/ruby_smb/smb1/packet/trans2/find_next2_response_spec.rb +0 -1
  269. data/spec/lib/ruby_smb/smb1/packet/trans2/open2_response_spec.rb +0 -5
  270. data/spec/lib/ruby_smb/smb1/packet/trans2/set_file_information_response_spec.rb +0 -6
  271. data/spec/lib/ruby_smb/smb1/pipe_spec.rb +20 -14
  272. data/spec/lib/ruby_smb/smb1/tree_spec.rb +22 -0
  273. data/spec/lib/ruby_smb/smb2/file_spec.rb +61 -9
  274. data/spec/lib/ruby_smb/smb2/negotiate_context_spec.rb +2 -2
  275. data/spec/lib/ruby_smb/smb2/pipe_spec.rb +20 -14
  276. data/spec/lib/ruby_smb/smb2/tree_spec.rb +58 -1
  277. data/spec/spec_helper.rb +1 -1
  278. data/spec/support/bin_helper.rb +9 -0
  279. data.tar.gz.sig +0 -0
  280. metadata +229 -23
  281. metadata.gz.sig +0 -0
  282. data/.travis.yml +0 -6
  283. data/lib/ruby_smb/client/signing.rb +0 -64
  284. data/lib/ruby_smb/dcerpc/rrp_unicode_string.rb +0 -35
  285. data/spec/lib/ruby_smb/dcerpc/rrp_unicode_string_spec.rb +0 -98
@@ -2,7 +2,6 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryInfoKeyResponse do
2
2
  subject(:packet) { described_class.new }
3
3
 
4
4
  it { is_expected.to respond_to :lp_class }
5
- it { is_expected.to respond_to :pad }
6
5
  it { is_expected.to respond_to :lpc_sub_keys }
7
6
  it { is_expected.to respond_to :lpc_max_sub_key_len }
8
7
  it { is_expected.to respond_to :lpc_max_class_len }
@@ -23,73 +22,62 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryInfoKeyResponse do
23
22
  expect(packet.lp_class).to be_a RubySMB::Dcerpc::RrpUnicodeString
24
23
  end
25
24
 
26
- it 'has an initial value of 0' do
27
- expect(packet.lp_class).to eq(0)
28
- end
29
- end
30
-
31
- describe '#pad' do
32
- it 'is a string' do
33
- expect(packet.pad).to be_a BinData::String
34
- end
35
-
36
- it 'should keep #lpc_sub_keys 4-byte aligned' do
37
- packet.lp_class = 'test'
38
- expect(packet.lpc_sub_keys.abs_offset % 4).to eq 0
25
+ it 'has the expected initial value' do
26
+ expect(packet.lp_class).to eq({:buffer_length=>0, :maximum_length=>0, :buffer=>:null})
39
27
  end
40
28
  end
41
29
 
42
30
  describe '#lpc_sub_keys' do
43
- it 'is a 32-bit unsigned integer' do
44
- expect(packet.lpc_sub_keys).to be_a BinData::Uint32le
31
+ it 'is a NdrUint32' do
32
+ expect(packet.lpc_sub_keys).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
45
33
  end
46
34
  end
47
35
 
48
36
  describe '#lpc_max_sub_key_len' do
49
- it 'is a 32-bit unsigned integer' do
50
- expect(packet.lpc_max_sub_key_len).to be_a BinData::Uint32le
37
+ it 'is a NdrUint32' do
38
+ expect(packet.lpc_max_sub_key_len).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
51
39
  end
52
40
  end
53
41
 
54
42
  describe '#lpc_max_class_len' do
55
- it 'is a 32-bit unsigned integer' do
56
- expect(packet.lpc_max_class_len).to be_a BinData::Uint32le
43
+ it 'is a NdrUint32' do
44
+ expect(packet.lpc_max_class_len).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
57
45
  end
58
46
  end
59
47
 
60
48
  describe '#lpc_values' do
61
- it 'is a 32-bit unsigned integer' do
62
- expect(packet.lpc_values).to be_a BinData::Uint32le
49
+ it 'is a NdrUint32' do
50
+ expect(packet.lpc_values).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
63
51
  end
64
52
  end
65
53
 
66
54
  describe '#lpcb_max_value_name_len' do
67
- it 'is a 32-bit unsigned integer' do
68
- expect(packet.lpcb_max_value_name_len).to be_a BinData::Uint32le
55
+ it 'is a NdrUint32' do
56
+ expect(packet.lpcb_max_value_name_len).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
69
57
  end
70
58
  end
71
59
 
72
60
  describe '#lpcb_max_value_len' do
73
- it 'is a 32-bit unsigned integer' do
74
- expect(packet.lpcb_max_value_len).to be_a BinData::Uint32le
61
+ it 'is a NdrUint32' do
62
+ expect(packet.lpcb_max_value_len).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
75
63
  end
76
64
  end
77
65
 
78
66
  describe '#lpcb_security_descriptor' do
79
- it 'is a 32-bit unsigned integer' do
80
- expect(packet.lpcb_security_descriptor).to be_a BinData::Uint32le
67
+ it 'is a NdrUint32' do
68
+ expect(packet.lpcb_security_descriptor).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
81
69
  end
82
70
  end
83
71
 
84
72
  describe '#lpft_last_write_time' do
85
- it 'is a FileTime structure' do
86
- expect(packet.lpft_last_write_time).to be_a RubySMB::Field::FileTime
73
+ it 'is a NdrFileTime structure' do
74
+ expect(packet.lpft_last_write_time).to be_a RubySMB::Dcerpc::Ndr::NdrFileTime
87
75
  end
88
76
  end
89
77
 
90
78
  describe '#error_status' do
91
- it 'is a 32-bit unsigned integer' do
92
- expect(packet.error_status).to be_a BinData::Uint32le
79
+ it 'is a NdrUint32' do
80
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
93
81
  end
94
82
  end
95
83
 
@@ -98,16 +86,4 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryInfoKeyResponse do
98
86
  expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_QUERY_INFO_KEY)
99
87
  end
100
88
  end
101
-
102
- describe '#pad_length' do
103
- it 'returns 0 when #lpc_sub_keys is already 4-byte aligned' do
104
- packet.lp_class = 'align'
105
- expect(packet.pad_length).to eq 0
106
- end
107
-
108
- it 'returns 2 when #lpc_sub_keys is only 2-byte aligned' do
109
- packet.lp_class = 'align' + 'A'
110
- expect(packet.pad_length).to eq 2
111
- end
112
- end
113
89
  end
@@ -9,7 +9,6 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryValueRequest do
9
9
 
10
10
  it { is_expected.to respond_to :hkey }
11
11
  it { is_expected.to respond_to :lp_value_name }
12
- it { is_expected.to respond_to :pad }
13
12
  it { is_expected.to respond_to :lp_type }
14
13
  it { is_expected.to respond_to :lp_data }
15
14
  it { is_expected.to respond_to :lpcb_data }
@@ -32,38 +31,27 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryValueRequest do
32
31
  end
33
32
  end
34
33
 
35
- describe '#pad' do
36
- it 'is a string' do
37
- expect(packet.pad).to be_a BinData::String
38
- end
39
-
40
- it 'should keep #lp_type 4-byte aligned' do
41
- packet.lp_value_name = 'test'
42
- expect(packet.lp_type.abs_offset % 4).to eq 0
43
- end
44
- end
45
-
46
34
  describe '#lp_type' do
47
- it 'is a NdrLpDword structure' do
48
- expect(packet.lp_type).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
35
+ it 'is a Ndr::NdrUint32Ptr structure' do
36
+ expect(packet.lp_type).to be_a RubySMB::Dcerpc::Ndr::NdrUint32Ptr
49
37
  end
50
38
  end
51
39
 
52
40
  describe '#lp_data' do
53
- it 'is a NdrLpByte structure' do
54
- expect(packet.lp_data).to be_a RubySMB::Dcerpc::Ndr::NdrLpByte
41
+ it 'is a Ndr::NdrByteArrayPtr structure' do
42
+ expect(packet.lp_data).to be_a RubySMB::Dcerpc::Ndr::NdrByteArrayPtr
55
43
  end
56
44
  end
57
45
 
58
46
  describe '#lpcb_data' do
59
- it 'is a NdrLpDword structure' do
60
- expect(packet.lpcb_data).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
47
+ it 'is a Ndr::NdrUint32Ptr structure' do
48
+ expect(packet.lpcb_data).to be_a RubySMB::Dcerpc::Ndr::NdrUint32Ptr
61
49
  end
62
50
  end
63
51
 
64
52
  describe '#lpcb_len' do
65
- it 'is a NdrLpDword structure' do
66
- expect(packet.lpcb_len).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
53
+ it 'is a Ndr::NdrUint32Ptr structure' do
54
+ expect(packet.lpcb_len).to be_a RubySMB::Dcerpc::Ndr::NdrUint32Ptr
67
55
  end
68
56
  end
69
57
 
@@ -72,17 +60,5 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryValueRequest do
72
60
  expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_QUERY_VALUE)
73
61
  end
74
62
  end
75
-
76
- describe '#pad_length' do
77
- it 'returns 0 when #lp_type is already 4-byte aligned' do
78
- packet.lp_value_name = 'align'
79
- expect(packet.pad_length).to eq 0
80
- end
81
-
82
- it 'returns 2 when #lp_type is only 2-byte aligned' do
83
- packet.lp_value_name = 'align' + 'A'
84
- expect(packet.pad_length).to eq 2
85
- end
86
- end
87
63
  end
88
64
 
@@ -3,7 +3,6 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryValueResponse do
3
3
 
4
4
  it { is_expected.to respond_to :lp_type }
5
5
  it { is_expected.to respond_to :lp_data }
6
- it { is_expected.to respond_to :pad }
7
6
  it { is_expected.to respond_to :lpcb_data }
8
7
  it { is_expected.to respond_to :lpcb_len }
9
8
  it { is_expected.to respond_to :error_status }
@@ -14,43 +13,32 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryValueResponse do
14
13
  end
15
14
 
16
15
  describe '#lp_type' do
17
- it 'is a NdrLpDword structure' do
18
- expect(packet.lp_type).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
16
+ it 'is a Ndr::NdrUint32Ptr structure' do
17
+ expect(packet.lp_type).to be_a RubySMB::Dcerpc::Ndr::NdrUint32Ptr
19
18
  end
20
19
  end
21
20
 
22
21
  describe '#lp_data' do
23
- it 'is a NdrLpByte structure' do
24
- expect(packet.lp_data).to be_a RubySMB::Dcerpc::Ndr::NdrLpByte
25
- end
26
- end
27
-
28
- describe '#pad' do
29
- it 'is a string' do
30
- expect(packet.pad).to be_a BinData::String
31
- end
32
-
33
- it 'should keep #lpcb_data 4-byte aligned' do
34
- packet.lp_data.bytes = 'spec_test'.bytes
35
- expect(packet.lpcb_data.abs_offset % 4).to eq 0
22
+ it 'is a NdrNdrByteArrayPtr structure' do
23
+ expect(packet.lp_data).to be_a RubySMB::Dcerpc::Ndr::NdrByteArrayPtr
36
24
  end
37
25
  end
38
26
 
39
27
  describe '#lpcb_data' do
40
- it 'is a NdrLpDword structure' do
41
- expect(packet.lpcb_data).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
28
+ it 'is a Ndr::NdrUint32Ptr structure' do
29
+ expect(packet.lpcb_data).to be_a RubySMB::Dcerpc::Ndr::NdrUint32Ptr
42
30
  end
43
31
  end
44
32
 
45
33
  describe '#lpcb_len' do
46
- it 'is a NdrLpDword structure' do
47
- expect(packet.lpcb_len).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
34
+ it 'is a Ndr::NdrUint32Ptr structure' do
35
+ expect(packet.lpcb_len).to be_a RubySMB::Dcerpc::Ndr::NdrUint32Ptr
48
36
  end
49
37
  end
50
38
 
51
39
  describe '#error_status' do
52
- it 'is a 32-bit unsigned integer' do
53
- expect(packet.error_status).to be_a BinData::Uint32le
40
+ it 'is a NdrUint32' do
41
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
54
42
  end
55
43
  end
56
44
 
@@ -60,24 +48,12 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryValueResponse do
60
48
  end
61
49
  end
62
50
 
63
- describe '#pad_length' do
64
- it 'returns 0 when #lpcb_data is already 4-byte aligned' do
65
- packet.lp_data.bytes = 'aligned.'.bytes
66
- expect(packet.pad_length).to eq 0
67
- end
68
-
69
- it 'returns 2 when #lpcb_data is only 2-byte aligned' do
70
- packet.lp_data.bytes = 'not aligned'.bytes
71
- expect(packet.pad_length).to eq 1
72
- end
73
- end
74
-
75
51
  describe '#data' do
76
52
  context 'when #lp_type is 1 (unicode null-terminated string)' do
77
53
  it 'returns the expected value' do
78
54
  str = 'spec test string'.encode('utf-16le')
79
55
  packet.lp_type = 1
80
- packet.lp_data.bytes = str.bytes
56
+ packet.lp_data = str.bytes
81
57
  expect(packet.data).to eq(str)
82
58
  end
83
59
  end
@@ -86,7 +62,7 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryValueResponse do
86
62
  it 'returns the expected value' do
87
63
  str = '/%PATH%/foo'.encode('utf-16le')
88
64
  packet.lp_type = 2
89
- packet.lp_data.bytes = str.bytes
65
+ packet.lp_data = str.bytes
90
66
  expect(packet.data).to eq(str)
91
67
  end
92
68
  end
@@ -95,7 +71,7 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryValueResponse do
95
71
  it 'returns the expected value' do
96
72
  bytes = [0xFF, 0xEE, 0xDD, 0xCC].pack('C*')
97
73
  packet.lp_type = 3
98
- packet.lp_data.bytes = bytes.bytes
74
+ packet.lp_data = bytes.bytes
99
75
  expect(packet.data).to eq(bytes)
100
76
  end
101
77
  end
@@ -104,7 +80,7 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryValueResponse do
104
80
  it 'returns the expected value' do
105
81
  number = 12345
106
82
  packet.lp_type = 4
107
- packet.lp_data.bytes = [number].pack('V').bytes
83
+ packet.lp_data = [number].pack('V').bytes
108
84
  expect(packet.data).to eq(number)
109
85
  end
110
86
  end
@@ -113,7 +89,7 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryValueResponse do
113
89
  it 'returns the expected value' do
114
90
  number = 12345
115
91
  packet.lp_type = 5
116
- packet.lp_data.bytes = [number].pack('N').bytes
92
+ packet.lp_data = [number].pack('N').bytes
117
93
  expect(packet.data).to eq(number)
118
94
  end
119
95
  end
@@ -124,7 +100,7 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryValueResponse do
124
100
  null_byte = "\0".encode('utf-16le')
125
101
  str = (str_array + [null_byte]).join(null_byte)
126
102
  packet.lp_type = 7
127
- packet.lp_data.bytes = str.bytes
103
+ packet.lp_data = str.bytes
128
104
  expect(packet.data).to eq(str_array)
129
105
  end
130
106
  end
@@ -133,7 +109,7 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryValueResponse do
133
109
  it 'returns the expected value' do
134
110
  number = 0x1234567812345678
135
111
  packet.lp_type = 11
136
- packet.lp_data.bytes = [number].pack('Q<').bytes
112
+ packet.lp_data = [number].pack('Q<').bytes
137
113
  expect(packet.data).to eq(number)
138
114
  end
139
115
  end
@@ -142,7 +118,7 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryValueResponse do
142
118
  it 'returns an empty string' do
143
119
  str = 'test'
144
120
  packet.lp_type = 6
145
- packet.lp_data.bytes = str.bytes
121
+ packet.lp_data = str.bytes
146
122
  expect(packet.data).to eq('')
147
123
  end
148
124
  end
@@ -29,4 +29,8 @@ RSpec.describe RubySMB::Dcerpc::Winreg::Regsam do
29
29
  it 'is little endian' do
30
30
  expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
31
31
  end
32
+
33
+ it 'it is a Ndr::NdrStruct' do
34
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrStruct
35
+ end
32
36
  end
@@ -0,0 +1,45 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::RpcHkey do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it 'is NdrContextHandle subclass' do
5
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrContextHandle
6
+ end
7
+ end
8
+
9
+ RSpec.describe RubySMB::Dcerpc::Winreg::SaveKeyRequest do
10
+ subject(:packet) { described_class.new }
11
+
12
+
13
+ it 'is little endian' do
14
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
15
+ end
16
+
17
+ it { is_expected.to respond_to :hkey }
18
+ it { is_expected.to respond_to :lp_file }
19
+ it { is_expected.to respond_to :lp_security_attributes }
20
+
21
+ describe '#hkey' do
22
+ it 'is a RpcHkey structure' do
23
+ expect(packet.hkey).to be_a RubySMB::Dcerpc::Winreg::RpcHkey
24
+ end
25
+ end
26
+
27
+ describe '#lp_file' do
28
+ it 'is a RrpUnicodeString structure' do
29
+ expect(packet.lp_file).to be_a RubySMB::Dcerpc::RrpUnicodeString
30
+ end
31
+ end
32
+
33
+ describe '#lp_security_attributes' do
34
+ it 'is a PrpcSecurityAttributes structure' do
35
+ expect(packet.lp_security_attributes).to be_a RubySMB::Dcerpc::PrpcSecurityAttributes
36
+ end
37
+ end
38
+
39
+ describe '#initialize_instance' do
40
+ it 'sets #opnum to REG_SAVE_KEY constant' do
41
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_SAVE_KEY)
42
+ end
43
+ end
44
+ end
45
+
@@ -0,0 +1,22 @@
1
+ RSpec.describe RubySMB::Dcerpc::Winreg::SaveKeyResponse do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :error_status }
5
+
6
+ it 'is little endian' do
7
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
8
+ end
9
+
10
+ describe '#error_status' do
11
+ it 'is a NdrUint32' do
12
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
13
+ end
14
+ end
15
+
16
+ describe '#initialize_instance' do
17
+ it 'sets #opnum to REG_CREATE_KEY constant' do
18
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Winreg::REG_CREATE_KEY)
19
+ end
20
+ end
21
+ end
22
+