📄 netlogon.c
字号:
static bool test_GetDcName(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct netr_GetDcName r; r.in.logon_server = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.domainname = lp_workgroup(tctx->lp_ctx); status = dcerpc_netr_GetDcName(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "GetDcName"); torture_assert_werr_ok(tctx, r.out.result, "GetDcName"); torture_comment(tctx, "\tDC is at '%s'\n", r.out.dcname); return true;}/* try a netlogon LogonControl */static bool test_LogonControl(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct netr_LogonControl r; int i; r.in.logon_server = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.function_code = 1; for (i=1;i<4;i++) { r.in.level = i; torture_comment(tctx, "Testing LogonControl level %d\n", i); status = dcerpc_netr_LogonControl(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "LogonControl"); } return true;}/* try a netlogon GetAnyDCName*/static bool test_GetAnyDCName(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct netr_GetAnyDCName r; r.in.logon_server = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.domainname = lp_workgroup(tctx->lp_ctx); status = dcerpc_netr_GetAnyDCName(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "GetAnyDCName"); if (r.out.dcname) { torture_comment(tctx, "\tDC is at '%s'\n", r.out.dcname); } return true;}/* try a netlogon LogonControl2*/static bool test_LogonControl2(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct netr_LogonControl2 r; int i; r.in.logon_server = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.function_code = NETLOGON_CONTROL_REDISCOVER; r.in.data.domain = lp_workgroup(tctx->lp_ctx); for (i=1;i<4;i++) { r.in.level = i; torture_comment(tctx, "Testing LogonControl2 level %d function %d\n", i, r.in.function_code); status = dcerpc_netr_LogonControl2(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "LogonControl"); } r.in.function_code = NETLOGON_CONTROL_TC_QUERY; r.in.data.domain = lp_workgroup(tctx->lp_ctx); for (i=1;i<4;i++) { r.in.level = i; torture_comment(tctx, "Testing LogonControl2 level %d function %d\n", i, r.in.function_code); status = dcerpc_netr_LogonControl2(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "LogonControl"); } r.in.function_code = NETLOGON_CONTROL_TRANSPORT_NOTIFY; r.in.data.domain = lp_workgroup(tctx->lp_ctx); for (i=1;i<4;i++) { r.in.level = i; torture_comment(tctx, "Testing LogonControl2 level %d function %d\n", i, r.in.function_code); status = dcerpc_netr_LogonControl2(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "LogonControl"); } r.in.function_code = NETLOGON_CONTROL_SET_DBFLAG; r.in.data.debug_level = ~0; for (i=1;i<4;i++) { r.in.level = i; torture_comment(tctx, "Testing LogonControl2 level %d function %d\n", i, r.in.function_code); status = dcerpc_netr_LogonControl2(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "LogonControl"); } return true;}/* try a netlogon DatabaseSync2*/static bool test_DatabaseSync2(struct torture_context *tctx, struct dcerpc_pipe *p, struct cli_credentials *machine_credentials){ NTSTATUS status; struct netr_DatabaseSync2 r; struct creds_CredentialState *creds; const uint32_t database_ids[] = {0, 1, 2}; int i; if (!test_SetupCredentials2(p, tctx, NETLOGON_NEG_AUTH2_FLAGS, machine_credentials, SEC_CHAN_BDC, &creds)) { return false; } r.in.logon_server = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.computername = TEST_MACHINE_NAME; r.in.preferredmaximumlength = (uint32_t)-1; ZERO_STRUCT(r.in.return_authenticator); for (i=0;i<ARRAY_SIZE(database_ids);i++) { r.in.sync_context = 0; r.in.database_id = database_ids[i]; r.in.restart_state = 0; torture_comment(tctx, "Testing DatabaseSync2 of id %d\n", r.in.database_id); do { creds_client_authenticator(creds, &r.in.credential); status = dcerpc_netr_DatabaseSync2(p, tctx, &r); if (NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) break; /* Native mode servers don't do this */ if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) { return true; } torture_assert_ntstatus_ok(tctx, status, "DatabaseSync2"); if (!creds_client_check(creds, &r.out.return_authenticator.cred)) { torture_comment(tctx, "Credential chaining failed\n"); } r.in.sync_context = r.out.sync_context; } while (NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)); } return true;}/* try a netlogon LogonControl2Ex*/static bool test_LogonControl2Ex(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct netr_LogonControl2Ex r; int i; r.in.logon_server = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.function_code = NETLOGON_CONTROL_REDISCOVER; r.in.data.domain = lp_workgroup(tctx->lp_ctx); for (i=1;i<4;i++) { r.in.level = i; torture_comment(tctx, "Testing LogonControl2Ex level %d function %d\n", i, r.in.function_code); status = dcerpc_netr_LogonControl2Ex(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "LogonControl"); } r.in.function_code = NETLOGON_CONTROL_TC_QUERY; r.in.data.domain = lp_workgroup(tctx->lp_ctx); for (i=1;i<4;i++) { r.in.level = i; torture_comment(tctx, "Testing LogonControl2Ex level %d function %d\n", i, r.in.function_code); status = dcerpc_netr_LogonControl2Ex(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "LogonControl"); } r.in.function_code = NETLOGON_CONTROL_TRANSPORT_NOTIFY; r.in.data.domain = lp_workgroup(tctx->lp_ctx); for (i=1;i<4;i++) { r.in.level = i; torture_comment(tctx, "Testing LogonControl2Ex level %d function %d\n", i, r.in.function_code); status = dcerpc_netr_LogonControl2Ex(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "LogonControl"); } r.in.function_code = NETLOGON_CONTROL_SET_DBFLAG; r.in.data.debug_level = ~0; for (i=1;i<4;i++) { r.in.level = i; torture_comment(tctx, "Testing LogonControl2Ex level %d function %d\n", i, r.in.function_code); status = dcerpc_netr_LogonControl2Ex(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "LogonControl"); } return true;}static bool test_netr_DsRGetForestTrustInformation(struct torture_context *tctx, struct dcerpc_pipe *p, const char *trusted_domain_name) { NTSTATUS status; struct netr_DsRGetForestTrustInformation r; struct lsa_ForestTrustInformation info, *info_ptr; info_ptr = &info; r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.trusted_domain_name = trusted_domain_name; r.in.flags = 0; r.out.forest_trust_info = &info_ptr; torture_comment(tctx ,"Testing netr_DsRGetForestTrustInformation\n"); status = dcerpc_netr_DsRGetForestTrustInformation(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "DsRGetForestTrustInformation"); torture_assert_werr_ok(tctx, r.out.result, "DsRGetForestTrustInformation"); return true;}/* try a netlogon netr_DsrEnumerateDomainTrusts*/static bool test_DsrEnumerateDomainTrusts(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct netr_DsrEnumerateDomainTrusts r; int i; r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.trust_flags = 0x3f; status = dcerpc_netr_DsrEnumerateDomainTrusts(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "DsrEnumerateDomaintrusts"); torture_assert_werr_ok(tctx, r.out.result, "DsrEnumerateDomaintrusts"); /* when trusted_domain_name is NULL, netr_DsRGetForestTrustInformation * will show non-forest trusts and all UPN suffixes of the own forest * as LSA_FOREST_TRUST_TOP_LEVEL_NAME types */ if (r.out.count) { if (!test_netr_DsRGetForestTrustInformation(tctx, p, NULL)) { return false; } } for (i=0; i<r.out.count; i++) { /* get info for transitive forest trusts */ if (r.out.trusts[i].trust_attributes & NETR_TRUST_ATTRIBUTE_FOREST_TRANSITIVE) { if (!test_netr_DsRGetForestTrustInformation(tctx, p, r.out.trusts[i].dns_name)) { return false; } } } return true;}static bool test_netr_NetrEnumerateTrustedDomains(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct netr_NetrEnumerateTrustedDomains r; struct netr_Blob trusted_domains_blob; r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.out.trusted_domains_blob = &trusted_domains_blob; status = dcerpc_netr_NetrEnumerateTrustedDomains(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "netr_NetrEnumerateTrustedDomains"); torture_assert_werr_ok(tctx, r.out.result, "NetrEnumerateTrustedDomains"); return true;}static bool test_netr_NetrEnumerateTrustedDomainsEx(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct netr_NetrEnumerateTrustedDomainsEx r; struct netr_DomainTrustList dom_trust_list; r.in.server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.out.dom_trust_list = &dom_trust_list; status = dcerpc_netr_NetrEnumerateTrustedDomainsEx(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "netr_NetrEnumerateTrustedDomainsEx"); torture_assert_werr_ok(tctx, r.out.result, "NetrEnumerateTrustedDomainsEx"); return true;}static bool test_netr_DsRGetSiteName(struct dcerpc_pipe *p, struct torture_context *tctx, const char *computer_name, const char *expected_site) { NTSTATUS status; struct netr_DsRGetSiteName r; if (torture_setting_bool(tctx, "samba4", false)) torture_skip(tctx, "skipping DsRGetSiteName test against Samba4"); r.in.computer_name = computer_name; torture_comment(tctx, "Testing netr_DsRGetSiteName\n"); status = dcerpc_netr_DsRGetSiteName(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "DsRGetSiteName"); torture_assert_werr_ok(tctx, r.out.result, "DsRGetSiteName"); torture_assert_str_equal(tctx, expected_site, r.out.site, "netr_DsRGetSiteName"); r.in.computer_name = talloc_asprintf(tctx, "\\\\%s", computer_name); torture_comment(tctx, "Testing netr_DsRGetSiteName with broken computer name: %s\n", r.in.computer_name); status = dcerpc_netr_DsRGetSiteName(p, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "DsRGetSiteName"); torture_assert_werr_equal(tctx, r.out.result, WERR_INVALID_COMPUTERNAME, "netr_DsRGetSiteName"); return true;}/* try a netlogon netr_DsRGetDCName*/static bool test_netr_DsRGetDCName(struct torture_context *tctx, struct dcerpc_pipe *p){ NTSTATUS status; struct netr_DsRGetDCName r; r.in.server_unc = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p)); r.in.domain_name = talloc_asprintf(tctx, "%s", lp_realm(tctx->lp_ctx)); r.in.domain_guid = NULL; r.in.site_guid = NULL; r.in.flags = DS_RETURN_DNS_NAME;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -