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,27 @@
1
+ require 'ruby_smb/dcerpc/ndr'
2
+
3
+ module RubySMB
4
+ module Dcerpc
5
+ module Netlogon
6
+
7
+ # [3.5.4.4.2 NetrServerAuthenticate3 (Opnum 26)](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrpc/3a9ed16f-8014-45ae-80af-c0ecb06e2db9)
8
+ class NetrServerAuthenticate3Request < BinData::Record
9
+ attr_reader :opnum
10
+
11
+ endian :little
12
+
13
+ logonsrv_handle :primary_name
14
+ ndr_conf_var_wide_stringz :account_name
15
+ netlogon_secure_channel_type :secure_channel_type
16
+ ndr_conf_var_wide_stringz :computer_name
17
+ netlogon_credential :client_credential
18
+ ndr_uint32 :flags
19
+
20
+ def initialize_instance
21
+ super
22
+ @opnum = NETR_SERVER_AUTHENTICATE3
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ require 'ruby_smb/dcerpc/ndr'
2
+
3
+ module RubySMB
4
+ module Dcerpc
5
+ module Netlogon
6
+
7
+ # [3.5.4.4.2 NetrServerAuthenticate3 (Opnum 26)](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrpc/3a9ed16f-8014-45ae-80af-c0ecb06e2db9)
8
+ class NetrServerAuthenticate3Response < BinData::Record
9
+ attr_reader :opnum
10
+
11
+ endian :little
12
+
13
+ netlogon_credential :server_credential
14
+ ndr_uint32 :negotiate_flags
15
+ ndr_uint32 :account_rid
16
+ ndr_uint32 :error_status
17
+
18
+ def initialize_instance
19
+ super
20
+ @opnum = NETR_SERVER_AUTHENTICATE3
21
+ end
22
+
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,27 @@
1
+ require 'ruby_smb/dcerpc/ndr'
2
+
3
+ module RubySMB
4
+ module Dcerpc
5
+ module Netlogon
6
+
7
+ # [3.5.4.4.5 NetrServerPasswordSet2 (Opnum 30)](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrpc/14b020a8-0bcf-4af5-ab72-cc92bc6b1d81)
8
+ class NetrServerPasswordSet2Request < BinData::Record
9
+ attr_reader :opnum
10
+
11
+ endian :little
12
+
13
+ logonsrv_handle :primary_name
14
+ ndr_conf_var_wide_stringz :account_name
15
+ netlogon_secure_channel_type :secure_channel_type
16
+ ndr_conf_var_wide_stringz :computer_name
17
+ netlogon_authenticator :authenticator
18
+ ndr_fixed_byte_array :clear_new_password, initial_length: 516 # this is an encrypted NL_TRUST_PASSWORD
19
+
20
+ def initialize_instance
21
+ super
22
+ @opnum = Netlogon::NETR_SERVER_PASSWORD_SET2
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,23 @@
1
+ require 'ruby_smb/dcerpc/ndr'
2
+
3
+ module RubySMB
4
+ module Dcerpc
5
+ module Netlogon
6
+
7
+ # [3.5.4.4.5 NetrServerPasswordSet2 (Opnum 30)](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrpc/14b020a8-0bcf-4af5-ab72-cc92bc6b1d81)
8
+ class NetrServerPasswordSet2Response < BinData::Record
9
+ attr_reader :opnum
10
+
11
+ endian :little
12
+
13
+ netlogon_authenticator :return_authenticator
14
+ ndr_uint32 :error_status
15
+
16
+ def initialize_instance
17
+ super
18
+ @opnum = Netlogon::NETR_SERVER_PASSWORD_SET2
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ require 'ruby_smb/dcerpc/ndr'
2
+
3
+ module RubySMB
4
+ module Dcerpc
5
+ module Netlogon
6
+
7
+ # [3.5.4.4.1 NetrServerReqChallenge (Opnum 4)](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrpc/5ad9db9f-7441-4ce5-8c7b-7b771e243d32)
8
+ class NetrServerReqChallengeRequest < BinData::Record
9
+ attr_reader :opnum
10
+
11
+ endian :little
12
+
13
+ logonsrv_handle :primary_name
14
+ ndr_conf_var_wide_stringz :computer_name
15
+ netlogon_credential :client_challenge
16
+
17
+ def initialize_instance
18
+ super
19
+ @opnum = NETR_SERVER_REQ_CHALLENGE
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ require 'ruby_smb/dcerpc/ndr'
2
+
3
+ module RubySMB
4
+ module Dcerpc
5
+ module Netlogon
6
+
7
+ # [3.5.4.4.1 NetrServerReqChallenge (Opnum 4)](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrpc/5ad9db9f-7441-4ce5-8c7b-7b771e243d32)
8
+ class NetrServerReqChallengeResponse < BinData::Record
9
+ attr_reader :opnum
10
+
11
+ endian :little
12
+
13
+ netlogon_credential :server_challenge
14
+ ndr_uint32 :error_status
15
+
16
+ def initialize_instance
17
+ super
18
+ @opnum = NETR_SERVER_REQ_CHALLENGE
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,102 @@
1
+ module RubySMB
2
+ module Dcerpc
3
+ module Netlogon
4
+
5
+ # see: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrpc/592edbc8-f6f1-40c0-9ab3-fe6725ac6d7e
6
+ UUID = '12345678-1234-abcd-ef00-01234567cffb'
7
+ VER_MAJOR = 1
8
+ VER_MINOR = 0
9
+
10
+ # Operation numbers
11
+ NETR_SERVER_REQ_CHALLENGE = 4
12
+ NETR_SERVER_AUTHENTICATE3 = 26
13
+ NETR_SERVER_PASSWORD_SET2 = 30
14
+
15
+ # see: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrpc/3b224201-b531-43e2-8c79-b61f6dea8640
16
+ class LogonsrvHandle < Ndr::NdrWideStringzPtr; end
17
+
18
+ # see: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrpc/d55e2632-7163-4f6c-b662-4b870e8cc1cd
19
+ class NetlogonCredential < Ndr::NdrFixedByteArray
20
+ default_parameters initial_length: 8
21
+ end
22
+
23
+ # see: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrpc/76c93227-942a-4687-ab9d-9d972ffabdab
24
+ class NetlogonAuthenticator < Ndr::NdrStruct
25
+ default_parameter byte_align: 4
26
+ endian :little
27
+
28
+ netlogon_credential :credential
29
+ ndr_uint32 :timestamp
30
+ end
31
+
32
+ # see: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrpc/4d1235e3-2c96-4e9f-a147-3cb338a0d09f
33
+ class NetlogonSecureChannelType < Ndr::NdrEnum
34
+ # enum example from dmendel/bindata#38 https://github.com/dmendel/bindata/issues/38#issuecomment-46397163
35
+ ALL = {
36
+ 0 => :NullSecureChannel,
37
+ 1 => :MsvApSecureChannel,
38
+ 2 => :WorkstationSecureChannel,
39
+ 3 => :TrustedDnsDomainSecureChannel,
40
+ 4 => :TrustedDomainSecureChannel,
41
+ 5 => :UasServerSecureChannel,
42
+ 6 => :ServerSecureChannel,
43
+ 7 => :CdcServerSecureChannel
44
+ }
45
+ ALL.each_pair { |val,sym| const_set(sym.to_s.gsub(/([a-z])([A-Z])/, '\1_\2').upcase, val) }
46
+ default_parameter assert: -> { ALL.keys.include? value }
47
+
48
+ def as_enum
49
+ ALL[value]
50
+ end
51
+
52
+ def assign(val)
53
+ if val.is_a? Symbol
54
+ val = ALL.key(val)
55
+ raise ArgumentError, 'invalid value name' if val.nil?
56
+ end
57
+
58
+ super
59
+ end
60
+ end
61
+
62
+ require 'ruby_smb/dcerpc/netlogon/netr_server_authenticate3_request'
63
+ require 'ruby_smb/dcerpc/netlogon/netr_server_authenticate3_response'
64
+ require 'ruby_smb/dcerpc/netlogon/netr_server_password_set2_request'
65
+ require 'ruby_smb/dcerpc/netlogon/netr_server_password_set2_response'
66
+ require 'ruby_smb/dcerpc/netlogon/netr_server_req_challenge_request'
67
+ require 'ruby_smb/dcerpc/netlogon/netr_server_req_challenge_response'
68
+
69
+ # Calculate the netlogon session key from the provided shared secret and
70
+ # challenges. The shared secret is an NTLM hash.
71
+ #
72
+ # @param shared_secret [String] the share secret between the client and the server
73
+ # @param client_challenge [String] the client challenge portion of the negotiation
74
+ # @param server_challenge [String] the server challenge portion of the negotiation
75
+ # @return [String] the session key for encryption
76
+ def self.calculate_session_key(shared_secret, client_challenge, server_challenge)
77
+ client_challenge = client_challenge.to_binary_s if client_challenge.is_a? NetlogonCredential
78
+ server_challenge = server_challenge.to_binary_s if server_challenge.is_a? NetlogonCredential
79
+
80
+ hmac = OpenSSL::HMAC.new(shared_secret, OpenSSL::Digest::SHA256.new)
81
+ hmac << client_challenge
82
+ hmac << server_challenge
83
+ hmac.digest.first(16)
84
+ end
85
+
86
+ # Encrypt the input data using the specified session key. This is used for
87
+ # certain Netlogon service operations including the authentication
88
+ # process. Per the specification, this uses AES-128-CFB8 with an all zero
89
+ # initialization vector.
90
+ #
91
+ # @param session_key [String] the session key to use for encryption (must be 16 bytes long)
92
+ # @param input_data [String] the data to encrypt
93
+ # @return [String] the encrypted data
94
+ def self.encrypt_credential(session_key, input_data)
95
+ cipher = OpenSSL::Cipher.new('AES-128-CFB8').encrypt
96
+ cipher.iv = "\x00" * 16
97
+ cipher.key = session_key
98
+ cipher.update(input_data) + cipher.final
99
+ end
100
+ end
101
+ end
102
+ end
@@ -1,11 +1,12 @@
1
1
  module RubySMB
