ruby_smb 2.0.9 → 2.0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (228) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.github/workflows/verify.yml +5 -15
  4. data/examples/auth_capture.rb +71 -0
  5. data/examples/dump_secrets_from_sid.rb +207 -0
  6. data/examples/enum_domain_users.rb +75 -0
  7. data/examples/get_computer_info.rb +42 -0
  8. data/examples/query_service_status.rb +42 -4
  9. data/lib/ruby_smb/client/negotiation.rb +1 -1
  10. data/lib/ruby_smb/client.rb +10 -20
  11. data/lib/ruby_smb/dcerpc/bind.rb +28 -20
  12. data/lib/ruby_smb/dcerpc/bind_ack.rb +29 -28
  13. data/lib/ruby_smb/dcerpc/client.rb +542 -0
  14. data/lib/ruby_smb/dcerpc/drsr/drs_bind_request.rb +24 -0
  15. data/lib/ruby_smb/dcerpc/drsr/drs_bind_response.rb +26 -0
  16. data/lib/ruby_smb/dcerpc/drsr/drs_crack_names_request.rb +57 -0
  17. data/lib/ruby_smb/dcerpc/drsr/drs_crack_names_response.rb +76 -0
  18. data/lib/ruby_smb/dcerpc/drsr/drs_domain_controller_info_request.rb +46 -0
  19. data/lib/ruby_smb/dcerpc/drsr/drs_domain_controller_info_response.rb +168 -0
  20. data/lib/ruby_smb/dcerpc/drsr/drs_extensions.rb +56 -0
  21. data/lib/ruby_smb/dcerpc/drsr/drs_get_nc_changes_request.rb +121 -0
  22. data/lib/ruby_smb/dcerpc/drsr/drs_get_nc_changes_response.rb +118 -0
  23. data/lib/ruby_smb/dcerpc/drsr/drs_unbind_request.rb +24 -0
  24. data/lib/ruby_smb/dcerpc/drsr/drs_unbind_response.rb +26 -0
  25. data/lib/ruby_smb/dcerpc/drsr.rb +909 -0
  26. data/lib/ruby_smb/dcerpc/epm/epm_ept_map_request.rb +26 -0
  27. data/lib/ruby_smb/dcerpc/epm/epm_ept_map_response.rb +25 -0
  28. data/lib/ruby_smb/dcerpc/epm/epm_twrt.rb +211 -0
  29. data/lib/ruby_smb/dcerpc/epm.rb +75 -0
  30. data/lib/ruby_smb/dcerpc/error.rb +17 -0
  31. data/lib/ruby_smb/dcerpc/ndr.rb +1159 -297
  32. data/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_request.rb +3 -13
  33. data/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_response.rb +3 -3
  34. data/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_request.rb +3 -13
  35. data/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_response.rb +1 -1
  36. data/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_request.rb +3 -11
  37. data/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_response.rb +1 -1
  38. data/lib/ruby_smb/dcerpc/netlogon.rb +5 -4
  39. data/lib/ruby_smb/dcerpc/p_syntax_id_t.rb +4 -3
  40. data/lib/ruby_smb/dcerpc/pdu_header.rb +7 -7
  41. data/lib/ruby_smb/dcerpc/ptypes.rb +1 -0
  42. data/lib/ruby_smb/dcerpc/request.rb +79 -32
  43. data/lib/ruby_smb/dcerpc/response.rb +45 -10
  44. data/lib/ruby_smb/dcerpc/rpc_auth3.rb +28 -0
  45. data/lib/ruby_smb/dcerpc/rpc_security_attributes.rb +11 -11
  46. data/lib/ruby_smb/dcerpc/rrp_rpc_unicode_string.rb +118 -0
  47. data/lib/ruby_smb/dcerpc/samr/rpc_sid.rb +150 -0
  48. data/lib/ruby_smb/dcerpc/samr/samr_close_handle_request.rb +23 -0
  49. data/lib/ruby_smb/dcerpc/samr/samr_close_handle_response.rb +24 -0
  50. data/lib/ruby_smb/dcerpc/samr/samr_connect_request.rb +32 -0
  51. data/lib/ruby_smb/dcerpc/samr/samr_connect_response.rb +23 -0
  52. data/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_request.rb +26 -0
  53. data/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_response.rb +55 -0
  54. data/lib/ruby_smb/dcerpc/samr/samr_get_alias_membership_request.rb +48 -0
  55. data/lib/ruby_smb/dcerpc/samr/samr_get_alias_membership_response.rb +38 -0
  56. data/lib/ruby_smb/dcerpc/samr/samr_get_groups_for_user_request.rb +23 -0
  57. data/lib/ruby_smb/dcerpc/samr/samr_get_groups_for_user_response.rb +48 -0
  58. data/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_request.rb +24 -0
  59. data/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_response.rb +25 -0
  60. data/lib/ruby_smb/dcerpc/samr/samr_open_domain_request.rb +27 -0
  61. data/lib/ruby_smb/dcerpc/samr/samr_open_domain_response.rb +24 -0
  62. data/lib/ruby_smb/dcerpc/samr/samr_open_user_request.rb +26 -0
  63. data/lib/ruby_smb/dcerpc/samr/samr_open_user_response.rb +24 -0
  64. data/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_request.rb +23 -0
  65. data/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_response.rb +23 -0
  66. data/lib/ruby_smb/dcerpc/samr.rb +613 -0
  67. data/lib/ruby_smb/dcerpc/sec_trailer.rb +26 -0
  68. data/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all.rb +56 -79
  69. data/lib/ruby_smb/dcerpc/srvsvc.rb +27 -4
  70. data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request.rb +13 -25
  71. data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response.rb +2 -2
  72. data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response.rb +1 -1
  73. data/lib/ruby_smb/dcerpc/svcctl/control_service_request.rb +1 -1
  74. data/lib/ruby_smb/dcerpc/svcctl/control_service_response.rb +1 -1
  75. data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request.rb +4 -14
  76. data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response.rb +1 -1
  77. data/lib/ruby_smb/dcerpc/svcctl/open_service_w_request.rb +3 -11
  78. data/lib/ruby_smb/dcerpc/svcctl/open_service_w_response.rb +1 -1
  79. data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request.rb +1 -1
  80. data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response.rb +12 -11
  81. data/lib/ruby_smb/dcerpc/svcctl/query_service_status_response.rb +1 -1
  82. data/lib/ruby_smb/dcerpc/svcctl/service_status.rb +9 -8
  83. data/lib/ruby_smb/dcerpc/svcctl/start_service_w_request.rb +3 -3
  84. data/lib/ruby_smb/dcerpc/svcctl/start_service_w_response.rb +1 -1
  85. data/lib/ruby_smb/dcerpc/svcctl.rb +1 -3
  86. data/lib/ruby_smb/dcerpc/uuid.rb +3 -0
  87. data/lib/ruby_smb/dcerpc/winreg/close_key_response.rb +2 -2
  88. data/lib/ruby_smb/dcerpc/winreg/create_key_request.rb +2 -13
  89. data/lib/ruby_smb/dcerpc/winreg/create_key_response.rb +3 -3
  90. data/lib/ruby_smb/dcerpc/winreg/enum_key_request.rb +3 -20
  91. data/lib/ruby_smb/dcerpc/winreg/enum_key_response.rb +3 -20
  92. data/lib/ruby_smb/dcerpc/winreg/enum_value_request.rb +5 -14
  93. data/lib/ruby_smb/dcerpc/winreg/enum_value_response.rb +5 -14
  94. data/lib/ruby_smb/dcerpc/winreg/open_key_request.rb +1 -9
  95. data/lib/ruby_smb/dcerpc/winreg/open_key_response.rb +4 -3
  96. data/lib/ruby_smb/dcerpc/winreg/open_root_key_request.rb +5 -6
  97. data/lib/ruby_smb/dcerpc/winreg/open_root_key_response.rb +2 -2
  98. data/lib/ruby_smb/dcerpc/winreg/query_info_key_response.rb +9 -18
  99. data/lib/ruby_smb/dcerpc/winreg/query_value_request.rb +4 -14
  100. data/lib/ruby_smb/dcerpc/winreg/query_value_response.rb +7 -15
  101. data/lib/ruby_smb/dcerpc/winreg/regsam.rb +3 -1
  102. data/lib/ruby_smb/dcerpc/winreg/save_key_request.rb +0 -9
  103. data/lib/ruby_smb/dcerpc/winreg/save_key_response.rb +1 -1
  104. data/lib/ruby_smb/dcerpc/winreg.rb +10 -14
  105. data/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_request.rb +26 -0
  106. data/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_response.rb +88 -0
  107. data/lib/ruby_smb/dcerpc/wkssvc.rb +65 -0
  108. data/lib/ruby_smb/dcerpc.rb +41 -11
  109. data/lib/ruby_smb/dialect.rb +45 -0
  110. data/lib/ruby_smb/dispatcher/base.rb +1 -1
  111. data/lib/ruby_smb/field/file_time.rb +1 -1
  112. data/lib/ruby_smb/field/string16.rb +5 -1
  113. data/lib/ruby_smb/gss/provider/authenticator.rb +42 -0
  114. data/lib/ruby_smb/gss/provider/ntlm.rb +303 -0
  115. data/lib/ruby_smb/gss/provider.rb +35 -0
  116. data/lib/ruby_smb/gss.rb +56 -63
  117. data/lib/ruby_smb/ntlm.rb +61 -0
  118. data/lib/ruby_smb/server/server_client/negotiation.rb +156 -0
  119. data/lib/ruby_smb/server/server_client/session_setup.rb +82 -0
  120. data/lib/ruby_smb/server/server_client.rb +162 -0
  121. data/lib/ruby_smb/server.rb +54 -0
  122. data/lib/ruby_smb/signing.rb +59 -0
  123. data/lib/ruby_smb/smb1/packet/negotiate_response.rb +11 -11
  124. data/lib/ruby_smb/smb1/packet/negotiate_response_extended.rb +1 -1
  125. data/lib/ruby_smb/smb1/packet/session_setup_request.rb +1 -1
  126. data/lib/ruby_smb/smb1/pipe.rb +4 -0
  127. data/lib/ruby_smb/smb1/tree.rb +1 -1
  128. data/lib/ruby_smb/smb2/negotiate_context.rb +18 -2
  129. data/lib/ruby_smb/smb2/packet/negotiate_request.rb +9 -0
  130. data/lib/ruby_smb/smb2/packet/negotiate_response.rb +0 -1
  131. data/lib/ruby_smb/smb2/packet/session_setup_response.rb +2 -2
  132. data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +1 -1
  133. data/lib/ruby_smb/smb2/pipe.rb +4 -0
  134. data/lib/ruby_smb/smb2/tree.rb +1 -1
  135. data/lib/ruby_smb/smb2.rb +3 -1
  136. data/lib/ruby_smb/version.rb +1 -1
  137. data/lib/ruby_smb.rb +2 -1
  138. data/spec/lib/ruby_smb/client_spec.rb +8 -11
  139. data/spec/lib/ruby_smb/dcerpc/bind_ack_spec.rb +69 -41
  140. data/spec/lib/ruby_smb/dcerpc/bind_spec.rb +75 -21
  141. data/spec/lib/ruby_smb/dcerpc/client_spec.rb +714 -0
  142. data/spec/lib/ruby_smb/dcerpc/drsr_spec.rb +2169 -0
  143. data/spec/lib/ruby_smb/dcerpc/ndr_spec.rb +3792 -1373
  144. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_request_spec.rb +4 -4
  145. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_request_spec.rb +4 -4
  146. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_request_spec.rb +2 -2
  147. data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_response_spec.rb +2 -2
  148. data/spec/lib/ruby_smb/dcerpc/p_syntax_id_t_spec.rb +18 -4
  149. data/spec/lib/ruby_smb/dcerpc/pdu_header_spec.rb +27 -1
  150. data/spec/lib/ruby_smb/dcerpc/request_spec.rb +76 -11
  151. data/spec/lib/ruby_smb/dcerpc/response_spec.rb +99 -9
  152. data/spec/lib/ruby_smb/dcerpc/rpc_auth3_spec.rb +75 -0
  153. data/spec/lib/ruby_smb/dcerpc/rpc_security_attributes_spec.rb +29 -28
  154. data/spec/lib/ruby_smb/dcerpc/rrp_rpc_unicode_string_spec.rb +340 -0
  155. data/spec/lib/ruby_smb/dcerpc/samr/rpc_sid_spec.rb +116 -0
  156. data/spec/lib/ruby_smb/dcerpc/samr/samr_close_handle_request_spec.rb +40 -0
  157. data/spec/lib/ruby_smb/dcerpc/samr/samr_close_handle_response_spec.rb +48 -0
  158. data/spec/lib/ruby_smb/dcerpc/samr/samr_connect_request_spec.rb +56 -0
  159. data/spec/lib/ruby_smb/dcerpc/samr/samr_connect_response_spec.rb +47 -0
  160. data/spec/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_request_spec.rb +63 -0
  161. data/spec/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_response_spec.rb +265 -0
  162. data/spec/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_request_spec.rb +52 -0
  163. data/spec/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_response_spec.rb +36 -0
  164. data/spec/lib/ruby_smb/dcerpc/samr/samr_open_domain_request_spec.rb +56 -0
  165. data/spec/lib/ruby_smb/dcerpc/samr/samr_open_domain_response_spec.rb +48 -0
  166. data/spec/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_request_spec.rb +48 -0
  167. data/spec/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_response_spec.rb +42 -0
  168. data/spec/lib/ruby_smb/dcerpc/samr_spec.rb +420 -0
  169. data/spec/lib/ruby_smb/dcerpc/sec_trailer_spec.rb +92 -0
  170. data/spec/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all_spec.rb +149 -110
  171. data/spec/lib/ruby_smb/dcerpc/srvsvc_spec.rb +21 -17
  172. data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request_spec.rb +56 -79
  173. data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response_spec.rb +4 -4
  174. data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response_spec.rb +2 -2
  175. data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_request_spec.rb +2 -2
  176. data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_response_spec.rb +2 -2
  177. data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request_spec.rb +19 -29
  178. data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response_spec.rb +2 -2
  179. data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_request_spec.rb +9 -15
  180. data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_response_spec.rb +2 -2
  181. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request_spec.rb +2 -2
  182. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response_spec.rb +22 -22
  183. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_response_spec.rb +2 -2
  184. data/spec/lib/ruby_smb/dcerpc/svcctl/service_status_spec.rb +18 -14
  185. data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_request_spec.rb +5 -4
  186. data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_response_spec.rb +2 -2
  187. data/spec/lib/ruby_smb/dcerpc/svcctl_spec.rb +1 -5
  188. data/spec/lib/ruby_smb/dcerpc/uuid_spec.rb +15 -23
  189. data/spec/lib/ruby_smb/dcerpc/winreg/close_key_response_spec.rb +2 -2
  190. data/spec/lib/ruby_smb/dcerpc/winreg/create_key_request_spec.rb +4 -41
  191. data/spec/lib/ruby_smb/dcerpc/winreg/create_key_response_spec.rb +4 -4
  192. data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_request_spec.rb +4 -52
  193. data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_response_spec.rb +4 -56
  194. data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_request_spec.rb +10 -34
  195. data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_response_spec.rb +10 -34
  196. data/spec/lib/ruby_smb/dcerpc/winreg/open_key_request_spec.rb +2 -26
  197. data/spec/lib/ruby_smb/dcerpc/winreg/open_key_response_spec.rb +2 -2
  198. data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_request_spec.rb +17 -25
  199. data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_response_spec.rb +2 -2
  200. data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_response_spec.rb +20 -44
  201. data/spec/lib/ruby_smb/dcerpc/winreg/query_value_request_spec.rb +8 -32
  202. data/spec/lib/ruby_smb/dcerpc/winreg/query_value_response_spec.rb +10 -22
  203. data/spec/lib/ruby_smb/dcerpc/winreg/regsam_spec.rb +4 -0
  204. data/spec/lib/ruby_smb/dcerpc/winreg/save_key_request_spec.rb +0 -12
  205. data/spec/lib/ruby_smb/dcerpc/winreg/save_key_response_spec.rb +2 -2
  206. data/spec/lib/ruby_smb/dcerpc/winreg_spec.rb +18 -47
  207. data/spec/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_request_spec.rb +43 -0
  208. data/spec/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_response_spec.rb +410 -0
  209. data/spec/lib/ruby_smb/dcerpc/wkssvc_spec.rb +70 -0
  210. data/spec/lib/ruby_smb/field/string16_spec.rb +22 -0
  211. data/spec/lib/ruby_smb/gss/provider/ntlm/account_spec.rb +32 -0
  212. data/spec/lib/ruby_smb/gss/provider/ntlm/authenticator_spec.rb +101 -0
  213. data/spec/lib/ruby_smb/gss/provider/ntlm/os_version_spec.rb +32 -0
  214. data/spec/lib/ruby_smb/gss/provider/ntlm_spec.rb +113 -0
  215. data/spec/lib/ruby_smb/server/server_client_spec.rb +156 -0
  216. data/spec/lib/ruby_smb/server_spec.rb +32 -0
  217. data/spec/lib/ruby_smb/smb1/pipe_spec.rb +18 -37
  218. data/spec/lib/ruby_smb/smb1/tree_spec.rb +4 -4
  219. data/spec/lib/ruby_smb/smb2/negotiate_context_spec.rb +2 -2
  220. data/spec/lib/ruby_smb/smb2/pipe_spec.rb +18 -16
  221. data/spec/lib/ruby_smb/smb2/tree_spec.rb +5 -5
  222. data/spec/support/bin_helper.rb +9 -0
  223. data.tar.gz.sig +2 -1
  224. metadata +119 -6
  225. metadata.gz.sig +0 -0
  226. data/lib/ruby_smb/client/signing.rb +0 -64
  227. data/lib/ruby_smb/dcerpc/rrp_unicode_string.rb +0 -38
  228. data/spec/lib/ruby_smb/dcerpc/rrp_unicode_string_spec.rb +0 -135
