diff options
Diffstat (limited to 'source4/torture/rpc/netlogon.c')
-rw-r--r-- | source4/torture/rpc/netlogon.c | 210 |
1 files changed, 188 insertions, 22 deletions
diff --git a/source4/torture/rpc/netlogon.c b/source4/torture/rpc/netlogon.c index 4c844b5f1a..26889e58c8 100644 --- a/source4/torture/rpc/netlogon.c +++ b/source4/torture/rpc/netlogon.c @@ -23,6 +23,164 @@ #include "includes.h" +#define TEST_MACHINE_NAME "torturetest" + +static struct { + struct dcerpc_pipe *p; + const char *machine_password; + struct policy_handle acct_handle; +} join; + +/* + join the domain as a BDC +*/ +static BOOL join_domain_bdc(TALLOC_CTX *mem_ctx) +{ + NTSTATUS status; + struct samr_Connect c; + struct samr_CreateUser2 r; + struct samr_OpenDomain o; + struct samr_LookupDomain l; + struct samr_SetUserInfo s; + union samr_UserInfo u; + struct policy_handle handle; + struct policy_handle domain_handle; + uint32 access_granted; + uint32 rid; + BOOL ret = True; + uint8 session_key[16]; + struct samr_Name name; + + printf("Connecting to SAMR\n"); + + status = torture_rpc_connection(&join.p, + DCERPC_SAMR_NAME, + DCERPC_SAMR_UUID, + DCERPC_SAMR_VERSION); + if (!NT_STATUS_IS_OK(status)) { + return False; + } + + c.in.system_name = NULL; + c.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED; + c.out.handle = &handle; + + status = dcerpc_samr_Connect(join.p, mem_ctx, &c); + if (!NT_STATUS_IS_OK(status)) { + printf("samr_Connect failed - %s\n", nt_errstr(status)); + return False; + } + + printf("Opening domain %s\n", lp_workgroup()); + + name.name = lp_workgroup(); + l.in.handle = &handle; + l.in.domain = &name; + + status = dcerpc_samr_LookupDomain(join.p, mem_ctx, &l); + if (!NT_STATUS_IS_OK(status)) { + printf("LookupDomain failed - %s\n", nt_errstr(status)); + return False; + } + + o.in.handle = &handle; + o.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED; + o.in.sid = l.out.sid; + o.out.domain_handle = &domain_handle; + + status = dcerpc_samr_OpenDomain(join.p, mem_ctx, &o); + if (!NT_STATUS_IS_OK(status)) { + printf("OpenDomain failed - %s\n", nt_errstr(status)); + return False; + } + + printf("Creating machine account %s\n", TEST_MACHINE_NAME); + +again: + name.name = talloc_asprintf(mem_ctx, "%s$", TEST_MACHINE_NAME); + r.in.handle = &domain_handle; + r.in.username = &name; + r.in.acct_flags = ACB_SVRTRUST; + r.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED; + r.out.acct_handle = &join.acct_handle; + r.out.access_granted = &access_granted; + r.out.rid = &rid; + + status = dcerpc_samr_CreateUser2(join.p, mem_ctx, &r); + + if (NT_STATUS_EQUAL(status, NT_STATUS_USER_EXISTS) && + test_DeleteUser_byname(join.p, mem_ctx, &domain_handle, name.name)) { + goto again; + } + + if (!NT_STATUS_IS_OK(status)) { + printf("CreateUser2 failed - %s\n", nt_errstr(status)); + return False; + } + + join.machine_password = generate_random_str(8); + + printf("Setting machine account password '%s'\n", join.machine_password); + + s.in.handle = &join.acct_handle; + s.in.info = &u; + s.in.level = 24; + + encode_pw_buffer(u.info24.password.data, join.machine_password, STR_UNICODE); + u.info24.pw_len = strlen(join.machine_password); + + status = dcerpc_fetch_session_key(join.p, session_key); + if (!NT_STATUS_IS_OK(status)) { + printf("SetUserInfo level %u - no session key - %s\n", + s.in.level, nt_errstr(status)); + return False; + } + + SamOEMhash(u.info24.password.data, session_key, 516); + + status = dcerpc_samr_SetUserInfo(join.p, mem_ctx, &s); + if (!NT_STATUS_IS_OK(status)) { + printf("SetUserInfo failed - %s\n", nt_errstr(status)); + return False; + } + + s.in.handle = &join.acct_handle; + s.in.info = &u; + s.in.level = 16; + + u.info16.acct_flags = ACB_SVRTRUST; + + printf("Resetting ACB flags\n"); + + status = dcerpc_samr_SetUserInfo(join.p, mem_ctx, &s); + if (!NT_STATUS_IS_OK(status)) { + printf("SetUserInfo failed - %s\n", nt_errstr(status)); + return False; + } + + return ret; +} + +/* + leave the domain as a BDC +*/ +static BOOL leave_domain_bdc(TALLOC_CTX *mem_ctx) +{ + struct samr_DeleteUser d; + NTSTATUS status; + + d.in.handle = &join.acct_handle; + d.out.handle = &join.acct_handle; + + status = dcerpc_samr_DeleteUser(join.p, mem_ctx, &d); + if (!NT_STATUS_IS_OK(status)) { + printf("Delete of machine account failed\n"); + return False; + } + + return True; +} + static BOOL test_LogonUasLogon(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) { NTSTATUS status; @@ -30,7 +188,7 @@ static BOOL test_LogonUasLogon(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) r.in.server_name = NULL; r.in.username = lp_parm_string(-1, "torture", "username"); - r.in.workstation = lp_netbios_name(); + r.in.workstation = TEST_MACHINE_NAME; printf("Testing LogonUasLogon\n"); @@ -51,7 +209,7 @@ static BOOL test_LogonUasLogoff(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) r.in.server_name = NULL; r.in.username = lp_parm_string(-1, "torture", "username"); - r.in.workstation = lp_netbios_name(); + r.in.workstation = TEST_MACHINE_NAME; printf("Testing LogonUasLogoff\n"); @@ -77,7 +235,7 @@ static BOOL test_SetupCredentials(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, printf("Testing ServerReqChallenge\n"); r.in.server_name = NULL; - r.in.computer_name = lp_netbios_name(); + r.in.computer_name = TEST_MACHINE_NAME; generate_random_buffer(r.in.credentials.data, sizeof(r.in.credentials.data), False); status = dcerpc_netr_ServerReqChallenge(p, mem_ctx, &r); @@ -86,7 +244,7 @@ static BOOL test_SetupCredentials(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return False; } - plain_pass = secrets_fetch_machine_password(); + plain_pass = join.machine_password; if (!plain_pass) { printf("Unable to fetch machine password!\n"); return False; @@ -98,9 +256,9 @@ static BOOL test_SetupCredentials(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, &a.in.credentials); a.in.server_name = NULL; - a.in.username = talloc_asprintf(mem_ctx, "%s$", lp_netbios_name()); + a.in.username = talloc_asprintf(mem_ctx, "%s$", TEST_MACHINE_NAME); a.in.secure_channel_type = SEC_CHAN_BDC; - a.in.computer_name = lp_netbios_name(); + a.in.computer_name = TEST_MACHINE_NAME; printf("Testing ServerAuthenticate\n"); @@ -131,7 +289,7 @@ static BOOL test_SetupCredentials2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, printf("Testing ServerReqChallenge\n"); r.in.server_name = NULL; - r.in.computer_name = lp_netbios_name(); + r.in.computer_name = TEST_MACHINE_NAME; generate_random_buffer(r.in.credentials.data, sizeof(r.in.credentials.data), False); status = dcerpc_netr_ServerReqChallenge(p, mem_ctx, &r); @@ -140,7 +298,7 @@ static BOOL test_SetupCredentials2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return False; } - plain_pass = secrets_fetch_machine_password(); + plain_pass = join.machine_password; if (!plain_pass) { printf("Unable to fetch machine password!\n"); return False; @@ -152,9 +310,9 @@ static BOOL test_SetupCredentials2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, &a.in.credentials); a.in.server_name = NULL; - a.in.username = talloc_asprintf(mem_ctx, "%s$", lp_netbios_name()); + a.in.username = talloc_asprintf(mem_ctx, "%s$", TEST_MACHINE_NAME); a.in.secure_channel_type = SEC_CHAN_BDC; - a.in.computer_name = lp_netbios_name(); + a.in.computer_name = TEST_MACHINE_NAME; a.in.negotiate_flags = &negotiate_flags; a.out.negotiate_flags = &negotiate_flags; @@ -198,7 +356,7 @@ static BOOL test_SamLogon(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) ninfo.logon_info.logon_id_low = 0; ninfo.logon_info.logon_id_high = 0; ninfo.logon_info.username.string = username; - ninfo.logon_info.workstation.string = lp_netbios_name(); + ninfo.logon_info.workstation.string = TEST_MACHINE_NAME; generate_random_buffer(ninfo.challenge, sizeof(ninfo.challenge), False); ninfo.nt.length = 24; @@ -213,7 +371,7 @@ static BOOL test_SamLogon(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) creds_client_authenticator(&creds, &auth); r.in.server_name = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p)); - r.in.workstation = lp_netbios_name(); + r.in.workstation = TEST_MACHINE_NAME; r.in.credential = &auth; r.in.authenticator = &auth2; r.in.logon_level = 2; @@ -251,9 +409,9 @@ static BOOL test_SetPassword(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) } r.in.server_name = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p)); - r.in.username = talloc_asprintf(mem_ctx, "%s$", lp_netbios_name()); + r.in.username = talloc_asprintf(mem_ctx, "%s$", TEST_MACHINE_NAME); r.in.secure_channel_type = SEC_CHAN_BDC; - r.in.computer_name = lp_netbios_name(); + r.in.computer_name = TEST_MACHINE_NAME; password = generate_random_str(8); E_md4hash(password, r.in.new_password.data); @@ -270,9 +428,7 @@ static BOOL test_SetPassword(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) return False; } - if (!secrets_store_machine_password(password)) { - printf("Failed to save machine password\n"); - } + join.machine_password = password; if (!creds_client_check(&creds, &r.out.return_authenticator.cred)) { printf("Credential chaining failed\n"); @@ -318,7 +474,7 @@ static BOOL test_DatabaseSync(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) } r.in.logon_server = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p)); - r.in.computername = lp_netbios_name(); + r.in.computername = TEST_MACHINE_NAME; r.in.preferredmaximumlength = (uint32)-1; ZERO_STRUCT(r.in.return_authenticator); @@ -380,7 +536,7 @@ static BOOL test_DatabaseDeltas(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) } r.in.logon_server = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p)); - r.in.computername = lp_netbios_name(); + r.in.computername = TEST_MACHINE_NAME; r.in.preferredmaximumlength = (uint32)-1; ZERO_STRUCT(r.in.return_authenticator); @@ -435,7 +591,7 @@ static BOOL test_AccountDeltas(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) } r.in.logon_server = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p)); - r.in.computername = lp_netbios_name(); + r.in.computername = TEST_MACHINE_NAME; ZERO_STRUCT(r.in.return_authenticator); creds_client_authenticator(&creds, &r.in.credential); ZERO_STRUCT(r.in.uas); @@ -470,7 +626,7 @@ static BOOL test_AccountSync(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) } r.in.logon_server = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p)); - r.in.computername = lp_netbios_name(); + r.in.computername = TEST_MACHINE_NAME; ZERO_STRUCT(r.in.return_authenticator); creds_client_authenticator(&creds, &r.in.credential); ZERO_STRUCT(r.in.recordid); @@ -666,7 +822,7 @@ static BOOL test_DatabaseSync2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx) } r.in.logon_server = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p)); - r.in.computername = lp_netbios_name(); + r.in.computername = TEST_MACHINE_NAME; r.in.preferredmaximumlength = (uint32)-1; ZERO_STRUCT(r.in.return_authenticator); @@ -790,6 +946,11 @@ BOOL torture_rpc_netlogon(int dummy) mem_ctx = talloc_init("torture_rpc_netlogon"); + if (!join_domain_bdc(mem_ctx)) { + printf("Failed to join as BDC\n"); + return False; + } + status = torture_rpc_connection(&p, DCERPC_NETLOGON_NAME, DCERPC_NETLOGON_UUID, @@ -856,5 +1017,10 @@ BOOL torture_rpc_netlogon(int dummy) torture_rpc_close(p); + if (!leave_domain_bdc(mem_ctx)) { + printf("Failed to delete BDC machine account\n"); + return False; + } + return ret; } |