samr.c

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

C
2,122
字号
	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 = 0;	r.in.nt_cross = NULL;	r.in.cross2_present = 1;	r.in.lm_cross = &hash6;	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_NT_CROSS_ENCRYPTION_REQUIRED, 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;	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_EQUAL(status, NT_STATUS_PASSWORD_RESTRICTION)) {		printf("ChangePasswordUser returned: %s perhaps min password age? (not fatal)\n", nt_errstr(status));	} else 	if (!NT_STATUS_IS_OK(status)) {		printf("ChangePasswordUser failed - %s\n", nt_errstr(status));		ret = false;	} else {		changed = true;		*password = newpass;	}	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;	r.in.lm_cross = &hash6;	if (changed) {		status = dcerpc_samr_ChangePasswordUser(p, mem_ctx, &r);		if (NT_STATUS_EQUAL(status, NT_STATUS_PASSWORD_RESTRICTION)) {			printf("ChangePasswordUser returned: %s perhaps min password age? (not fatal)\n", nt_errstr(status));		} else if (!NT_STATUS_EQUAL(status, NT_STATUS_WRONG_PASSWORD)) {			printf("ChangePasswordUser failed: expected NT_STATUS_WRONG_PASSWORD because we already changed the password, got %s\n", nt_errstr(status));			ret = false;		}	}		if (!test_samr_handle_Close(p, mem_ctx, &user_handle)) {		ret = false;	}	return ret;}static bool test_OemChangePasswordUser2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, 					const char *acct_name,					struct policy_handle *handle, char **password){	NTSTATUS status;	struct samr_OemChangePasswordUser2 r;	bool ret = true;	struct samr_Password lm_verifier;	struct samr_CryptPassword lm_pass;	struct lsa_AsciiString server, account, account_bad;	char *oldpass;	char *newpass;	uint8_t old_lm_hash[16], new_lm_hash[16];	struct samr_GetDomPwInfo dom_pw_info;	int policy_min_pw_len = 0;	struct lsa_String domain_name;	domain_name.string = "";	dom_pw_info.in.domain_name = &domain_name;	printf("Testing OemChangePasswordUser2\n");	if (!*password) {		printf("Failing OemChangePasswordUser2 as old password was NULL.  Previous test failed?\n");		return false;	}	oldpass = *password;	status = dcerpc_samr_GetDomPwInfo(p, mem_ctx, &dom_pw_info);	if (NT_STATUS_IS_OK(status)) {		policy_min_pw_len = dom_pw_info.out.info.min_password_length;	}	newpass = samr_rand_pass(mem_ctx, policy_min_pw_len);	server.string = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));	account.string = acct_name;	E_deshash(oldpass, old_lm_hash);	E_deshash(newpass, new_lm_hash);	encode_pw_buffer(lm_pass.data, newpass, STR_ASCII);	arcfour_crypt(lm_pass.data, old_lm_hash, 516);	E_old_pw_hash(new_lm_hash, old_lm_hash, lm_verifier.hash);	r.in.server = &server;	r.in.account = &account;	r.in.password = &lm_pass;	r.in.hash = &lm_verifier;	/* Break the verification */	lm_verifier.hash[0]++;	status = dcerpc_samr_OemChangePasswordUser2(p, mem_ctx, &r);	if (!NT_STATUS_EQUAL(status, NT_STATUS_PASSWORD_RESTRICTION)	    && !NT_STATUS_EQUAL(status, NT_STATUS_WRONG_PASSWORD)) {		printf("ChangePasswordUser3 failed, should have returned WRONG_PASSWORD (or at least 'PASSWORD_RESTRICTON') for invalid password verifier - %s\n",			nt_errstr(status));		ret = false;	}	encode_pw_buffer(lm_pass.data, newpass, STR_ASCII);	/* Break the old password */	old_lm_hash[0]++;	arcfour_crypt(lm_pass.data, old_lm_hash, 516);	/* unbreak it for the next operation */	old_lm_hash[0]--;	E_old_pw_hash(new_lm_hash, old_lm_hash, lm_verifier.hash);	r.in.server = &server;	r.in.account = &account;	r.in.password = &lm_pass;	r.in.hash = &lm_verifier;	status = dcerpc_samr_OemChangePasswordUser2(p, mem_ctx, &r);	if (!NT_STATUS_EQUAL(status, NT_STATUS_PASSWORD_RESTRICTION)	    && !NT_STATUS_EQUAL(status, NT_STATUS_WRONG_PASSWORD)) {		printf("ChangePasswordUser3 failed, should have returned WRONG_PASSWORD (or at least 'PASSWORD_RESTRICTON') for invalidly encrpted password - %s\n",			nt_errstr(status));		ret = false;	}	encode_pw_buffer(lm_pass.data, newpass, STR_ASCII);	arcfour_crypt(lm_pass.data, old_lm_hash, 516);	r.in.server = &server;	r.in.account = &account;	r.in.password = &lm_pass;	r.in.hash = NULL;	status = dcerpc_samr_OemChangePasswordUser2(p, mem_ctx, &r);	if (!NT_STATUS_EQUAL(status, NT_STATUS_PASSWORD_RESTRICTION)	    && !NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) {		printf("ChangePasswordUser3 failed, should have returned INVALID_PARAMETER (or at least 'PASSWORD_RESTRICTON') for no supplied validation hash - %s\n",			nt_errstr(status));		ret = false;	}	/* This shouldn't be a valid name */	account_bad.string = TEST_ACCOUNT_NAME "XX";	r.in.account = &account_bad;	status = dcerpc_samr_OemChangePasswordUser2(p, mem_ctx, &r);	if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) {		printf("ChangePasswordUser3 failed, should have returned INVALID_PARAMETER for no supplied validation hash and invalid user - %s\n",			nt_errstr(status));		ret = false;	}	/* This shouldn't be a valid name */	account_bad.string = TEST_ACCOUNT_NAME "XX";	r.in.account = &account_bad;	r.in.password = &lm_pass;	r.in.hash = &lm_verifier;	status = dcerpc_samr_OemChangePasswordUser2(p, mem_ctx, &r);	if (!NT_STATUS_EQUAL(status, NT_STATUS_WRONG_PASSWORD)) {		printf("ChangePasswordUser3 failed, should have returned WRONG_PASSWORD for invalid user - %s\n",			nt_errstr(status));		ret = false;	}	/* This shouldn't be a valid name */	account_bad.string = TEST_ACCOUNT_NAME "XX";	r.in.account = &account_bad;	r.in.password = NULL;	r.in.hash = &lm_verifier;	status = dcerpc_samr_OemChangePasswordUser2(p, mem_ctx, &r);	if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) {		printf("ChangePasswordUser3 failed, should have returned INVALID_PARAMETER for no supplied password and invalid user - %s\n",			nt_errstr(status));		ret = false;	}	E_deshash(oldpass, old_lm_hash);	E_deshash(newpass, new_lm_hash);	encode_pw_buffer(lm_pass.data, newpass, STR_ASCII);	arcfour_crypt(lm_pass.data, old_lm_hash, 516);	E_old_pw_hash(new_lm_hash, old_lm_hash, lm_verifier.hash);	r.in.server = &server;	r.in.account = &account;	r.in.password = &lm_pass;	r.in.hash = &lm_verifier;	status = dcerpc_samr_OemChangePasswordUser2(p, mem_ctx, &r);	if (NT_STATUS_EQUAL(status, NT_STATUS_PASSWORD_RESTRICTION)) {		printf("OemChangePasswordUser2 returned: %s perhaps min password age? (not fatal)\n", nt_errstr(status));	} else if (!NT_STATUS_IS_OK(status)) {		printf("OemChangePasswordUser2 failed - %s\n", nt_errstr(status));		ret = false;	} else {		*password = newpass;	}	return ret;}static bool test_ChangePasswordUser2(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, 				     const char *acct_name,				     char **password,				     char *newpass, bool allow_password_restriction){	NTSTATUS status;	struct samr_ChangePasswordUser2 r;	bool ret = true;	struct lsa_String server, account;	struct samr_CryptPassword nt_pass, lm_pass;	struct samr_Password nt_verifier, lm_verifier;	char *oldpass;	uint8_t old_nt_hash[16], new_nt_hash[16];	uint8_t old_lm_hash[16], new_lm_hash[16];	struct samr_GetDomPwInfo dom_pw_info;	struct lsa_String domain_name;	domain_name.string = "";	dom_pw_info.in.domain_name = &domain_name;	printf("Testing ChangePasswordUser2 on %s\n", acct_name);	if (!*password) {		printf("Failing ChangePasswordUser3 as old password was NULL.  Previous test failed?\n");		return false;	}	oldpass = *password;	if (!newpass) {		int policy_min_pw_len = 0;		status = dcerpc_samr_GetDomPwInfo(p, mem_ctx, &dom_pw_info);		if (NT_STATUS_IS_OK(status)) {			policy_min_pw_len = dom_pw_info.out.info.min_password_length;		}		newpass = samr_rand_pass(mem_ctx, policy_min_pw_len);	} 	server.string = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));	init_lsa_String(&account, acct_name);	E_md4hash(oldpass, old_nt_hash);	E_md4hash(newpass, new_nt_hash);	E_deshash(oldpass, old_lm_hash);	E_deshash(newpass, new_lm_hash);	encode_pw_buffer(lm_pass.data, newpass, STR_ASCII|STR_TERMINATE);	arcfour_crypt(lm_pass.data, old_lm_hash, 516);	E_old_pw_hash(new_nt_hash, old_lm_hash, lm_verifier.hash);	encode_pw_buffer(nt_pass.data, newpass, STR_UNICODE);	arcfour_crypt(nt_pass.data, old_nt_hash, 516);	E_old_pw_hash(new_nt_hash, old_nt_hash, nt_verifier.hash);	r.in.server = &server;	r.in.account = &account;	r.in.nt_password = &nt_pass;	r.in.nt_verifier = &nt_verifier;	r.in.lm_change = 1;	r.in.lm_password = &lm_pass;	r.in.lm_verifier = &lm_verifier;	status = dcerpc_samr_ChangePasswordUser2(p, mem_ctx, &r);	if (allow_password_restriction && NT_STATUS_EQUAL(status, NT_STATUS_PASSWORD_RESTRICTION)) {		printf("ChangePasswordUser2 returned: %s perhaps min password age? (not fatal)\n", nt_errstr(status));	} else if (!NT_STATUS_IS_OK(status)) {		printf("ChangePasswordUser2 failed - %s\n", nt_errstr(status));		ret = false;	} else {		*password = newpass;	}	return ret;}bool test_ChangePasswordUser3(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, 			      const char *account_string,			      int policy_min_pw_len,			      char **password,			      const char *newpass,			      NTTIME last_password_change,			      bool handle_reject_reason){	NTSTATUS status;	struct samr_ChangePasswordUser3 r;	bool ret = true;	struct lsa_String server, account, account_bad;	struct samr_CryptPassword nt_pass, lm_pass;	struct samr_Password nt_verifier, lm_verifier;	char *oldpass;	uint8_t old_nt_hash[16], new_nt_hash[16];	uint8_t old_lm_hash[16], new_lm_hash[16];	NTTIME t;	printf("Testing ChangePasswordUser3\n");	if (newpass == NULL) {		do {			if (policy_min_pw_len == 0) {				newpass = samr_rand_pass(mem_ctx, policy_min_pw_len);			} else {				newpass = samr_rand_pass_fixed_len(mem_ctx, policy_min_pw_len);			}		} while (check_password_quality(newpass) == false);	} else {		printf("Using password '%s'\n", newpass);	}	if (!*password) {		printf("Failing ChangePasswordUser3 as old password was NULL.  Previous test failed?\n");		return false;	}	oldpass = *password;	server.string = talloc_asprintf(mem_ctx, "\\\\%s", dcerpc_server_name(p));	init_lsa_String(&account, account_string);	E_md4hash(oldpass, old_nt_hash);	E_md4hash(newpass, new_nt_hash);	E_deshash(oldpass, old_lm_hash);	E_deshash(newpass, new_lm_hash);	encode_pw_buffer(lm_pass.data, newpass, STR_UNICODE);	arcfour_crypt(lm_pass.data, old_nt_hash, 516);	E_old_pw_hash(new_nt_hash, old_lm_hash, lm_verifier.hash);	encode_pw_buffer(nt_pass.data, newpass, STR_UNICODE);	arcfour_crypt(nt_pass.data, old_nt_hash, 516);	E_old_pw_hash(new_nt_hash, old_nt_hash, nt_verifier.hash);		/* Break the verification */	nt_verifier.hash[0]++;	r.in.server = &server;	r.in.account = &account;	r.in.nt_password = &nt_pass;	r.in.nt_verifier = &nt_verifier;	r.in.lm_change = 1;	r.in.lm_password = &lm_pass;	r.in.lm_verifier = &lm_verifier;	r.in.password3 = NULL;	status = dcerpc_samr_ChangePasswordUser3(p, mem_ctx, &r);	if (!NT_STATUS_EQUAL(status, NT_STATUS_PASSWORD_RESTRICTION) &&	    (!NT_STATUS_EQUAL(status, NT_STATUS_WRONG_PASSWORD))) {		printf("ChangePasswordUser3 failed, should have returned WRONG_PASSWORD (or at least 'PASSWORD_RESTRICTON') for invalid password verifier - %s\n",			nt_errstr(status));		ret = false;	}		encode_pw_buffer(lm_pass.data, newpass, STR_UNICODE);	arcfour_crypt(lm_pass.data, old_nt_hash, 516);	E_old_pw_hash(new_nt_hash, old_lm_hash, lm_verifier.hash);	encode_pw_buffer(nt_pass.data, newpass, STR_UNICODE);	/* Break the NT hash */	old_nt_hash[0]++;	arcfour_crypt(nt_pass.data, old_nt_hash, 516);	/* Unbreak it again */

⌨️ 快捷键说明

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