@@ -3,7 +3,6 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryValueResponse do
3
3
 
4
4
  it { is_expected.to respond_to :lp_type }
5
5
  it { is_expected.to respond_to :lp_data }
6
- it { is_expected.to respond_to :pad }
7
6
  it { is_expected.to respond_to :lpcb_data }
8
7
  it { is_expected.to respond_to :lpcb_len }
9
8
  it { is_expected.to respond_to :error_status }
@@ -14,43 +13,32 @@ RSpec.describe RubySMB::Dcerpc::Winreg::QueryValueResponse do
14
13
  end
15
14
 
16
15
  describe '#lp_type' do
17
- it 'is a NdrLpDword structure' do
18
- expect(packet.lp_type).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
16
+ it 'is a Ndr::NdrUint32Ptr structure' do
17
+ expect(packet.lp_type).to be_a RubySMB::Dcerpc::Ndr::NdrUint32Ptr
19
18
  end
20
19
  end
21
20
 
22
21
  describe '#lp_data' do
23
- it 'is a NdrLpByteArray structure' do
24
- expect(packet.lp_data).to be_a RubySMB::Dcerpc::Ndr::NdrLpByteArray
25
- end
26
- end
27
-
28
- describe '#pad' do
29
- it 'is a string' do
30
- expect(packet.pad).to be_a BinData::String
31
- end
32
-
33
- it 'should keep #lpcb_data 4-byte aligned' do
34
- packet.lp_data = 'spec_test'.bytes
35
- expect(packet.lpcb_data.abs_offset % 4).to eq 0
22
+ it 'is a NdrNdrByteArrayPtr structure' do
23
+ expect(packet.lp_data).to be_a RubySMB::Dcerpc::Ndr::NdrByteArrayPtr
36
24
  end
