samr.c

来自「samba最新软件」· C语言 代码 · 共 2,122 行 · 第 1/5 页

C
2,122
字号
	bool ret = true;	printf("testing GetGroupsForUser\n");	r.in.user_handle = user_handle;	status = dcerpc_samr_GetGroupsForUser(p, tctx, &r);	if (!NT_STATUS_IS_OK(status)) {		printf("GetGroupsForUser failed - %s\n",nt_errstr(status));		ret = false;	}	return ret;}static bool test_GetDomPwInfo(struct dcerpc_pipe *p, struct torture_context *tctx,			      struct lsa_String *domain_name){	NTSTATUS status;	struct samr_GetDomPwInfo r;	bool ret = true;	r.in.domain_name = domain_name;	printf("Testing GetDomPwInfo with name %s\n", r.in.domain_name->string);	status = dcerpc_samr_GetDomPwInfo(p, tctx, &r);	if (!NT_STATUS_IS_OK(status)) {		printf("GetDomPwInfo failed - %s\n", nt_errstr(status));		ret = false;	}	r.in.domain_name->string = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));	printf("Testing GetDomPwInfo with name %s\n", r.in.domain_name->string);	status = dcerpc_samr_GetDomPwInfo(p, tctx, &r);	if (!NT_STATUS_IS_OK(status)) {		printf("GetDomPwInfo failed - %s\n", nt_errstr(status));		ret = false;	}	r.in.domain_name->string = "\\\\__NONAME__";	printf("Testing GetDomPwInfo with name %s\n", r.in.domain_name->string);	status = dcerpc_samr_GetDomPwInfo(p, tctx, &r);	if (!NT_STATUS_IS_OK(status)) {		printf("GetDomPwInfo failed - %s\n", nt_errstr(status));		ret = false;	}	r.in.domain_name->string = "\\\\Builtin";	printf("Testing GetDomPwInfo with name %s\n", r.in.domain_name->string);	status = dcerpc_samr_GetDomPwInfo(p, tctx, &r);	if (!NT_STATUS_IS_OK(status)) {		printf("GetDomPwInfo failed - %s\n", nt_errstr(status));		ret = false;	}	return ret;}static bool test_GetUserPwInfo(struct dcerpc_pipe *p, struct torture_context *tctx,			       struct policy_handle *handle){	NTSTATUS status;	struct samr_GetUserPwInfo r;	bool ret = true;	printf("Testing GetUserPwInfo\n");	r.in.user_handle = handle;	status = dcerpc_samr_GetUserPwInfo(p, tctx, &r);	if (!NT_STATUS_IS_OK(status)) {		printf("GetUserPwInfo failed - %s\n", nt_errstr(status));		ret = false;	}	return ret;}static NTSTATUS test_LookupName(struct dcerpc_pipe *p, struct torture_context *tctx,				struct policy_handle *domain_handle, const char *name,				uint32_t *rid){	NTSTATUS status;	struct samr_LookupNames n;	struct lsa_String sname[2];	init_lsa_String(&sname[0], name);	n.in.domain_handle = domain_handle;	n.in.num_names = 1;	n.in.names = sname;	status = dcerpc_samr_LookupNames(p, tctx, &n);	if (NT_STATUS_IS_OK(status)) {		*rid = n.out.rids.ids[0];	} else {		return status;	}	init_lsa_String(&sname[1], "xxNONAMExx");	n.in.num_names = 2;	status = dcerpc_samr_LookupNames(p, tctx, &n);	if (!NT_STATUS_EQUAL(status, STATUS_SOME_UNMAPPED)) {		printf("LookupNames[2] failed - %s\n", nt_errstr(status));				if (NT_STATUS_IS_OK(status)) {			return NT_STATUS_UNSUCCESSFUL;		}		return status;	}	n.in.num_names = 0;	status = dcerpc_samr_LookupNames(p, tctx, &n);	if (!NT_STATUS_IS_OK(status)) {		printf("LookupNames[0] failed - %s\n", nt_errstr(status));				return status;	}	init_lsa_String(&sname[0], "xxNONAMExx");	n.in.num_names = 1;	status = dcerpc_samr_LookupNames(p, tctx, &n);	if (!NT_STATUS_EQUAL(status, NT_STATUS_NONE_MAPPED)) {		printf("LookupNames[1 bad name] failed - %s\n", nt_errstr(status));				if (NT_STATUS_IS_OK(status)) {			return NT_STATUS_UNSUCCESSFUL;		}		return status;	}	init_lsa_String(&sname[0], "xxNONAMExx");	init_lsa_String(&sname[1], "xxNONAME2xx");	n.in.num_names = 2;	status = dcerpc_samr_LookupNames(p, tctx, &n);	if (!NT_STATUS_EQUAL(status, NT_STATUS_NONE_MAPPED)) {		printf("LookupNames[2 bad names] failed - %s\n", nt_errstr(status));				if (NT_STATUS_IS_OK(status)) {			return NT_STATUS_UNSUCCESSFUL;		}		return status;	}	return NT_STATUS_OK;}static NTSTATUS test_OpenUser_byname(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, 				     struct policy_handle *domain_handle,				     const char *name, struct policy_handle *user_handle){	NTSTATUS status;	struct samr_OpenUser r;	uint32_t rid;	status = test_LookupName(p, mem_ctx, domain_handle, name, &rid);	if (!NT_STATUS_IS_OK(status)) {		return status;	}	r.in.domain_handle = domain_handle;	r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;	r.in.rid = rid;	r.out.user_handle = user_handle;	status = dcerpc_samr_OpenUser(p, mem_ctx, &r);	if (!NT_STATUS_IS_OK(status)) {		printf("OpenUser_byname(%s -> %d) failed - %s\n", name, rid, nt_errstr(status));	}	return status;}#if 0static bool test_ChangePasswordNT3(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, 				   struct policy_handle *handle){	NTSTATUS status;	struct samr_ChangePasswordUser r;	bool ret = true;	struct samr_Password hash1, hash2, hash3, hash4, hash5, hash6;	struct policy_handle user_handle;	char *oldpass = "test";	char *newpass = "test2";	uint8_t old_nt_hash[16], new_nt_hash[16];	uint8_t old_lm_hash[16], new_lm_hash[16];	status = test_OpenUser_byname(p, mem_ctx, handle, "testuser", &user_handle);	if (!NT_STATUS_IS_OK(status)) {		return false;	}	printf("Testing ChangePasswordUser for user 'testuser'\n");	printf("old password: %s\n", oldpass);	printf("new password: %s\n", newpass);	E_md4hash(oldpass, old_nt_hash);	E_md4hash(newpass, new_nt_hash);	E_deshash(oldpass, old_lm_hash);	E_deshash(newpass, new_lm_hash);	E_old_pw_hash(new_lm_hash, old_lm_hash, hash1.hash);	E_old_pw_hash(old_lm_hash, new_lm_hash, hash2.hash);	E_old_pw_hash(new_nt_hash, old_nt_hash, hash3.hash);	E_old_pw_hash(old_nt_hash, new_nt_hash, hash4.hash);	E_old_pw_hash(old_lm_hash, new_nt_hash, hash5.hash);	E_old_pw_hash(old_nt_hash, new_lm_hash, hash6.hash);	r.in.handle = &user_handle;	r.in.lm_present = 1;	r.in.old_lm_crypted = &hash1;	r.in.new_lm_crypted = &hash2;	r.in.nt_present = 1;	r.in.old_nt_crypted = &hash3;	r.in.new_nt_crypted = &hash4;	r.in.cross1_present = 1;	r.in.nt_cross = &hash5;	r.in.cross2_present = 1;	r.in.lm_cross = &hash6;	status = dcerpc_samr_ChangePasswordUser(p, mem_ctx, &r);	if (!NT_STATUS_IS_OK(status)) {		printf("ChangePasswordUser failed - %s\n", nt_errstr(status));		ret = false;	}	if (!test_samr_handle_Close(p, mem_ctx, &user_handle)) {		ret = false;	}	return ret;}#endifstatic bool test_ChangePasswordUser(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, 				    const char *acct_name, 				    struct policy_handle *handle, char **password){	NTSTATUS status;	struct samr_ChangePasswordUser r;	bool ret = true;	struct samr_Password hash1, hash2, hash3, hash4, hash5, hash6;	struct policy_handle user_handle;	char *oldpass;	uint8_t old_nt_hash[16], new_nt_hash[16];	uint8_t old_lm_hash[16], new_lm_hash[16];	bool changed = true;	char *newpass;	struct samr_GetUserPwInfo pwp;	int policy_min_pw_len = 0;	status = test_OpenUser_byname(p, mem_ctx, handle, acct_name, &user_handle);	if (!NT_STATUS_IS_OK(status)) {		return false;	}	pwp.in.user_handle = &user_handle;	status = dcerpc_samr_GetUserPwInfo(p, mem_ctx, &pwp);	if (NT_STATUS_IS_OK(status)) {		policy_min_pw_len = pwp.out.info.min_password_length;	}	newpass = samr_rand_pass(mem_ctx, policy_min_pw_len);	printf("Testing ChangePasswordUser\n");	if (!*password) {		printf("Failing ChangePasswordUser as old password was NULL.  Previous test failed?\n");		return false;	}	oldpass = *password;	E_md4hash(oldpass, old_nt_hash);	E_md4hash(newpass, new_nt_hash);	E_deshash(oldpass, old_lm_hash);	E_deshash(newpass, new_lm_hash);	E_old_pw_hash(new_lm_hash, old_lm_hash, hash1.hash);	E_old_pw_hash(old_lm_hash, new_lm_hash, hash2.hash);	E_old_pw_hash(new_nt_hash, old_nt_hash, hash3.hash);	E_old_pw_hash(old_nt_hash, new_nt_hash, hash4.hash);	E_old_pw_hash(old_lm_hash, new_nt_hash, hash5.hash);	E_old_pw_hash(old_nt_hash, new_lm_hash, hash6.hash);	r.in.user_handle = &user_handle;	r.in.lm_present = 1;	/* Break the LM hash */	hash1.hash[0]++;	r.in.old_lm_crypted = &hash1;	r.in.new_lm_crypted = &hash2;	r.in.nt_present = 1;	r.in.old_nt_crypted = &hash3;	r.in.new_nt_crypted = &hash4;	r.in.cross1_present = 1;	r.in.nt_cross = &hash5;	r.in.cross2_present = 1;	r.in.lm_cross = &hash6;	status = dcerpc_samr_ChangePasswordUser(p, mem_ctx, &r);	if (!NT_STATUS_EQUAL(status, NT_STATUS_WRONG_PASSWORD)) {		printf("ChangePasswordUser failed: expected NT_STATUS_WRONG_PASSWORD because we broke the LM hash, got %s\n", nt_errstr(status));		ret = false;	}	/* Unbreak the LM hash */	hash1.hash[0]--;	r.in.user_handle = &user_handle;	r.in.lm_present = 1;	r.in.old_lm_crypted = &hash1;	r.in.new_lm_crypted = &hash2;	/* Break the NT hash */	hash3.hash[0]--;	r.in.nt_present = 1;	r.in.old_nt_crypted = &hash3;	r.in.new_nt_crypted = &hash4;	r.in.cross1_present = 1;	r.in.nt_cross = &hash5;	r.in.cross2_present = 1;	r.in.lm_cross = &hash6;	status = dcerpc_samr_ChangePasswordUser(p, mem_ctx, &r);	if (!NT_STATUS_EQUAL(status, NT_STATUS_WRONG_PASSWORD)) {		printf("ChangePasswordUser failed: expected NT_STATUS_WRONG_PASSWORD because we broke the NT hash, got %s\n", nt_errstr(status));		ret = false;	}	/* Unbreak the NT hash */	hash3.hash[0]--;	r.in.user_handle = &user_handle;	r.in.lm_present = 1;	r.in.old_lm_crypted = &hash1;	r.in.new_lm_crypted = &hash2;	r.in.nt_present = 1;	r.in.old_nt_crypted = &hash3;	r.in.new_nt_crypted = &hash4;	r.in.cross1_present = 1;	r.in.nt_cross = &hash5;	r.in.cross2_present = 1;	/* Break the LM cross */	hash6.hash[0]++;	r.in.lm_cross = &hash6;	status = dcerpc_samr_ChangePasswordUser(p, mem_ctx, &r);	if (!NT_STATUS_EQUAL(status, NT_STATUS_WRONG_PASSWORD)) {		printf("ChangePasswordUser failed: expected NT_STATUS_WRONG_PASSWORD because we broke the LM cross-hash, got %s\n", nt_errstr(status));		ret = false;	}	/* Unbreak the LM cross */	hash6.hash[0]--;	r.in.user_handle = &user_handle;	r.in.lm_present = 1;	r.in.old_lm_crypted = &hash1;	r.in.new_lm_crypted = &hash2;	r.in.nt_present = 1;	r.in.old_nt_crypted = &hash3;	r.in.new_nt_crypted = &hash4;	r.in.cross1_present = 1;	/* Break the NT cross */	hash5.hash[0]++;	r.in.nt_cross = &hash5;	r.in.cross2_present = 1;	r.in.lm_cross = &hash6;	status = dcerpc_samr_ChangePasswordUser(p, mem_ctx, &r);	if (!NT_STATUS_EQUAL(status, NT_STATUS_WRONG_PASSWORD)) {		printf("ChangePasswordUser failed: expected NT_STATUS_WRONG_PASSWORD because we broke the NT cross-hash, got %s\n", nt_errstr(status));		ret = false;	}	/* Unbreak the NT cross */	hash5.hash[0]--;	/* Reset the hashes to not broken values */	E_old_pw_hash(new_lm_hash, old_lm_hash, hash1.hash);	E_old_pw_hash(old_lm_hash, new_lm_hash, hash2.hash);	E_old_pw_hash(new_nt_hash, old_nt_hash, hash3.hash);	E_old_pw_hash(old_nt_hash, new_nt_hash, hash4.hash);	E_old_pw_hash(old_lm_hash, new_nt_hash, hash5.hash);	E_old_pw_hash(old_nt_hash, new_lm_hash, hash6.hash);	r.in.user_handle = &user_handle;	r.in.lm_present = 1;	r.in.old_lm_crypted = &hash1;	r.in.new_lm_crypted = &hash2;	r.in.nt_present = 1;	r.in.old_nt_crypted = &hash3;	r.in.new_nt_crypted = &hash4;	r.in.cross1_present = 1;	r.in.nt_cross = &hash5;	r.in.cross2_present = 0;	r.in.lm_cross = NULL;	status = dcerpc_samr_ChangePasswordUser(p, mem_ctx, &r);	if (NT_STATUS_IS_OK(status)) {		changed = true;		*password = newpass;	} else if (!NT_STATUS_EQUAL(NT_STATUS_PASSWORD_RESTRICTION, status)) {		printf("ChangePasswordUser failed: expected NT_STATUS_OK, or at least NT_STATUS_PASSWORD_RESTRICTION, got %s\n", nt_errstr(status));		ret = false;	}	oldpass = newpass;	newpass = samr_rand_pass(mem_ctx, policy_min_pw_len);	E_md4hash(oldpass, old_nt_hash);	E_md4hash(newpass, new_nt_hash);	E_deshash(oldpass, old_lm_hash);	E_deshash(newpass, new_lm_hash);	/* Reset the hashes to not broken values */	E_old_pw_hash(new_lm_hash, old_lm_hash, hash1.hash);	E_old_pw_hash(old_lm_hash, new_lm_hash, hash2.hash);	E_old_pw_hash(new_nt_hash, old_nt_hash, hash3.hash);	E_old_pw_hash(old_nt_hash, new_nt_hash, hash4.hash);	E_old_pw_hash(old_lm_hash, new_nt_hash, hash5.hash);	E_old_pw_hash(old_nt_hash, new_lm_hash, hash6.hash);	r.in.user_handle = &user_handle;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?