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

📄 kerberos5.c

📁 经典的unix下telnetd代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	ret = krb5_auth_con_getremotesubkey (context,					     auth_context,					     &key_block);	if (ret) {	    Data(ap, KRB_REJECT, "krb5_auth_con_getremotesubkey failed", -1);	    auth_finished(ap, AUTH_REJECT);	    if (auth_debug_mode)		printf("Kerberos V5: "		       "krb5_auth_con_getremotesubkey failed (%s)\r\n",		       krb5_get_err_text(context, ret));	    return;	}	if (key_block == NULL) {	    ret = krb5_auth_con_getkey(context,				       auth_context,				       &key_block);	}	if (ret) {	    Data(ap, KRB_REJECT, "krb5_auth_con_getkey failed", -1);	    auth_finished(ap, AUTH_REJECT);	    if (auth_debug_mode)		printf("Kerberos V5: "		       "krb5_auth_con_getkey failed (%s)\r\n",		       krb5_get_err_text(context, ret));	    return;	}	if (key_block == NULL) {	    Data(ap, KRB_REJECT, "no subkey received", -1);	    auth_finished(ap, AUTH_REJECT);	    if (auth_debug_mode)		printf("Kerberos V5: "		       "krb5_auth_con_getremotesubkey returned NULL key\r\n");	    return;	}	if ((ap->way & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) {	    ret = krb5_mk_rep(context, auth_context, &outbuf);	    if (ret) {		Data(ap, KRB_REJECT,		     "krb5_mk_rep failed", -1);		auth_finished(ap, AUTH_REJECT);		if (auth_debug_mode)		    printf("Kerberos V5: "			   "krb5_mk_rep failed (%s)\r\n",			   krb5_get_err_text(context, ret));		return;	    }	    Data(ap, KRB_RESPONSE, outbuf.data, outbuf.length);	}	if (krb5_unparse_name(context, ticket->client, &name))	    name = 0;	if(UserNameRequested && krb5_kuserok(context,					     ticket->client,					     UserNameRequested)) {	    Data(ap, KRB_ACCEPT, name, name ? -1 : 0);	    if (auth_debug_mode) {		printf("Kerberos5 identifies him as ``%s''\r\n",		       name ? name : "");	    }	    if(key_block->keytype == ETYPE_DES_CBC_MD5 ||	       key_block->keytype == ETYPE_DES_CBC_MD4 ||	       key_block->keytype == ETYPE_DES_CBC_CRC) {		Session_Key skey;		skey.type = SK_DES;		skey.length = 8;		skey.data = key_block->keyvalue.data;		encrypt_session_key(&skey, 0);	    }	} else {	    char *msg;	    asprintf (&msg, "user `%s' is not authorized to "		      "login as `%s'", 		      name ? name : "<unknown>",		      UserNameRequested ? UserNameRequested : "<nobody>");	    if (msg == NULL)		Data(ap, KRB_REJECT, NULL, 0);	    else {		Data(ap, KRB_REJECT, (void *)msg, -1);		free(msg);	    }	    auth_finished (ap, AUTH_REJECT);	    krb5_free_keyblock_contents(context, key_block);	    break;	}	auth_finished(ap, AUTH_USER);	krb5_free_keyblock_contents(context, key_block);		break;    case KRB_FORWARD: {	struct passwd *pwd;	char ccname[1024];	/* XXX */	krb5_data inbuf;	krb5_ccache ccache;	inbuf.data = (char *)data;	inbuf.length = cnt;	pwd = getpwnam (UserNameRequested);	if (pwd == NULL)	    break;	snprintf (ccname, sizeof(ccname),		  "FILE:/tmp/krb5cc_%u", pwd->pw_uid);	ret = krb5_cc_resolve (context, ccname, &ccache);	if (ret) {	    if (auth_debug_mode)		printf ("Kerberos V5: could not get ccache: %s\r\n",			krb5_get_err_text(context, ret));	    break;	}	ret = krb5_cc_initialize (context,				  ccache,				  ticket->client);	if (ret) {	    if (auth_debug_mode)		printf ("Kerberos V5: could not init ccache: %s\r\n",			krb5_get_err_text(context, ret));	    break;	}#if defined(DCE)	esetenv("KRB5CCNAME", ccname, 1);#endif	ret = krb5_rd_cred2 (context,			     auth_context,			     ccache,			     &inbuf);	if(ret) {	    char *errbuf;	    asprintf (&errbuf,		      "Read forwarded creds failed: %s",		      krb5_get_err_text (context, ret));	    if(errbuf == NULL)		Data(ap, KRB_FORWARD_REJECT, NULL, 0);	    else		Data(ap, KRB_FORWARD_REJECT, errbuf, -1);	    if (auth_debug_mode)		printf("Could not read forwarded credentials: %s\r\n",		       errbuf);	    free (errbuf);	} else {	    Data(ap, KRB_FORWARD_ACCEPT, 0, 0);#if defined(DCE)	    dfsfwd = 1;#endif	}	chown (ccname + 5, pwd->pw_uid, -1);	if (auth_debug_mode)	    printf("Forwarded credentials obtained\r\n");	break;    }    default:	if (auth_debug_mode)	    printf("Unknown Kerberos option %d\r\n", data[-1]);	Data(ap, KRB_REJECT, 0, 0);	break;    }}voidkerberos5_reply(Authenticator *ap, unsigned char *data, int cnt){    static int mutual_complete = 0;    if (cnt-- < 1)	return;    switch (*data++) {    case KRB_REJECT:	if (cnt > 0) {	    printf("[ Kerberos V5 refuses authentication because %.*s ]\r\n",		   cnt, data);	} else	    printf("[ Kerberos V5 refuses authentication ]\r\n");	auth_send_retry();	return;    case KRB_ACCEPT: {	krb5_error_code ret;	Session_Key skey;	krb5_keyblock *keyblock;		if ((ap->way & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL &&	    !mutual_complete) {	    printf("[ Kerberos V5 accepted you, but didn't provide mutual authentication! ]\r\n");	    auth_send_retry();	    return;	}	if (cnt)	    printf("[ Kerberos V5 accepts you as ``%.*s'' ]\r\n", cnt, data);	else	    printf("[ Kerberos V5 accepts you ]\r\n");	      	ret = krb5_auth_con_getlocalsubkey (context,					    auth_context,					    &keyblock);	if (ret)	    ret = krb5_auth_con_getkey (context,					auth_context,					&keyblock);	if(ret) {	    printf("[ krb5_auth_con_getkey: %s ]\r\n",		   krb5_get_err_text(context, ret));	    auth_send_retry();	    return;	}	      	skey.type = SK_DES;	skey.length = 8;	skey.data = keyblock->keyvalue.data;	encrypt_session_key(&skey, 0);	krb5_free_keyblock_contents (context, keyblock);	auth_finished(ap, AUTH_USER);	if (forward_flags & OPTS_FORWARD_CREDS)	    kerberos5_forward(ap);	break;    }    case KRB_RESPONSE:	if ((ap->way & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) {	    /* the rest of the reply should contain a krb_ap_rep */	  krb5_ap_rep_enc_part *reply;	  krb5_data inbuf;	  krb5_error_code ret;	    	  inbuf.length = cnt;	  inbuf.data = (char *)data;	  ret = krb5_rd_rep(context, auth_context, &inbuf, &reply);	  if (ret) {	      printf("[ Mutual authentication failed: %s ]\r\n",		     krb5_get_err_text (context, ret));	      auth_send_retry();	      return;	  }	  krb5_free_ap_rep_enc_part(context, reply);	  mutual_complete = 1;	}	return;    case KRB_FORWARD_ACCEPT:	printf("[ Kerberos V5 accepted forwarded credentials ]\r\n");	return;    case KRB_FORWARD_REJECT:	printf("[ Kerberos V5 refuses forwarded credentials because %.*s ]\r\n",	       cnt, data);	return;    default:	if (auth_debug_mode)	    printf("Unknown Kerberos option %d\r\n", data[-1]);	return;    }}intkerberos5_status(Authenticator *ap, char *name, size_t name_sz, int level){    if (level < AUTH_USER)	return(level);    if (UserNameRequested &&	krb5_kuserok(context,		     ticket->client,		     UserNameRequested))	{	    strlcpy(name, UserNameRequested, name_sz);#if defined(DCE)	    dfsk5ok = 1;#endif	    return(AUTH_VALID);	} else	    return(AUTH_USER);}#define	BUMP(buf, len)		while (*(buf)) {++(buf), --(len);}#define	ADDC(buf, len, c)	if ((len) > 0) {*(buf)++ = (c); --(len);}voidkerberos5_printsub(unsigned char *data, int cnt, unsigned char *buf, int buflen){    int i;    buf[buflen-1] = '\0';		/* make sure its NULL terminated */    buflen -= 1;    switch(data[3]) {    case KRB_REJECT:		/* Rejected (reason might follow) */	strlcpy((char *)buf, " REJECT ", buflen);	goto common;    case KRB_ACCEPT:		/* Accepted (name might follow) */	strlcpy((char *)buf, " ACCEPT ", buflen);    common:	BUMP(buf, buflen);	if (cnt <= 4)	    break;	ADDC(buf, buflen, '"');	for (i = 4; i < cnt; i++)	    ADDC(buf, buflen, data[i]);	ADDC(buf, buflen, '"');	ADDC(buf, buflen, '\0');	break;    case KRB_AUTH:			/* Authentication data follows */	strlcpy((char *)buf, " AUTH", buflen);	goto common2;    case KRB_RESPONSE:	strlcpy((char *)buf, " RESPONSE", buflen);	goto common2;    case KRB_FORWARD:		/* Forwarded credentials follow */	strlcpy((char *)buf, " FORWARD", buflen);	goto common2;    case KRB_FORWARD_ACCEPT:	/* Forwarded credentials accepted */	strlcpy((char *)buf, " FORWARD_ACCEPT", buflen);	goto common2;    case KRB_FORWARD_REJECT:	/* Forwarded credentials rejected */	/* (reason might follow) */	strlcpy((char *)buf, " FORWARD_REJECT", buflen);	goto common2;    default:	snprintf(buf, buflen, " %d (unknown)", data[3]);    common2:	BUMP(buf, buflen);	for (i = 4; i < cnt; i++) {	    snprintf(buf, buflen, " %d", data[i]);	    BUMP(buf, buflen);	}	break;    }}voidkerberos5_forward(Authenticator *ap){    krb5_error_code ret;    krb5_ccache     ccache;    krb5_creds      creds;    krb5_kdc_flags  flags;    krb5_data       out_data;    krb5_principal  principal;    ret = krb5_cc_default (context, &ccache);    if (ret) {	if (auth_debug_mode)	    printf ("KerberosV5: could not get default ccache: %s\r\n",		    krb5_get_err_text (context, ret));	return;    }    ret = krb5_cc_get_principal (context, ccache, &principal);    if (ret) {	if (auth_debug_mode)	    printf ("KerberosV5: could not get principal: %s\r\n",		    krb5_get_err_text (context, ret));	return;    }    memset (&creds, 0, sizeof(creds));    creds.client = principal;        ret = krb5_build_principal (context,				&creds.server,				strlen(principal->realm),				principal->realm,				"krbtgt",				principal->realm,				NULL);    if (ret) {	if (auth_debug_mode)	    printf ("KerberosV5: could not get principal: %s\r\n",		    krb5_get_err_text (context, ret));	return;    }    creds.times.endtime = 0;    flags.i = 0;    flags.b.forwarded = 1;    if (forward_flags & OPTS_FORWARDABLE_CREDS)	flags.b.forwardable = 1;    ret = krb5_get_forwarded_creds (context,				    auth_context,				    ccache,				    flags.i,				    RemoteHostName,				    &creds,				    &out_data);    if (ret) {	if (auth_debug_mode)	    printf ("Kerberos V5: error getting forwarded creds: %s\r\n",		    krb5_get_err_text (context, ret));	return;    }    if(!Data(ap, KRB_FORWARD, out_data.data, out_data.length)) {	if (auth_debug_mode)	    printf("Not enough room for authentication data\r\n");    } else {	if (auth_debug_mode)	    printf("Forwarded local Kerberos V5 credentials to server\r\n");    }}#if defined(DCE)/* if this was a K5 authentication try and join a PAG for the user. */voidkerberos5_dfspag(void){    if (dfsk5ok) {	dfspag = krb5_dfs_pag(context, dfsfwd, ticket->client,			      UserNameRequested);    }}#endifintkerberos5_set_forward(int on){    if(on == 0)	forward_flags &= ~OPTS_FORWARD_CREDS;    if(on == 1)	forward_flags |= OPTS_FORWARD_CREDS;    if(on == -1)	forward_flags ^= OPTS_FORWARD_CREDS;    return 0;}intkerberos5_set_forwardable(int on){    if(on == 0)	forward_flags &= ~OPTS_FORWARDABLE_CREDS;    if(on == 1)	forward_flags |= OPTS_FORWARDABLE_CREDS;    if(on == -1)	forward_flags ^= OPTS_FORWARDABLE_CREDS;    return 0;}#endif /* KRB5 */

⌨️ 快捷键说明

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