37
25
  end
38
26
 
39
27
  describe '#lpcb_data' do
40
- it 'is a NdrLpDword structure' do
41
- expect(packet.lpcb_data).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
28
+ it 'is a Ndr::NdrUint32Ptr structure' do
29
+ expect(packet.lpcb_data).to be_a RubySMB::Dcerpc::Ndr::NdrUint32Ptr
42
30
  end
43
31
  end
44
32
 
45
33
  describe '#lpcb_len' do
46
- it 'is a NdrLpDword structure' do
47
- expect(packet.lpcb_len).to be_a RubySMB::Dcerpc::Ndr::NdrLpDword
34
+ it 'is a Ndr::NdrUint32Ptr structure' do
35
+ expect(packet.lpcb_len).to be_a RubySMB::Dcerpc::Ndr::NdrUint32Ptr
48
36
  end
49
37
  end
50
38
 
51
39
  describe '#error_status' do
52
- it 'is a 32-bit unsigned integer' do
53
- expect(packet.error_status).to be_a BinData::Uint32le
40
+ it 'is a NdrUint32' do
41
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
54
42
  end
55
43
  end
56
44
 
@@ -29,4 +29,8 @@ RSpec.describe RubySMB::Dcerpc::Winreg::Regsam do
29
29
  it 'is little endian' do