2
2
  module Dcerpc
3
- class PSyntaxIdT < BinData::Record
3
+ class PSyntaxIdT < Ndr::NdrStruct
4
+ default_parameter byte_align: 4
4
5
  endian :little
5
6
 
6
7
  uuid :if_uuid, initial_value: -> { uuid }
7
- uint16 :if_ver_major, initial_value: -> { ver_major }
8
- uint16 :if_ver_minor, initial_value: -> { ver_minor }
8
+ ndr_uint16 :if_ver_major, initial_value: -> { ver_major }
9
+ ndr_uint16 :if_ver_minor, initial_value: -> { ver_minor }
9
10
  end
10
11
  end
11
12
  end
@@ -10,14 +10,14 @@ module RubySMB
10
10
  uint8 :ptype, label: 'PDU type'
11
11
 
12
12
  struct :pfc_flags do
13
- bit1 :object_uuid, label: 'Object UUID'
14
- bit1 :maybe, label: 'Maybe call semantics'
13
+ bit1 :object_uuid, label: 'Object UUID'
14
+ bit1 :maybe, label: 'Maybe call semantics'
15
15
  bit1 :did_not_execute, label: 'Did not execute'
16
- bit1 :conc_mpx, label: 'Concurrent multiplexing'
17
- bit1 :reserved_1, label: 'Reserved'
18
- bit1 :pending_cancel, label: 'Pending cancel'
19
- bit1 :last_frag, label: 'Last fragment', initial_value: 1
20
- bit1 :first_frag, label: 'First fragment', initial_value: 1
16
+ bit1 :conc_mpx, label: 'Concurrent multiplexing'
17
+ bit1 :reserved_1, label: 'Reserved'
18
+ bit1 :support_header_sign, label: 'Support Header Signing'
19
+ bit1 :last_frag, label: 'Last fragment', initial_value: 1
20
+ bit1 :first_frag, label: 'First fragment', initial_value: 1
21
21
  end
