ruby_smb 2.0.9 → 2.0.13
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.github/workflows/verify.yml +5 -15
- data/examples/auth_capture.rb +71 -0
- data/examples/dump_secrets_from_sid.rb +207 -0
- data/examples/enum_domain_users.rb +75 -0
- data/examples/get_computer_info.rb +42 -0
- data/examples/query_service_status.rb +42 -4
- data/lib/ruby_smb/client/negotiation.rb +1 -1
- data/lib/ruby_smb/client.rb +10 -20
- data/lib/ruby_smb/dcerpc/bind.rb +28 -20
- data/lib/ruby_smb/dcerpc/bind_ack.rb +29 -28
- data/lib/ruby_smb/dcerpc/client.rb +542 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_bind_request.rb +24 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_bind_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_crack_names_request.rb +57 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_crack_names_response.rb +76 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_domain_controller_info_request.rb +46 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_domain_controller_info_response.rb +168 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_extensions.rb +56 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_get_nc_changes_request.rb +121 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_get_nc_changes_response.rb +118 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_unbind_request.rb +24 -0
- data/lib/ruby_smb/dcerpc/drsr/drs_unbind_response.rb +26 -0
- data/lib/ruby_smb/dcerpc/drsr.rb +909 -0
- data/lib/ruby_smb/dcerpc/epm/epm_ept_map_request.rb +26 -0
- data/lib/ruby_smb/dcerpc/epm/epm_ept_map_response.rb +25 -0
- data/lib/ruby_smb/dcerpc/epm/epm_twrt.rb +211 -0
- data/lib/ruby_smb/dcerpc/epm.rb +75 -0
- data/lib/ruby_smb/dcerpc/error.rb +17 -0
- data/lib/ruby_smb/dcerpc/ndr.rb +1159 -297
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_request.rb +3 -13
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_response.rb +3 -3
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_request.rb +3 -13
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_request.rb +3 -11
- data/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/netlogon.rb +5 -4
- data/lib/ruby_smb/dcerpc/p_syntax_id_t.rb +4 -3
- data/lib/ruby_smb/dcerpc/pdu_header.rb +7 -7
- data/lib/ruby_smb/dcerpc/ptypes.rb +1 -0
- data/lib/ruby_smb/dcerpc/request.rb +79 -32
- data/lib/ruby_smb/dcerpc/response.rb +45 -10
- data/lib/ruby_smb/dcerpc/rpc_auth3.rb +28 -0
- data/lib/ruby_smb/dcerpc/rpc_security_attributes.rb +11 -11
- data/lib/ruby_smb/dcerpc/rrp_rpc_unicode_string.rb +118 -0
- data/lib/ruby_smb/dcerpc/samr/rpc_sid.rb +150 -0
- data/lib/ruby_smb/dcerpc/samr/samr_close_handle_request.rb +23 -0
- data/lib/ruby_smb/dcerpc/samr/samr_close_handle_response.rb +24 -0
- data/lib/ruby_smb/dcerpc/samr/samr_connect_request.rb +32 -0
- data/lib/ruby_smb/dcerpc/samr/samr_connect_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_request.rb +26 -0
- data/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_response.rb +55 -0
- data/lib/ruby_smb/dcerpc/samr/samr_get_alias_membership_request.rb +48 -0
- data/lib/ruby_smb/dcerpc/samr/samr_get_alias_membership_response.rb +38 -0
- data/lib/ruby_smb/dcerpc/samr/samr_get_groups_for_user_request.rb +23 -0
- data/lib/ruby_smb/dcerpc/samr/samr_get_groups_for_user_response.rb +48 -0
- data/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_request.rb +24 -0
- data/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_response.rb +25 -0
- data/lib/ruby_smb/dcerpc/samr/samr_open_domain_request.rb +27 -0
- data/lib/ruby_smb/dcerpc/samr/samr_open_domain_response.rb +24 -0
- data/lib/ruby_smb/dcerpc/samr/samr_open_user_request.rb +26 -0
- data/lib/ruby_smb/dcerpc/samr/samr_open_user_response.rb +24 -0
- data/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_request.rb +23 -0
- data/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_response.rb +23 -0
- data/lib/ruby_smb/dcerpc/samr.rb +613 -0
- data/lib/ruby_smb/dcerpc/sec_trailer.rb +26 -0
- data/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all.rb +56 -79
- data/lib/ruby_smb/dcerpc/srvsvc.rb +27 -4
- data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request.rb +13 -25
- data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response.rb +2 -2
- data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl/control_service_request.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl/control_service_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request.rb +4 -14
- data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl/open_service_w_request.rb +3 -11
- data/lib/ruby_smb/dcerpc/svcctl/open_service_w_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response.rb +12 -11
- data/lib/ruby_smb/dcerpc/svcctl/query_service_status_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl/service_status.rb +9 -8
- data/lib/ruby_smb/dcerpc/svcctl/start_service_w_request.rb +3 -3
- data/lib/ruby_smb/dcerpc/svcctl/start_service_w_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/svcctl.rb +1 -3
- data/lib/ruby_smb/dcerpc/uuid.rb +3 -0
- data/lib/ruby_smb/dcerpc/winreg/close_key_response.rb +2 -2
- data/lib/ruby_smb/dcerpc/winreg/create_key_request.rb +2 -13
- data/lib/ruby_smb/dcerpc/winreg/create_key_response.rb +3 -3
- data/lib/ruby_smb/dcerpc/winreg/enum_key_request.rb +3 -20
- data/lib/ruby_smb/dcerpc/winreg/enum_key_response.rb +3 -20
- data/lib/ruby_smb/dcerpc/winreg/enum_value_request.rb +5 -14
- data/lib/ruby_smb/dcerpc/winreg/enum_value_response.rb +5 -14
- data/lib/ruby_smb/dcerpc/winreg/open_key_request.rb +1 -9
- data/lib/ruby_smb/dcerpc/winreg/open_key_response.rb +4 -3
- data/lib/ruby_smb/dcerpc/winreg/open_root_key_request.rb +5 -6
- data/lib/ruby_smb/dcerpc/winreg/open_root_key_response.rb +2 -2
- data/lib/ruby_smb/dcerpc/winreg/query_info_key_response.rb +9 -18
- data/lib/ruby_smb/dcerpc/winreg/query_value_request.rb +4 -14
- data/lib/ruby_smb/dcerpc/winreg/query_value_response.rb +7 -15
- data/lib/ruby_smb/dcerpc/winreg/regsam.rb +3 -1
- data/lib/ruby_smb/dcerpc/winreg/save_key_request.rb +0 -9
- data/lib/ruby_smb/dcerpc/winreg/save_key_response.rb +1 -1
- data/lib/ruby_smb/dcerpc/winreg.rb +10 -14
- data/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_request.rb +26 -0
- data/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_response.rb +88 -0
- data/lib/ruby_smb/dcerpc/wkssvc.rb +65 -0
- data/lib/ruby_smb/dcerpc.rb +41 -11
- data/lib/ruby_smb/dialect.rb +45 -0
- data/lib/ruby_smb/dispatcher/base.rb +1 -1
- data/lib/ruby_smb/field/file_time.rb +1 -1
- data/lib/ruby_smb/field/string16.rb +5 -1
- data/lib/ruby_smb/gss/provider/authenticator.rb +42 -0
- data/lib/ruby_smb/gss/provider/ntlm.rb +303 -0
- data/lib/ruby_smb/gss/provider.rb +35 -0
- data/lib/ruby_smb/gss.rb +56 -63
- data/lib/ruby_smb/ntlm.rb +61 -0
- data/lib/ruby_smb/server/server_client/negotiation.rb +156 -0
- data/lib/ruby_smb/server/server_client/session_setup.rb +82 -0
- data/lib/ruby_smb/server/server_client.rb +162 -0
- data/lib/ruby_smb/server.rb +54 -0
- data/lib/ruby_smb/signing.rb +59 -0
- data/lib/ruby_smb/smb1/packet/negotiate_response.rb +11 -11
- data/lib/ruby_smb/smb1/packet/negotiate_response_extended.rb +1 -1
- data/lib/ruby_smb/smb1/packet/session_setup_request.rb +1 -1
- data/lib/ruby_smb/smb1/pipe.rb +4 -0
- data/lib/ruby_smb/smb1/tree.rb +1 -1
- data/lib/ruby_smb/smb2/negotiate_context.rb +18 -2
- data/lib/ruby_smb/smb2/packet/negotiate_request.rb +9 -0
- data/lib/ruby_smb/smb2/packet/negotiate_response.rb +0 -1
- data/lib/ruby_smb/smb2/packet/session_setup_response.rb +2 -2
- data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +1 -1
- data/lib/ruby_smb/smb2/pipe.rb +4 -0
- data/lib/ruby_smb/smb2/tree.rb +1 -1
- data/lib/ruby_smb/smb2.rb +3 -1
- data/lib/ruby_smb/version.rb +1 -1
- data/lib/ruby_smb.rb +2 -1
- data/spec/lib/ruby_smb/client_spec.rb +8 -11
- data/spec/lib/ruby_smb/dcerpc/bind_ack_spec.rb +69 -41
- data/spec/lib/ruby_smb/dcerpc/bind_spec.rb +75 -21
- data/spec/lib/ruby_smb/dcerpc/client_spec.rb +714 -0
- data/spec/lib/ruby_smb/dcerpc/drsr_spec.rb +2169 -0
- data/spec/lib/ruby_smb/dcerpc/ndr_spec.rb +3792 -1373
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_authenticate3_request_spec.rb +4 -4
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_password_set2_request_spec.rb +4 -4
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_request_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/netlogon/netr_server_req_challenge_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/p_syntax_id_t_spec.rb +18 -4
- data/spec/lib/ruby_smb/dcerpc/pdu_header_spec.rb +27 -1
- data/spec/lib/ruby_smb/dcerpc/request_spec.rb +76 -11
- data/spec/lib/ruby_smb/dcerpc/response_spec.rb +99 -9
- data/spec/lib/ruby_smb/dcerpc/rpc_auth3_spec.rb +75 -0
- data/spec/lib/ruby_smb/dcerpc/rpc_security_attributes_spec.rb +29 -28
- data/spec/lib/ruby_smb/dcerpc/rrp_rpc_unicode_string_spec.rb +340 -0
- data/spec/lib/ruby_smb/dcerpc/samr/rpc_sid_spec.rb +116 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_close_handle_request_spec.rb +40 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_close_handle_response_spec.rb +48 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_connect_request_spec.rb +56 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_connect_response_spec.rb +47 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_request_spec.rb +63 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_enumerate_users_in_domain_response_spec.rb +265 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_request_spec.rb +52 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_lookup_domain_in_sam_server_response_spec.rb +36 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_open_domain_request_spec.rb +56 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_open_domain_response_spec.rb +48 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_request_spec.rb +48 -0
- data/spec/lib/ruby_smb/dcerpc/samr/samr_rid_to_sid_response_spec.rb +42 -0
- data/spec/lib/ruby_smb/dcerpc/samr_spec.rb +420 -0
- data/spec/lib/ruby_smb/dcerpc/sec_trailer_spec.rb +92 -0
- data/spec/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all_spec.rb +149 -110
- data/spec/lib/ruby_smb/dcerpc/srvsvc_spec.rb +21 -17
- data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request_spec.rb +56 -79
- data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response_spec.rb +4 -4
- data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_request_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request_spec.rb +19 -29
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_request_spec.rb +9 -15
- data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response_spec.rb +22 -22
- data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl/service_status_spec.rb +18 -14
- data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_request_spec.rb +5 -4
- data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/svcctl_spec.rb +1 -5
- data/spec/lib/ruby_smb/dcerpc/uuid_spec.rb +15 -23
- data/spec/lib/ruby_smb/dcerpc/winreg/close_key_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/winreg/create_key_request_spec.rb +4 -41
- data/spec/lib/ruby_smb/dcerpc/winreg/create_key_response_spec.rb +4 -4
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_request_spec.rb +4 -52
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_response_spec.rb +4 -56
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_request_spec.rb +10 -34
- data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_response_spec.rb +10 -34
- data/spec/lib/ruby_smb/dcerpc/winreg/open_key_request_spec.rb +2 -26
- data/spec/lib/ruby_smb/dcerpc/winreg/open_key_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_request_spec.rb +17 -25
- data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_response_spec.rb +20 -44
- data/spec/lib/ruby_smb/dcerpc/winreg/query_value_request_spec.rb +8 -32
- data/spec/lib/ruby_smb/dcerpc/winreg/query_value_response_spec.rb +10 -22
- data/spec/lib/ruby_smb/dcerpc/winreg/regsam_spec.rb +4 -0
- data/spec/lib/ruby_smb/dcerpc/winreg/save_key_request_spec.rb +0 -12
- data/spec/lib/ruby_smb/dcerpc/winreg/save_key_response_spec.rb +2 -2
- data/spec/lib/ruby_smb/dcerpc/winreg_spec.rb +18 -47
- data/spec/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_request_spec.rb +43 -0
- data/spec/lib/ruby_smb/dcerpc/wkssvc/netr_wksta_get_info_response_spec.rb +410 -0
- data/spec/lib/ruby_smb/dcerpc/wkssvc_spec.rb +70 -0
- data/spec/lib/ruby_smb/field/string16_spec.rb +22 -0
- data/spec/lib/ruby_smb/gss/provider/ntlm/account_spec.rb +32 -0
- data/spec/lib/ruby_smb/gss/provider/ntlm/authenticator_spec.rb +101 -0
- data/spec/lib/ruby_smb/gss/provider/ntlm/os_version_spec.rb +32 -0
- data/spec/lib/ruby_smb/gss/provider/ntlm_spec.rb +113 -0
- data/spec/lib/ruby_smb/server/server_client_spec.rb +156 -0
- data/spec/lib/ruby_smb/server_spec.rb +32 -0
- data/spec/lib/ruby_smb/smb1/pipe_spec.rb +18 -37
- data/spec/lib/ruby_smb/smb1/tree_spec.rb +4 -4
- data/spec/lib/ruby_smb/smb2/negotiate_context_spec.rb +2 -2
- data/spec/lib/ruby_smb/smb2/pipe_spec.rb +18 -16
- data/spec/lib/ruby_smb/smb2/tree_spec.rb +5 -5
- data/spec/support/bin_helper.rb +9 -0
- data.tar.gz.sig +2 -1
- metadata +119 -6
- metadata.gz.sig +0 -0
- data/lib/ruby_smb/client/signing.rb +0 -64
- data/lib/ruby_smb/dcerpc/rrp_unicode_string.rb +0 -38
- data/spec/lib/ruby_smb/dcerpc/rrp_unicode_string_spec.rb +0 -135
|
@@ -0,0 +1,909 @@
|
|
|
1
|
+
module RubySMB
|
|
2
|
+
module Dcerpc
|
|
3
|
+
module Drsr
|
|
4
|
+
|
|
5
|
+
UUID = 'E3514235-4B06-11D1-AB04-00C04FC2DCD2'
|
|
6
|
+
VER_MAJOR = 4
|
|
7
|
+
VER_MINOR = 0
|
|
8
|
+
|
|
9
|
+
# [5.138 NTSAPI_CLIENT_GUID](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/d4ff2fb2-bf57-455e-9646-426a92737d6e)
|
|
10
|
+
NTSAPI_CLIENT_GUID = 'e24d201a-4fd6-11d1-a3da-0000f875ae0d'
|
|
11
|
+
|
|
12
|
+
# Operation numbers
|
|
13
|
+
DRS_BIND = 0x0000
|
|
14
|
+
DRS_UNBIND = 0x0001
|
|
15
|
+
DRS_GET_NC_CHANGES = 0x0003
|
|
16
|
+
DRS_CRACK_NAMES = 0x000C
|
|
17
|
+
DRS_DOMAIN_CONTROLLER_INFO = 0x0010
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# DRS_EXTENSIONS_INT Flags
|
|
21
|
+
# [5.39 DRS_EXTENSIONS_INT](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/3ee529b1-23db-4996-948a-042f04998e91)
|
|
22
|
+
DRS_EXT_BASE = 0x00000001
|
|
23
|
+
DRS_EXT_ASYNCREPL = 0x00000002
|
|
24
|
+
DRS_EXT_REMOVEAPI = 0x00000004
|
|
25
|
+
DRS_EXT_MOVEREQ_V2 = 0x00000008
|
|
26
|
+
DRS_EXT_GETCHG_DEFLATE = 0x00000010
|
|
27
|
+
DRS_EXT_DCINFO_V1 = 0x00000020
|
|
28
|
+
DRS_EXT_RESTORE_USN_OPTIMIZATION = 0x00000040
|
|
29
|
+
DRS_EXT_ADDENTRY = 0x00000080
|
|
30
|
+
DRS_EXT_KCC_EXECUTE = 0x00000100
|
|
31
|
+
DRS_EXT_ADDENTRY_V2 = 0x00000200
|
|
32
|
+
DRS_EXT_LINKED_VALUE_REPLICATION = 0x00000400
|
|
33
|
+
DRS_EXT_DCINFO_V2 = 0x00000800
|
|
34
|
+
DRS_EXT_INSTANCE_TYPE_NOT_REQ_ON_MOD = 0x00001000
|
|
35
|
+
DRS_EXT_CRYPTO_BIND = 0x00002000
|
|
36
|
+
DRS_EXT_GET_REPL_INFO = 0x00004000
|
|
37
|
+
DRS_EXT_STRONG_ENCRYPTION = 0x00008000
|
|
38
|
+
DRS_EXT_DCINFO_VFFFFFFFF = 0x00010000
|
|
39
|
+
DRS_EXT_TRANSITIVE_MEMBERSHIP = 0x00020000
|
|
40
|
+
DRS_EXT_ADD_SID_HISTORY = 0x00040000
|
|
41
|
+
DRS_EXT_POST_BETA3 = 0x00080000
|
|
42
|
+
DRS_EXT_GETCHGREQ_V5 = 0x00100000
|
|
43
|
+
DRS_EXT_GETMEMBERSHIPS2 = 0x00200000
|
|
44
|
+
DRS_EXT_GETCHGREQ_V6 = 0x00400000
|
|
45
|
+
DRS_EXT_NONDOMAIN_NCS = 0x00800000
|
|
46
|
+
DRS_EXT_GETCHGREQ_V8 = 0x01000000
|
|
47
|
+
DRS_EXT_GETCHGREPLY_V5 = 0x02000000
|
|
48
|
+
DRS_EXT_GETCHGREPLY_V6 = 0x04000000
|
|
49
|
+
DRS_EXT_GETCHGREPLY_V9 = 0x00000100
|
|
50
|
+
DRS_EXT_WHISTLER_BETA3 = 0x08000000
|
|
51
|
+
DRS_EXT_W2K3_DEFLATE = 0x10000000
|
|
52
|
+
DRS_EXT_GETCHGREQ_V10 = 0x20000000
|
|
53
|
+
DRS_EXT_RESERVED_FOR_WIN2K_OR_DOTNET_PART2 = 0x40000000
|
|
54
|
+
DRS_EXT_RESERVED_FOR_WIN2K_OR_DOTNET_PART3 = 0x80000000
|
|
55
|
+
|
|
56
|
+
# DRS_EXTENSIONS_INT FlagsExt
|
|
57
|
+
# [5.39 DRS_EXTENSIONS_INT](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/3ee529b1-23db-4996-948a-042f04998e91)
|
|
58
|
+
DRS_EXT_ADAM = 0x00000001
|
|
59
|
+
DRS_EXT_LH_BETA2 = 0x00000002
|
|
60
|
+
DRS_EXT_RECYCLE_BIN = 0x00000004
|
|
61
|
+
# DRS_EXT_GETCHGREPLY_V9 = 0x00000100 (already defined)
|
|
62
|
+
DRS_EXT_RPC_CORRELATIONID_1 = 0x00000400
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# [5.41 DRS_OPTIONS](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/ac9c8a11-cd46-4080-acbf-9faa86344030)
|
|
66
|
+
DRS_ASYNC_OP = 0x00000001
|
|
67
|
+
DRS_GETCHG_CHECK = 0x00000002
|
|
68
|
+
DRS_UPDATE_NOTIFICATION = 0x00000002
|
|
69
|
+
DRS_ADD_REF = 0x00000004
|
|
70
|
+
DRS_SYNC_ALL = 0x00000008
|
|
71
|
+
DRS_DEL_REF = 0x00000008
|
|
72
|
+
DRS_WRIT_REP = 0x00000010
|
|
73
|
+
DRS_INIT_SYNC = 0x00000020
|
|
74
|
+
DRS_PER_SYNC = 0x00000040
|
|
75
|
+
DRS_MAIL_REP = 0x00000080
|
|
76
|
+
DRS_ASYNC_REP = 0x00000100
|
|
77
|
+
DRS_IGNORE_ERROR = 0x00000100
|
|
78
|
+
DRS_TWOWAY_SYNC = 0x00000200
|
|
79
|
+
DRS_CRITICAL_ONLY = 0x00000400
|
|
80
|
+
DRS_GET_ANC = 0x00000800
|
|
81
|
+
DRS_GET_NC_SIZE = 0x00001000
|
|
82
|
+
DRS_LOCAL_ONLY = 0x00001000
|
|
83
|
+
DRS_NONGC_RO_REP = 0x00002000
|
|
84
|
+
DRS_SYNC_BYNAME = 0x00004000
|
|
85
|
+
DRS_REF_OK = 0x00004000
|
|
86
|
+
DRS_FULL_SYNC_NOW = 0x00008000
|
|
87
|
+
DRS_NO_SOURCE = 0x00008000
|
|
88
|
+
DRS_FULL_SYNC_IN_PROGRESS = 0x00010000
|
|
89
|
+
DRS_FULL_SYNC_PACKET = 0x00020000
|
|
90
|
+
DRS_SYNC_REQUEUE = 0x00040000
|
|
91
|
+
DRS_SYNC_URGENT = 0x00080000
|
|
92
|
+
DRS_REF_GCSPN = 0x00100000
|
|
93
|
+
DRS_NO_DISCARD = 0x00100000
|
|
94
|
+
DRS_NEVER_SYNCED = 0x00200000
|
|
95
|
+
DRS_SPECIAL_SECRET_PROCESSING = 0x00400000
|
|
96
|
+
DRS_INIT_SYNC_NOW = 0x00800000
|
|
97
|
+
DRS_PREEMPTED = 0x01000000
|
|
98
|
+
DRS_SYNC_FORCED = 0x02000000
|
|
99
|
+
DRS_DISABLE_AUTO_SYNC = 0x04000000
|
|
100
|
+
DRS_DISABLE_PERIODIC_SYNC = 0x08000000
|
|
101
|
+
DRS_USE_COMPRESSION = 0x10000000
|
|
102
|
+
DRS_NEVER_NOTIFY = 0x20000000
|
|
103
|
+
DRS_SYNC_PAS = 0x40000000
|
|
104
|
+
DRS_GET_ALL_GROUP_MEMBERSHIP = 0x80000000
|
|
105
|
+
|
|
106
|
+
# [4.1.10.2.22 EXOP_REQ Codes](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/05de65ee-af0d-46d1-a9c8-4f0f856031cb)
|
|
107
|
+
EXOP_FSMO_REQ_ROLE = 0x00000001
|
|
108
|
+
EXOP_FSMO_REQ_RID_ALLOC = 0x00000002
|
|
109
|
+
EXOP_FSMO_RID_REQ_ROLE = 0x00000003
|
|
110
|
+
EXOP_FSMO_REQ_PDC = 0x00000004
|
|
111
|
+
EXOP_FSMO_ABANDON_ROLE = 0x00000005
|
|
112
|
+
EXOP_REPL_OBJ = 0x00000006
|
|
113
|
+
EXOP_REPL_SECRETS = 0x00000007
|
|
114
|
+
|
|
115
|
+
# Enumeration for identifying a compression algorithm.
|
|
116
|
+
# [4.1.10.2.18 DRS_COMP_ALG_TYPE](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/bb303730-0667-49f0-b117-288404c4b4cb)
|
|
117
|
+
DRS_COMP_ALG_NONE = 0,
|
|
118
|
+
DRS_COMP_ALG_UNUSED = 1,
|
|
119
|
+
DRS_COMP_ALG_MSZIP = 2,
|
|
120
|
+
DRS_COMP_ALG_WIN2K3 = 3
|
|
121
|
+
|
|
122
|
+
# [4.1.10.2.21 EXOP_ERR Codes](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/bb303730-0667-49f0-b117-288404c4b4cb)
|
|
123
|
+
EXOP_ERR_SUCCESS = 0x00000001
|
|
124
|
+
EXOP_ERR_UNKNOWN_OP = 0x00000002
|
|
125
|
+
EXOP_ERR_FSMO_NOT_OWNER = 0x00000003
|
|
126
|
+
EXOP_ERR_UPDATE_ERR = 0x00000004
|
|
127
|
+
EXOP_ERR_EXCEPTION = 0x00000005
|
|
128
|
+
EXOP_ERR_UNKNOWN_CALLER = 0x00000006
|
|
129
|
+
EXOP_ERR_RID_ALLOC = 0x00000007
|
|
130
|
+
EXOP_ERR_FSMO_OWNER_DELETED = 0x00000008
|
|
131
|
+
EXOP_ERR_FSMO_PENDING_OP = 0x00000009
|
|
132
|
+
EXOP_ERR_MISMATCH = 0x0000000A
|
|
133
|
+
EXOP_ERR_COULDNT_CONTACT = 0x0000000B
|
|
134
|
+
EXOP_ERR_FSMO_REFUSING_ROLES = 0x0000000C
|
|
135
|
+
EXOP_ERR_DIR_ERROR = 0x0000000D
|
|
136
|
+
EXOP_ERR_FSMO_MISSING_SETTINGS = 0x0000000E
|
|
137
|
+
EXOP_ERR_ACCESS_DENIED = 0x0000000F
|
|
138
|
+
EXOP_ERR_PARAM_ERROR = 0x00000010
|
|
139
|
+
|
|
140
|
+
# DRS_MSG_CRACKREQ_V1 dwFlags
|
|
141
|
+
# [4.1.4.1.2 DRS_MSG_CRACKREQ_V1](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/b47debc0-59ee-40e4-ad0f-4bc9f96043b2)
|
|
142
|
+
DS_NAME_FLAG_GCVERIFY = 0x00000004
|
|
143
|
+
DS_NAME_FLAG_TRUST_REFERRAL = 0x00000008
|
|
144
|
+
DS_NAME_FLAG_PRIVATE_RESOLVE_FPOS = 0x80000000
|
|
145
|
+
|
|
146
|
+
# [4.1.4.1.3 DS_NAME_FORMAT](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/73c73cf2-0824-4d65-97f4-f56244f3e8a6)
|
|
147
|
+
DS_UNKNOWN_NAME = 0x00000000,
|
|
148
|
+
DS_FQDN_1779_NAME = 0x00000001,
|
|
149
|
+
DS_NT4_ACCOUNT_NAME = 0x00000002,
|
|
150
|
+
DS_DISPLAY_NAME = 0x00000003,
|
|
151
|
+
DS_UNIQUE_ID_NAME = 0x00000006,
|
|
152
|
+
DS_CANONICAL_NAME = 0x00000007,
|
|
153
|
+
DS_USER_PRINCIPAL_NAME = 0x00000008,
|
|
154
|
+
DS_CANONICAL_NAME_EX = 0x00000009,
|
|
155
|
+
DS_SERVICE_PRINCIPAL_NAME = 0x0000000A,
|
|
156
|
+
DS_SID_OR_SID_HISTORY_NAME = 0x0000000B,
|
|
157
|
+
DS_DNS_DOMAIN_NAME = 0x0000000C
|
|
158
|
+
|
|
159
|
+
# formatOffered: DS_NAME_FORMAT flags, plus these flags
|
|
160
|
+
DS_LIST_SITES = 0xFFFFFFFF
|
|
161
|
+
DS_LIST_SERVERS_IN_SITE = 0xFFFFFFFE
|
|
162
|
+
DS_LIST_DOMAINS_IN_SITE = 0xFFFFFFFD
|
|
163
|
+
DS_LIST_SERVERS_FOR_DOMAIN_IN_SITE = 0xFFFFFFFC
|
|
164
|
+
DS_LIST_INFO_FOR_SERVER = 0xFFFFFFFB
|
|
165
|
+
DS_LIST_ROLES = 0xFFFFFFFA
|
|
166
|
+
DS_NT4_ACCOUNT_NAME_SANS_DOMAIN = 0xFFFFFFF9
|
|
167
|
+
DS_MAP_SCHEMA_GUID = 0xFFFFFFF8
|
|
168
|
+
DS_LIST_DOMAINS = 0xFFFFFFF7
|
|
169
|
+
DS_LIST_NCS = 0xFFFFFFF6
|
|
170
|
+
DS_ALT_SECURITY_IDENTITIES_NAME = 0xFFFFFFF5
|
|
171
|
+
DS_STRING_SID_NAME = 0xFFFFFFF4
|
|
172
|
+
DS_LIST_SERVERS_WITH_DCS_IN_SITE = 0xFFFFFFF3
|
|
173
|
+
DS_LIST_GLOBAL_CATALOG_SERVERS = 0xFFFFFFF1
|
|
174
|
+
DS_NT4_ACCOUNT_NAME_SANS_DOMAIN_EX = 0xFFFFFFF0
|
|
175
|
+
DS_USER_PRINCIPAL_NAME_AND_ALTSECID = 0xFFFFFFEF
|
|
176
|
+
|
|
177
|
+
# formatDesired: DS_NAME_FORMAT flags, plus these flags
|
|
178
|
+
DS_USER_PRINCIPAL_NAME_FOR_LOGON = 0xFFFFFFF2
|
|
179
|
+
# DS_STRING_SID_NAME = 0xFFFFFFF4 (already defined)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
ATTRTYP_TO_ATTID = {
|
|
184
|
+
'userPrincipalName' => '1.2.840.113556.1.4.656',
|
|
185
|
+
'sAMAccountName' => '1.2.840.113556.1.4.221',
|
|
186
|
+
'unicodePwd' => '1.2.840.113556.1.4.90',
|
|
187
|
+
'dBCSPwd' => '1.2.840.113556.1.4.55',
|
|
188
|
+
'ntPwdHistory' => '1.2.840.113556.1.4.94',
|
|
189
|
+
'lmPwdHistory' => '1.2.840.113556.1.4.160',
|
|
190
|
+
'supplementalCredentials' => '1.2.840.113556.1.4.125',
|
|
191
|
+
'objectSid' => '1.2.840.113556.1.4.146',
|
|
192
|
+
'pwdLastSet' => '1.2.840.113556.1.4.96',
|
|
193
|
+
'userAccountControl' => '1.2.840.113556.1.4.8',
|
|
194
|
+
'accountExpires' => '1.2.840.113556.1.4.159',
|
|
195
|
+
'lastLogonTimestamp' => '1.2.840.113556.1.4.1696'
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
class DrsHandle < Ndr::NdrContextHandle; end
|
|
199
|
+
|
|
200
|
+
class DrsConfStringz16 < Ndr::NdrConfArray
|
|
201
|
+
extend Ndr::ArrayClassPlugin
|
|
202
|
+
default_parameters type: :ndr_wide_char
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# [5.50 DSNAME](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/385d478f-3eb6-4d2c-ac58-f25c4debdd86)
|
|
206
|
+
class DsName < Ndr::NdrStruct
|
|
207
|
+
default_parameter byte_align: 4
|
|
208
|
+
endian :little
|
|
209
|
+
|
|
210
|
+
# We don't want to include ref_id (4 bytes) if it is a pointer
|
|
211
|
+
ndr_uint32 :struct_len, initial_value: -> { @obj.parent.respond_to?(:ref_id) ? num_bytes - 4 : num_bytes }
|
|
212
|
+
ndr_uint32 :sid_len
|
|
213
|
+
uuid :guid
|
|
214
|
+
string :sid, byte_align: 1, length: 28
|
|
215
|
+
ndr_uint32 :name_len, initial_value: -> { string_name.max_count - 1 }
|
|
216
|
+
drs_conf_stringz16 :string_name
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
class DsNamePtr < DsName
|
|
220
|
+
default_parameters referent_byte_align: 4
|
|
221
|
+
extend Ndr::PointerClassPlugin
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
# [5.209 USN](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/1be1e991-a2db-4f91-9953-8eab69f60e64)
|
|
225
|
+
class Usn < BinData::Int64le
|
|
226
|
+
default_parameter byte_align: 8
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# [5.210 USN_VECTOR](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/595d11b8-6ca7-4a61-bd56-3e6a2b99b76b)
|
|
230
|
+
class UsnVector < Ndr::NdrStruct
|
|
231
|
+
default_parameter byte_align: 8
|
|
232
|
+
|
|
233
|
+
usn :usn_high_obj_update
|
|
234
|
+
usn :usn_reserved
|
|
235
|
+
usn :usn_high_prop_update
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
# [5.202 UPTODATE_CURSOR_V1](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/cf88f341-fb49-4cd5-b7e2-6920cbd91f1b)
|
|
239
|
+
class UptodateCursorV1 < Ndr::NdrStruct
|
|
240
|
+
default_parameter byte_align: 8
|
|
241
|
+
|
|
242
|
+
uuid :uuid_dsa
|
|
243
|
+
usn :usn_high_prop_update
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
# [5.204 UPTODATE_VECTOR_V1_EXT](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/462b424a-b50a-4c4a-a81f-48d0f4cf40fe)
|
|
247
|
+
class UptodateVectorV1Ext < Ndr::NdrStruct
|
|
248
|
+
default_parameter byte_align: 8
|
|
249
|
+
|
|
250
|
+
ndr_uint32 :dw_version
|
|
251
|
+
ndr_uint32 :dw_reserved1
|
|
252
|
+
ndr_uint32 :c_num_cursors
|
|
253
|
+
ndr_uint32 :dw_reserved2
|
|
254
|
+
ndr_conf_array :rg_cursors, type: :uptodate_cursor_v1
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
class UptodateVectorV1ExtPtr < UptodateVectorV1Ext
|
|
258
|
+
default_parameters referent_byte_align: 8
|
|
259
|
+
extend Ndr::PointerClassPlugin
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
module AttrtypRequestPlugin
|
|
263
|
+
# [5.16.4 ATTRTYP-to-OID Conversion](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/6f53317f-2263-48ee-86c1-4580bf97232c)
|
|
264
|
+
def add_attrtyp_from_oid(oid, to_field: :p_partial_attr_set)
|
|
265
|
+
last_value = oid.split('.').last.to_i
|
|
266
|
+
binary_oid = OpenSSL::ASN1::ObjectId.new(oid).to_der[2..-1]
|
|
267
|
+
if last_value < 128
|
|
268
|
+
oid_prefix = binary_oid[0...-1].bytes
|
|
269
|
+
else
|
|
270
|
+
oid_prefix = binary_oid[0...-2].bytes
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
prefix_table = self.prefix_table_dest.p_prefix_entry
|
|
274
|
+
prefix_table.instantiate_referent if prefix_table.is_null_ptr?
|
|
275
|
+
pos = prefix_table.size
|
|
276
|
+
index = prefix_table.to_ary.index { |e| e.prefix.elements == oid_prefix }
|
|
277
|
+
if index
|
|
278
|
+
pos = index
|
|
279
|
+
else
|
|
280
|
+
entry = PrefixTableEntry.new(ndx: pos)
|
|
281
|
+
entry.prefix.elements = oid_prefix
|
|
282
|
+
prefix_table << entry
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
lower_word = last_value % 0x4000
|
|
286
|
+
# mark it so that it is known to not be the whole lastValue
|
|
287
|
+
lower_word += 0x8000 if last_value >= 0x4000
|
|
288
|
+
upper_word = pos
|
|
289
|
+
attrtyp = (upper_word << 16) + lower_word
|
|
290
|
+
attr_set_field = send(to_field)
|
|
291
|
+
attr_set_field.instantiate_referent if attr_set_field.is_null_ptr?
|
|
292
|
+
attr_set_field.rg_partial_attr << attrtyp
|
|
293
|
+
end
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
module AttrtypResponsePlugin
|
|
297
|
+
# [5.16.4 ATTRTYP-to-OID Conversion](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/6f53317f-2263-48ee-86c1-4580bf97232c)
|
|
298
|
+
def oid_from_attid(attr_typ)
|
|
299
|
+
upper_word = attr_typ / 0x10000
|
|
300
|
+
lower_word = attr_typ % 0x10000
|
|
301
|
+
prefix_table = self.prefix_table_src.p_prefix_entry
|
|
302
|
+
binary_oid = nil
|
|
303
|
+
prefix_table.each do |prefix_table_entry|
|
|
304
|
+
if prefix_table_entry.ndx == upper_word
|
|
305
|
+
binary_oid = prefix_table_entry.prefix.elements.to_ary.pack('C*')
|
|
306
|
+
if lower_word < 128
|
|
307
|
+
binary_oid << [lower_word].pack('C')
|
|
308
|
+
else
|
|
309
|
+
lower_word -= 0x8000 if lower_word >= 0x8000
|
|
310
|
+
binary_oid << [((lower_word / 128) % 128) + 128].pack('C')
|
|
311
|
+
binary_oid << [lower_word % 128].pack('C')
|
|
312
|
+
end
|
|
313
|
+
break
|
|
314
|
+
end
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
return unless binary_oid
|
|
318
|
+
OpenSSL::ASN1.decode("\x06#{[binary_oid.length].pack('C')}#{binary_oid}").value
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
# [5.14 ATTRTYP](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/91173129-08e6-497c-8266-b5ac0aa5f983)
|
|
323
|
+
class Attrtyp < Ndr::NdrUint32; end
|
|
324
|
+
|
|
325
|
+
# [5.146 PARTIAL_ATTR_VECTOR_V1_EXT](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/1d5c1b34-daa4-4761-a8b5-d3c0146a0e30)
|
|
326
|
+
class PartialAttrVectorV1Ext < Ndr::NdrStruct
|
|
327
|
+
default_parameter byte_align: 4
|
|
328
|
+
|
|
329
|
+
ndr_uint32 :dw_version, initial_value: 1
|
|
330
|
+
ndr_uint32 :dw_reserved1
|
|
331
|
+
ndr_uint32 :c_attrs, initial_value: -> { rg_partial_attr.max_count }
|
|
332
|
+
ndr_conf_array :rg_partial_attr, type: :attrtyp
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
class PartialAttrVectorV1ExtPtr < PartialAttrVectorV1Ext
|
|
336
|
+
default_parameters referent_byte_align: 4
|
|
337
|
+
extend Ndr::PointerClassPlugin
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
class DrsByteArrayPtr < Ndr::NdrConfArray
|
|
341
|
+
default_parameters type: :ndr_uint8
|
|
342
|
+
extend Ndr::PointerClassPlugin
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
# [5.143 OID_t](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/cbc2b761-8938-4591-a9f7-2d1512ed7f05)
|
|
346
|
+
class OidT < Ndr::NdrStruct
|
|
347
|
+
default_parameter byte_align: 4
|
|
348
|
+
|
|
349
|
+
ndr_uint32 :oid_length, initial_value: -> { elements.max_count }
|
|
350
|
+
drs_byte_array_ptr :elements
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
# [5.154 PrefixTableEntry](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/d26d36cd-10c4-4b27-a84e-98336abf357a)
|
|
354
|
+
class PrefixTableEntry < Ndr::NdrStruct
|
|
355
|
+
default_parameter byte_align: 4
|
|
356
|
+
|
|
357
|
+
ndr_uint32 :ndx
|
|
358
|
+
oid_t :prefix
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
class PrefixTableEntryArrayPtr < Ndr::NdrConfArray
|
|
362
|
+
default_parameter type: :prefix_table_entry
|
|
363
|
+
extend Ndr::PointerClassPlugin
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
# [5.180 SCHEMA_PREFIX_TABLE](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/9b371267-e8b8-4c69-9979-02dae02e5e38)
|
|
367
|
+
class SchemaPrefixTable < Ndr::NdrStruct
|
|
368
|
+
default_parameter byte_align: 4
|
|
369
|
+
|
|
370
|
+
ndr_uint32 :prefix_count, initial_value: -> { p_prefix_entry.max_count }
|
|
371
|
+
prefix_table_entry_array_ptr :p_prefix_entry
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
class DrsConfStringz < Ndr::NdrConfArray
|
|
375
|
+
extend Ndr::ArrayClassPlugin
|
|
376
|
+
default_parameters type: :ndr_char
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
# [5.132 MTX_ADDR](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/107b7c0e-0f0d-4fe2-8232-14ec3b78f40d)
|
|
380
|
+
class MtxAddr < Ndr::NdrStruct
|
|
381
|
+
default_parameter byte_align: 4
|
|
382
|
+
|
|
383
|
+
ndr_uint32 :mtx_name_len, initial_value: -> { mtx_name.length }
|
|
384
|
+
drs_conf_stringz :mtx_name
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
class MtxAddrPtr < MtxAddr
|
|
388
|
+
default_parameters referent_byte_align: 4
|
|
389
|
+
extend Ndr::PointerClassPlugin
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
# [5.219 VAR_SIZE_BUFFER_WITH_VERSION](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/589574c1-eaa1-456f-ac53-de597b2cff6b)
|
|
393
|
+
class VarSizeBufferWithVersion < Ndr::NdrStruct
|
|
394
|
+
default_parameter byte_align: 8
|
|
395
|
+
|
|
396
|
+
ndr_uint32 :ul_version
|
|
397
|
+
ndr_uint32 :cb_byte_buffer, initial_value: -> { rg_buffer.size }
|
|
398
|
+
ndr_uint64 :ul_padding
|
|
399
|
+
ndr_conf_array :rg_buffer, type: :ndr_uint8
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
class VarSizeBufferWithVersionPtr < VarSizeBufferWithVersion
|
|
403
|
+
default_parameters referent_byte_align: 8
|
|
404
|
+
extend Ndr::PointerClassPlugin
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
# [5.16 ATTRVAL](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/cc002cbf-efe0-42f8-9295-a5a6577263d4)
|
|
408
|
+
class Attrval < Ndr::NdrStruct
|
|
409
|
+
default_parameter byte_align: 4
|
|
410
|
+
|
|
411
|
+
ndr_uint32 :val_len, initial_value: -> { p_val.length }
|
|
412
|
+
drs_byte_array_ptr :p_val
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
class AttrvalArrayPtr < Ndr::NdrConfArray
|
|
416
|
+
default_parameters type: :attrval
|
|
417
|
+
extend Ndr::PointerClassPlugin
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
# [5.17 ATTRVALBLOCK](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/b526370f-dfe5-4e85-9041-90d07bc16ff5)
|
|
421
|
+
class Attrvalblock < Ndr::NdrStruct
|
|
422
|
+
default_parameter byte_align: 4
|
|
423
|
+
|
|
424
|
+
ndr_uint32 :val_count, initial_value: -> { p_aval.length }
|
|
425
|
+
attrval_array_ptr :p_aval
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
# [5.9 ATTR](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/a2db41e2-7803-4d3c-a499-0fee92b1c149)
|
|
429
|
+
class Attr < Ndr::NdrStruct
|
|
430
|
+
default_parameter byte_align: 4
|
|
431
|
+
|
|
432
|
+
attrtyp :attr_typ
|
|
433
|
+
attrvalblock :attr_val
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
class AttrArrayPtr < Ndr::NdrConfArray
|
|
437
|
+
default_parameters type: :attr
|
|
438
|
+
extend Ndr::PointerClassPlugin
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
# [5.10 ATTRBLOCK](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/f81324b8-6400-41b5-bc25-5117589c602a)
|
|
442
|
+
class Attrblock < Ndr::NdrStruct
|
|
443
|
+
default_parameter byte_align: 4
|
|
444
|
+
|
|
445
|
+
ndr_uint32 :attr_count, initial_value: -> { p_attr.length }
|
|
446
|
+
attr_array_ptr :p_attr
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
# [5.53 ENTINF](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/6d69822e-adb6-4977-8553-c2d529c17e5b)
|
|
450
|
+
class Entinf < Ndr::NdrStruct
|
|
451
|
+
default_parameter byte_align: 4
|
|
452
|
+
|
|
453
|
+
ds_name_ptr :p_name
|
|
454
|
+
ndr_uint32 :ul_flags
|
|
455
|
+
attrblock :attr_block
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
# [5.51 DSTIME](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/a72a16b9-73e4-41ca-a5c1-afc5fc54e175)
|
|
459
|
+
class Dstime < BinData::Int64le
|
|
460
|
+
default_parameter byte_align: 8
|
|
461
|
+
end
|
|
462
|
+
|
|
463
|
+
# [5.155 PROPERTY_META_DATA_EXT](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/aef7ebde-c305-4224-95fd-585c86b19c38)
|
|
464
|
+
class PropertyMetaDataExt < Ndr::NdrStruct
|
|
465
|
+
default_parameter byte_align: 8
|
|
466
|
+
|
|
467
|
+
ndr_uint32 :dw_version
|
|
468
|
+
dstime :time_changed
|
|
469
|
+
uuid :uuid_dsa_originating
|
|
470
|
+
usn :usn_originating
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
# [5.156 PROPERTY_META_DATA_EXT_VECTOR](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/22bccd51-1e7d-4502-aef8-b84da983f94f)
|
|
474
|
+
class PropertyMetaDataExtVector < Ndr::NdrStruct
|
|
475
|
+
default_parameter byte_align: 8
|
|
476
|
+
|
|
477
|
+
ndr_uint32 :c_num_props, initial_value: -> { rg_meta_data.size }
|
|
478
|
+
ndr_conf_array :rg_meta_data, type: :property_meta_data_ext
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
class PropertyMetaDataExtVectorPtr < PropertyMetaDataExtVector
|
|
482
|
+
default_parameters referent_byte_align: 8
|
|
483
|
+
extend Ndr::PointerClassPlugin
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
# [5.162 REPLENTINFLIST](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/c38b0412-cf00-4b0c-b4f4-4662a4484a00)
|
|
487
|
+
class ReplentinflistPtr < Ndr::NdrStruct
|
|
488
|
+
default_parameters byte_align: 4, referent_byte_align: 4
|
|
489
|
+
extend Ndr::PointerClassPlugin
|
|
490
|
+
|
|
491
|
+
replentinflist_ptr :p_next_ent_inf
|
|
492
|
+
entinf :entinf
|
|
493
|
+
ndr_boolean :f_is_nc_prefix
|
|
494
|
+
uuid_ptr :p_parent_guid
|
|
495
|
+
property_meta_data_ext_vector_ptr :p_meta_data_ext
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
# [4.1.10.2.19 DRS_COMPRESSED_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/6d3e7f57-3ef8-46e0-a6ad-e9331f297957)
|
|
499
|
+
class DrsCompressedBlob < Ndr::NdrStruct
|
|
500
|
+
default_parameter byte_align: 4
|
|
501
|
+
|
|
502
|
+
ndr_uint32 :cb_uncompressed_size
|
|
503
|
+
ndr_uint32 :cb_compressed_size
|
|
504
|
+
ndr_conf_array :pb_compressed_data, type: :ndr_uint8
|
|
505
|
+
end
|
|
506
|
+
|
|
507
|
+
# [5.215 VALUE_META_DATA_EXT_V1](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/7530cf2e-a2ad-4716-a570-8383f8b1846f)
|
|
508
|
+
class ValueMetaDataExtV1 < Ndr::NdrStruct
|
|
509
|
+
default_parameter byte_align: 8
|
|
510
|
+
|
|
511
|
+
dstime :time_created
|
|
512
|
+
property_meta_data_ext :meta_data
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
# [5.167 REPLVALINF_V1](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/22946fbf-170e-4ab4-82c7-dabdfd97bf5a)
|
|
516
|
+
class ReplvalinfV1 < Ndr::NdrStruct
|
|
517
|
+
default_parameter byte_align: 8
|
|
518
|
+
|
|
519
|
+
ds_name_ptr :p_object
|
|
520
|
+
attrtyp :attr_typ
|
|
521
|
+
attrval :aval
|
|
522
|
+
ndr_boolean :f_is_present
|
|
523
|
+
value_meta_data_ext_v1 :meta_data
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
class ReplvalinfV1ArrayPtr < Ndr::NdrConfArray
|
|
527
|
+
default_parameters type: :replvalinf_v1
|
|
528
|
+
extend Ndr::PointerClassPlugin
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
# [4.1.10.2.18 DRS_COMP_ALG_TYPE](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/bb303730-0667-49f0-b117-288404c4b4cb)
|
|
532
|
+
class DrsCompAlgType < Ndr::NdrUint32; end
|
|
533
|
+
|
|
534
|
+
# [5.216 VALUE_META_DATA_EXT_V3](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/eab72899-a828-427d-8384-9a51ffdb77e1)
|
|
535
|
+
class ValueMetaDataExtV3 < Ndr::NdrStruct
|
|
536
|
+
default_parameter byte_align: 8
|
|
537
|
+
|
|
538
|
+
dstime :time_created
|
|
539
|
+
property_meta_data_ext :meta_data
|
|
540
|
+
ndr_uint32 :unused1
|
|
541
|
+
ndr_uint32 :unused2
|
|
542
|
+
ndr_uint32 :unused3
|
|
543
|
+
dstime :time_expired
|
|
544
|
+
end
|
|
545
|
+
|
|
546
|
+
# [5.168 REPLVALINF_V3](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/9c15369b-b7d2-437a-b73d-66a92c367795)
|
|
547
|
+
class ReplvalinfV3 < Ndr::NdrStruct
|
|
548
|
+
default_parameter byte_align: 8
|
|
549
|
+
|
|
550
|
+
ds_name_ptr :p_object
|
|
551
|
+
attrtyp :attr_typ
|
|
552
|
+
attrval :aval
|
|
553
|
+
ndr_boolean :f_is_present
|
|
554
|
+
value_meta_data_ext_v3 :meta_data
|
|
555
|
+
end
|
|
556
|
+
|
|
557
|
+
class ReplvalinfV3ArrayPtr < Ndr::NdrConfArray
|
|
558
|
+
default_parameters type: :replvalinf_v3
|
|
559
|
+
extend Ndr::PointerClassPlugin
|
|
560
|
+
end
|
|
561
|
+
|
|
562
|
+
# [5.203 UPTODATE_CURSOR_V2](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/d3e30021-b6ac-413e-b08a-b69b9b0c6592)
|
|
563
|
+
class UptodateCursorV2 < Ndr::NdrStruct
|
|
564
|
+
default_parameter byte_align: 8
|
|
565
|
+
|
|
566
|
+
uuid :uuid_dsa
|
|
567
|
+
usn :usn_high_prop_update
|
|
568
|
+
dstime :time_last_sync_success
|
|
569
|
+
end
|
|
570
|
+
|
|
571
|
+
#[5.205 UPTODATE_VECTOR_V2_EXT](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/cebd1ccb-891b-4268-b056-4b714cdf981e)
|
|
572
|
+
class UptodateVectorV2Ext < Ndr::NdrStruct
|
|
573
|
+
default_parameter byte_align: 8
|
|
574
|
+
|
|
575
|
+
ndr_uint32 :dw_version
|
|
576
|
+
ndr_uint32 :dw_reserved1
|
|
577
|
+
ndr_uint32 :c_num_cursors
|
|
578
|
+
ndr_uint32 :dw_reserved2
|
|
579
|
+
ndr_conf_array :rg_cursors, type: :uptodate_cursor_v2
|
|
580
|
+
end
|
|
581
|
+
|
|
582
|
+
class UptodateVectorV2ExtPtr < UptodateVectorV2Ext
|
|
583
|
+
default_parameters referent_byte_align: 8
|
|
584
|
+
extend Ndr::PointerClassPlugin
|
|
585
|
+
end
|
|
586
|
+
|
|
587
|
+
|
|
588
|
+
require 'ruby_smb/dcerpc/drsr/drs_extensions'
|
|
589
|
+
require 'ruby_smb/dcerpc/drsr/drs_bind_request'
|
|
590
|
+
require 'ruby_smb/dcerpc/drsr/drs_bind_response'
|
|
591
|
+
require 'ruby_smb/dcerpc/drsr/drs_unbind_request'
|
|
592
|
+
require 'ruby_smb/dcerpc/drsr/drs_unbind_response'
|
|
593
|
+
require 'ruby_smb/dcerpc/drsr/drs_domain_controller_info_request'
|
|
594
|
+
require 'ruby_smb/dcerpc/drsr/drs_domain_controller_info_response'
|
|
595
|
+
require 'ruby_smb/dcerpc/drsr/drs_crack_names_request'
|
|
596
|
+
require 'ruby_smb/dcerpc/drsr/drs_crack_names_response'
|
|
597
|
+
require 'ruby_smb/dcerpc/drsr/drs_get_nc_changes_request'
|
|
598
|
+
require 'ruby_smb/dcerpc/drsr/drs_get_nc_changes_response'
|
|
599
|
+
|
|
600
|
+
|
|
601
|
+
# Creates a context handle that is necessary to call any other method in this interface
|
|
602
|
+
#
|
|
603
|
+
# @return [RubySMB::Dcerpc::Drsr::DrsHandle] Context handle
|
|
604
|
+
# @raise [RubySMB::Dcerpc::Error::InvalidPacket] if the response is not a
|
|
605
|
+
# DrsBind packet
|
|
606
|
+
# @raise [RubySMB::Dcerpc::Error::SamrError] if the response error status
|
|
607
|
+
# is not STATUS_SUCCESS
|
|
608
|
+
def drs_bind
|
|
609
|
+
drs_extensions_int = DrsExtensionsInt.new(
|
|
610
|
+
dw_flags: DRS_EXT_GETCHGREQ_V6 | DRS_EXT_GETCHGREPLY_V6 | DRS_EXT_GETCHGREQ_V8 | DRS_EXT_STRONG_ENCRYPTION,
|
|
611
|
+
dw_ext_caps: 0xFFFFFFFF
|
|
612
|
+
)
|
|
613
|
+
drs_bind_request = DrsBindRequest.new(pext_client: drs_extensions_int)
|
|
614
|
+
response = dcerpc_request(
|
|
615
|
+
drs_bind_request,
|
|
616
|
+
auth_level: RubySMB::Dcerpc::RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
|
|
617
|
+
auth_type: RubySMB::Dcerpc::RPC_C_AUTHN_WINNT
|
|
618
|
+
)
|
|
619
|
+
begin
|
|
620
|
+
drs_bind_response = DrsBindResponse.read(response)
|
|
621
|
+
rescue IOError
|
|
622
|
+
raise RubySMB::Dcerpc::Error::InvalidPacket, 'Error reading DrsBindResponse'
|
|
623
|
+
end
|
|
624
|
+
unless drs_bind_response.error_status == WindowsError::NTStatus::STATUS_SUCCESS
|
|
625
|
+
raise RubySMB::Dcerpc::Error::DrsrError,
|
|
626
|
+
"Error returned with drs_bind: "\
|
|
627
|
+
"#{WindowsError::NTStatus.find_by_retval(drs_bind_response.error_status.value).join(',')}"
|
|
628
|
+
end
|
|
629
|
+
|
|
630
|
+
ppext_server = drs_bind_response.ppext_server
|
|
631
|
+
raw_drs_extensions_int = ppext_server.cb.to_binary_s + ppext_server.rgb.to_binary_s
|
|
632
|
+
drs_extensions_int_response = DrsExtensionsInt.new
|
|
633
|
+
# If dwExtCaps is not included, just add zeros to parse it correctly
|
|
634
|
+
raw_drs_extensions_int << "\x00".b * (drs_extensions_int.num_bytes - ppext_server.cb)
|
|
635
|
+
drs_extensions_int_response.read(raw_drs_extensions_int)
|
|
636
|
+
|
|
637
|
+
unless drs_extensions_int_response.dw_repl_epoch == 0
|
|
638
|
+
# Different epoch, we have to call DRSBind again
|
|
639
|
+
drs_extensions_int.dw_repl_epoch = drs_extensions_int_response.dw_repl_epoch
|
|
640
|
+
drs_bind_request.pext_client.assign(drs_extensions_int)
|
|
641
|
+
response = dcerpc_request(
|
|
642
|
+
drs_bind_request,
|
|
643
|
+
auth_level: RubySMB::Dcerpc::RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
|
|
644
|
+
auth_type: RubySMB::Dcerpc::RPC_C_AUTHN_WINNT
|
|
645
|
+
)
|
|
646
|
+
begin
|
|
647
|
+
drs_bind_response = DrsBindResponse.read(response)
|
|
648
|
+
rescue IOError
|
|
649
|
+
raise RubySMB::Dcerpc::Error::InvalidPacket, 'Error reading DrsBindResponse'
|
|
650
|
+
end
|
|
651
|
+
unless drs_bind_response.error_status == WindowsError::NTStatus::STATUS_SUCCESS
|
|
652
|
+
raise RubySMB::Dcerpc::Error::DrsrError,
|
|
653
|
+
"Error returned with drs_bind: "\
|
|
654
|
+
"#{WindowsError::NTStatus.find_by_retval(drs_bind_response.error_status.value).join(',')}"
|
|
655
|
+
end
|
|
656
|
+
end
|
|
657
|
+
|
|
658
|
+
drs_bind_response.ph_drs
|
|
659
|
+
end
|
|
660
|
+
|
|
661
|
+
# Destroys a context handle previously created by the #drs_bind method
|
|
662
|
+
#
|
|
663
|
+
# @raise [RubySMB::Dcerpc::Error::InvalidPacket] if the response is not a
|
|
664
|
+
# DrsUnbind packet
|
|
665
|
+
# @raise [RubySMB::Dcerpc::Error::SamrError] if the response error status
|
|
666
|
+
# is not STATUS_SUCCESS
|
|
667
|
+
def drs_unbind(ph_drs)
|
|
668
|
+
drs_unbind_request = DrsUnbindRequest.new(ph_drs: ph_drs)
|
|
669
|
+
response = dcerpc_request(
|
|
670
|
+
drs_unbind_request,
|
|
671
|
+
auth_level: RubySMB::Dcerpc::RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
|
|
672
|
+
auth_type: RubySMB::Dcerpc::RPC_C_AUTHN_WINNT
|
|
673
|
+
)
|
|
674
|
+
begin
|
|
675
|
+
drs_unbind_response = DrsUnbindResponse.read(response)
|
|
676
|
+
rescue IOError
|
|
677
|
+
raise RubySMB::Dcerpc::Error::InvalidPacket, 'Error reading DrsUnbindResponse'
|
|
678
|
+
end
|
|
679
|
+
unless drs_unbind_response.error_status == WindowsError::NTStatus::STATUS_SUCCESS
|
|
680
|
+
raise RubySMB::Dcerpc::Error::DrsrError,
|
|
681
|
+
"Error returned with drs_unbind: "\
|
|
682
|
+
"#{WindowsError::NTStatus.find_by_retval(drs_unbind_response.error_status.value).join(',')}"
|
|
683
|
+
end
|
|
684
|
+
|
|
685
|
+
nil
|
|
686
|
+
end
|
|
687
|
+
|
|
688
|
+
# Retrieves information about DCs in a given domain
|
|
689
|
+
#
|
|
690
|
+
# @param h_drs [RubySMB::Dcerpc::Drsr::DrsHandle] Context handle
|
|
691
|
+
# previously created by the #drs_bind method
|
|
692
|
+
# @param domain [String] Domain name
|
|
693
|
+
# @return [Array<RubySMB::Dcerpc::Drsr::DsDomainControllerInfo1wPtr>]
|
|
694
|
+
# Array of DsDomainControllerInfo1wPtr containing information about DCs
|
|
695
|
+
# @raise [RubySMB::Dcerpc::Error::InvalidPacket] if the response is not a
|
|
696
|
+
# DrsDomainControllerInfo packet
|
|
697
|
+
# @raise [RubySMB::Dcerpc::Error::SamrError] if the response error status
|
|
698
|
+
# is not STATUS_SUCCESS
|
|
699
|
+
def drs_domain_controller_info(h_drs, domain)
|
|
700
|
+
drs_domain_controller_info_request = DrsDomainControllerInfoRequest.new(
|
|
701
|
+
h_drs: h_drs,
|
|
702
|
+
pmsg_in: {
|
|
703
|
+
switch_type: 1,
|
|
704
|
+
msg_dcinfo: {
|
|
705
|
+
domain: domain,
|
|
706
|
+
info_level: 2
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
)
|
|
710
|
+
response = dcerpc_request(
|
|
711
|
+
drs_domain_controller_info_request,
|
|
712
|
+
auth_level: RubySMB::Dcerpc::RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
|
|
713
|
+
auth_type: RubySMB::Dcerpc::RPC_C_AUTHN_WINNT
|
|
714
|
+
)
|
|
715
|
+
begin
|
|
716
|
+
drs_domain_controller_info_response = DrsDomainControllerInfoResponse.read(response)
|
|
717
|
+
rescue IOError
|
|
718
|
+
raise RubySMB::Dcerpc::Error::InvalidPacket, 'Error reading DrsDomainControllerInfoResponse'
|
|
719
|
+
end
|
|
720
|
+
unless drs_domain_controller_info_response.error_status == WindowsError::NTStatus::STATUS_SUCCESS
|
|
721
|
+
raise RubySMB::Dcerpc::Error::DrsrError,
|
|
722
|
+
"Error returned with drs_domain_controller_info: "\
|
|
723
|
+
"#{WindowsError::NTStatus.find_by_retval(drs_domain_controller_info_response.error_status.value).join(',')}"
|
|
724
|
+
end
|
|
725
|
+
|
|
726
|
+
drs_domain_controller_info_response.pmsg_out.msg_dcinfo.r_items.to_ary
|
|
727
|
+
end
|
|
728
|
+
|
|
729
|
+
# Looks up each of a set of objects in the directory and returns it to
|
|
730
|
+
# the caller in the requested format
|
|
731
|
+
#
|
|
732
|
+
# @param h_drs [RubySMB::Dcerpc::Drsr::DrsHandle] Context handle
|
|
733
|
+
# previously created by the #drs_bind method
|
|
734
|
+
# @param flags [Integer] Flags (see `DRS_MSG_CRACKREQ_V1 dwFlags` in this
|
|
735
|
+
# file)
|
|
736
|
+
# @param format_offered [Integer] The format of the names in rp_names
|
|
737
|
+
# (see DS_NAME_FORMAT constants in this file )
|
|
738
|
+
# @param format_desired [Integer] The format of the names returned
|
|
739
|
+
# (see DS_NAME_FORMAT constants in this file )
|
|
740
|
+
# @param rp_names [Array<String>] Input names to translate
|
|
741
|
+
# @return [Array<RubySMB::Dcerpc::Drsr::DsNameResultItemwPtr>]
|
|
742
|
+
# Array of DsNameResultItemwPtr containing the translated names
|
|
743
|
+
# @raise [RubySMB::Dcerpc::Error::InvalidPacket] if the response is not a
|
|
744
|
+
# DrsCrackNames packet
|
|
745
|
+
# @raise [RubySMB::Dcerpc::Error::SamrError] if the response error status
|
|
746
|
+
# is not STATUS_SUCCESS
|
|
747
|
+
def drs_crack_names(h_drs, flags: 0, format_offered: DS_SID_OR_SID_HISTORY_NAME, format_desired: DS_UNIQUE_ID_NAME, rp_names: [])
|
|
748
|
+
drs_crack_names_request = DrsCrackNamesRequest.new(
|
|
749
|
+
h_drs: h_drs,
|
|
750
|
+
pmsg_in: {
|
|
751
|
+
switch_type: 1,
|
|
752
|
+
msg_crack: {
|
|
753
|
+
dw_flags: flags,
|
|
754
|
+
format_offered: format_offered,
|
|
755
|
+
format_desired: format_desired,
|
|
756
|
+
rp_names: rp_names
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
)
|
|
760
|
+
response = dcerpc_request(
|
|
761
|
+
drs_crack_names_request,
|
|
762
|
+
auth_level: RubySMB::Dcerpc::RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
|
|
763
|
+
auth_type: RubySMB::Dcerpc::RPC_C_AUTHN_WINNT
|
|
764
|
+
)
|
|
765
|
+
begin
|
|
766
|
+
drs_crack_names_response = DrsCrackNamesResponse.read(response)
|
|
767
|
+
rescue IOError
|
|
768
|
+
raise RubySMB::Dcerpc::Error::InvalidPacket, 'Error reading DrsCrackNamesResponse'
|
|
769
|
+
end
|
|
770
|
+
unless drs_crack_names_response.error_status == WindowsError::NTStatus::STATUS_SUCCESS
|
|
771
|
+
raise RubySMB::Dcerpc::Error::DrsrError,
|
|
772
|
+
"Error returned with drs_crack_names: "\
|
|
773
|
+
"#{WindowsError::NTStatus.find_by_retval(drs_crack_names_response.error_status.value).join(',')}"
|
|
774
|
+
end
|
|
775
|
+
|
|
776
|
+
drs_crack_names_response.pmsg_out.msg_crack.p_result.r_items.to_ary
|
|
777
|
+
end
|
|
778
|
+
|
|
779
|
+
# [4.1.10.2.20 ENCRYPTED_PAYLOAD](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/7b60d2b3-5bb1-49aa-aefc-fa887e683977)
|
|
780
|
+
class EncryptedPayload < BinData::Record
|
|
781
|
+
endian :little
|
|
782
|
+
|
|
783
|
+
uint8_array :salt, initial_length: 16
|
|
784
|
+
uint32 :check_sum
|
|
785
|
+
uint8_array :encrypted_data, read_until: :eof
|
|
786
|
+
end
|
|
787
|
+
|
|
788
|
+
# [4.1.10.6.17 DecryptValuesIfNecessary](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/a14e34f0-69ff-484e-820c-1170c63c19ab)
|
|
789
|
+
def decrypt_attribute_value(attribute)
|
|
790
|
+
unless @session_key
|
|
791
|
+
raise RubySMB::Error::EncryptionError, 'Unable to decrypt attribute value: session key is empty'
|
|
792
|
+
end
|
|
793
|
+
encrypted_payload = EncryptedPayload.read(attribute)
|
|
794
|
+
|
|
795
|
+
signature = OpenSSL::Digest::MD5.digest(@session_key + encrypted_payload.salt.to_binary_s)
|
|
796
|
+
rc4 = OpenSSL::Cipher.new('rc4')
|
|
797
|
+
rc4.decrypt
|
|
798
|
+
rc4.key = signature
|
|
799
|
+
plain_text = rc4.update(
|
|
800
|
+
encrypted_payload.check_sum.to_binary_s +
|
|
801
|
+
encrypted_payload.encrypted_data.to_binary_s
|
|
802
|
+
)
|
|
803
|
+
plain_text += rc4.final
|
|
804
|
+
|
|
805
|
+
plain_text[4..-1]
|
|
806
|
+
end
|
|
807
|
+
|
|
808
|
+
# From [MS-LSAD] [5.1.3 DES-ECB-LM Cipher Definition](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lsad/32a2c8af-dc6e-4662-918d-ef333d570dd2)
|
|
809
|
+
def transform_key(input_key)
|
|
810
|
+
output_key = []
|
|
811
|
+
output_key << (input_key[0].ord >> 0x01).chr
|
|
812
|
+
output_key << (((input_key[0].ord & 0x01) << 6) | (input_key[1].ord >> 2)).chr
|
|
813
|
+
output_key << (((input_key[1].ord & 0x03) << 5) | (input_key[2].ord >> 3)).chr
|
|
814
|
+
output_key << (((input_key[2].ord & 0x07) << 4) | (input_key[3].ord >> 4)).chr
|
|
815
|
+
output_key << (((input_key[3].ord & 0x0F) << 3) | (input_key[4].ord >> 5)).chr
|
|
816
|
+
output_key << (((input_key[4].ord & 0x1F) << 2) | (input_key[5].ord >> 6)).chr
|
|
817
|
+
output_key << (((input_key[5].ord & 0x3F) << 1) | (input_key[6].ord >> 7)).chr
|
|
818
|
+
output_key << (input_key[6].ord & 0x7F).chr
|
|
819
|
+
|
|
820
|
+
output_key.map { |byte| ((byte.ord << 1) & 0xFE).chr }.join
|
|
821
|
+
end
|
|
822
|
+
|
|
823
|
+
# From [MS-SAMR] [2.2.11.1.3 Deriving Key1 and Key2 from a Little-Endian, Unsigned Integer Key](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-samr/b1b0094f-2546-431f-b06d-582158a9f2bb)
|
|
824
|
+
def derive_key(base_key)
|
|
825
|
+
key = [base_key].pack('L<')
|
|
826
|
+
key1 = [key[0] , key[1] , key[2] , key[3] , key[0] , key[1] , key[2]]
|
|
827
|
+
key2 = [key[3] , key[0] , key[1] , key[2] , key[3] , key[0] , key[1]]
|
|
828
|
+
[transform_key(key1.join), transform_key(key2.join)]
|
|
829
|
+
end
|
|
830
|
+
|
|
831
|
+
def remove_des_layer(crypted_hash, rid)
|
|
832
|
+
key1, key2 = derive_key(rid)
|
|
833
|
+
|
|
834
|
+
des = OpenSSL::Cipher.new('des-ecb')
|
|
835
|
+
des.decrypt
|
|
836
|
+
des.key = key1
|
|
837
|
+
des.padding = 0
|
|
838
|
+
decrypted_hash = des.update(crypted_hash[0,8])
|
|
839
|
+
decrypted_hash += des.final
|
|
840
|
+
|
|
841
|
+
des.reset
|
|
842
|
+
des.decrypt
|
|
843
|
+
des.key = key2
|
|
844
|
+
des.padding = 0
|
|
845
|
+
decrypted_hash += des.update(crypted_hash[8..-1])
|
|
846
|
+
decrypted_hash += des.final
|
|
847
|
+
|
|
848
|
+
decrypted_hash
|
|
849
|
+
end
|
|
850
|
+
|
|
851
|
+
# Replicates updates from an NC replica on the server
|
|
852
|
+
#
|
|
853
|
+
# @param h_drs [RubySMB::Dcerpc::Drsr::DrsHandle] Context handle
|
|
854
|
+
# previously created by the #drs_bind method
|
|
855
|
+
# @param nc_guid [String] GUID of the DSName representing the NC
|
|
856
|
+
# (naming context) root of the replica to replicate
|
|
857
|
+
# @param nc_guid [String] DSA GUID of the DC.
|
|
858
|
+
# @return [RubySMB::Dcerpc::Drsr::DrsGetNcChangesResponse] Response
|
|
859
|
+
# structure containing the updates
|
|
860
|
+
# @raise [RubySMB::Dcerpc::Error::InvalidPacket] if the response is not a
|
|
861
|
+
# DrsGetNcChanges packet
|
|
862
|
+
# @raise [RubySMB::Dcerpc::Error::SamrError] if the response error status
|
|
863
|
+
# is not STATUS_SUCCESS
|
|
864
|
+
def drs_get_nc_changes(h_drs, nc_guid:, dsa_object_guid:)
|
|
865
|
+
drs_get_nc_changes_request = DrsGetNcChangesRequest.new(
|
|
866
|
+
h_drs: h_drs,
|
|
867
|
+
dw_in_version: 8,
|
|
868
|
+
pmsg_in: {
|
|
869
|
+
msg_getchg: {
|
|
870
|
+
uuid_dsa_obj_dest: dsa_object_guid,
|
|
871
|
+
uuid_invoc_id_src: dsa_object_guid,
|
|
872
|
+
p_nc: {
|
|
873
|
+
guid: nc_guid,
|
|
874
|
+
string_name: ["\0"]
|
|
875
|
+
},
|
|
876
|
+
ul_flags: DRS_INIT_SYNC | DRS_WRIT_REP,
|
|
877
|
+
c_max_objects: 1,
|
|
878
|
+
ul_extended_op: EXOP_REPL_OBJ
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
)
|
|
882
|
+
|
|
883
|
+
ATTRTYP_TO_ATTID.values.each do |oid|
|
|
884
|
+
drs_get_nc_changes_request.pmsg_in.msg_getchg.add_attrtyp_from_oid(oid)
|
|
885
|
+
end
|
|
886
|
+
|
|
887
|
+
response = dcerpc_request(
|
|
888
|
+
drs_get_nc_changes_request,
|
|
889
|
+
auth_level: RubySMB::Dcerpc::RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
|
|
890
|
+
auth_type: RubySMB::Dcerpc::RPC_C_AUTHN_WINNT
|
|
891
|
+
)
|
|
892
|
+
begin
|
|
893
|
+
drs_get_nc_changes_response = DrsGetNcChangesResponse.read(response)
|
|
894
|
+
rescue IOError
|
|
895
|
+
raise RubySMB::Dcerpc::Error::InvalidPacket, 'Error reading DrsGetNcChangesResponse'
|
|
896
|
+
end
|
|
897
|
+
unless drs_get_nc_changes_response.error_status == WindowsError::NTStatus::STATUS_SUCCESS
|
|
898
|
+
raise RubySMB::Dcerpc::Error::DrsrError,
|
|
899
|
+
"Error returned with drs_get_nc_changes: "\
|
|
900
|
+
"#{WindowsError::NTStatus.find_by_retval(drs_get_nc_changes_response.error_status.value).join(',')}"
|
|
901
|
+
end
|
|
902
|
+
|
|
903
|
+
drs_get_nc_changes_response
|
|
904
|
+
end
|
|
905
|
+
|
|
906
|
+
end
|
|
907
|
+
end
|
|
908
|
+
end
|
|
909
|
+
|