30
30
  expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
31
31
  end
32
+
33
+ it 'it is a Ndr::NdrStruct' do
34
+ expect(described_class).to be < RubySMB::Dcerpc::Ndr::NdrStruct
35
+ end
32
36
  end
@@ -16,7 +16,6 @@ RSpec.describe RubySMB::Dcerpc::Winreg::SaveKeyRequest do
16
16
 
17
17
  it { is_expected.to respond_to :hkey }
18
18
  it { is_expected.to respond_to :lp_file }
19
- it { is_expected.to respond_to :pad }
20
19
  it { is_expected.to respond_to :lp_security_attributes }
21
20
 
22
21
  describe '#hkey' do
@@ -31,17 +30,6 @@ RSpec.describe RubySMB::Dcerpc::Winreg::SaveKeyRequest do
31
30
  end
32
31
  end
33
32
 
34
- describe '#pad' do
35
- it 'is a string' do
36
- expect(packet.pad).to be_a BinData::String
37
- end
38
-
39
- it 'should keep #lp_security_attributes 4-byte aligned' do
40
- packet.lp_file = "test"
41
- expect(packet.lp_security_attributes.abs_offset % 4).to eq 0
42
- end
43
- end
44
-
45
33
  describe '#lp_security_attributes' do
46
34
  it 'is a PrpcSecurityAttributes structure' do
