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
@@ -1,189 +1,228 @@
1
- RSpec.describe RubySMB::Dcerpc::Srvsvc::NetShareEnumAll do
2
- subject(:packet) { described_class.new(host: '1.2.3.4') }
3
-
4
- it { is_expected.to respond_to :referent_id }
5
- it { is_expected.to respond_to :max_count }
6
- it { is_expected.to respond_to :offset }
7
- it { is_expected.to respond_to :actual_count }
8
- it { is_expected.to respond_to :server_unc }
9
- it { is_expected.to respond_to :pad }
10
- it { is_expected.to respond_to :level }
11
- it { is_expected.to respond_to :ctr }
12
- it { is_expected.to respond_to :ctr_referent_id }
13
- it { is_expected.to respond_to :ctr_count }
14
- it { is_expected.to respond_to :pointer_to_array }
15
- it { is_expected.to respond_to :max_buffer }
16
- it { is_expected.to respond_to :resume_referent_id }
1
+ RSpec.describe RubySMB::Dcerpc::Srvsvc::NetShareEnumAllRequest do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :server_name }
5
+ it { is_expected.to respond_to :info_struct }
6
+ it { is_expected.to respond_to :prefered_maximum_length }
17
7
  it { is_expected.to respond_to :resume_handle }
18
- it { is_expected.to respond_to :opnum }
19
8
 
20
9
  it 'is little endian' do
21
10
  expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
22
11
  end
23
12
 
24
- context 'when \'host\' parameter is not provided' do
25
- it 'raises an ArgumentError' do
26
- expect { described_class.new }.to raise_error(ArgumentError)
13
+ describe '#server_name' do
14
+ it 'is a SrvsvcHandle' do
15
+ expect(packet.server_name).to be_a RubySMB::Dcerpc::Srvsvc::SrvsvcHandle
16
+ end
17
+ end
18
+
19
+ describe '#info_struct' do
20
+ it 'is a LpshareEnumStruct' do
21
+ expect(packet.info_struct).to be_a RubySMB::Dcerpc::Srvsvc::LpshareEnumStruct
27
22
  end
28
23
  end
29
24
 
30
- describe '#referent_id' do
31
- it 'should be a 32-bit unsigned integer' do
32
- expect(packet.referent_id).to be_a BinData::Uint32le
25
+ describe '#prefered_maximum_length' do
26
+ it 'is a NdrUint32' do
27
+ expect(packet.prefered_maximum_length).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
33
28
  end
34
29
 
35
- it 'should have a default value of 1' do
36
- expect(packet.referent_id).to eq 1
30
+ it 'has a default value of 0xFFFFFFFF' do
31
+ expect(packet.prefered_maximum_length).to eq(0xFFFFFFFF)
37
32
  end
38
33
  end
39
34
 
40
- describe '#max_count' do
41
- it 'should be a 32-bit unsigned integer' do
42
- expect(packet.max_count).to be_a BinData::Uint32le
35
+ describe '#resume_handle' do
36
+ it 'is a NdrUint32Ptr' do
37
+ expect(packet.resume_handle).to be_a RubySMB::Dcerpc::Ndr::NdrUint32Ptr
43
38
  end
44
39
 
45
- it 'should be the number of unicode characters in the #server_unc field' do
46
- expect(packet.max_count).to eq(packet.server_unc.do_num_bytes / 2)
40
+ it 'has a default value of 0' do
41
+ expect(packet.resume_handle).to eq(0)
47
42
  end
48
43
  end
49
44
 
50
- describe '#offset' do
51
- it 'should be a 32-bit unsigned integer' do
52
- expect(packet.offset).to be_a BinData::Uint32le
45
+ describe '#initialize_instance' do
46
+ it 'sets #opnum to NET_SHARE_ENUM_ALL constant' do
47
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Srvsvc::NET_SHARE_ENUM_ALL)
53
48
  end
49
+ end
50
+ end
54
51
 
55
- it 'should have a default value of 0' do
56
- expect(packet.offset).to eq 0
57
- end
52
+ RSpec.describe RubySMB::Dcerpc::Srvsvc::NetShareEnumAllResponse do
53
+ subject(:packet) { described_class.new }
54
+
55
+ it { is_expected.to respond_to :info_struct }
56
+ it { is_expected.to respond_to :total_entries }
57
+ it { is_expected.to respond_to :resume_handle }
58
+ it { is_expected.to respond_to :error_status }
59
+
60
+ it 'is little endian' do
61
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
58
62
  end
