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

📄 cracknames.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 3 页
字号:
			result_filter = talloc_asprintf(mem_ctx, "(name=%s)",							account);	       			W_ERROR_HAVE_NO_MEMORY(result_filter);		}		break;	}	case DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT: {		char *p;		char *domain;		const char *account = NULL;				domain = talloc_strdup(mem_ctx, name);		W_ERROR_HAVE_NO_MEMORY(domain);				p = strchr(domain, '\\');		if (!p) {			/* invalid input format */			info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;			return WERR_OK;		}		p[0] = '\0';				if (p[1]) {			account = &p[1];		}				domain_filter = talloc_asprintf(mem_ctx, 						"(&(&(nETBIOSName=%s)(objectclass=crossRef))(ncName=*))", 						ldb_binary_encode_string(mem_ctx, domain));		W_ERROR_HAVE_NO_MEMORY(domain_filter);		if (account) {			result_filter = talloc_asprintf(mem_ctx, "(sAMAccountName=%s)",							ldb_binary_encode_string(mem_ctx, account));			W_ERROR_HAVE_NO_MEMORY(result_filter);		}				talloc_free(domain);		break;	}		/* A LDAP DN as a string */	case DRSUAPI_DS_NAME_FORMAT_FQDN_1779: {		domain_filter = NULL;		name_dn = ldb_dn_new(mem_ctx, sam_ctx, name);		if (! ldb_dn_validate(name_dn)) {			info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;			return WERR_OK;		}		break;	}		/* A GUID as a string */	case DRSUAPI_DS_NAME_FORMAT_GUID: {		struct GUID guid;		char *ldap_guid;		NTSTATUS nt_status;		domain_filter = NULL;		nt_status = GUID_from_string(name, &guid);		if (!NT_STATUS_IS_OK(nt_status)) {			info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;			return WERR_OK;		}					ldap_guid = ldap_encode_ndr_GUID(mem_ctx, &guid);		if (!ldap_guid) {			return WERR_NOMEM;		}		result_filter = talloc_asprintf(mem_ctx, "(objectGUID=%s)",						ldap_guid);		W_ERROR_HAVE_NO_MEMORY(result_filter);		break;	}	case DRSUAPI_DS_NAME_FORMAT_DISPLAY: {		domain_filter = NULL;		result_filter = talloc_asprintf(mem_ctx, "(|(displayName=%s)(samAccountName=%s))",						ldb_binary_encode_string(mem_ctx, name), 						ldb_binary_encode_string(mem_ctx, name));		W_ERROR_HAVE_NO_MEMORY(result_filter);		break;	}			/* A S-1234-5678 style string */	case DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY: {		struct dom_sid *sid = dom_sid_parse_talloc(mem_ctx, name);		char *ldap_sid;									    		domain_filter = NULL;		if (!sid) {			info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;			return WERR_OK;		}		ldap_sid = ldap_encode_ndr_dom_sid(mem_ctx, 						   sid);		if (!ldap_sid) {			return WERR_NOMEM;		}		result_filter = talloc_asprintf(mem_ctx, "(objectSid=%s)",						ldap_sid);		W_ERROR_HAVE_NO_MEMORY(result_filter);		break;	}	case DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL: {		krb5_principal principal;		char *unparsed_name;		ret = krb5_parse_name(smb_krb5_context->krb5_context, name, &principal);		if (ret) {			info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;			return WERR_OK;		}				domain_filter = NULL;				ret = krb5_unparse_name(smb_krb5_context->krb5_context, principal, &unparsed_name);		if (ret) {			krb5_free_principal(smb_krb5_context->krb5_context, principal);			return WERR_NOMEM;		}		krb5_free_principal(smb_krb5_context->krb5_context, principal);		result_filter = talloc_asprintf(mem_ctx, "(&(objectClass=user)(userPrincipalName=%s))", 						ldb_binary_encode_string(mem_ctx, unparsed_name));				free(unparsed_name);		W_ERROR_HAVE_NO_MEMORY(result_filter);		break;	}	case DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL: {		krb5_principal principal;		char *unparsed_name_short;		char *service;		ret = krb5_parse_name(smb_krb5_context->krb5_context, name, &principal);		if (ret == 0 && principal->name.name_string.len < 2) {			info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;			krb5_free_principal(smb_krb5_context->krb5_context, principal);			return WERR_OK;		}		ret = krb5_parse_name_flags(smb_krb5_context->krb5_context, name, 					    KRB5_PRINCIPAL_PARSE_NO_REALM, &principal);		if (ret) {			krb5_free_principal(smb_krb5_context->krb5_context, principal);			return dns_domain_from_principal(mem_ctx, smb_krb5_context,							 name, info1);		}		domain_filter = NULL;				ret = krb5_unparse_name_flags(smb_krb5_context->krb5_context, principal, 					      KRB5_PRINCIPAL_UNPARSE_NO_REALM, &unparsed_name_short);		if (ret) {			krb5_free_principal(smb_krb5_context->krb5_context, principal);			return WERR_NOMEM;		}		service = principal->name.name_string.val[0];		if ((principal->name.name_string.len == 2) && (strcasecmp(service, "host") == 0)) {			/* the 'cn' attribute is just the leading part of the name */			char *computer_name;			computer_name = talloc_strndup(mem_ctx, principal->name.name_string.val[1], 						      strcspn(principal->name.name_string.val[1], "."));			if (computer_name == NULL) {				return WERR_NOMEM;			}			result_filter = talloc_asprintf(mem_ctx, "(|(&(servicePrincipalName=%s)(objectClass=user))(&(cn=%s)(objectClass=computer)))", 							ldb_binary_encode_string(mem_ctx, unparsed_name_short), 							ldb_binary_encode_string(mem_ctx, computer_name));		} else {			result_filter = talloc_asprintf(mem_ctx, "(&(servicePrincipalName=%s)(objectClass=user))",							ldb_binary_encode_string(mem_ctx, unparsed_name_short));		}		krb5_free_principal(smb_krb5_context->krb5_context, principal);		free(unparsed_name_short);		W_ERROR_HAVE_NO_MEMORY(result_filter);				break;	}	default: {		info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;		return WERR_OK;	}	}	if (format_flags & DRSUAPI_DS_NAME_FLAG_SYNTACTICAL_ONLY) {		return DsCrackNameOneSyntactical(mem_ctx, format_offered, format_desired,						 name_dn, name, info1);	}		return DsCrackNameOneFilter(sam_ctx, mem_ctx, 				    smb_krb5_context, 				    format_flags, format_offered, format_desired, 				    name_dn, name, 				    domain_filter, result_filter, 				    info1);}/* Subcase of CrackNames.  It is possible to translate a LDAP-style DN * (FQDN_1779) into a canoical name without actually searching the * database */static WERROR DsCrackNameOneSyntactical(TALLOC_CTX *mem_ctx,					uint32_t format_offered, uint32_t format_desired,					struct ldb_dn *name_dn, const char *name, 					struct drsuapi_DsNameInfo1 *info1){	char *cracked;	if (format_offered != DRSUAPI_DS_NAME_FORMAT_FQDN_1779) {		info1->status = DRSUAPI_DS_NAME_STATUS_NO_SYNTACTICAL_MAPPING;		return WERR_OK;	}	switch (format_desired) {	case DRSUAPI_DS_NAME_FORMAT_CANONICAL: 		cracked = ldb_dn_canonical_string(mem_ctx, name_dn);		break;	case DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX:		cracked = ldb_dn_canonical_ex_string(mem_ctx, name_dn);		break;	default:		info1->status = DRSUAPI_DS_NAME_STATUS_NO_SYNTACTICAL_MAPPING;		return WERR_OK;	}	info1->status = DRSUAPI_DS_NAME_STATUS_OK;	info1->result_name	= cracked;	if (!cracked) {		return WERR_NOMEM;	}		return WERR_OK;	}/* Given a filter for the domain, and one for the result, perform the * ldb search. The format offered and desired flags change the * behaviours, including what attributes to return. * * The smb_krb5_context is required because we use the krb5 libs for principal parsing */static WERROR DsCrackNameOneFilter(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,				   struct smb_krb5_context *smb_krb5_context,				   uint32_t format_flags, uint32_t format_offered, uint32_t format_desired,				   struct ldb_dn *name_dn, const char *name, 				   const char *domain_filter, const char *result_filter, 				   struct drsuapi_DsNameInfo1 *info1){	int ldb_ret;	struct ldb_result *domain_res = NULL;	const char * const *domain_attrs;	const char * const *result_attrs;	struct ldb_message **result_res = NULL;	struct ldb_message *result = NULL;	struct ldb_dn *result_basedn = NULL;	int i;	char *p;	struct ldb_dn *partitions_basedn = samdb_partitions_dn(sam_ctx, mem_ctx);	const char * const _domain_attrs_1779[] = { "ncName", "dnsRoot", NULL};	const char * const _result_attrs_null[] = { NULL };	const char * const _domain_attrs_canonical[] = { "ncName", "dnsRoot", NULL};	const char * const _result_attrs_canonical[] = { "canonicalName", NULL };	const char * const _domain_attrs_nt4[] = { "ncName", "dnsRoot", "nETBIOSName", NULL};	const char * const _result_attrs_nt4[] = { "sAMAccountName", "objectSid", "objectClass", NULL};			const char * const _domain_attrs_guid[] = { "ncName", "dnsRoot", NULL};	const char * const _result_attrs_guid[] = { "objectGUID", NULL};			const char * const _domain_attrs_display[] = { "ncName", "dnsRoot", NULL};	const char * const _result_attrs_display[] = { "displayName", "samAccountName", NULL};	const char * const _domain_attrs_none[] = { "ncName", "dnsRoot" , NULL};	const char * const _result_attrs_none[] = { NULL};	/* here we need to set the attrs lists for domain and result lookups */	switch (format_desired) {	case DRSUAPI_DS_NAME_FORMAT_FQDN_1779:	case DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX:		domain_attrs = _domain_attrs_1779;		result_attrs = _result_attrs_null;		break;	case DRSUAPI_DS_NAME_FORMAT_CANONICAL:		domain_attrs = _domain_attrs_canonical;		result_attrs = _result_attrs_canonical;		break;	case DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT:		domain_attrs = _domain_attrs_nt4;		result_attrs = _result_attrs_nt4;		break;	case DRSUAPI_DS_NAME_FORMAT_GUID:				domain_attrs = _domain_attrs_guid;		result_attrs = _result_attrs_guid;		break;	case DRSUAPI_DS_NAME_FORMAT_DISPLAY:				domain_attrs = _domain_attrs_display;		result_attrs = _result_attrs_display;		break;	default:		domain_attrs = _domain_attrs_none;		result_attrs = _result_attrs_none;		break;	}	if (domain_filter) {		/* if we have a domain_filter look it up and set the result_basedn and the dns_domain_name */		ldb_ret = ldb_search_exp_fmt(sam_ctx, mem_ctx, &domain_res, 					     partitions_basedn,					     LDB_SCOPE_ONELEVEL,					     domain_attrs,					     "%s", domain_filter);				if (ldb_ret != LDB_SUCCESS) {			DEBUG(2, ("DsCrackNameOneFilter domain ref search failed: %s", ldb_errstring(sam_ctx)));			info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;			return WERR_OK;		}				switch (domain_res->count) {		case 1:			break;		case 0:			info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;			return WERR_OK;		default:			info1->status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE;			return WERR_OK;		}		info1->dns_domain_name	= samdb_result_string(domain_res->msgs[0], "dnsRoot", NULL);		W_ERROR_HAVE_NO_MEMORY(info1->dns_domain_name);		info1->status		= DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY;	} else {		info1->dns_domain_name	= NULL;		info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;	}	if (result_filter) {		int ret;		struct ldb_result *res;		if (domain_res) {			result_basedn = samdb_result_dn(sam_ctx, mem_ctx, domain_res->msgs[0], "ncName", NULL);						ret = ldb_search_exp_fmt(sam_ctx, mem_ctx, &res, 						 result_basedn, LDB_SCOPE_SUBTREE, 						 result_attrs, "%s", result_filter);			if (ret != LDB_SUCCESS) {				talloc_free(result_res);				info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;				return WERR_OK;			}			ldb_ret = res->count;			result_res = res->msgs;		} else {			/* search with the 'phantom root' flag */			struct ldb_request *req;			res = talloc_zero(mem_ctx, struct ldb_result);			W_ERROR_HAVE_NO_MEMORY(res);						ret = ldb_build_search_req(&req, sam_ctx, mem_ctx,						   ldb_get_root_basedn(sam_ctx),						   LDB_SCOPE_SUBTREE,						   result_filter,						   result_attrs,						   NULL,						   res,						   ldb_search_default_callback);			if (ret == LDB_SUCCESS) {				struct ldb_search_options_control *search_options;				search_options = talloc(req, struct ldb_search_options_control);				W_ERROR_HAVE_NO_MEMORY(search_options);				search_options->search_options = LDB_SEARCH_OPTION_PHANTOM_ROOT;				ret = ldb_request_add_control(req, LDB_CONTROL_SEARCH_OPTIONS_OID, false, search_options);			}			if (ret != LDB_SUCCESS) {				talloc_free(res);				info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;				return WERR_OK;			}						ldb_set_timeout(sam_ctx, req, 0); /* use default timeout */						ret = ldb_request(sam_ctx, req);						if (ret == LDB_SUCCESS) {				ret = ldb_wait(req->handle, LDB_WAIT_ALL);			}						talloc_free(req);			if (ret != LDB_SUCCESS) {				DEBUG(2, ("DsCrackNameOneFilter phantom root search failed: %s", 					  ldb_errstring(sam_ctx)));				info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;				return WERR_OK;			}			ldb_ret = res->count;			result_res = res->msgs;		}	} else if (format_offered == DRSUAPI_DS_NAME_FORMAT_FQDN_1779) {		ldb_ret = gendb_search_dn(sam_ctx, mem_ctx, name_dn, &result_res,					  result_attrs);	} else if (domain_res) {		name_dn = samdb_result_dn(sam_ctx, mem_ctx, domain_res->msgs[0], "ncName", NULL);		ldb_ret = gendb_search_dn(sam_ctx, mem_ctx, name_dn, &result_res,					  result_attrs);	} else {		/* Can't happen */		DEBUG(0, ("LOGIC ERROR: DsCrackNameOneFilter domain ref search not availible: This can't happen..."));		info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;		return WERR_OK;	}	switch (ldb_ret) {	case 1:		result = result_res[0];		break;	case 0:		switch (format_offered) {		case DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL: 			return DsCrackNameSPNAlias(sam_ctx, mem_ctx, 						   smb_krb5_context, 						   format_flags, format_offered, format_desired,						   name, info1);					case DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL:

⌨️ 快捷键说明

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