⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ntlmssp.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
			ntlmssp_state->session_key = session_key;		} else {			dump_data_pw("KEY_EXCH session key (enc):\n", encrypted_session_key.data, encrypted_session_key.length);			SamOEMhash(encrypted_session_key.data, 				   session_key.data, 				   encrypted_session_key.length);			ntlmssp_state->session_key = data_blob_talloc(ntlmssp_state->mem_ctx, 								      encrypted_session_key.data, 								      encrypted_session_key.length);			dump_data_pw("KEY_EXCH session key:\n", encrypted_session_key.data, 				     encrypted_session_key.length);		}	} else {		ntlmssp_state->session_key = session_key;	}	if (!NT_STATUS_IS_OK(nt_status)) {		ntlmssp_state->session_key = data_blob(NULL, 0);	} else if (ntlmssp_state->session_key.length) {		nt_status = ntlmssp_sign_init(ntlmssp_state);	}	data_blob_free(&encrypted_session_key);		/* Only one authentication allowed per server state. */	ntlmssp_state->expected_state = NTLMSSP_DONE;	return nt_status;}/** * Create an NTLMSSP state machine *  * @param ntlmssp_state NTLMSSP State, allocated by this function */NTSTATUS ntlmssp_server_start(NTLMSSP_STATE **ntlmssp_state){	TALLOC_CTX *mem_ctx;	mem_ctx = talloc_init("NTLMSSP context");		*ntlmssp_state = TALLOC_ZERO_P(mem_ctx, NTLMSSP_STATE);	if (!*ntlmssp_state) {		DEBUG(0,("ntlmssp_server_start: talloc failed!\n"));		talloc_destroy(mem_ctx);		return NT_STATUS_NO_MEMORY;	}	(*ntlmssp_state)->role = NTLMSSP_SERVER;	(*ntlmssp_state)->mem_ctx = mem_ctx;	(*ntlmssp_state)->get_challenge = get_challenge;	(*ntlmssp_state)->set_challenge = set_challenge;	(*ntlmssp_state)->may_set_challenge = may_set_challenge;	(*ntlmssp_state)->get_global_myname = global_myname;	(*ntlmssp_state)->get_domain = lp_workgroup;	(*ntlmssp_state)->server_role = ROLE_DOMAIN_MEMBER; /* a good default */	(*ntlmssp_state)->expected_state = NTLMSSP_NEGOTIATE;	(*ntlmssp_state)->ref_count = 1;	(*ntlmssp_state)->neg_flags = 		NTLMSSP_NEGOTIATE_128 |		NTLMSSP_NEGOTIATE_NTLM |		NTLMSSP_NEGOTIATE_NTLM2 |		NTLMSSP_NEGOTIATE_KEY_EXCH |		NTLMSSP_NEGOTIATE_SIGN |		NTLMSSP_NEGOTIATE_SEAL;	return NT_STATUS_OK;}/********************************************************************* Client side NTLMSSP*********************************************************************//** * Next state function for the Initial packet *  * @param ntlmssp_state NTLMSSP State * @param request The request, as a DATA_BLOB.  reply.data must be NULL * @param request The reply, as an allocated DATA_BLOB, caller to free. * @return Errors or NT_STATUS_OK.  */static NTSTATUS ntlmssp_client_initial(struct ntlmssp_state *ntlmssp_state, 				  DATA_BLOB reply, DATA_BLOB *next_request) {	if (ntlmssp_state->unicode) {		ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_UNICODE;	} else {		ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_OEM;	}		if (ntlmssp_state->use_ntlmv2) {		ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_NTLM2;	}	/* generate the ntlmssp negotiate packet */	msrpc_gen(next_request, "CddAA",		  "NTLMSSP",		  NTLMSSP_NEGOTIATE,		  ntlmssp_state->neg_flags,		  ntlmssp_state->get_domain(), 		  ntlmssp_state->get_global_myname());	ntlmssp_state->expected_state = NTLMSSP_CHALLENGE;	return NT_STATUS_MORE_PROCESSING_REQUIRED;}/** * Next state function for the Challenge Packet.  Generate an auth packet. *  * @param ntlmssp_state NTLMSSP State * @param request The request, as a DATA_BLOB.  reply.data must be NULL * @param request The reply, as an allocated DATA_BLOB, caller to free. * @return Errors or NT_STATUS_OK.  */static NTSTATUS ntlmssp_client_challenge(struct ntlmssp_state *ntlmssp_state, 					 const DATA_BLOB reply, DATA_BLOB *next_request) {	uint32 chal_flags, ntlmssp_command, unkn1, unkn2;	DATA_BLOB server_domain_blob;	DATA_BLOB challenge_blob;	DATA_BLOB struct_blob = data_blob(NULL, 0);	char *server_domain;	const char *chal_parse_string;	const char *auth_gen_string;	DATA_BLOB lm_response = data_blob(NULL, 0);	DATA_BLOB nt_response = data_blob(NULL, 0);	DATA_BLOB session_key = data_blob(NULL, 0);	DATA_BLOB encrypted_session_key = data_blob(NULL, 0);	NTSTATUS nt_status = NT_STATUS_OK;	if (!msrpc_parse(&reply, "CdBd",			 "NTLMSSP",			 &ntlmssp_command, 			 &server_domain_blob,			 &chal_flags)) {		DEBUG(1, ("Failed to parse the NTLMSSP Challenge: (#1)\n"));		dump_data(2, (const char *)reply.data, reply.length);		return NT_STATUS_INVALID_PARAMETER;	}		data_blob_free(&server_domain_blob);	DEBUG(3, ("Got challenge flags:\n"));	debug_ntlmssp_flags(chal_flags);	ntlmssp_handle_neg_flags(ntlmssp_state, chal_flags, lp_client_lanman_auth());	if (ntlmssp_state->unicode) {		if (chal_flags & NTLMSSP_CHAL_TARGET_INFO) {			chal_parse_string = "CdUdbddB";		} else {			chal_parse_string = "CdUdbdd";		}		auth_gen_string = "CdBBUUUBd";	} else {		if (chal_flags & NTLMSSP_CHAL_TARGET_INFO) {			chal_parse_string = "CdAdbddB";		} else {			chal_parse_string = "CdAdbdd";		}		auth_gen_string = "CdBBAAABd";	}	DEBUG(3, ("NTLMSSP: Set final flags:\n"));	debug_ntlmssp_flags(ntlmssp_state->neg_flags);	if (!msrpc_parse(&reply, chal_parse_string,			 "NTLMSSP",			 &ntlmssp_command, 			 &server_domain,			 &chal_flags,			 &challenge_blob, 8,			 &unkn1, &unkn2,			 &struct_blob)) {		DEBUG(1, ("Failed to parse the NTLMSSP Challenge: (#2)\n"));		dump_data(2, (const char *)reply.data, reply.length);		return NT_STATUS_INVALID_PARAMETER;	}	ntlmssp_state->server_domain = talloc_strdup(ntlmssp_state->mem_ctx,						     server_domain);	SAFE_FREE(server_domain);	if (challenge_blob.length != 8) {		data_blob_free(&struct_blob);		return NT_STATUS_INVALID_PARAMETER;	}	if (!ntlmssp_state->password) {		static const uchar zeros[16];		/* do nothing - blobs are zero length */		/* session key is all zeros */		session_key = data_blob_talloc(ntlmssp_state->mem_ctx, zeros, 16);				/* not doing NLTM2 without a password */		ntlmssp_state->neg_flags &= ~NTLMSSP_NEGOTIATE_NTLM2;	} else if (ntlmssp_state->use_ntlmv2) {		if (!struct_blob.length) {			/* be lazy, match win2k - we can't do NTLMv2 without it */			DEBUG(1, ("Server did not provide 'target information', required for NTLMv2\n"));			return NT_STATUS_INVALID_PARAMETER;		}		/* TODO: if the remote server is standalone, then we should replace 'domain'		   with the server name as supplied above */				if (!SMBNTLMv2encrypt(ntlmssp_state->user, 				      ntlmssp_state->domain, 				      ntlmssp_state->password, &challenge_blob, 				      &struct_blob, 				      &lm_response, &nt_response, &session_key)) {			data_blob_free(&challenge_blob);			data_blob_free(&struct_blob);			return NT_STATUS_NO_MEMORY;		}	} else if (ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_NTLM2) {		struct MD5Context md5_session_nonce_ctx;		uchar nt_hash[16];		uchar session_nonce[16];		uchar session_nonce_hash[16];		uchar user_session_key[16];		E_md4hash(ntlmssp_state->password, nt_hash);				lm_response = data_blob_talloc(ntlmssp_state->mem_ctx, NULL, 24);		generate_random_buffer(lm_response.data, 8);		memset(lm_response.data+8, 0, 16);		memcpy(session_nonce, challenge_blob.data, 8);		memcpy(&session_nonce[8], lm_response.data, 8);			MD5Init(&md5_session_nonce_ctx);		MD5Update(&md5_session_nonce_ctx, challenge_blob.data, 8);		MD5Update(&md5_session_nonce_ctx, lm_response.data, 8);		MD5Final(session_nonce_hash, &md5_session_nonce_ctx);		DEBUG(5, ("NTLMSSP challenge set by NTLM2\n"));		DEBUG(5, ("challenge is: \n"));		dump_data(5, (const char *)session_nonce_hash, 8);				nt_response = data_blob_talloc(ntlmssp_state->mem_ctx, NULL, 24);		SMBNTencrypt(ntlmssp_state->password,			     session_nonce_hash,			     nt_response.data);		session_key = data_blob_talloc(ntlmssp_state->mem_ctx, NULL, 16);		SMBsesskeygen_ntv1(nt_hash, NULL, user_session_key);		hmac_md5(user_session_key, session_nonce, sizeof(session_nonce), session_key.data);		dump_data_pw("NTLM2 session key:\n", session_key.data, session_key.length);	} else {		uchar lm_hash[16];		uchar nt_hash[16];		E_deshash(ntlmssp_state->password, lm_hash);		E_md4hash(ntlmssp_state->password, nt_hash);				/* lanman auth is insecure, it may be disabled */		if (lp_client_lanman_auth()) {			lm_response = data_blob_talloc(ntlmssp_state->mem_ctx, NULL, 24);			SMBencrypt(ntlmssp_state->password,challenge_blob.data,				   lm_response.data);		}				nt_response = data_blob_talloc(ntlmssp_state->mem_ctx, NULL, 24);		SMBNTencrypt(ntlmssp_state->password,challenge_blob.data,			     nt_response.data);				session_key = data_blob_talloc(ntlmssp_state->mem_ctx, NULL, 16);		if ((ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_LM_KEY) 		    && lp_client_lanman_auth()) {			SMBsesskeygen_lm_sess_key(lm_hash, lm_response.data,					session_key.data);			dump_data_pw("LM session key\n", session_key.data, session_key.length);		} else {			SMBsesskeygen_ntv1(nt_hash, NULL, session_key.data);			dump_data_pw("NT session key:\n", session_key.data, session_key.length);		}	}	data_blob_free(&struct_blob);	/* Key exchange encryptes a new client-generated session key with	   the password-derived key */	if (ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_KEY_EXCH) {		/* Make up a new session key */		uint8 client_session_key[16];		generate_random_buffer(client_session_key, sizeof(client_session_key));		/* Encrypt the new session key with the old one */		encrypted_session_key = data_blob(client_session_key, sizeof(client_session_key));		dump_data_pw("KEY_EXCH session key:\n", encrypted_session_key.data, encrypted_session_key.length);		SamOEMhash(encrypted_session_key.data, session_key.data, encrypted_session_key.length);		dump_data_pw("KEY_EXCH session key (enc):\n", encrypted_session_key.data, encrypted_session_key.length);		/* Mark the new session key as the 'real' session key */		data_blob_free(&session_key);		session_key = data_blob_talloc(ntlmssp_state->mem_ctx, client_session_key, sizeof(client_session_key));	}	/* this generates the actual auth packet */	if (!msrpc_gen(next_request, auth_gen_string, 		       "NTLMSSP", 		       NTLMSSP_AUTH, 		       lm_response.data, lm_response.length,		       nt_response.data, nt_response.length,		       ntlmssp_state->domain, 		       ntlmssp_state->user, 		       ntlmssp_state->get_global_myname(), 		       encrypted_session_key.data, encrypted_session_key.length,		       ntlmssp_state->neg_flags)) {				return NT_STATUS_NO_MEMORY;	}	data_blob_free(&encrypted_session_key);	data_blob_free(&ntlmssp_state->chal);	ntlmssp_state->session_key = session_key;	ntlmssp_state->chal = challenge_blob;	ntlmssp_state->lm_resp = lm_response;	ntlmssp_state->nt_resp = nt_response;	ntlmssp_state->expected_state = NTLMSSP_DONE;	if (!NT_STATUS_IS_OK(nt_status = ntlmssp_sign_init(ntlmssp_state))) {		DEBUG(1, ("Could not setup NTLMSSP signing/sealing system (error was: %s)\n", nt_errstr(nt_status)));	}	return nt_status;}NTSTATUS ntlmssp_client_start(NTLMSSP_STATE **ntlmssp_state){	TALLOC_CTX *mem_ctx;	mem_ctx = talloc_init("NTLMSSP Client context");		*ntlmssp_state = TALLOC_ZERO_P(mem_ctx, NTLMSSP_STATE);	if (!*ntlmssp_state) {		DEBUG(0,("ntlmssp_client_start: talloc failed!\n"));		talloc_destroy(mem_ctx);		return NT_STATUS_NO_MEMORY;	}	(*ntlmssp_state)->role = NTLMSSP_CLIENT;	(*ntlmssp_state)->mem_ctx = mem_ctx;	(*ntlmssp_state)->get_global_myname = global_myname;	(*ntlmssp_state)->get_domain = lp_workgroup;	(*ntlmssp_state)->unicode = True;	(*ntlmssp_state)->use_ntlmv2 = lp_client_ntlmv2_auth();	(*ntlmssp_state)->expected_state = NTLMSSP_INITIAL;	(*ntlmssp_state)->ref_count = 1;	(*ntlmssp_state)->neg_flags = 		NTLMSSP_NEGOTIATE_128 |		NTLMSSP_NEGOTIATE_NTLM |		NTLMSSP_NEGOTIATE_NTLM2 |		NTLMSSP_NEGOTIATE_KEY_EXCH |		/*		 * We need to set this to allow a later SetPassword		 * via the SAMR pipe to succeed. Strange.... We could		 * also add  NTLMSSP_NEGOTIATE_SEAL here. JRA.		 * */		NTLMSSP_NEGOTIATE_SIGN |		NTLMSSP_REQUEST_TARGET;	return NT_STATUS_OK;}

⌨️ 快捷键说明

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