Ethereal-dev: [Ethereal-dev] patch for ssh dissector.
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Huagang Xie <xie@xxxxxxxx>
Date: Sun, 26 Jan 2003 15:55:40 -0800
Norka, Douglas, Thanks for your suggestion. Here is a patch to deal with the problem.. Now, all un-determinable ssh flow will be treated as SSH_VERSION_UNKNOWN. here is a patch for it. Thanks, Huagang On Sun, Jan 26, 2003 at 11:32:11AM -0500, Norka Lucena wrote: > Hi Huagang, > > First of all THANK YOU SO VERY MUCH for the SSH dissector! > I was planning to do it since I needed badly for some testing. Actually, > I started but didn't have much. > > I haven't had the chance to use it yet, though, since I have a deadline > for tomorrow of something else. > > One of my friends, who is not on the Ethereal list tested it and asked > me to forward the following message to you. If you need to contact him > directly, his address is below > > Thanks again, and I hope this is useful to you. > > > Norka > > -----Forwarded Message----- > > > From: Douglas F. Calvert <dfc@xxxxxxxxx> > > To: Norka Lucena <norka@xxxxxxxxxxx> > > Subject: Re: Got it > > Date: 25 Jan 2003 22:49:59 -0500 > > > > Hello, > > I am playing around with the stuff right now. I noticed a problem > with > > the ssh dissector in ethereal. Can you forward this problem to the > > developer and the ethereal development list? > > > > If ethereal watches the ssh connection start up it correctly detects > the > > connection and the subsequent data as sshv2. However if it picks up an > > sshv2 connection midstream it identifies the connection as sshv1. > Maybe > > there is no way to differentiate an ssh version once the connection is > > started but it is problematic that the dissector assumes that it is > > sshv1. > > > > > -- LIDS secure linux kernel http://www.lids.org/ 1024D/B6EFB028 4731 2BF7 7735 4DBD 3771 4E24 B53B B60A B6EF B028
Index: packet-ssh.c =================================================================== RCS file: /cvsroot/ethereal/packet-ssh.c,v retrieving revision 1.1 diff -u -r1.1 packet-ssh.c --- packet-ssh.c 25 Jan 2003 00:22:50 -0000 1.1 +++ packet-ssh.c 26 Jan 2003 23:32:30 -0000 @@ -69,6 +69,10 @@ #define SSH2_MSG_KEX_DH_GEX_REPLY 33 #define SSH2_MSG_KEX_DH_GEX_REQUEST 34 +#define SSH_VERSION_UNKNOWN 0 +#define SSH_VERSION_1 1 +#define SSH_VERSION_2 2 + /* proto data */ struct ssh_pdu_data{ @@ -79,7 +83,7 @@ struct ssh_flow_data { guint req_counter; guint rsp_counter; - gboolean is_ssh2; + guint version; }; static GMemChunk *ssh_this_data=NULL; static GMemChunk *ssh_global_data = NULL; @@ -151,7 +155,7 @@ int offset, proto_tree *tree,int is_response, int number, gboolean *need_desegmentation ); static int ssh_dissect_protocol(tvbuff_t *tvb, packet_info *pinfo, - int offset, proto_tree *tree,int is_response,int *is_ssh2, + int offset, proto_tree *tree,int is_response,int *version, gboolean *need_desegmentation); static int ssh_dissect_encrypted_packet(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *tree,int is_response); @@ -189,7 +193,7 @@ gboolean is_response; gboolean is_newdata; gboolean need_desegmentation; - gboolean is_ssh2 ; + guint version; struct ssh_pdu_data *this_data=NULL; struct ssh_flow_data *global_data=NULL; @@ -211,7 +215,7 @@ global_data = g_mem_chunk_alloc(ssh_global_data); global_data->req_counter=0; global_data->rsp_counter=0; - global_data->is_ssh2=TRUE; + global_data->version=SSH_VERSION_UNKNOWN; conversation_add_proto_data(conversation,proto_ssh,global_data); } @@ -241,22 +245,25 @@ } number = 0; - is_ssh2 = global_data->is_ssh2; + version = global_data->version; if (check_col(pinfo->cinfo, COL_PROTOCOL)) { - if(this_data->counter == 0 ) { - col_set_str(pinfo->cinfo, COL_PROTOCOL, "SSH"); - }else { - if(is_ssh2) { - col_set_str(pinfo->cinfo, COL_PROTOCOL, "SSHv2"); - }else { + switch(version) { + case SSH_VERSION_UNKNOWN: + col_set_str(pinfo->cinfo, COL_PROTOCOL, "SSH"); + break; + case SSH_VERSION_1: col_set_str(pinfo->cinfo, COL_PROTOCOL, "SSHv1"); - } + break; + case SSH_VERSION_2: + col_set_str(pinfo->cinfo, COL_PROTOCOL, "SSHv2"); + break; + } } /* we will not decode SSH1 now */ - if(!is_ssh2) { + if(this_data->counter != 0 && version != SSH_VERSION_2) { offset = ssh_dissect_encrypted_packet(tvb, pinfo, offset,ssh_tree,is_response); return; @@ -280,11 +287,11 @@ if(this_number == 0) { offset = ssh_dissect_protocol(tvb, pinfo,offset,ssh_tree, - is_response,&is_ssh2, &need_desegmentation); + is_response,&version, &need_desegmentation); if(!is_response) { - global_data->is_ssh2 = is_ssh2; + global_data->version= version; } - } else { + } else { /* response, 1, 2 is key_exchange */ /* request, 1,2,3,4 is key_exchange */ if((is_response && this_number > 3) || (!is_response && this_number>4)) { @@ -426,12 +433,30 @@ static int ssh_dissect_protocol(tvbuff_t *tvb, packet_info *pinfo, - int offset, proto_tree *tree, int is_response, int * is_ssh2, + int offset, proto_tree *tree, int is_response, int * version, gboolean *need_desegmentation) { guint linelen,next_offset; guint remain_length; + /* + * If the first packet do not contain the banner, + * it is dump in the middle of a flow or not a ssh at all + */ + if(tvb_strncaseeql(tvb,offset,"SSH-",4) != 0 ) { + offset = ssh_dissect_encrypted_packet(tvb, pinfo, + offset,tree,is_response); + return offset; + } + + if(!is_response) { + if(tvb_strncaseeql(tvb,offset,"SSH-2.",6) == 0 ) { + *(version) = SSH_VERSION_2; + }else if(tvb_strncaseeql(tvb,offset,"SSH-1.",6) == 0 ) { + *(version) = SSH_VERSION_1; + } + } + remain_length = tvb_reported_length_remaining(tvb,offset); linelen = tvb_find_line_end(tvb, offset, -1, &next_offset, FALSE); @@ -453,9 +478,6 @@ proto_tree_add_item(tree, hf_ssh_protocol, tvb, offset, linelen+1, FALSE); } - if(!is_response && tvb_strncaseeql(tvb,offset,"SSH-2.0-",8)) { - *(is_ssh2) = FALSE; - } offset+=linelen+1; return offset; }
Attachment:
pgpo5p0DMPTOc.pgp
Description: PGP signature
- Follow-Ups:
- Re: [Ethereal-dev] patch for ssh dissector.
- From: Guy Harris
- Re: [Ethereal-dev] patch for ssh dissector.
- References:
- [Ethereal-dev] question about dissect protocol based on flow not the packet.
- From: Huagang XIE
- Re: [Ethereal-dev] question about dissect protocol based on flow not the packet.
- From: Guy Harris
- [Ethereal-dev] SSH dessector is here.
- From: Huagang Xie
- [Ethereal-dev] question about dissect protocol based on flow not the packet.
- Prev by Date: [Ethereal-dev] Re: dce rpc type packets
- Next by Date: [Ethereal-dev] packet-ssl.c patch - add AES (per rfc3268)
- Previous by thread: Re: [Ethereal-dev] one minor fix for SSH dissector
- Next by thread: Re: [Ethereal-dev] patch for ssh dissector.
- Index(es):