22
22
 
23
23
  uint32 :packed_drep, label: 'NDR data representation format label', initial_value: 0x10
@@ -17,6 +17,7 @@ module RubySMB
17
17
  BIND_NAK = 13
18
18
  ALTER_CONTEXT = 14
19
19
  ALTER_CONTEXT_RESP = 15
20
+ RPC_AUTH3 = 16
20
21
  SHUTDOWN = 17
21
22
  CO_CANCEL = 18
22
23
  ORPHANED = 19
@@ -3,47 +3,113 @@ module RubySMB
3
3
  # The Request PDU as defined in
4
4
  # [The request PDU](http://pubs.opengroup.org/onlinepubs/9629399/chap12.htm#tagcjh_17_06_04_09)
5
5
  class Request < BinData::Record
6
+ PTYPE = PTypes::REQUEST
7
+
6
8
  endian :little
7
9
 
8
- pdu_header :pdu_header, label: 'PDU header'
10
+ # PDU Header
11
+ pdu_header :pdu_header, label: 'PDU header common fields'
9
12
  uint32 :alloc_hint, label: 'Allocation hint', initial_value: -> { stub.num_bytes }
10
13
  uint16 :p_cont_id, label: 'Presentation context identification'
11
14
  uint16 :opnum, label: 'Operation Number'