47
35
  expect(packet.lp_security_attributes).to be_a RubySMB::Dcerpc::PrpcSecurityAttributes
@@ -8,8 +8,8 @@ RSpec.describe RubySMB::Dcerpc::Winreg::SaveKeyResponse do
8
8
  end
9
9
 
10
10
  describe '#error_status' do
11
- it 'is a 32-bit unsigned integer' do
12
- expect(packet.error_status).to be_a BinData::Uint32le
11
+ it 'is a NdrUint32' do
12
+ expect(packet.error_status).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
13
13
  end
14
14
  end
15
15
 
@@ -133,16 +133,14 @@ RSpec.describe RubySMB::Dcerpc::Winreg do
133
133
  let(:handle) { double('Handle') }
134
134
  let(:value_name) { double('Value Name') }
135
135
  let(:query_value_request_packet) { double('Query Value Request Packet #1') }
136
- let(:lp_data1) { double('LpData #1') }
137
- let(:lp_data2) { double('LpData #2') }
136
+ let(:lp_data) { double('LpData #2') }
138
137
  let(:response1) { double('Response #1') }
139
138
  let(:response2) { double('Response #2') }
140
139
  let(:query_value_response1) { double('Query Value Response #1') }
141
140
  let(:query_value_response2) { double('Query Value Response #2') }
