samr.c

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

C
2,122
字号
			      0);		/* Setting PWNOEXP clears the magic ACB_PW_EXPIRED flag */	TEST_USERINFO_INT_EXP(16, acct_flags, 5, acct_flags, 			      (base_acct_flags  | ACB_DISABLED | ACB_PWNOEXP), 			      (base_acct_flags  | ACB_DISABLED | ACB_PWNOEXP), 			      0);	TEST_USERINFO_INT_EXP(16, acct_flags, 21, acct_flags, 			      (base_acct_flags | ACB_DISABLED | ACB_HOMDIRREQ), 			      (base_acct_flags | ACB_DISABLED | ACB_HOMDIRREQ | user_extra_flags), 			      0);	/* The 'autolock' flag doesn't stick - check this */	TEST_USERINFO_INT_EXP(16, acct_flags, 21, acct_flags, 			      (base_acct_flags | ACB_DISABLED | ACB_AUTOLOCK), 			      (base_acct_flags | ACB_DISABLED | user_extra_flags), 			      0);#if 0	/* Removing the 'disabled' flag doesn't stick - check this */	TEST_USERINFO_INT_EXP(16, acct_flags, 21, acct_flags, 			      (base_acct_flags), 			      (base_acct_flags | ACB_DISABLED | user_extra_flags), 			      0);#endif	/* The 'store plaintext' flag does stick */	TEST_USERINFO_INT_EXP(16, acct_flags, 21, acct_flags, 			      (base_acct_flags | ACB_DISABLED | ACB_ENC_TXT_PWD_ALLOWED), 			      (base_acct_flags | ACB_DISABLED | ACB_ENC_TXT_PWD_ALLOWED | user_extra_flags), 			      0);	/* The 'use DES' flag does stick */	TEST_USERINFO_INT_EXP(16, acct_flags, 21, acct_flags, 			      (base_acct_flags | ACB_DISABLED | ACB_USE_DES_KEY_ONLY), 			      (base_acct_flags | ACB_DISABLED | ACB_USE_DES_KEY_ONLY | user_extra_flags), 			      0);	/* The 'don't require kerberos pre-authentication flag does stick */	TEST_USERINFO_INT_EXP(16, acct_flags, 21, acct_flags, 			      (base_acct_flags | ACB_DISABLED | ACB_DONT_REQUIRE_PREAUTH), 			      (base_acct_flags | ACB_DISABLED | ACB_DONT_REQUIRE_PREAUTH | user_extra_flags), 			      0);	/* The 'no kerberos PAC required' flag sticks */	TEST_USERINFO_INT_EXP(16, acct_flags, 21, acct_flags, 			      (base_acct_flags | ACB_DISABLED | ACB_NO_AUTH_DATA_REQD), 			      (base_acct_flags | ACB_DISABLED | ACB_NO_AUTH_DATA_REQD | user_extra_flags), 			      0);	TEST_USERINFO_INT_EXP(21, acct_flags, 21, acct_flags, 			      (base_acct_flags | ACB_DISABLED), 			      (base_acct_flags | ACB_DISABLED | user_extra_flags), 			      SAMR_FIELD_ACCT_FLAGS);#if 0	/* these fail with win2003 - it appears you can't set the primary gid?	   the set succeeds, but the gid isn't changed. Very weird! */	TEST_USERINFO_INT(9, primary_gid,  1, primary_gid, 513);	TEST_USERINFO_INT(9, primary_gid,  3, primary_gid, 513);	TEST_USERINFO_INT(9, primary_gid,  5, primary_gid, 513);	TEST_USERINFO_INT(9, primary_gid, 21, primary_gid, 513);#endif	return ret;}/*  generate a random password for password change tests*/static char *samr_rand_pass(TALLOC_CTX *mem_ctx, int min_len){	size_t len = MAX(8, min_len) + (random() % 6);	char *s = generate_random_str(mem_ctx, len);	printf("Generated password '%s'\n", s);	return s;}/*  generate a random password for password change tests (fixed length)*/static char *samr_rand_pass_fixed_len(TALLOC_CTX *mem_ctx, int len){	char *s = generate_random_str(mem_ctx, len);	printf("Generated password '%s'\n", s);	return s;}static bool test_SetUserPass(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, 			     struct policy_handle *handle, char **password){	NTSTATUS status;	struct samr_SetUserInfo s;	union samr_UserInfo u;	bool ret = true;	DATA_BLOB session_key;	char *newpass;	struct samr_GetUserPwInfo pwp;	int policy_min_pw_len = 0;	pwp.in.user_handle = 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);	s.in.user_handle = handle;	s.in.info = &u;	s.in.level = 24;	encode_pw_buffer(u.info24.password.data, newpass, STR_UNICODE);	/* w2k3 ignores this length */	u.info24.pw_len = strlen_m(newpass) * 2;	status = dcerpc_fetch_session_key(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;	}	arcfour_crypt_blob(u.info24.password.data, 516, &session_key);	printf("Testing SetUserInfo level 24 (set password)\n");	status = dcerpc_samr_SetUserInfo(p, mem_ctx, &s);	if (!NT_STATUS_IS_OK(status)) {		printf("SetUserInfo level %u failed - %s\n",		       s.in.level, nt_errstr(status));		ret = false;	} else {		*password = newpass;	}	return ret;}static bool test_SetUserPass_23(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, 				struct policy_handle *handle, uint32_t fields_present,				char **password){	NTSTATUS status;	struct samr_SetUserInfo s;	union samr_UserInfo u;	bool ret = true;	DATA_BLOB session_key;	char *newpass;	struct samr_GetUserPwInfo pwp;	int policy_min_pw_len = 0;	pwp.in.user_handle = 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);	s.in.user_handle = handle;	s.in.info = &u;	s.in.level = 23;	ZERO_STRUCT(u);	u.info23.info.fields_present = fields_present;	encode_pw_buffer(u.info23.password.data, newpass, STR_UNICODE);	status = dcerpc_fetch_session_key(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;	}	arcfour_crypt_blob(u.info23.password.data, 516, &session_key);	printf("Testing SetUserInfo level 23 (set password)\n");	status = dcerpc_samr_SetUserInfo(p, mem_ctx, &s);	if (!NT_STATUS_IS_OK(status)) {		printf("SetUserInfo level %u failed - %s\n",		       s.in.level, nt_errstr(status));		ret = false;	} else {		*password = newpass;	}	encode_pw_buffer(u.info23.password.data, newpass, STR_UNICODE);	status = dcerpc_fetch_session_key(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;	}	/* This should break the key nicely */	session_key.length--;	arcfour_crypt_blob(u.info23.password.data, 516, &session_key);	printf("Testing SetUserInfo level 23 (set password) with wrong password\n");	status = dcerpc_samr_SetUserInfo(p, mem_ctx, &s);	if (!NT_STATUS_EQUAL(status, NT_STATUS_WRONG_PASSWORD)) {		printf("SetUserInfo level %u should have failed with WRONG_PASSWORD- %s\n",		       s.in.level, nt_errstr(status));		ret = false;	}	return ret;}static bool test_SetUserPassEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, 			       struct policy_handle *handle, bool makeshort, 			       char **password){	NTSTATUS status;	struct samr_SetUserInfo s;	union samr_UserInfo u;	bool ret = true;	DATA_BLOB session_key;	DATA_BLOB confounded_session_key = data_blob_talloc(mem_ctx, NULL, 16);	uint8_t confounder[16];	char *newpass;	struct MD5Context ctx;	struct samr_GetUserPwInfo pwp;	int policy_min_pw_len = 0;	pwp.in.user_handle = 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;	}	if (makeshort && policy_min_pw_len) {		newpass = samr_rand_pass_fixed_len(mem_ctx, policy_min_pw_len - 1);	} else {		newpass = samr_rand_pass(mem_ctx, policy_min_pw_len);	}	s.in.user_handle = handle;	s.in.info = &u;	s.in.level = 26;	encode_pw_buffer(u.info26.password.data, newpass, STR_UNICODE);	u.info26.pw_len = strlen(newpass);	status = dcerpc_fetch_session_key(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;	}	generate_random_buffer((uint8_t *)confounder, 16);	MD5Init(&ctx);	MD5Update(&ctx, confounder, 16);	MD5Update(&ctx, session_key.data, session_key.length);	MD5Final(confounded_session_key.data, &ctx);	arcfour_crypt_blob(u.info26.password.data, 516, &confounded_session_key);	memcpy(&u.info26.password.data[516], confounder, 16);	printf("Testing SetUserInfo level 26 (set password ex)\n");	status = dcerpc_samr_SetUserInfo(p, mem_ctx, &s);	if (!NT_STATUS_IS_OK(status)) {		printf("SetUserInfo level %u failed - %s\n",		       s.in.level, nt_errstr(status));		ret = false;	} else {		*password = newpass;	}	/* This should break the key nicely */	confounded_session_key.data[0]++;	arcfour_crypt_blob(u.info26.password.data, 516, &confounded_session_key);	memcpy(&u.info26.password.data[516], confounder, 16);	printf("Testing SetUserInfo level 26 (set password ex) with wrong session key\n");	status = dcerpc_samr_SetUserInfo(p, mem_ctx, &s);	if (!NT_STATUS_EQUAL(status, NT_STATUS_WRONG_PASSWORD)) {		printf("SetUserInfo level %u should have failed with WRONG_PASSWORD: %s\n",		       s.in.level, nt_errstr(status));		ret = false;	} else {		*password = newpass;	}	return ret;}static bool test_SetUserPass_25(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, 				struct policy_handle *handle, uint32_t fields_present,				char **password){	NTSTATUS status;	struct samr_SetUserInfo s;	union samr_UserInfo u;	bool ret = true;	DATA_BLOB session_key;	DATA_BLOB confounded_session_key = data_blob_talloc(mem_ctx, NULL, 16);	struct MD5Context ctx;	uint8_t confounder[16];	char *newpass;	struct samr_GetUserPwInfo pwp;	int policy_min_pw_len = 0;	pwp.in.user_handle = 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);	s.in.user_handle = handle;	s.in.info = &u;	s.in.level = 25;	ZERO_STRUCT(u);	u.info25.info.fields_present = fields_present;	encode_pw_buffer(u.info25.password.data, newpass, STR_UNICODE);	status = dcerpc_fetch_session_key(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;	}	generate_random_buffer((uint8_t *)confounder, 16);	MD5Init(&ctx);	MD5Update(&ctx, confounder, 16);	MD5Update(&ctx, session_key.data, session_key.length);	MD5Final(confounded_session_key.data, &ctx);	arcfour_crypt_blob(u.info25.password.data, 516, &confounded_session_key);	memcpy(&u.info25.password.data[516], confounder, 16);	printf("Testing SetUserInfo level 25 (set password ex)\n");	status = dcerpc_samr_SetUserInfo(p, mem_ctx, &s);	if (!NT_STATUS_IS_OK(status)) {		printf("SetUserInfo level %u failed - %s\n",		       s.in.level, nt_errstr(status));		ret = false;	} else {		*password = newpass;	}	/* This should break the key nicely */	confounded_session_key.data[0]++;	arcfour_crypt_blob(u.info25.password.data, 516, &confounded_session_key);	memcpy(&u.info25.password.data[516], confounder, 16);	printf("Testing SetUserInfo level 25 (set password ex) with wrong session key\n");	status = dcerpc_samr_SetUserInfo(p, mem_ctx, &s);	if (!NT_STATUS_EQUAL(status, NT_STATUS_WRONG_PASSWORD)) {		printf("SetUserInfo level %u should have failed with WRONG_PASSWORD- %s\n",		       s.in.level, nt_errstr(status));		ret = false;	}	return ret;}static bool test_SetAliasInfo(struct dcerpc_pipe *p, struct torture_context *tctx,			       struct policy_handle *handle){	NTSTATUS status;	struct samr_SetAliasInfo r;	struct samr_QueryAliasInfo q;	uint16_t levels[] = {2, 3};	int i;	bool ret = true;	/* Ignoring switch level 1, as that includes the number of members for the alias	 * and setting this to a wrong value might have negative consequences	 */	for (i=0;i<ARRAY_SIZE(levels);i++) {		printf("Testing SetAliasInfo level %u\n", levels[i]);		r.in.alias_handle = handle;		r.in.level = levels[i];		r.in.info  = talloc(tctx, union samr_AliasInfo);		switch (r.in.level) {		    case ALIASINFONAME: init_lsa_String(&r.in.info->name,TEST_ALIASNAME); break;		    case ALIASINFODESCRIPTION: init_lsa_String(&r.in.info->description,				"Test Description, should test I18N as well"); break;		    case ALIASINFOALL: printf("ALIASINFOALL ignored\n"); break;		}		status = dcerpc_samr_SetAliasInfo(p, tctx, &r);		if (!NT_STATUS_IS_OK(status)) {			printf("SetAliasInfo level %u failed - %s\n",			       levels[i], nt_errstr(status));			ret = false;		}		q.in.alias_handle = handle;		q.in.level = levels[i];		status = dcerpc_samr_QueryAliasInfo(p, tctx, &q);		if (!NT_STATUS_IS_OK(status)) {			printf("QueryAliasInfo level %u failed - %s\n",			       levels[i], nt_errstr(status));			ret = false;		}	}	return ret;}static bool test_GetGroupsForUser(struct dcerpc_pipe *p, struct torture_context *tctx,				  struct policy_handle *user_handle){	struct samr_GetGroupsForUser r;	NTSTATUS status;

⌨️ 快捷键说明

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