12
15
  uuid :object, label: 'Object UID', onlyif: -> { pdu_header.pfc_flags.object_uuid == 1 }
13
16
 
17
+ # PDU Body
14
18
  choice :stub, label: 'Stub', selection: -> { @obj.parent.get_parameter(:endpoint) || '' } do
19
+ string 'Encrypted'
15
20
  choice 'Winreg', selection: -> { opnum } do
16
- open_root_key_request RubySMB::Dcerpc::Winreg::OPEN_HKCR, opnum: RubySMB::Dcerpc::Winreg::OPEN_HKCR
17
- open_root_key_request RubySMB::Dcerpc::Winreg::OPEN_HKCU, opnum: RubySMB::Dcerpc::Winreg::OPEN_HKCU
18
- open_root_key_request RubySMB::Dcerpc::Winreg::OPEN_HKLM, opnum: RubySMB::Dcerpc::Winreg::OPEN_HKLM
19
- open_root_key_request RubySMB::Dcerpc::Winreg::OPEN_HKPD, opnum: RubySMB::Dcerpc::Winreg::OPEN_HKPD
20
- open_root_key_request RubySMB::Dcerpc::Winreg::OPEN_HKU, opnum: RubySMB::Dcerpc::Winreg::OPEN_HKU
21
- open_root_key_request RubySMB::Dcerpc::Winreg::OPEN_HKCC, opnum: RubySMB::Dcerpc::Winreg::OPEN_HKCC
22
- open_root_key_request RubySMB::Dcerpc::Winreg::OPEN_HKPT, opnum: RubySMB::Dcerpc::Winreg::OPEN_HKPT
23
- open_root_key_request RubySMB::Dcerpc::Winreg::OPEN_HKPN, opnum: RubySMB::Dcerpc::Winreg::OPEN_HKPN
24
- close_key_request RubySMB::Dcerpc::Winreg::REG_CLOSE_KEY
25
- enum_key_request RubySMB::Dcerpc::Winreg::REG_ENUM_KEY
26
- enum_value_request RubySMB::Dcerpc::Winreg::REG_ENUM_VALUE
27
- open_key_request RubySMB::Dcerpc::Winreg::REG_OPEN_KEY
28
- query_info_key_request RubySMB::Dcerpc::Winreg::REG_QUERY_INFO_KEY
29
- query_value_request RubySMB::Dcerpc::Winreg::REG_QUERY_VALUE
21
+ open_root_key_request Winreg::OPEN_HKCR, opnum: Winreg::OPEN_HKCR
22
+ open_root_key_request Winreg::OPEN_HKCU, opnum: Winreg::OPEN_HKCU
23
+ open_root_key_request Winreg::OPEN_HKLM, opnum: Winreg::OPEN_HKLM
24
+ open_root_key_request Winreg::OPEN_HKPD, opnum: Winreg::OPEN_HKPD
25
+ open_root_key_request Winreg::OPEN_HKU, opnum: Winreg::OPEN_HKU
26
+ open_root_key_request Winreg::OPEN_HKCC, opnum: Winreg::OPEN_HKCC
27
+ open_root_key_request Winreg::OPEN_HKPT, opnum: Winreg::OPEN_HKPT
28
+ open_root_key_request Winreg::OPEN_HKPN, opnum: Winreg::OPEN_HKPN
29
+ close_key_request Winreg::REG_CLOSE_KEY
30
+ enum_key_request Winreg::REG_ENUM_KEY
31
+ enum_value_request Winreg::REG_ENUM_VALUE
32
+ open_key_request Winreg::REG_OPEN_KEY
33
+ query_info_key_request Winreg::REG_QUERY_INFO_KEY
34
+ query_value_request Winreg::REG_QUERY_VALUE
35
+ create_key_request Winreg::REG_CREATE_KEY
36
+ save_key_request Winreg::REG_SAVE_KEY
30
37
  string :default