142
141
  let(:data) { double('Data') }
143
142
  let(:lpcb_data) { double('LpcbData') }
144
- let(:lpcb_data_referent) { double('LpcbData Referent') }
145
- let(:lp_data2_referent) { double('LpData Referent') }
143
+ let(:max_count) { 5 }
146
144
  before :example do
147
145
  allow(described_class::QueryValueRequest).to receive(:new).and_return(query_value_request_packet)
148
146
  allow(query_value_request_packet).to receive_messages(
@@ -150,10 +148,9 @@ RSpec.describe RubySMB::Dcerpc::Winreg do
150
148
  :lpcb_data= => nil,
151
149
  :lpcb_len= => nil,
152
150
  :lp_data= => nil,
153
- :lp_data => lp_data2,
151
+ :lp_data => lp_data,
154
152
  )
155
- allow(lp_data2).to receive(:referent).and_return(lp_data2_referent)
156
- allow(lp_data2_referent).to receive(:max_count=)
153
+ allow(lp_data).to receive(:max_count=)
157
154
  first_request = true
158
155
  allow(winreg).to receive(:dcerpc_request) do |arg|
159
156
  if first_request
@@ -171,7 +168,7 @@ RSpec.describe RubySMB::Dcerpc::Winreg do
171
168
  :data => data
172
169
  )
173
170
  allow(query_value_response1).to receive(:lpcb_data).and_return(lpcb_data)
174
- allow(lpcb_data).to receive(:referent).and_return(lpcb_data_referent)
171
+ allow(lpcb_data).to receive(:to_i).and_return(max_count)
175
172
  end
176
173
 
177
174
  it 'create the expected QueryValueRequest packets' do
@@ -186,7 +183,7 @@ RSpec.describe RubySMB::Dcerpc::Winreg do
186
183
  expect(query_value_request_packet).to have_received(:lpcb_len=).with(0)
187
184
  expect(query_value_request_packet).to have_received(:lpcb_data=).with(lpcb_data)
188
185
  expect(query_value_request_packet).to have_received(:lp_data=).with([])
189
- expect(lp_data2_referent).to have_received(:max_count=).with(lpcb_data_referent)
186
+ expect(lp_data).to have_received(:max_count=).with(max_count)
190
187
  end
191
188
 
192
189
  it 'sends the expected dcerpc requests' do
@@ -293,19 +290,13 @@ RSpec.describe RubySMB::Dcerpc::Winreg do
293
290
  let(:response) { double('Response') }
294
291
  let(:query_info_key_response) { double('CloseKey Response') }
295
292
  let(:lp_class) { double('LpClass') }
296
- let(:lp_class_referent) { double('LpClass referent') }
297
- let(:lp_class_buf_ref) { double('LpClass buffer referent') }
298
293
  before :example do
299
294
  allow(described_class::QueryInfoKeyRequest).to receive(:new).and_return(query_info_key_request_packet)
300
295
  allow(query_info_key_request_packet).to receive_messages(
301
296
  :lp_class= => nil,
302
297
  :lp_class => lp_class,
303
298
  )