59
63
 
60
- describe '#actual_count' do
61
- it 'should be a 32-bit unsigned integer' do
62
- expect(packet.actual_count).to be_a BinData::Uint32le
64
+ describe '#info_struct' do
65
+ it 'is a LpshareEnumStruct' do
66
+ expect(packet.info_struct).to be_a RubySMB::Dcerpc::Srvsvc::LpshareEnumStruct
63
67
  end
68
+ end
64
69
 
65
- it 'should be the same value than #max_count' do
66
- expect(packet.actual_count).to eq(packet.max_count)
70
+ describe '#total_entries' do
71
+ it 'is a NdrUint32' do
72
+ expect(packet.total_entries).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
67
73
  end
68
74
  end
69
75
 
70
- describe '#server_unc' do
71
- it 'is a Stringz16' do
72
- expect(packet.server_unc).to be_a RubySMB::Field::Stringz16
76
+ describe '#resume_handle' do
77
+ it 'is a NdrUint32Ptr' do
78
+ expect(packet.resume_handle).to be_a RubySMB::Dcerpc::Ndr::NdrUint32Ptr
73
79
  end
80
+ end
74
81
 
75
- it 'uses the #host parameter value to create the UNC unicode string' do
76
- expect(packet.server_unc).to eq("\\\\#{"1.2.3.4".encode('utf-8')}".encode('utf-16le'))
82
+ describe '#error_status' do
83
+ it 'is a NdrUint32' do
84
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
77
85
  end
78
86
  end
79
87
 
80
- describe '#pad' do
81
- it 'should keep #level 4-byte aligned' do
82
- expect(packet.level.abs_offset % 4).to eq 0
88
+ describe '#initialize_instance' do
89
+ it 'sets #opnum to NET_SHARE_ENUM_ALL constant' do
90
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Srvsvc::NET_SHARE_ENUM_ALL)
83
91
  end
84
92
  end
93
+ end
94
+
95
+ RSpec.describe RubySMB::Dcerpc::Srvsvc::LpshareEnumStruct do
96
+ it 'is a NdrStruct' do
97
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrStruct
98
+ end
99
+
100
+ subject(:packet) { described_class.new }
101
+
102
+ it { is_expected.to respond_to :level }
103
+ it { is_expected.to respond_to :switch_value }
104
+ it { is_expected.to respond_to :share_info }
85
105
 
86
106
  describe '#level' do
87
- it 'should be a 32-bit unsigned integer' do
88
- expect(packet.level).to be_a BinData::Uint32le
107
+ it 'is a NdrUint32' do
108
+ expect(packet.level).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
89
109
  end
90
110
 
91
- it 'should have a default value of 1' do
111
+ it 'has a default value of 1' do
92
112
  expect(packet.level).to eq 1
93
113
  end
94
114
  end
95
115
 
96
- describe '#ctr' do
97
- it 'should be a 32-bit unsigned integer' do
98
- expect(packet.ctr).to be_a BinData::Uint32le
116
+ describe '#switch_value' do
117
+ it 'is a NdrUint32' do
118
+ expect(packet.switch_value).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
99
119
  end
100
120
 
101
- it 'should have a default value of 1' do
102
- expect(packet.ctr).to eq 1
121
+ it 'has a default value set to the #level value' do
122
+ expect(packet.switch_value).to eq packet.level
103
123
  end
104
- end
105
124
 
106
- describe '#ctr_referent_id' do
107
- it 'should be a 32-bit unsigned integer' do
108
- expect(packet.ctr_referent_id).to be_a BinData::Uint32le
109
- end
110
-
111
- it 'should have a default value of 1' do
112
- expect(packet.ctr_referent_id).to eq 1
125
+ it 'is an hidden field' do
126
+ expect(packet.snapshot).to_not have_key(:switch_value)
113
127
  end
114
128
  end
115
129
 