31
38
  end
39
+ choice 'Netlogon', selection: -> { opnum } do
40
+ netr_server_authenticate3_request Netlogon::NETR_SERVER_AUTHENTICATE3
41
+ netr_server_password_set2_request Netlogon::NETR_SERVER_PASSWORD_SET2
42
+ netr_server_req_challenge_request Netlogon::NETR_SERVER_REQ_CHALLENGE
43
+ string :default
44
+ end
32
45
  choice 'Srvsvc', selection: -> { opnum } do
33
- net_share_enum_all RubySMB::Dcerpc::Srvsvc::NET_SHARE_ENUM_ALL, host: -> { host rescue '' }
46
+ net_share_enum_all_request Srvsvc::NET_SHARE_ENUM_ALL
34
47
  string :default
35
48
  end
49
+ choice 'Svcctl', selection: -> { opnum } do
50
+ open_sc_manager_w_request Svcctl::OPEN_SC_MANAGER_W
51
+ open_service_w_request Svcctl::OPEN_SERVICE_W
52
+ query_service_status_request Svcctl::QUERY_SERVICE_STATUS
53
+ query_service_config_w_request Svcctl::QUERY_SERVICE_CONFIG_W
54
+ change_service_config_w_request Svcctl::CHANGE_SERVICE_CONFIG_W
55
+ start_service_w_request Svcctl::START_SERVICE_W
56
+ control_service_request Svcctl::CONTROL_SERVICE
57
+ close_service_handle_request Svcctl::CLOSE_SERVICE_HANDLE
58
+ string :default
59
+ end
60
+ choice 'Samr', selection: -> { opnum } do
61
+ samr_connect_request Samr::SAMR_CONNECT
62
+ samr_lookup_domain_in_sam_server_request Samr::SAMR_LOOKUP_DOMAIN_IN_SAM_SERVER
63
+ samr_open_domain_request Samr::SAMR_OPEN_DOMAIN
64
+ samr_enumerate_users_in_domain_request Samr::SAMR_ENUMERATE_USERS_IN_DOMAIN
65
+ samr_rid_to_sid_request Samr::SAMR_RID_TO_SID
66
+ samr_close_handle_request Samr::SAMR_CLOSE_HANDLE
67
+ samr_get_alias_membership_request Samr::SAMR_GET_ALIAS_MEMBERSHIP
68
+ samr_open_user_request Samr::SAMR_OPEN_USER
69
+ samr_get_groups_for_user_request Samr::SAMR_GET_GROUPS_FOR_USER
70
+ string :default
71
+ end
72
+ choice 'Wkssvc', selection: -> { opnum } do
73
+ netr_wksta_get_info_request Wkssvc::NETR_WKSTA_GET_INFO
74
+ string :default
75
+ end
76
+ choice 'Epm', selection: -> { opnum } do
77
+ epm_ept_map_request RubySMB::Dcerpc::Epm::EPT_MAP
78
+ string :default
79
+ end
80
+ choice 'Drsr', selection: -> { opnum } do
81
+ drs_bind_request Drsr::DRS_BIND
82
+ drs_unbind_request Drsr::DRS_UNBIND
83
+ drs_domain_controller_info_request Drsr::DRS_DOMAIN_CONTROLLER_INFO
84
+ drs_crack_names_request Drsr::DRS_CRACK_NAMES
85
+ drs_get_nc_changes_request Drsr::DRS_GET_NC_CHANGES
86
+ string :default
87
+ end
36
88
  string :default