304
- allow(lp_class).to receive(:referent).and_return(lp_class_referent)
305
- allow(lp_class_referent).to receive(:actual_count=)
306
- allow(lp_class).to receive(:maximum_length=)
307
- allow(lp_class).to receive_message_chain(:buffer, :referent => lp_class_buf_ref)
308
- allow(lp_class_buf_ref).to receive(:max_count=)
299
+ allow(lp_class).to receive(:set_max_buffer_size)
309
300
  allow(winreg).to receive(:dcerpc_request).and_return(response)
310
301
  allow(described_class::QueryInfoKeyResponse).to receive(:read).and_return(query_info_key_response)
311
302
  allow(query_info_key_response).to receive(:error_status).and_return(WindowsError::Win32::ERROR_SUCCESS)
@@ -323,10 +314,7 @@ RSpec.describe RubySMB::Dcerpc::Winreg do
323
314
 
324
315
  it 'sets the expected fields on the request packet' do
325
316
  winreg.query_info_key(handle)
326
- expect(query_info_key_request_packet).to have_received(:lp_class=).with('')
327
- expect(lp_class_referent).to have_received(:actual_count=).with(0)
328
- expect(lp_class).to have_received(:maximum_length=).with(1024)
329
- expect(lp_class_buf_ref).to have_received(:max_count=).with(1024 / 2)
317
+ expect(lp_class).to have_received(:set_max_buffer_size).with(RubySMB::Dcerpc::Winreg::BUFFER_SIZE)
330
318
  end
331
319
 
332
320
  it 'creates a QueryInfoKeyResponse structure from the expected dcerpc response' do
@@ -358,31 +346,22 @@ RSpec.describe RubySMB::Dcerpc::Winreg do
358
346
  let(:index) { double('Index') }
359
347
  let(:enum_key_request_packet) { double('enum_key Request Packet') }
360
348
  let(:lp_name) { double('Lp Name') }
361
- let(:buffer) { double('Buffer') }
362
- let(:lp_name_buffer_referent) { double('Lp Name buffer referent') }
363
349
  let(:response) { double('Response') }
364
350
  let(:enum_key_response) { double('enum_key Response') }
365
- let(:result_str) { double('Result String') }
351
+ let(:result_str) { { buffer: 'reg key' } }
366
352
  let(:lp_class) { double('Lp Class') }
367
- let(:lp_class_buffer_referent) { double('Lp Class buffer referent') }
368
353
  before :example do
369
354
  allow(described_class::EnumKeyRequest).to receive(:new).and_return(enum_key_request_packet)
370
355
  allow(enum_key_request_packet).to receive_messages(
371
- :lpft_last_write_time= => nil,
372
- :lp_class= => nil,
373
356
  :lp_name => lp_name,
374
357
  :lp_class => lp_class
375
358
  )
376
- allow(lp_class).to receive(:referent).and_return(lp_class_buffer_referent)
377
- allow(lp_class_buffer_referent).to receive(:buffer=)
378
- allow(lp_name).to receive(:buffer).and_return(buffer)
379
- allow(lp_name).to receive(:buffer=)
380
- allow(buffer).to receive(:referent).and_return(lp_name_buffer_referent)
381
- allow(lp_name_buffer_referent).to receive(:max_count=)
359
+ allow(lp_class).to receive(:instantiate_referent)
360
+ allow(lp_name).to receive(:set_max_buffer_size)
382
361
  allow(winreg).to receive(:dcerpc_request).and_return(response)
383
362
  allow(described_class::EnumKeyResponse).to receive(:read).and_return(enum_key_response)
384
363
  allow(enum_key_response).to receive(:error_status).and_return(WindowsError::Win32::ERROR_SUCCESS)
385
- allow(enum_key_response).to receive_message_chain(:lp_name, :to_s => result_str)
364
+ allow(enum_key_response).to receive_message_chain(:lp_name, :[] => result_str)
386
365
  end
387
366
 
388
367
  it 'create the expected EnumKeyRequest packet' do
@@ -392,11 +371,8 @@ RSpec.describe RubySMB::Dcerpc::Winreg do
392
371
 
393
372
  it 'sets the expected parameters on the request packet' do
394
373
  winreg.enum_key(handle, index)
395
- expect(enum_key_request_packet).to have_received(:lpft_last_write_time=).with(0)
396
- expect(enum_key_request_packet).to have_received(:lp_class=).with('')
397
- expect(lp_class_buffer_referent).to have_received(:buffer=).with(:null)
398
- expect(lp_name).to have_received(:buffer=).with('')
399
- expect(lp_name_buffer_referent).to have_received(:max_count=).with(256)
374
+ expect(lp_class).to have_received(:instantiate_referent)
375
+ expect(lp_name).to have_received(:set_max_buffer_size).with(RubySMB::Dcerpc::Winreg::BUFFER_SIZE)
400
376
  end
