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

📄 cracknames.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 3 页
字号:
			return DsCrackNameUPN(sam_ctx, mem_ctx, smb_krb5_context, 					      format_flags, format_offered, format_desired,					      name, info1);		}		info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;		return WERR_OK;	case -1:		DEBUG(2, ("DsCrackNameOneFilter result search failed: %s", ldb_errstring(sam_ctx)));		info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;		return WERR_OK;	default:		switch (format_offered) {		case DRSUAPI_DS_NAME_FORMAT_CANONICAL:		case DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX:		{			const char *canonical_name = NULL; /* Not required, but we get warnings... */			/* We may need to manually filter further */			for (i = 0; i < ldb_ret; i++) {				switch (format_offered) {				case DRSUAPI_DS_NAME_FORMAT_CANONICAL:					canonical_name = ldb_dn_canonical_string(mem_ctx, result_res[i]->dn);					break;				case DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX:					canonical_name = ldb_dn_canonical_ex_string(mem_ctx, result_res[i]->dn);					break;				}				if (strcasecmp_m(canonical_name, name) == 0) {					result = result_res[i];					break;				}			}			if (!result) {				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 = ldb_dn_canonical_string(mem_ctx, result->dn);	W_ERROR_HAVE_NO_MEMORY(info1->dns_domain_name);	p = strchr(info1->dns_domain_name, '/');	if (p) {		p[0] = '\0';	}		/* here we can use result and domain_res[0] */	switch (format_desired) {	case DRSUAPI_DS_NAME_FORMAT_FQDN_1779: {		info1->result_name	= ldb_dn_alloc_linearized(mem_ctx, result->dn);		W_ERROR_HAVE_NO_MEMORY(info1->result_name);		info1->status		= DRSUAPI_DS_NAME_STATUS_OK;		return WERR_OK;	}	case DRSUAPI_DS_NAME_FORMAT_CANONICAL: {		info1->result_name	= samdb_result_string(result, "canonicalName", NULL);		info1->status		= DRSUAPI_DS_NAME_STATUS_OK;		return WERR_OK;	}	case DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX: {		/* Not in the virtual ldb attribute */		return DsCrackNameOneSyntactical(mem_ctx, 						 DRSUAPI_DS_NAME_FORMAT_FQDN_1779, 						 DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX,						 result->dn, name, info1);	}	case DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT: {		const struct dom_sid *sid = samdb_result_dom_sid(mem_ctx, result, "objectSid");		const char *_acc = "", *_dom = "";				if (samdb_find_attribute(sam_ctx, result, "objectClass", "domain")) {			ldb_ret = ldb_search_exp_fmt(sam_ctx, mem_ctx, &domain_res, 						     partitions_basedn,						     LDB_SCOPE_ONELEVEL,						     domain_attrs,						     "(ncName=%s)", ldb_dn_get_linearized(result->dn));						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;			}			_dom = samdb_result_string(domain_res->msgs[0], "nETBIOSName", NULL);			W_ERROR_HAVE_NO_MEMORY(_dom);		} else {			_acc = samdb_result_string(result, "sAMAccountName", NULL);			if (!_acc) {				info1->status = DRSUAPI_DS_NAME_STATUS_NO_MAPPING;				return WERR_OK;			}			if (dom_sid_in_domain(dom_sid_parse_talloc(mem_ctx, SID_BUILTIN), sid)) {				_dom = "BUILTIN";			} else {				const char *attrs[] = { NULL };				struct ldb_result *domain_res2;				struct dom_sid *dom_sid = dom_sid_dup(mem_ctx, sid);				if (!dom_sid) {					return WERR_OK;				}				dom_sid->num_auths--;				ldb_ret = ldb_search_exp_fmt(sam_ctx, mem_ctx, &domain_res, 							     NULL,							     LDB_SCOPE_BASE,							     attrs,							     "(&(objectSid=%s)(objectClass=domain))", 							     ldap_encode_ndr_dom_sid(mem_ctx, dom_sid));								if (ldb_ret != LDB_SUCCESS) {					DEBUG(2, ("DsCrackNameOneFilter domain 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;				}				ldb_ret = ldb_search_exp_fmt(sam_ctx, mem_ctx, &domain_res2, 							     partitions_basedn,							     LDB_SCOPE_ONELEVEL,							     domain_attrs,							     "(ncName=%s)", ldb_dn_get_linearized(domain_res->msgs[0]->dn));								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_res2->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;				}				_dom = samdb_result_string(domain_res2->msgs[0], "nETBIOSName", NULL);				W_ERROR_HAVE_NO_MEMORY(_dom);			}		}		info1->result_name	= talloc_asprintf(mem_ctx, "%s\\%s", _dom, _acc);		W_ERROR_HAVE_NO_MEMORY(info1->result_name);				info1->status		= DRSUAPI_DS_NAME_STATUS_OK;		return WERR_OK;	}	case DRSUAPI_DS_NAME_FORMAT_GUID: {		struct GUID guid;				guid = samdb_result_guid(result, "objectGUID");				info1->result_name	= GUID_string2(mem_ctx, &guid);		W_ERROR_HAVE_NO_MEMORY(info1->result_name);				info1->status		= DRSUAPI_DS_NAME_STATUS_OK;		return WERR_OK;	}	case DRSUAPI_DS_NAME_FORMAT_DISPLAY: {		info1->result_name	= samdb_result_string(result, "displayName", NULL);		if (!info1->result_name) {			info1->result_name	= samdb_result_string(result, "sAMAccountName", NULL);		} 		if (!info1->result_name) {			info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;		} else {			info1->status = DRSUAPI_DS_NAME_STATUS_OK;		}		return WERR_OK;	}	case DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL: {		info1->status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE;		return WERR_OK;	}	case DRSUAPI_DS_NAME_FORMAT_DNS_DOMAIN:		case DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY: {		info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;		return WERR_OK;	}	default:		info1->status = DRSUAPI_DS_NAME_STATUS_NO_MAPPING;		return WERR_OK;	}}/* Given a user Principal Name (such as foo@bar.com), * return the user and domain DNs.  This is used in the KDC to then * return the Keys and evaluate policy */NTSTATUS crack_user_principal_name(struct ldb_context *sam_ctx, 				   TALLOC_CTX *mem_ctx, 				   const char *user_principal_name, 				   struct ldb_dn **user_dn,				   struct ldb_dn **domain_dn) {	WERROR werr;	struct drsuapi_DsNameInfo1 info1;	werr = DsCrackNameOneName(sam_ctx, mem_ctx, 0,				  DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL,				  DRSUAPI_DS_NAME_FORMAT_FQDN_1779, 				  user_principal_name,				  &info1);	if (!W_ERROR_IS_OK(werr)) {		return werror_to_ntstatus(werr);	}	switch (info1.status) {	case DRSUAPI_DS_NAME_STATUS_OK:		break;	case DRSUAPI_DS_NAME_STATUS_NOT_FOUND:	case DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY:	case DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE:		return NT_STATUS_NO_SUCH_USER;	case DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR:	default:		return NT_STATUS_UNSUCCESSFUL;	}		*user_dn = ldb_dn_new(mem_ctx, sam_ctx, info1.result_name);		if (domain_dn) {		werr = DsCrackNameOneName(sam_ctx, mem_ctx, 0,					  DRSUAPI_DS_NAME_FORMAT_CANONICAL,					  DRSUAPI_DS_NAME_FORMAT_FQDN_1779, 					  talloc_asprintf(mem_ctx, "%s/", 							  info1.dns_domain_name),					  &info1);		if (!W_ERROR_IS_OK(werr)) {			return werror_to_ntstatus(werr);		}		switch (info1.status) {		case DRSUAPI_DS_NAME_STATUS_OK:			break;		case DRSUAPI_DS_NAME_STATUS_NOT_FOUND:		case DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY:		case DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE:			return NT_STATUS_NO_SUCH_USER;		case DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR:		default:			return NT_STATUS_UNSUCCESSFUL;		}				*domain_dn = ldb_dn_new(mem_ctx, sam_ctx, info1.result_name);	}	return NT_STATUS_OK;	}/* Given a Service Principal Name (such as host/foo.bar.com@BAR.COM), * return the user and domain DNs.  This is used in the KDC to then * return the Keys and evaluate policy */NTSTATUS crack_service_principal_name(struct ldb_context *sam_ctx, 				      TALLOC_CTX *mem_ctx, 				      const char *service_principal_name, 				      struct ldb_dn **user_dn,				      struct ldb_dn **domain_dn) {	WERROR werr;	struct drsuapi_DsNameInfo1 info1;	werr = DsCrackNameOneName(sam_ctx, mem_ctx, 0,				  DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL,				  DRSUAPI_DS_NAME_FORMAT_FQDN_1779, 				  service_principal_name,				  &info1);	if (!W_ERROR_IS_OK(werr)) {		return werror_to_ntstatus(werr);	}	switch (info1.status) {	case DRSUAPI_DS_NAME_STATUS_OK:		break;	case DRSUAPI_DS_NAME_STATUS_NOT_FOUND:	case DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY:	case DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE:		return NT_STATUS_NO_SUCH_USER;	case DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR:	default:		return NT_STATUS_UNSUCCESSFUL;	}		*user_dn = ldb_dn_new(mem_ctx, sam_ctx, info1.result_name);		if (domain_dn) {		werr = DsCrackNameOneName(sam_ctx, mem_ctx, 0,					  DRSUAPI_DS_NAME_FORMAT_CANONICAL,					  DRSUAPI_DS_NAME_FORMAT_FQDN_1779, 					  talloc_asprintf(mem_ctx, "%s/", 							  info1.dns_domain_name),					  &info1);		if (!W_ERROR_IS_OK(werr)) {			return werror_to_ntstatus(werr);		}		switch (info1.status) {		case DRSUAPI_DS_NAME_STATUS_OK:			break;		case DRSUAPI_DS_NAME_STATUS_NOT_FOUND:		case DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY:		case DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE:			return NT_STATUS_NO_SUCH_USER;		case DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR:		default:			return NT_STATUS_UNSUCCESSFUL;		}				*domain_dn = ldb_dn_new(mem_ctx, sam_ctx, info1.result_name);	}	return NT_STATUS_OK;	}NTSTATUS crack_name_to_nt4_name(TALLOC_CTX *mem_ctx, 				struct event_context *ev_ctx, 				struct loadparm_context *lp_ctx,				uint32_t format_offered,				const char *name, 				const char **nt4_domain, const char **nt4_account){	WERROR werr;	struct drsuapi_DsNameInfo1 info1;	struct ldb_context *ldb;	char *p;	/* Handle anonymous bind */	if (!name || !*name) {		*nt4_domain = "";		*nt4_account = "";		return NT_STATUS_OK;	}	ldb = samdb_connect(mem_ctx, ev_ctx, lp_ctx, system_session(mem_ctx, lp_ctx));	if (ldb == NULL) {		return NT_STATUS_INTERNAL_DB_CORRUPTION;	}	werr = DsCrackNameOneName(ldb, mem_ctx, 0,				  format_offered, 				  DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT,				  name,				  &info1);	if (!W_ERROR_IS_OK(werr)) {		return werror_to_ntstatus(werr);	}	switch (info1.status) {	case DRSUAPI_DS_NAME_STATUS_OK:		break;	case DRSUAPI_DS_NAME_STATUS_NOT_FOUND:	case DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY:	case DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE:		return NT_STATUS_NO_SUCH_USER;	case DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR:	default:		return NT_STATUS_UNSUCCESSFUL;	}		*nt4_domain = talloc_strdup(mem_ctx, info1.result_name);		p = strchr(*nt4_domain, '\\');	if (!p) {		return NT_STATUS_INVALID_PARAMETER;	}	p[0] = '\0';		if (p[1]) {		*nt4_account = talloc_strdup(mem_ctx, &p[1]);	}	if (!*nt4_account || !*nt4_domain) {		return NT_STATUS_NO_MEMORY;	}	return NT_STATUS_OK;}NTSTATUS crack_auto_name_to_nt4_name(TALLOC_CTX *mem_ctx,				     struct event_context *ev_ctx, 				     struct loadparm_context *lp_ctx,				     const char *name,				     const char **nt4_domain,				     const char **nt4_account){	uint32_t format_offered = DRSUAPI_DS_NAME_FORMAT_UKNOWN;	/* Handle anonymous bind */	if (!name || !*name) {		*nt4_domain = "";		*nt4_account = "";		return NT_STATUS_OK;	}	if (strchr_m(name, '=')) {		format_offered = DRSUAPI_DS_NAME_FORMAT_FQDN_1779;	} else if (strchr_m(name, '@')) {		format_offered = DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL;	} else if (strchr_m(name, '\\')) {		format_offered = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT;	} else if (strchr_m(name, '/')) {		format_offered = DRSUAPI_DS_NAME_FORMAT_CANONICAL;	}	return crack_name_to_nt4_name(mem_ctx, ev_ctx, lp_ctx, format_offered, name, nt4_domain, nt4_account);}

⌨️ 快捷键说明

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