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
@@ -0,0 +1,75 @@
1
+ RSpec.describe RubySMB::Dcerpc::RpcAuth3 do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :pdu_header }
5
+ it { is_expected.to respond_to :pad }
6
+ it { is_expected.to respond_to :sec_trailer }
7
+ it { is_expected.to respond_to :auth_value }
8
+
9
+ it 'is little endian' do
10
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
11
+ end
12
+
13
+ describe '#pdu_header' do
14
+ subject(:header) { packet.pdu_header }
15
+
16
+ it 'is a standard PDU Header' do
17
+ expect(header).to be_a RubySMB::Dcerpc::PDUHeader
18
+ end
19
+
20
+ it 'should have the #ptype field set to PTypes::BIND' do
21
+ expect(header.ptype).to eq RubySMB::Dcerpc::PTypes::RPC_AUTH3
22
+ end
23
+ end
24
+
25
+ describe '#sec_trailer' do
26
+ it 'should be SecTrailer structure' do
27
+ expect(packet.sec_trailer).to be_a RubySMB::Dcerpc::SecTrailer
28
+ end
29
+
30
+ it 'should not exist if the #auth_length PDU header field is 0' do
31
+ packet.pdu_header.auth_length = 0
32
+ expect(packet.sec_trailer?).to be false
33
+ end
34
+
35
+ it 'should exist only if the #auth_length PDU header field is greater than 0' do
36
+ packet.pdu_header.auth_length = 10
37
+ expect(packet.sec_trailer?).to be true
38
+ end
39
+ end
40
+
41
+ describe '#auth_value' do
42
+ it 'should be a string' do
43
+ expect(packet.auth_value).to be_a BinData::String
44
+ end
45
+
46
+ it 'should not exist if the #auth_length PDU header field is 0' do
47
+ packet.pdu_header.auth_length = 0
48
+ expect(packet.auth_value?).to be false
49
+ end
50
+
51
+ it 'should exist only if the #auth_length PDU header field is greater than 0' do
52
+ packet.pdu_header.auth_length = 10
53
+ expect(packet.auth_value?).to be true
54
+ end
55
+
56
+ it 'reads #auth_length bytes' do
57
+ auth_value = '12345678'
58
+ packet.pdu_header.auth_length = 6
59
+ packet.auth_value.read(auth_value)
60
+ expect(packet.auth_value).to eq(auth_value[0,6])
61
+ end
62
+ end
63
+
64
+ it 'reads its own binary representation and output the same packet' do
65
+ auth_size = rand(0xFF)
66
+ packet = described_class.new(
67
+ pdu_header: { auth_length: auth_size },
68
+ pad: rand(0xFFFFFFFF),
69
+ auth_value: 'A' * auth_size
70
+ )
71
+ binary = packet.to_binary_s
72
+ expect(described_class.read(binary)).to eq(packet)
73
+ end
74
+
75
+ end
@@ -0,0 +1,162 @@
1
+ RSpec.describe RubySMB::Dcerpc::RpcSecurityDescriptor do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :lp_security_descriptor }
5
+ it { is_expected.to respond_to :cb_in_security_descriptor }
6
+ it { is_expected.to respond_to :cb_out_security_descriptor }
7
+
8
+ it 'is little endian' do
9
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
10
+ end
11
+
12
+ it 'has :byte_align parameter set to the expected value' do
13
+ expect(described_class.default_parameters[:byte_align]).to eq(4)
14
+ end
15
+
16
+ describe '#lp_security_descriptor' do
17
+ it 'should be a NdrByteArrayPtr structure' do
18
+ expect(packet.lp_security_descriptor).to be_a RubySMB::Dcerpc::Ndr::NdrByteArrayPtr
19
+ end
20
+ end
21
+
22
+ describe '#cb_in_security_descriptor' do
23
+ it 'should be a NdrUint32' do
24
+ expect(packet.cb_in_security_descriptor).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
25
+ end
26
+ end
27
+
28
+ describe '#cb_out_security_descriptor' do
29
+ it 'should be a NdrUint32' do
30
+ expect(packet.cb_out_security_descriptor).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
31
+ end
32
+ end
33
+
34
+ describe '#read' do
35
+ context 'with a null pointer' do
36
+ it 'reads its own binary representation' do
37
+ raw = packet.to_binary_s
38
+ expect(described_class.read(raw)).to eq(packet)
39
+ expect(described_class.read(raw).to_binary_s).to eq(raw)
40
+ end
41
+ end
42
+
43
+ context 'with a normal RpcSecurityAttributes structure' do
44
+ it 'reads its own binary representation' do
45
+ packet.lp_security_descriptor = RubySMB::Dcerpc::Ndr::NdrByteArrayPtr.new([1, 2, 3])
46
+ packet.cb_in_security_descriptor = 90
47
+ packet.cb_out_security_descriptor = 33
48
+ raw = packet.to_binary_s
49
+ expect(described_class.read(raw)).to eq(packet)
50
+ expect(described_class.read(raw).to_binary_s).to eq(raw)
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ RSpec.describe RubySMB::Dcerpc::RpcSecurityAttributes do
57
+ subject(:packet) { described_class.new }
58
+
59
+ it { is_expected.to respond_to :n_length }
60
+ it { is_expected.to respond_to :rpc_security_descriptor }
61
+ it { is_expected.to respond_to :b_inheritHandle }
62
+
63
+ it 'is little endian' do
64
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
65
+ end
66
+
67
+ it 'has :byte_align parameter set to the expected value' do
68
+ expect(described_class.default_parameters[:byte_align]).to eq(4)
69
+ end
70
+
71
+ describe '#n_length' do
72
+ it 'should be a NdrUint32' do
73
+ expect(packet.n_length).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
74
+ end
75
+ end
76
+
77
+ describe '#rpc_security_descriptor' do
78
+ it 'should be a RpcSecurityDescriptor structure' do
79
+ expect(packet.rpc_security_descriptor).to be_a RubySMB::Dcerpc::RpcSecurityDescriptor
80
+ end
81
+ end
82
+
83
+ describe '#b_inheritHandle' do
84
+ it 'should be a NdrUint8' do
85
+ expect(packet.b_inheritHandle).to be_a RubySMB::Dcerpc::Ndr::NdrUint8
86
+ end
87
+ end
88
+
89
+ describe '#read' do
90
+ context 'with a null pointer' do
91
+ it 'reads its own binary representation' do
92
+ raw = packet.to_binary_s
93
+ expect(described_class.read(raw)).to eq(packet)
94
+ expect(described_class.read(raw).to_binary_s).to eq(raw)
95
+ end
96
+ end
97
+
98
+ context 'with a normal RpcSecurityAttributes structure' do
99
+ it 'reads its own binary representation' do
100
+ packet.n_length = 3
101
+ packet.rpc_security_descriptor = RubySMB::Dcerpc::RpcSecurityDescriptor.new
102
+ packet.rpc_security_descriptor.lp_security_descriptor = [1, 2, 3]
103
+ packet.rpc_security_descriptor.cb_in_security_descriptor = 33
104
+ packet.rpc_security_descriptor.cb_out_security_descriptor = 22
105
+ packet.b_inheritHandle = 90
106
+ raw = packet.to_binary_s
107
+ expect(described_class.read(raw)).to eq(packet)
108
+ expect(described_class.read(raw).to_binary_s).to eq(raw)
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ RSpec.describe RubySMB::Dcerpc::PrpcSecurityAttributes do
115
+ it 'is a RpcSecurityAttributes subclass' do
116
+ expect(described_class).to be < RubySMB::Dcerpc::RpcSecurityAttributes
117
+ end
118
+
119
+ subject(:packet) { described_class.new }
120
+
121
+ it { is_expected.to respond_to :ref_id }
122
+
123
+ it 'is little endian' do
124
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
125
+ end
126
+
127
+ it 'should be a RpcSecurityAttributes structure' do
128
+ expect(packet).to be_a RubySMB::Dcerpc::RpcSecurityAttributes
129
+ end
130
+
131
+ it 'is :null if #ref_id is zero' do
132
+ packet.ref_id = 0
133
+ expect(packet).to eq(:null)
134
+ end
135
+
136
+ describe '#read' do
137
+ context 'with a null pointer' do
138
+ it 'reads its own binary representation' do
139
+ raw = packet.to_binary_s
140
+ expect(described_class.read(raw)).to eq(packet)
141
+ expect(described_class.read(raw).to_binary_s).to eq(raw)
142
+ end
143
+ end
144
+
145
+ context 'with a normal RpcSecurityAttributes structure' do
146
+ it 'reads its own binary representation' do
147
+ struct = RubySMB::Dcerpc::RpcSecurityAttributes.new
148
+ struct.n_length = 5
149
+ struct.rpc_security_descriptor = RubySMB::Dcerpc::RpcSecurityDescriptor.new
150
+ struct.rpc_security_descriptor.lp_security_descriptor = [1, 2, 3]
151
+ struct.rpc_security_descriptor.cb_in_security_descriptor = 33
152
+ struct.rpc_security_descriptor.cb_out_security_descriptor = 22
153
+ struct.b_inheritHandle = 4
154
+ packet.assign(struct)
155
+ raw = packet.to_binary_s
156
+ expect(described_class.read(raw)).to eq(packet)
157
+ expect(described_class.read(raw).to_binary_s).to eq(raw)
158
+ end
159
+ end
160
+ end
161
+ end
162
+
@@ -0,0 +1,340 @@
1
+ RSpec.describe RubySMB::Dcerpc::RrpUnicodeString do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :buffer_length }
5
+ it { is_expected.to respond_to :maximum_length }
6
+ it { is_expected.to respond_to :buffer }
7
+
8
+ it 'is little endian' do
9
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
10
+ end
11
+
12
+ it 'has :byte_align parameter set to the expected value' do
13
+ expect(described_class.default_parameters[:byte_align]).to eq(4)
14
+ end
15
+
16
+ describe '#buffer_length' do
17
+ it 'should be a NdrUint16' do
18
+ expect(packet.buffer_length).to be_a RubySMB::Dcerpc::Ndr::NdrUint16
19
+ end
20
+ it 'is 0 by default' do
21
+ expect(packet.buffer_length).to eq(0)
22
+ end
23
+ end
24
+
25
+ describe '#maximum_length' do
26
+ it 'should be a NdrUint16' do
27
+ expect(packet.maximum_length).to be_a RubySMB::Dcerpc::Ndr::NdrUint16
28
+ end
29
+ it 'is 0 by default' do
30
+ expect(packet.maximum_length).to eq(0)
31
+ end
32
+ end
33
+
34
+ describe '#buffer' do
35
+ it 'should be a NdrWideStringzPtr' do
36
+ expect(packet.buffer).to be_a RubySMB::Dcerpc::Ndr::NdrWideStringzPtr
37
+ end
38
+ it 'is :null by default' do
39
+ expect(packet.buffer).to eq(:null)
40
+ end
41
+ end
42
+
43
+ describe '#assign' do
44
+ context 'with a string' do
45
+ before :example do
46
+ packet.assign('spec_test')
47
+ end
48
+
49
+ [BinData::Stringz, BinData::String, String].each do |klass|
50
+ context "with a #{klass}" do
51
+ it 'sets #buffer to the expected value' do
52
+ expect(packet.buffer).to eq(RubySMB::Dcerpc::Ndr::NdrWideStringPtr.new(klass.new('spec_test')))
53
+ end
54
+
55
+ it 'sets #buffer_length to the expected value' do
56
+ expect(packet.buffer_length).to eq(('spec_test'.size + 1) * 2)
57
+ end
58
+
59
+ it 'sets #maximum_length to the expected value' do
60
+ expect(packet.maximum_length).to eq(('spec_test'.size + 1) * 2)
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ context 'with a :null pointer' do
67
+ before :example do
68
+ packet.assign(:null)
69
+ end
70
+ it 'sets #buffer to :null' do
71
+ expect(packet.buffer).to eq(:null)
72
+ end
73
+
74
+ it 'sets #buffer_length to 0' do
75
+ expect(packet.buffer_length).to eq(0)
76
+ end
77
+
78
+ it 'sets #maximum_length to 0' do
79
+ expect(packet.maximum_length).to eq(0)
80
+ end
81
+ end
82
+ end
83
+
84
+ describe '#read' do
85
+ context 'with a null pointer' do
86
+ it 'reads its own binary representation' do
87
+ raw = packet.to_binary_s
88
+ expect(described_class.read(raw)).to eq(packet)
89
+ expect(described_class.read(raw).to_binary_s).to eq(raw)
90
+ end
91
+ end
92
+
93
+ context 'with a normal string' do
94
+ it 'reads its own binary representation' do
95
+ packet.assign('my_test')
96
+ raw = packet.to_binary_s
97
+ expect(described_class.read(raw)).to eq(packet)
98
+ expect(described_class.read(raw).to_binary_s).to eq(raw)
99
+ end
100
+ end
101
+ end
102
+
103
+ describe '#set_max_buffer_size' do
104
+ it 'sets buffer.max_count to the expected value' do
105
+ packet.set_max_buffer_size(4)
106
+ expect(packet.buffer.max_count).to eq(4 / 2)
107
+ end
108
+
109
+ it 'sets #maximum_length to the expected value' do
110
+ packet.set_max_buffer_size(4)
111
+ expect(packet.maximum_length).to eq(4)
112
+ end
113
+
114
+ it 'instantiates `buffer` if it is a null pointer' do
115
+ expect(packet.buffer).to eq(:null)
116
+ packet.set_max_buffer_size(4)
117
+ expect(packet.buffer).to eq('')
118
+ end
119
+ end
120
+
121
+ describe '#to_s' do
122
+ it 'returns a unicode string' do
123
+ packet.assign('Test')
124
+ expect(packet.to_s).to eq('Test'.encode('utf-16le'))
125
+ end
126
+
127
+ it 'returns a unicode encoded empty string if `buffer` is a null pointer' do
128
+ expect(packet.buffer).to eq(:null)
129
+ expect(packet.to_s).to eq(''.encode('utf-16le'))
130
+ end
131
+ end
132
+ end
133
+
134
+ RSpec.describe RubySMB::Dcerpc::PrrpUnicodeString do
135
+ it 'is RrpUnicodeString subclass' do
136
+ expect(described_class).to be < RubySMB::Dcerpc::RrpUnicodeString
137
+ end
138
+
139
+ subject(:packet) { described_class.new }
140
+
141
+ it 'is a NDR pointer' do
142
+ expect(subject).to be_a RubySMB::Dcerpc::Ndr::PointerPlugin
143
+ end
144
+
145
+ it { is_expected.to respond_to :ref_id }
146
+
147
+ it 'is :null if #ref_id is zero' do
148
+ packet.ref_id = 0
149
+ expect(packet).to eq(:null)
150
+ end
151
+
152
+ describe '#read' do
153
+ context 'with a null pointer' do
154
+ it 'reads its own binary representation' do
155
+ raw = packet.to_binary_s
156
+ expect(described_class.read(raw)).to eq(packet)
157
+ expect(described_class.read(raw).to_binary_s).to eq(raw)
158
+ end
159
+ end
160
+
161
+ context 'with a normal string' do
162
+ it 'reads its own binary representation' do
163
+ packet.assign('my_test')
164
+ raw = packet.to_binary_s
165
+ expect(described_class.read(raw)).to eq(packet)
166
+ expect(described_class.read(raw).to_binary_s).to eq(raw)
167
+ end
168
+ end
169
+ end
170
+ end
171
+
172
+ RSpec.describe RubySMB::Dcerpc::RpcUnicodeString do
173
+ subject(:packet) { described_class.new }
174
+
175
+ it { is_expected.to respond_to :buffer_length }
176
+ it { is_expected.to respond_to :maximum_length }
177
+ it { is_expected.to respond_to :buffer }
178
+
179
+ it 'is little endian' do
180
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
181
+ end
182
+
183
+ it 'has :byte_align parameter set to the expected value' do
184
+ expect(described_class.default_parameters[:byte_align]).to eq(4)
185
+ end
186
+
187
+ describe '#buffer_length' do
188
+ it 'should be a NdrUint16' do
189
+ expect(packet.buffer_length).to be_a RubySMB::Dcerpc::Ndr::NdrUint16
190
+ end
191
+ it 'is 0 by default' do
192
+ expect(packet.buffer_length).to eq(0)
193
+ end
194
+ end
195
+
196
+ describe '#maximum_length' do
197
+ it 'should be a NdrUint16' do
198
+ expect(packet.maximum_length).to be_a RubySMB::Dcerpc::Ndr::NdrUint16
199
+ end
200
+ it 'is 0 by default' do
201
+ expect(packet.maximum_length).to eq(0)
202
+ end
203
+ end
204
+
205
+ describe '#buffer' do
206
+ it 'should be a NdrWideStringPtr' do
207
+ expect(packet.buffer).to be_a RubySMB::Dcerpc::Ndr::NdrWideStringPtr
208
+ end
209
+ it 'is :null by default' do
210
+ expect(packet.buffer).to eq(:null)
211
+ end
212
+ end
213
+
214
+ describe '#assign' do
215
+ context 'with a string' do
216
+ before :example do
217
+ packet.assign('spec_test')
218
+ end
219
+
220
+ [BinData::Stringz, BinData::String, String].each do |klass|
221
+ context "with a #{klass}" do
222
+ it 'sets #buffer to the expected value' do
223
+ expect(packet.buffer).to eq(RubySMB::Dcerpc::Ndr::NdrWideStringPtr.new('spec_test'))
224
+ end
225
+
226
+ it 'sets #buffer_length to the expected value' do
227
+ expect(packet.buffer_length).to eq(('spec_test'.size) * 2)
228
+ end
229
+
230
+ it 'sets #maximum_length to the expected value' do
231
+ expect(packet.maximum_length).to eq(('spec_test'.size) * 2)
232
+ end
233
+ end
234
+ end
235
+ end
236
+ context 'with a :null pointer' do
237
+ before :example do
238
+ packet.assign(:null)
239
+ end
240
+ it 'sets #buffer to :null' do
241
+ expect(packet.buffer).to eq(:null)
242
+ end
243
+
244
+ it 'sets #buffer_length to 0' do
245
+ expect(packet.buffer_length).to eq(0)
246
+ end
247
+
248
+ it 'sets #maximum_length to 0' do
249
+ expect(packet.maximum_length).to eq(0)
250
+ end
251
+ end
252
+ end
253
+
254
+ describe '#read' do
255
+ context 'with a null pointer' do
256
+ it 'reads its own binary representation' do
257
+ raw = packet.to_binary_s
258
+ expect(described_class.read(raw)).to eq(packet)
259
+ expect(described_class.read(raw).to_binary_s).to eq(raw)
260
+ end
261
+ end
262
+
263
+ context 'with a normal string' do
264
+ it 'reads its own binary representation' do
265
+ packet.assign('my_test')
266
+ raw = packet.to_binary_s
267
+ expect(described_class.read(raw)).to eq(packet)
268
+ expect(described_class.read(raw).to_binary_s).to eq(raw)
269
+ end
270
+ end
271
+ end
272
+
273
+ describe '#set_max_buffer_size' do
274
+ it 'sets buffer.max_count to the expected value' do
275
+ packet.set_max_buffer_size(4)
276
+ expect(packet.buffer.max_count).to eq(4 / 2)
277
+ end
278
+
279
+ it 'sets #maximum_length to the expected value' do
280
+ packet.set_max_buffer_size(4)
281
+ expect(packet.maximum_length).to eq(4)
282
+ end
283
+
284
+ it 'instantiates `buffer` if it is a null pointer' do
285
+ expect(packet.buffer).to eq(:null)
286
+ packet.set_max_buffer_size(4)
287
+ expect(packet.buffer).to eq('')
288
+ end
289
+ end
290
+
291
+ describe '#to_s' do
292
+ it 'returns a unicode string' do
293
+ packet.assign('Test')
294
+ expect(packet.to_s).to eq('Test'.encode('utf-16le'))
295
+ end
296
+
297
+ it 'returns a unicode encoded empty string if `buffer` is a null pointer' do
298
+ expect(packet.buffer).to eq(:null)
299
+ expect(packet.to_s).to eq(''.encode('utf-16le'))
300
+ end
301
+ end
302
+ end
303
+
304
+ RSpec.describe RubySMB::Dcerpc::PrpcUnicodeString do
305
+ it 'is RpcUnicodeString subclass' do
306
+ expect(described_class).to be < RubySMB::Dcerpc::RpcUnicodeString
307
+ end
308
+
309
+ subject(:packet) { described_class.new }
310
+
311
+ it 'is a NDR pointer' do
312
+ expect(subject).to be_a RubySMB::Dcerpc::Ndr::PointerPlugin
313
+ end
314
+
315
+ it { is_expected.to respond_to :ref_id }
316
+
317
+ it 'is :null if #ref_id is zero' do
318
+ packet.ref_id = 0
319
+ expect(packet).to eq(:null)
320
+ end
321
+
322
+ describe '#read' do
323
+ context 'with a null pointer' do
324
+ it 'reads its own binary representation' do
325
+ raw = packet.to_binary_s
326
+ expect(described_class.read(raw)).to eq(packet)
327
+ expect(described_class.read(raw).to_binary_s).to eq(raw)
328
+ end
329
+ end
330
+
331
+ context 'with a normal string' do
332
+ it 'reads its own binary representation' do
333
+ packet.assign('my_test')
334
+ raw = packet.to_binary_s
335
+ expect(described_class.read(raw)).to eq(packet)
336
+ expect(described_class.read(raw).to_binary_s).to eq(raw)
337
+ end
338
+ end
339
+ end
340
+ end
@@ -0,0 +1,116 @@
1
+ RSpec.describe RubySMB::Dcerpc::Samr::RpcSidIdentifierAuthority do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it 'is a Ndr::NdrFixArray' do
5
+ expect(packet).to be_a(RubySMB::Dcerpc::Ndr::NdrFixArray)
6
+ end
7
+ it 'has element of type :ndr_uint8' do
8
+ expect(packet[0]).to be_a(RubySMB::Dcerpc::Ndr::NdrUint8)
9
+ end
10
+ it 'has 6 elements by default' do
11
+ expect(packet.size).to eq(6)
12
+ end
13
+ it 'is one-byte aligned' do
14
+ expect(packet.eval_parameter(:byte_align)).to eq(1)
15
+ end
16
+ it 'reads itself' do
17
+ expect(packet.read(described_class.new([1, 2, 3, 4, 5, 6]).to_binary_s)).to eq([1, 2, 3, 4, 5, 6])
18
+ end
19
+ end
20
+
21
+ RSpec.describe RubySMB::Dcerpc::Samr::RpcSid do
22
+ subject(:packet) { described_class.new }
23
+
24
+ it { is_expected.to respond_to :revision }
25
+ it { is_expected.to respond_to :sub_authority_count }
26
+ it { is_expected.to respond_to :identifier_authority }
27
+ it { is_expected.to respond_to :sub_authority }
28
+
29
+ it 'is little endian' do
30
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
31
+ end
32
+ it 'is a Ndr::NdrStruct' do
33
+ expect(packet).to be_a(RubySMB::Dcerpc::Ndr::NdrStruct)
34
+ end
35
+ it 'is four-byte aligned' do
36
+ expect(packet.eval_parameter(:byte_align)).to eq(4)
37
+ end
38
+ describe '#revision' do
39
+ it 'is a NdrUint8 structure' do
40
+ expect(packet.revision).to be_a RubySMB::Dcerpc::Ndr::NdrUint8
41
+ end
42
+ end
43
+ describe '#sub_authority_count' do
44
+ it 'is a NdrUint8 structure' do
45
+ expect(packet.sub_authority_count).to be_a RubySMB::Dcerpc::Ndr::NdrUint8
46
+ end
47
+ it 'is set the the number of #sub_authority elements by default' do
48
+ packet.sub_authority = [21, 419547006, 9459028, 4093171872, 500]
49
+ expect(packet.sub_authority_count).to eq(5)
50
+ end
51
+ end
52
+ describe '#identifier_authority' do
53
+ it 'is a RpcSidIdentifierAuthority structure' do
54
+ expect(packet.identifier_authority).to be_a RubySMB::Dcerpc::Samr::RpcSidIdentifierAuthority
55
+ end
56
+ end
57
+ describe '#sub_authority' do
58
+ it 'is a NdrConfArray structure' do
59
+ expect(packet.sub_authority).to be_a RubySMB::Dcerpc::Ndr::NdrConfArray
60
+ end
61
+ it 'has element of type :ndr_uint32' do
62
+ packet.sub_authority << 1
63
+ expect(packet.sub_authority[0]).to be_a(RubySMB::Dcerpc::Ndr::NdrUint32)
64
+ end
65
+ end
66
+ describe '#snapshot' do
67
+ it 'outputs the expected SID' do
68
+ packet.revision = 1
69
+ packet.identifier_authority = [0, 0, 0, 0, 0, 5]
70
+ packet.sub_authority = [21, 419547006, 9459028, 4093171872, 500]
71
+ expect(packet.snapshot).to eq('S-1-5-21-419547006-9459028-4093171872-500')
72
+ end
73
+ end
74
+ describe '#assign' do
75
+ it 'assign the correct fields from a String' do
76
+ packet.assign('S-1-5-21-419547006-9459028-4093171872-500')
77
+ expect(packet.revision).to eq(1)
78
+ expect(packet.sub_authority_count).to eq(5)
79
+ expect(packet.identifier_authority).to eq([0, 0, 0, 0, 0, 5])
80
+ expect(packet.sub_authority).to eq([21, 419547006, 9459028, 4093171872, 500])
81
+ end
82
+ it 'assign the correct fields from another RpcSid object' do
83
+ packet2 = described_class.new
84
+ packet2.revision = 1
85
+ packet2.identifier_authority = [0, 0, 0, 0, 0, 5]
86
+ packet2.sub_authority = [21, 419547006, 9459028, 4093171872, 500]
87
+ packet.assign(packet2)
88
+ expect(packet.revision).to eq(1)
89
+ expect(packet.sub_authority_count).to eq(5)
90
+ expect(packet.identifier_authority).to eq([0, 0, 0, 0, 0, 5])
91
+ expect(packet.sub_authority).to eq([21, 419547006, 9459028, 4093171872, 500])
92
+ expect(packet.snapshot).to eq('S-1-5-21-419547006-9459028-4093171872-500')
93
+ end
94
+ end
95
+ it 'reads itself' do
96
+ expect(packet.read(described_class.new('S-1-5-21-419547006-9459028-4093171872-500').to_binary_s)).to eq('S-1-5-21-419547006-9459028-4093171872-500')
97
+ end
98
+ end
99
+
100
+ RSpec.describe RubySMB::Dcerpc::Samr::PrpcSid do
101
+ subject(:packet) { described_class.new }
102
+
103
+ it 'is a RpcSid' do
104
+ expect(packet).to be_a(RubySMB::Dcerpc::Samr::RpcSid)
105
+ end
106
+ it 'is a NdrPointer' do
107
+ expect(described_class).to be_a(RubySMB::Dcerpc::Ndr::PointerClassPlugin)
108
+ expect(packet).to be_a(RubySMB::Dcerpc::Ndr::PointerPlugin)
109
+ end
110
+ it 'is four-byte aligned' do
111
+ expect(packet.eval_parameter(:byte_align)).to eq(4)
112
+ end
113
+ it 'reads itself' do
114
+ expect(packet.read(described_class.new('S-1-5-21-419547006-9459028-4093171872-500').to_binary_s)).to eq('S-1-5-21-419547006-9459028-4093171872-500')
115
+ end
116
+ end