401
377
 
402
378
  it 'sends the expected dcerpc request' do
@@ -433,22 +409,18 @@ RSpec.describe RubySMB::Dcerpc::Winreg do
433
409
  let(:index) { double('Index') }
434
410
  let(:enum_value_request_packet) { double('EnumValue Request Packet') }
435
411
  let(:lp_value_name) { double('Lp Value Name') }
436
- let(:buffer) { double('Buffer') }
437
412
  let(:referent) { double('Referent') }
438
413
  let(:response) { double('Response') }
439
414
  let(:enum_value_response) { double('EnumValue Response') }
440
- let(:result_str) { double('Result String') }
415
+ let(:result_str) { {buffer: 'reg value'} }
441
416
  before :example do
442
417
  allow(described_class::EnumValueRequest).to receive(:new).and_return(enum_value_request_packet)
443
418
  allow(enum_value_request_packet).to receive(:lp_value_name).and_return(lp_value_name)
444
- allow(lp_value_name).to receive(:buffer).and_return(buffer)
445
- allow(lp_value_name).to receive(:buffer=)
446
- allow(buffer).to receive(:referent).and_return(referent)
447
- allow(referent).to receive(:max_count=)
419
+ allow(lp_value_name).to receive(:set_max_buffer_size)
448
420
  allow(winreg).to receive(:dcerpc_request).and_return(response)
449
421
  allow(described_class::EnumValueResponse).to receive(:read).and_return(enum_value_response)
450
422
  allow(enum_value_response).to receive(:error_status).and_return(WindowsError::Win32::ERROR_SUCCESS)
451
- allow(enum_value_response).to receive_message_chain(:lp_value_name, :to_s => result_str)
423
+ allow(enum_value_response).to receive_message_chain(:lp_value_name, :[] => result_str)
452
424
  end
453
425
 
454
426
  it 'create the expected EnumValueRequest packet' do
@@ -458,8 +430,7 @@ RSpec.describe RubySMB::Dcerpc::Winreg do
458
430
 
459
431
  it 'sets the expected buffer on the request packet' do
460
432
  winreg.enum_value(handle, index)
461
- expect(referent).to have_received(:max_count=).with(256)
462
- expect(lp_value_name).to have_received(:buffer=).with('')
433
+ expect(lp_value_name).to have_received(:set_max_buffer_size).with(RubySMB::Dcerpc::Winreg::BUFFER_SIZE)
463
434
  end
464
435
 
465
436
  it 'sends the expected dcerpc request' do
@@ -0,0 +1,43 @@
1
+ RSpec.describe RubySMB::Dcerpc::Wkssvc::WkssvcIdentifyHandle do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it 'is a Ndr::NdrWideStringPtr' do
5
+ expect(packet).to be_a(RubySMB::Dcerpc::Ndr::NdrWideStringPtr)
6
+ end
7
+ end
8
+
9
+ RSpec.describe RubySMB::Dcerpc::Wkssvc::NetrWkstaGetInfoRequest do
10
+ subject(:packet) { described_class.new }
11
+
12
+ it { is_expected.to respond_to :server_name }
13
+ it { is_expected.to respond_to :level }
14
+ it { is_expected.to respond_to :opnum }
15
+
16
+ it 'is little endian' do
17
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
18
+ end
19
+ it 'is a BinData::Record' do
20
+ expect(packet).to be_a(BinData::Record)
21
+ end
22
+ describe '#server_name' do
23
+ it 'is a WkssvcIdentifyHandle structure' do
24
+ expect(packet.server_name).to be_a RubySMB::Dcerpc::Wkssvc::WkssvcIdentifyHandle
25
+ end
26
+ end
27
+ describe '#level' do
28
+ it 'is a NdrUint32 structure' do
29
+ expect(packet.level).to be_a RubySMB::Dcerpc::Ndr::NdrUint32
30
+ end
31
+ end
32
+ describe '#initialize_instance' do
33
+ it 'sets #opnum to NETR_WKSTA_GET_INFO constant' do
34
+ expect(packet.opnum).to eq(RubySMB::Dcerpc::Wkssvc::NETR_WKSTA_GET_INFO)
35
+ end
36
+ end
37
+ it 'reads itself' do
38
+ new_class = described_class.new(server_name: 'TestServer', level: 4)
39
+ expect(packet.read(new_class.to_binary_s)).to eq(
40
+ {server_name: 'TestServer'.encode('utf-16le'), level: 4}
41
+ )
42
+ end
43
+ end