Ethereal-dev: [Ethereal-dev] Re: bug in socks (3) - wrong dissection of AuthReply packets.

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Yaniv Kaul <ykaul@xxxxxxxxxxxx>
Date: Thu, 12 Feb 2004 15:40:30 +0200
Attached please find a fix for packet-socks.c that corrects this, against CVS 2004-01-20.

Yaniv Kaul wrote:

Lines 840-844, in packet-socks.c:
   else if ( hash_info->state == AuthReply){    /* V5 User Auth reply */
       hash_info->cmd_reply_row = get_packet_ptr;
       if (check_col(pinfo->cinfo, COL_INFO))
col_append_str(pinfo->cinfo, COL_INFO, " User authentication reply");
       hash_info->state = V5Command;

The code assumes that the response for a an authentication request is a V5Command. However, it's usually an authentication response - and the authentication subnegotiation has its own version number ('1', according to RFC 1929). This causes it not to interpret the command properly (as it see the version is '1' and '5', it won't continue to dissect the packet).

I've seen servers replying with version '5', but I think it's a faulty server - some clients won't be able to connect to it, if they expect the version they sent ('1)' and the version they received ('5') to match...

Snoops will be available upon request.


--- packet-socks.c	2004-01-22 22:43:18.000000000 +0200
+++ ../packet-socks.c	2004-02-12 15:30:46.000000000 +0200
@@ -2,7 +2,7 @@
  * Routines for socks versions 4 &5  packet dissection
  * Copyright 2000, Jeffrey C. Foster <jfoste@xxxxxxxxxxxx>
  *
- * $Id: packet-socks.c,v 1.56 2004/01/22 20:43:17 guy Exp $
+ * $Id: packet-socks.c,v 1.55 2004/01/10 02:43:29 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@xxxxxxxxxxxx>
@@ -141,6 +141,7 @@
 	V5Reply,
 	V5BindReply,
 	UserNameAuth,
+	UserNameAuthReply,
 	GssApiAuth,
 	AuthReply,
 	Done
@@ -166,6 +167,7 @@
 	row_pointer_type	command_row;
 	row_pointer_type 	auth_method_row;
 	row_pointer_type	user_name_auth_row;
+	row_pointer_type	auth_version;
 	guint32 start_done_row;
 
 	guint32	dst_addr;	/* this needs to handle IPv6 */
@@ -418,7 +420,7 @@
 
         *ptr = hash_info->udp_remote_port;
 
-	decode_udp_ports( tvb, offset, pinfo, tree, pinfo->srcport, pinfo->destport, -1);
+	decode_udp_ports( tvb, offset, pinfo, tree, pinfo->srcport, pinfo->destport);
 
         *ptr = hash_info->udp_port;
 
@@ -538,7 +540,7 @@
 	unsigned int i, command;
 	guint temp;
 	char *AuthMethodStr;
-
+	unsigned char auth_status;
 	proto_tree_add_item( tree, hf_socks_ver, tvb, offset, 1, FALSE);
 	++offset;
 
@@ -589,6 +591,14 @@
 	}
 					/* command to the server */
 					/* command response from server */
+	else if (compare_packet( hash_info->auth_version)) {
+		auth_status = tvb_get_guint8(tvb, offset);
+		if(auth_status != 0)
+			proto_tree_add_text( tree, tvb, offset, 1, "Status: %d (failure)", auth_status);
+		else
+			proto_tree_add_text( tree, tvb, offset, 1, "Status: success", auth_status);
+		offset ++;
+	}
 	else if ((compare_packet( hash_info->command_row)) ||
 	         (compare_packet( hash_info->cmd_reply_row)) ||
 	         (compare_packet( hash_info->bind_reply_row))){
@@ -823,24 +833,25 @@
 	else if ( hash_info->state == V5BindReply) {	/* V5 Bind Second Reply */
 
 		if (check_col(pinfo->cinfo, COL_INFO))
-	 		col_append_str(pinfo->cinfo, COL_INFO, " Command Response: Bind remote host info");
+			col_append_str(pinfo->cinfo, COL_INFO, " Command Response: Bind remote host info");
 
 		hash_info->bind_reply_row = get_packet_ptr;
 		hash_info->state = Done;
 	}
 	else if ( hash_info->state == UserNameAuth) {	/* Handle V5 User Auth*/
+		hash_info->auth_version = get_packet_ptr;
 		if (check_col(pinfo->cinfo, COL_INFO))
-	 		col_append_str(pinfo->cinfo, COL_INFO,
-	 			" User authentication response");
+			col_append_str(pinfo->cinfo, COL_INFO,
+				" User authentication request");
 
 		hash_info->user_name_auth_row = get_packet_ptr;
 		hash_info->state = AuthReply;
 
 	}
 	else if ( hash_info->state == AuthReply){	/* V5 User Auth reply */
-		hash_info->cmd_reply_row = get_packet_ptr;
+		hash_info->auth_version = get_packet_ptr;
 		if (check_col(pinfo->cinfo, COL_INFO))
-	 		col_append_str(pinfo->cinfo, COL_INFO, " User authentication reply");
+			col_append_str(pinfo->cinfo, COL_INFO, " User authentication reply");
 		hash_info->state = V5Command;
 	}
 }