37
89
  end
90
+ string :auth_pad,
91
+ onlyif: -> { has_auth_verifier? },
92
+ length: -> { (16 - (stub.num_bytes % 16)) % 16 }
38
93
 
39
- string :auth_verifier, label: 'Authentication verifier',
40
- onlyif: -> { pdu_header.auth_length > 0 },
94
+ # Auth Verifier
95
+ sec_trailer :sec_trailer, onlyif: -> { has_auth_verifier? }
96
+ string :auth_value, label: 'Authentication verifier',
97
+ onlyif: -> { has_auth_verifier? },
41
98
  read_length: -> { pdu_header.auth_length }
42
99
 
43
100
  def initialize_instance
44
101
  super
45
- pdu_header.ptype = RubySMB::Dcerpc::PTypes::REQUEST
102
+ pdu_header.ptype = PTYPE
103
+ end
104
+
105
+ def enable_encrypted_stub
106
+ @params[:endpoint] = 'Encrypted'
46
107
  end
108
+
109
+ def has_auth_verifier?
110
+ self.pdu_header.auth_length > 0
111
+ end
112
+
47
113
  end
48
114
  end
49
115
  end
@@ -3,24 +3,59 @@ module RubySMB
3
3
  # The Response PDU as defined in
4
4
  # [The response PDU](http://pubs.opengroup.org/onlinepubs/9629399/chap12.htm#tagcjh_17_06_04_10)
5
5
  class Response < BinData::Record
6
- endian :little
6
+ PTYPE = PTypes::RESPONSE
7
7
 
8
- pdu_header :pdu_header, label: 'PDU header'
8
+ endian :little
9
9
 
10
- uint32 :alloc_hint, label: 'Allocation hint', initial_value: -> { stub.do_num_bytes }
11
- uint16 :p_cont_id, label: 'Presentation context identification'
12
- uint8 :cancel_count, label: 'Cancel count'
13
- uint8 :reserved
10
+ # PDU Header
11
+ pdu_header :pdu_header, label: 'PDU header common fields'
12
+ uint32 :alloc_hint, label: 'Allocation hint', initial_value: -> { stub.do_num_bytes }
13
+ uint16 :p_cont_id, label: 'Presentation context identification'
14
+ uint8 :cancel_count, label: 'Cancel count'
15
+ uint8 :reserved
14
16
 
15
- string :stub, label: 'Stub', read_length: -> { pdu_header.frag_length - stub.abs_offset - pdu_header.auth_length }
17
+ # PDU Body
18
+ string :stub, label: 'Stub', read_length: -> { stub_length }
19
+ string :auth_pad,
20
+ onlyif: -> { has_auth_verifier? },
21
+ length: -> { (16 - (stub.num_bytes % 16)) % 16 }
16
22
 
17
- string :auth_verifier, label: 'Authentication verifier',
18
- onlyif: -> { pdu_header.auth_length > 0 },
23
+ # Auth Verifier
24
+ sec_trailer :sec_trailer, onlyif: -> { has_auth_verifier? }
25
+ string :auth_value, label: 'Authentication verifier',
26
+ onlyif: -> { has_auth_verifier? },
19
27
  read_length: -> { pdu_header.auth_length }
20
28
 
21
29
  def initialize_instance
22
30
  super