116
- describe '#ctr_count' do
117
- it 'should be a 32-bit unsigned integer' do
118
- expect(packet.ctr_count).to be_a BinData::Uint32le
130
+ describe '#share_info' do
131
+ it 'is a BinData::Choice' do
132
+ expect(packet.share_info).to be_a BinData::Choice
119
133
  end
120
134
 
121
- it 'should have a default value of 0' do
122
- expect(packet.ctr_count).to eq 0
135
+ it 'selects a structure according to :level value and set the default value' do
136
+ expect(packet.share_info.snapshot).to eq({ entries_read: 0, buffer: :null })
137
+ # Trying to with a non existing enum value, since only Level 1 is implemented so far
138
+ packet.level = 0
139
+ expect { packet.share_info.snapshot }.to raise_error(IndexError)
123
140
  end
124
141
  end
142
+ end
125
143
 
126
- describe '#pointer_to_array' do
127
- it 'should be a 32-bit unsigned integer' do
128
- expect(packet.pointer_to_array).to be_a BinData::Uint32le
129
- end
144
+ RSpec.describe RubySMB::Dcerpc::Srvsvc::LpshareInfo1Container do
145
+ it 'is a ShareInfo1Container' do
146
+ expect(described_class).to be < RubySMB::Dcerpc::Srvsvc::ShareInfo1Container
147
+ end
148
+ it 'is a NDR pointer' do
149
+ expect(described_class.new).to be_a RubySMB::Dcerpc::Ndr::PointerPlugin
150
+ end
151
+ end
130
152
 
131
- it 'should have a default value of 0' do
132
- expect(packet.pointer_to_array).to eq 0
133
- end
153
+ RSpec.describe RubySMB::Dcerpc::Srvsvc::ShareInfo1Container do
154
+ it 'is a NdrStruct' do
155
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrStruct
134
156
  end
135
157
 
136
- describe '#max_buffer' do
137
- it 'should be a 32-bit unsigned integer' do
138
- expect(packet.max_buffer).to be_a BinData::Uint32le
139
- end
158
+ subject(:packet) { described_class.new }
159
+
160
+ it { is_expected.to respond_to :entries_read }
161
+ it { is_expected.to respond_to :buffer }
140
162
 
141
- it 'should have a default value of 4294967295' do
142
- expect(packet.max_buffer).to eq 4294967295
163
+ describe '#entries_read' do
164
+ it 'is a NdrUint32' do
165
+ expect(packet.entries_read).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
143
166
  end
144
167
  end
145
168
 
146
- describe '#resume_referent_id' do
147
- it 'should be a 32-bit unsigned integer' do
148
- expect(packet.resume_referent_id).to be_a BinData::Uint32le
169
+ describe '#buffer' do
170
+ it 'is a LpshareInfo1' do
171
+ expect(packet.buffer).to be_a RubySMB::Dcerpc::Srvsvc::LpshareInfo1
149
172
  end
173
+ end
174
+ end
150
175
 
151
- it 'should have a default value of 1' do
152
- expect(packet.resume_referent_id).to eq 1
153
- end
176
+ RSpec.describe RubySMB::Dcerpc::Srvsvc::LpshareInfo1 do
177
+ it 'is a ShareInfo1' do
178
+ expect(described_class).to be < RubySMB::Dcerpc::Srvsvc::ShareInfo1
179
+ end
180
+ it 'is a NDR pointer' do
181
+ expect(described_class.new).to be_a RubySMB::Dcerpc::Ndr::PointerPlugin
154
182
  end
183
+ end
155
184
 
156
- describe '#resume_handle' do
157
- it 'should be a 32-bit unsigned integer' do
158
- expect(packet.resume_handle).to be_a BinData::Uint32le
159
- end
185
+ RSpec.describe RubySMB::Dcerpc::Srvsvc::ShareInfo1 do
186
+ it 'is a NdrConfArray' do
187
+ expect(described_class.new).to be_a RubySMB::Dcerpc::Ndr::NdrConfArray
188
+ end
189
+ it 'contains element of type ShareInfo1Element' do
190
+ expect(described_class.default_parameters[:type]).to eq(:share_info1_element)
191
+ end
192
+ end
160
193
 
