Ethereal-dev: Re: [Ethereal-dev] Tacacs Dissector for 0.9.15
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Emanuele Caratti <wiz@xxxxxx>
Date: Sun, 21 Sep 2003 11:25:07 +0200
On Sat, Sep 20, 2003 at 02:44:09AM -0700, Guy Harris wrote: > > I've still to complete the accounting part, > Presumably that's why it gets a > > packet-tacacs.h:417: warning: `tacplus_acct_flags' defined but not used > > warning - the accounting part dissector will presumably use that > variable. Exactly :) May be I can keep that variable in my cvs version until I complete the accounting part... > I just checked in an additional change to arrange that the buffer > allocated for the decrypted data be freed when the tvbuff to which it > refers is freed (along the lines of what other decrypting dissectors > do). Ok, I found also a leek in md5_xor... It's possible to leave the function without freeing md5_buff. Attached you'll find the merge of my latest version and the one in current CVS tree. I've replaced the buff=g_malloc + tvb_get_nstringz0 with buff=tvb_get_string. Now the md5_xor function doesn't return value and use the CLEANUP call Different RAS have different password with the same tacacs+ server, so it's possible to have the need of different tacpluskey.... Where can I look for some hint about implementing this feature ? It's possible to have a kind of popup to add the password to the tcp stream ? -- Ciao, Emanuele
--- mytacacs/packet-tacacs.c 2003-09-21 11:06:24.000000000 +0200 +++ /.1/cvs-mirror/ethereal/packet-tacacs.c 2003-09-21 09:41:25.000000000 +0200 @@ -47,7 +47,7 @@ #include "crypt-md5.h" #include "packet-tacacs.h" -static void md5_xor( u_char *data, char *key, int data_len, u_char *session_id, u_char version, u_char seq_no ); +static int md5_xor( u_char *data, char *key, int data_len, guint32 session_id, u_char version, u_char seq_no ); static int proto_tacacs = -1; static int hf_tacacs_version = -1; @@ -329,16 +329,15 @@ tacplus_tvb_setup( tvbuff_t *tvb, tvbuff_t **dst_tvb, packet_info *pinfo, guint32 len, guint8 version ) { guint8 *buff; - u_char session_id[4]; - -/* session_id is in NETWORK Byte Order, and is used as byte array in the md5_xor */ - - tvb_memcpy(tvb, (guint8*)session_id, 4,4); + guint32 tmp_sess; + + buff=g_malloc(len); - buff = tvb_memdup(tvb, TAC_PLUS_HDR_SIZE, len); + tvb_memcpy(tvb,(guint8*)&tmp_sess,4,4); + tvb_memcpy(tvb, buff, TAC_PLUS_HDR_SIZE, len); - md5_xor( buff, tacplus_key, len, session_id,version, tvb_get_guint8(tvb,2) ); + md5_xor( buff, tacplus_key, len, tmp_sess,version, tvb_get_guint8(tvb,2) ); /* Allocate a new tvbuff, referring to the decrypted data. */ *dst_tvb = tvb_new_real_data( buff, len, len ); @@ -556,7 +555,8 @@ val=tvb_get_ntohs( tvb, AUTHEN_C_USER_LEN_OFF ); proto_tree_add_text( tree, tvb, AUTHEN_C_USER_LEN_OFF, 2 , "User length: %d", val ); if( val ){ - buff=tvb_get_string( tvb, var_off, val ); + buff=g_malloc(val+1); + tvb_get_nstringz0( tvb, var_off, val+1, buff ); proto_tree_add_text( tree, tvb, var_off, val, "User: %s", buff ); var_off+=val; g_free(buff); @@ -594,7 +594,8 @@ proto_tree_add_text( tree, tvb, AUTHEN_R_SRV_MSG_LEN_OFF, 2 , "Server message length: %d", val ); if( val ) { - buff=tvb_get_string(tvb, var_off, val ); + buff=g_malloc(val+1); + tvb_get_nstringz0(tvb, var_off, val+1, buff); proto_tree_add_text(tree, tvb, var_off, val, "Server message: %s", buff ); var_off+=val; g_free(buff); @@ -703,7 +704,8 @@ proto_tree_add_text( tree, tvb, ACCT_R_SRV_MSG_LEN_OFF, 2 , "Server message length: %d", val ); if( val ) { - buff=tvb_get_string( tvb, var_off, val ); + buff=(guint8*)g_malloc(val+1); + tvb_get_nstringz0( tvb, var_off, val+1, buff ); proto_tree_add_text( tree, tvb, var_off, val, "Server message: %s", buff ); var_off+=val; @@ -715,7 +717,8 @@ proto_tree_add_text( tree, tvb, ACCT_R_DATA_LEN_OFF, 2 , "Data length: %d", val ); if( val ) { - buff= tvb_get_string( tvb, var_off, val ); + buff=(guint8*)g_malloc(val+1); + tvb_get_nstringz0( tvb, var_off, val+1, buff ); proto_tree_add_text( tree, tvb, var_off, val, "Data: %s", buff ); g_free(buff); @@ -914,8 +917,9 @@ proto_register_field_array(proto_tacplus, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); tacplus_module = prefs_register_protocol (proto_tacplus, NULL); - prefs_register_string_preference ( tacplus_module, "key", - "TACACS+ Encryption Key", "TACACS+ Encryption Key", &tacplus_key ); + prefs_register_string_preference(tacplus_module, "key", + "TACACS+ Encryption Key", "TACACS+ Encryption Key", + &tacplus_key); } void @@ -928,11 +932,10 @@ dissector_add("tcp.port", TCP_PORT_TACACS, tacplus_handle); } - #define MD5_LEN 16 - -static void -md5_xor( u_char *data, char *key, int data_len, u_char *session_id, u_char version, u_char seq_no ) + +static int +md5_xor( u_char *data, char *key, int data_len, guint32 session_id, u_char version, u_char seq_no ) { int i,j,md5_len; md5_byte_t *md5_buff; @@ -940,21 +943,20 @@ md5_byte_t *mdp; md5_state_t mdcontext; - md5_len = 4 /* sizeof(session_id) */ + strlen(key) + md5_len = sizeof(session_id) + strlen(key) + sizeof(version) + sizeof(seq_no); md5_buff = (md5_byte_t*)g_malloc(md5_len+MD5_LEN); - CLEANUP_PUSH( g_free, md5_buff ); - mdp = md5_buff; - *(guint32*)mdp = *(guint32*)session_id; - mdp += 4 ; + bcopy(&session_id, mdp, sizeof(session_id)); + mdp += sizeof(session_id); bcopy(key, mdp, strlen(key)); mdp += strlen(key); - *mdp++ = version; - *mdp++ = seq_no; - + bcopy(&version, mdp, sizeof(version)); + mdp += sizeof(version); + bcopy(&seq_no, mdp, sizeof(seq_no)); + mdp += sizeof(seq_no); md5_init(&mdcontext); md5_append(&mdcontext, md5_buff, md5_len); @@ -963,10 +965,8 @@ for (i = 0; i < data_len; i += 16) { for (j = 0; j < 16; j++) { - if ((i + j) >= data_len) { - i = data_len+1; /* To exit from the external loop */ - break; - } + if ((i + j) >= data_len) + return 0; data[i + j] ^= hash[j]; } bcopy( hash, mdp , MD5_LEN ); @@ -974,5 +974,6 @@ md5_append(&mdcontext, md5_buff, md5_len); md5_finish(&mdcontext,hash); } - CLEANUP_CALL_AND_POP; + g_free( md5_buff ); + return 0; }
- Follow-Ups:
- Re: [Ethereal-dev] Tacacs Dissector for 0.9.15
- From: Guy Harris
- Re: [Ethereal-dev] Tacacs Dissector for 0.9.15
- References:
- [Ethereal-dev] Tacacs Dissector for 0.9.15
- From: Emanuele Caratti
- Re: [Ethereal-dev] Tacacs Dissector for 0.9.15
- From: Guy Harris
- Re: [Ethereal-dev] Tacacs Dissector for 0.9.15
- From: Guy Harris
- [Ethereal-dev] Tacacs Dissector for 0.9.15
- Prev by Date: [Ethereal-dev] Problem making Ethereal, after changing autoconf
- Next by Date: Re: [Ethereal-dev] artnet plugin seems to need libtool which iscausing problems on FreeBSD
- Previous by thread: Re: [Ethereal-dev] Tacacs Dissector for 0.9.15
- Next by thread: Re: [Ethereal-dev] Tacacs Dissector for 0.9.15
- Index(es):