23
- pdu_header.ptype = RubySMB::Dcerpc::PTypes::RESPONSE
31
+ pdu_header.ptype = PTYPE
32
+ end
33
+
34
+ def has_auth_verifier?
35
+ self.pdu_header.auth_length > 0
36
+ end
37
+
38
+ def stub_length
39
+ stub_length = pdu_header.frag_length - stub.rel_offset
40
+ if has_auth_verifier?
41
+ # Note that the resulting stub length includes auth_pad. We will be
42
+ # able to separate the auth_pad from the stub once the sec_trailer
43
+ # structure is read.
44
+ stub_length -= (sec_trailer.num_bytes + pdu_header.auth_length)
45
+ end
46
+ stub_length
47
+ end
48
+
49
+ def read(io)
50
+ super
51
+ if has_auth_verifier? && sec_trailer.auth_pad_length > 0
52
+ # At this point, auth_pad is at the end of the stub. We need to move
53
+ # it to the correct field. It is now possible since we know its
54
+ # length from the sec_trailer auth_pad_length field.
55
+ pad = stub[-(sec_trailer.auth_pad_length)..-1]
56
+ stub.assign(stub[0...-(sec_trailer.auth_pad_length)])
57
+ auth_pad.assign(pad)
58
+ end
24
59
  end
25
60
  end
26
61
  end
@@ -0,0 +1,28 @@
1
+ module RubySMB
2
+ module Dcerpc
3
+
4
+ # [2.2.2.10 rpc_auth_3 PDU](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rpce/a6b7b03c-4ac5-4c25-8c52-f2bec872ac97)
5
+ class RpcAuth3 < BinData::Record
6
+ PTYPE = PTypes::RPC_AUTH3
7
+
8
+ endian :little
9
+
10
+ # PDU Header
11
+ pdu_header :pdu_header
12
+ uint32 :pad
13
+
14
+ # Auth Verifier
15
+ sec_trailer :sec_trailer, onlyif: -> { pdu_header.auth_length > 0 }
16
+ string :auth_value,
17
+ onlyif: -> { pdu_header.auth_length > 0 },
18
+ read_length: -> { pdu_header.auth_length }
19
+
20
+ def initialize_instance
21
+ super
22
+ pdu_header.ptype = PTYPE
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+
@@ -0,0 +1,34 @@
1
+ module RubySMB
2
+ module Dcerpc
3
+
4
+ # This class represents a RPC_SECURITY_DESCRIPTOR structure as defined in
5
+ # [2.2.8 RPC_SECURITY_DESCRIPTOR](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rrp/9729e781-8eb9-441b-82ca-e898f98d29c2)
6
+ class RpcSecurityDescriptor < Ndr::NdrStruct
7
+ default_parameters byte_align: 4
8
+ endian :little
9
+
10
+ ndr_byte_array_ptr :lp_security_descriptor
11
+ ndr_uint32 :cb_in_security_descriptor
12
+ ndr_uint32 :cb_out_security_descriptor
13
+ end
14
+
15
+ # This class represents a RPC_SECURITY_ATTRIBUTES structure as defined in
16
+ # [2.2.7 RPC_SECURITY_ATTRIBUTES](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rrp/bc37b8cf-8c94-4804-ad53-0aaf5eaf0ecb)
17
+ class RpcSecurityAttributes < Ndr::NdrStruct
18
+ default_parameters byte_align: 4
19
+ endian :little
20
+
21
+ ndr_uint32 :n_length
22
+ rpc_security_descriptor :rpc_security_descriptor
23
+ ndr_uint8 :b_inheritHandle
24
+ end
25
+
26
+ # This class represents a pointer to a RPC_SECURITY_ATTRIBUTES structure as defined in
27
+ # [2.2.7 RPC_SECURITY_ATTRIBUTES](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rrp/bc37b8cf-8c94-4804-ad53-0aaf5eaf0ecb)
28
+ class PrpcSecurityAttributes < RpcSecurityAttributes
29
+ extend Ndr::PointerClassPlugin
30
+ end
31
+
32
+ end
33
+ end
34
+