161
- it 'should have a default value of 0' do
162
- expect(packet.resume_handle).to eq 0
163
- end
194
+ RSpec.describe RubySMB::Dcerpc::Srvsvc::ShareInfo1Element do
195
+ it 'is a NdrStruct' do
196
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrStruct
164
197
  end
165
198
 
166
- describe '#initialize_instance' do
167
- it 'sets #opnum to REG_CLOSE_KEY constant' do
168
- expect(packet.opnum).to eq(RubySMB::Dcerpc::Srvsvc::NET_SHARE_ENUM_ALL)
199
+ subject(:packet) { described_class.new }
200
+
201
+ it { is_expected.to respond_to :shi1_netname }
202
+ it { is_expected.to respond_to :shi1_type }
203
+ it { is_expected.to respond_to :shi1_remark }
204
+
205
+ describe '#shi1_netname' do
206
+ it 'is a NdrConfVarWideStringz' do
207
+ expect(packet.shi1_netname).to be_a RubySMB::Dcerpc::Ndr::NdrConfVarWideStringz
169
208
  end
170
209
  end
171
210
 
172
- describe '#pad_length' do
173
- it 'returns 0 when #level is already 4-byte aligned' do
174
- expect(packet.pad_length).to eq 0
211
+ describe '#shi1_type' do
212
+ it 'is a NdrUint32' do
213
+ expect(packet.shi1_type).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
175
214
  end
215
+ end
176
216
 
177
- it 'returns 2 when #level is only 2-byte aligned' do
178
- packet.server_unc = packet.server_unc + 'A'.encode('utf-16le')
179
- expect(packet.pad_length).to eq 2
217
+ describe '#shi1_remark' do
218
+ it 'is a NdrConfVarWideStringz' do
219
+ expect(packet.shi1_remark).to be_a RubySMB::Dcerpc::Ndr::NdrConfVarWideStringz
180
220
  end
181
221
  end
222
+ end
182
223
 
183
- describe 'class method self.parse_response' do
184
- # TODO: this class method will be refactored to use proper BinData NDR
185
- # fields once they are ready (see https://github.com/rapid7/ruby_smb/issues/124)
224
+ RSpec.describe RubySMB::Dcerpc::Srvsvc::SrvsvcHandle do
225
+ it 'is a NdrWideStringzPtr' do
226
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrWideStringzPtr
186
227
  end
187
228
  end
188
-
189
-
@@ -11,20 +11,30 @@ RSpec.describe RubySMB::Dcerpc::Srvsvc do
11
11
  let(:host) { '1.2.3.4' }
12
12
  let(:request_packet) { double('NetShareEnumAll request packet') }
13
13
  let(:dcerpc_response) { double('DCERPC response') }
14
+ let(:response) { double('NetShareEnumAllResponse') }
14
15
  let(:shares) do
15
16
  [
16
- ["C$", "DISK", "Default share"],
17
- ["Shared", "DISK", ""],
18
- ["IPC$", "IPC", "Remote IPC"],
19
- ["ADMIN$", "DISK", "Remote Admin"]
17
+ RubySMB::Dcerpc::Srvsvc::ShareInfo1Element.new({:shi1_netname=>'C$', :shi1_type=>0, :shi1_remark=>'Default share'}),
18
+ RubySMB::Dcerpc::Srvsvc::ShareInfo1Element.new({:shi1_netname=>'Shared', :shi1_type=>0, :shi1_remark=>''}),
19
+ RubySMB::Dcerpc::Srvsvc::ShareInfo1Element.new({:shi1_netname=>'IPC$', :shi1_type=>2147483651, :shi1_remark=>'Remote IPC'}),
20
+ RubySMB::Dcerpc::Srvsvc::ShareInfo1Element.new({:shi1_netname=>'ADMIN$', :shi1_type=>2147483648, :shi1_remark=>'Remote Admin'})
21
+ ]
22
+ end
23
+ let(:result) do
24
+ [
25
+ {name: 'C$', type: 'DISK', comment: 'Default share'},
26
+ {name: 'Shared', type: 'DISK', comment: ''},
27
+ {name: 'IPC$', type: 'IPC|SPECIAL', comment: 'Remote IPC'},
28
+ {name: 'ADMIN$', type: 'DISK|SPECIAL', comment: 'Remote Admin'}
20
29
  ]
21
30
  end
22
31
 
23
32
  before :example do
24
33
  allow(srvsvc).to receive(:bind)
25
- allow(RubySMB::Dcerpc::Srvsvc::NetShareEnumAll).to receive(:new).and_return(request_packet)
34
+ allow(RubySMB::Dcerpc::Srvsvc::NetShareEnumAllRequest).to receive(:new).and_return(request_packet)
26
35
  allow(srvsvc).to receive(:dcerpc_request).and_return(dcerpc_response)
27
- allow(RubySMB::Dcerpc::Srvsvc::NetShareEnumAll).to receive(:parse_response).and_return(shares)
36
+ allow(RubySMB::Dcerpc::Srvsvc::NetShareEnumAllResponse).to receive(:read).and_return(response)
37
+ allow(response).to receive_message_chain(:info_struct, :share_info, :buffer).and_return(shares)
28
38
  end
29
39
 
30
40
  it 'calls #bind with the expected arguments' do
@@ -32,9 +42,9 @@ RSpec.describe RubySMB::Dcerpc::Srvsvc do
32
42
  expect(srvsvc).to have_received(:bind).with(endpoint: RubySMB::Dcerpc::Srvsvc)
33
43
  end
34
44
 
35
- it 'creates the expected NetShareEnumAll packet' do
45
+ it 'creates the expected NetShareEnumAllRequest packet' do
36
46
  srvsvc.net_share_enum_all(host)
37
- expect(RubySMB::Dcerpc::Srvsvc::NetShareEnumAll).to have_received(:new).with(host: host)
47
+ expect(RubySMB::Dcerpc::Srvsvc::NetShareEnumAllRequest).to have_received(:new).with(server_name: "\\\\#{host}")
38
48
  end
39
49
 
40
50
  it 'calls #request with the expected arguments' do
@@ -42,19 +52,13 @@ RSpec.describe RubySMB::Dcerpc::Srvsvc do
42
52
  expect(srvsvc).to have_received(:dcerpc_request).with(request_packet)
43
53
  end
44
54
 
45
- it 'parse the response with NetShareEnumAll #parse_response method' do
55
+ it 'parse the response with NetShareEnumAllResponse' do
46
56
  srvsvc.net_share_enum_all(host)
47
- expect(RubySMB::Dcerpc::Srvsvc::NetShareEnumAll).to have_received(:parse_response).with(dcerpc_response)
57
+ expect(RubySMB::Dcerpc::Srvsvc::NetShareEnumAllResponse).to have_received(:read).with(dcerpc_response)
48
58
  end
49
59
 
50
60
  it 'returns the remote shares' do
51
- output = [
52
- {:name=>"C$", :type=>"DISK", :comment=>"Default share"},
53
- {:name=>"Shared", :type=>"DISK", :comment=>""},
54
- {:name=>"IPC$", :type=>"IPC", :comment=>"Remote IPC"},
55
- {:name=>"ADMIN$", :type=>"DISK", :comment=>"Remote Admin"},
56
- ]
57
- expect(srvsvc.net_share_enum_all(host)).to eq(output)
61
+ expect(srvsvc.net_share_enum_all(host)).to eq(result)
58
62
  end
59
63
  end
60
64
  end
@@ -0,0 +1,168 @@
1
+ RSpec.describe RubySMB::Dcerpc::Svcctl::ChangeServiceConfigWRequest do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :h_service }
5
+ it { is_expected.to respond_to :dw_service_type }
6
+ it { is_expected.to respond_to :dw_start_type }
7
+ it { is_expected.to respond_to :dw_error_control }
8
+ it { is_expected.to respond_to :lp_binary_path_name }
9
+ it { is_expected.to respond_to :lp_load_order_group }
10
+ it { is_expected.to respond_to :dw_tag_id }
11
+ it { is_expected.to respond_to :lp_dependencies }
12
+ it { is_expected.to respond_to :dw_depend_size }
13
+ it { is_expected.to respond_to :lp_service_start_name }
14
+ it { is_expected.to respond_to :lp_password }
15
+ it { is_expected.to respond_to :dw_pw_size }
16
+ it { is_expected.to respond_to :lp_display_name }
17
+
18
+ it 'is little endian' do
19
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
20
+ end
21
+
22
+ describe '#h_service' do
23
+ it 'is a ScRpcHandle structure' do
24
+ expect(packet.h_service).to be_a RubySMB::Dcerpc::Svcctl::ScRpcHandle
25
+ end
26
+ end
27
+
28
+ describe '#dw_service_type' do
29
+ it 'is a NdrUint32' do
30
+ expect(packet.dw_service_type).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
31
+ end
32
+ end
33
+
34
+ describe '#dw_start_type' do
35
+ it 'is a NdrUint32' do
36
+ expect(packet.dw_start_type).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
37
+ end
38
+ end
39
+
40
+ describe '#dw_start_type' do
41
+ it 'is a NdrUint32' do
42
+ expect(packet.dw_start_type).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
43
+ end
44
+ end
45
+
46
+ describe '#lp_binary_path_name' do
47
+ it 'is a NdrWideStringPtr structure' do
48
+ expect(packet.lp_binary_path_name).to be_a RubySMB::Dcerpc::Ndr::NdrWideStringPtr
49
+ end
50
+ end
51
+
52
+ describe '#lp_load_order_group' do
53
+ it 'is a NdrWideStringPtr structure' do
54
+ expect(packet.lp_load_order_group).to be_a RubySMB::Dcerpc::Ndr::NdrWideStringPtr
55
+ end
56
+ end
57
+
58
+ describe '#dw_tag_id' do
59
+ it 'is a NdrUint32Ptr structure' do
60
+ expect(packet.dw_tag_id).to be_a RubySMB::Dcerpc::Ndr::NdrUint32Ptr
61
+ end
62
+ end
63
+
64
+ describe '#lp_dependencies' do
65
+ it 'is a Ndr::NdrConfArray of Uint8 elements' do
66
+ expect(packet.lp_dependencies).to be_a RubySMB::Dcerpc::Ndr::NdrConfArray
67
+ expect(packet.lp_dependencies[0]).to be_a BinData::Uint8
68
+ end
69
+ end
70
+
71
+ describe '#dw_depend_size' do
72
+ it 'is a NdrUint32' do
73
+ expect(packet.dw_depend_size).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
74
+ end
75
+ end
76
+
77
+ describe '#lp_service_start_name' do
78
+ it 'is a NdrWideStringPtr structure' do
79
+ expect(packet.lp_service_start_name).to be_a RubySMB::Dcerpc::Ndr::NdrWideStringPtr
80
+ end
81
+ end
82
+
83
+ describe '#lp_password' do
84
+ it 'is a Ndr::NdrConfArray of Uint8 elements' do
85
+ expect(packet.lp_password).to be_a RubySMB::Dcerpc::Ndr::NdrConfArray
86
+ expect(packet.lp_password[0]).to be_a BinData::Uint8
87
+ end
88
+ end
89
+
90
+ describe '#dw_pw_size' do
91
+ it 'is a NdrUint32' do
92
+ expect(packet.dw_pw_size).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
93
+ end
94
+
95
+ it 'is set to the number of elements in #lp_password array' do
96
+ packet.lp_password = [1, 2, 3, 4, 5]
97
+ expect(packet.dw_pw_size).to eq(5)
98
+ end
99
+ end
100
+
101
+ describe '#lp_display_name' do
102
+ it 'is a NdrWideStringPtr structure' do
103
+ expect(packet.lp_display_name).to be_a RubySMB::Dcerpc::Ndr::NdrWideStringPtr
104
+ end
105
+ end
106
+
107
+ it 'should keep #lp_load_order_group 4-byte aligned' do
108
+ 5.times do |i|
109
+ packet.lp_binary_path_name = "A" * i
110
+ expect(packet.lp_load_order_group.abs_offset % 4).to eq 0
111
+ end
112
+ end
113
+
114
+ it 'should keep #dw_tag_id 4-byte aligned' do
115
+ 5.times do |i|
116
+ packet.lp_load_order_group = "A" * i
117
+ expect(packet.dw_tag_id.abs_offset % 4).to eq 0
118
+ end
119
+ end
120
+
121
+ it 'should keep #dw_depend_size 4-byte aligned' do
122
+ 5.times do |i|
123
+ packet.lp_dependencies = [1] * i
124
+ expect(packet.dw_depend_size.abs_offset % 4).to eq 0
125
+ end
126
+ end
127
+
128
+ it 'should keep #lp_password 4-byte aligned' do
129
+ 5.times do |i|
130
+ packet.lp_service_start_name = "A" * i
131
+ expect(packet.lp_password.abs_offset % 4).to eq 0
132
+ end
133
+ end
134
+
135
+ it 'should keep #dw_pw_size 4-byte aligned' do
136
+ 5.times do |i|
137
+ packet.lp_password = [1] * i
138
+ expect(packet.dw_pw_size.abs_offset % 4).to eq 0
139
+ end
140
+ end
141
+
142
+ describe '#initialize_instance' do
143
+ it 'sets #opnum to CHANGE_SERVICE_CONFIG_W constant' do
144
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::CHANGE_SERVICE_CONFIG_W)
145
+ end
146
+ end
147
+
148
+ it 'reads its own binary representation and outputs the same packet' do
149
+ packet = described_class.new(
150
+ h_service: {context_handle_attributes: 0, context_handle_uuid: '367abb81-9844-35f1-ad32-98f038001003'},
151
+ dw_service_type: 33,
152
+ dw_start_type: 3,
153
+ dw_error_control: 11,
154
+ lp_binary_path_name: 'test',
155
+ lp_load_order_group: 'test2',
156
+ dw_tag_id: 4,
157
+ lp_dependencies: [1,2],
158
+ dw_depend_size: 2,
159
+ lp_service_start_name: 'test3',
160
+ lp_password: [1,2,3],
161
+ dw_pw_size: 3,
162
+ lp_display_name: 'test4'
163
+ )
164
+ binary = packet.to_binary_s
165
+ expect(described_class.read(binary)).to eq(packet)
166
+ end
167
+ end
168
+
@@ -0,0 +1,38 @@
1
+ RSpec.describe RubySMB::Dcerpc::Svcctl::ChangeServiceConfigWResponse do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :dw_tag_id }
5
+ it { is_expected.to respond_to :error_status }
6
+
7
+ it 'is little endian' do
8
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
9
+ end
10
+
11
+ describe '#dw_tag_id' do
12
+ it 'is a NdrUint32Ptr structure' do
13
+ expect(packet.dw_tag_id).to be_a RubySMB::Dcerpc::Ndr::NdrUint32Ptr
14
+ end
15
+ end
16
+
17
+ describe '#error_status' do
18
+ it 'is a NdrUint32' do
19
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
20
+ end
21
+ end
22
+
23
+ describe '#initialize_instance' do
24
+ it 'sets #opnum to CHANGE_SERVICE_CONFIG_W constant' do
25
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::CHANGE_SERVICE_CONFIG_W)
26
+ end
27
+ end
28
+
29
+ it 'reads its own binary representation and outputs the same packet' do
30
+ packet = described_class.new(
31
+ dw_tag_id: 4,
32
+ error_status: 1
33
+ )
34
+ binary = packet.to_binary_s
35
+ expect(described_class.read(binary)).to eq(packet)
36
+ end
37
+ end
38
+
@@ -0,0 +1,30 @@
1
+ RSpec.describe RubySMB::Dcerpc::Svcctl::CloseServiceHandleRequest do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :h_sc_object }
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 '#h_sc_object' do
11
+ it 'is a ScRpcHandle structure' do
12
+ expect(packet.h_sc_object).to be_a RubySMB::Dcerpc::Svcctl::ScRpcHandle
13
+ end
14
+ end
15
+
16
+ describe '#initialize_instance' do
17
+ it 'sets #opnum to CLOSE_SERVICE_HANDLE constant' do
18
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Svcctl::CLOSE_SERVICE_HANDLE)
19
+ end
20
+ end
21
+
22
+ it 'reads its own binary representation and outputs the same packet' do
23
+ packet = described_class.new(
24
+ h_service: {context_handle_attributes: 0, context_handle_uuid: '367abb81-9844-35f1-ad32-98f038001003'}
25
+ )
26
+ binary = packet.to_binary_s
27
+ expect(described_class.read(binary)).to eq(packet)
28
+ end
29
+ end
30
+