Wireshark-dev: [Wireshark-dev] [PATCH] Socks GSSAPI support
From: Jelmer Vernooij <jelmer@xxxxxxxxx>
Date: Wed, 24 Sep 2008 21:54:55 +0200
The attached patch adds support for dissecting GSSAPI authentication data to the SOCKS dissector. Cheers, Jelmer -- Jelmer Vernooij <jelmer@xxxxxxxxx> - http://samba.org/~jelmer/ Jabber: jelmer@xxxxxxxxxxxxxxx
Index: epan/dissectors/packet-socks.c
===================================================================
--- epan/dissectors/packet-socks.c (revision 26258)
+++ epan/dissectors/packet-socks.c (working copy)
@@ -1,6 +1,7 @@
/* packet-socks.c
* Routines for socks versions 4 &5 packet dissection
* Copyright 2000, Jeffrey C. Foster <jfoste@xxxxxxxxxxxx>
+ * Copyright 2008, Jelmer Vernooij <jelmer@xxxxxxxxx>
*
* $Id$
*
@@ -123,6 +124,9 @@
static int hf_socks_ip_dst = -1;
static int hf_socks_ip6_dst = -1;
static int hf_user_name = -1;
+static int hf_gssapi_payload = -1;
+static int hf_gssapi_command = -1;
+static int hf_gssapi_length = -1;
static int hf_v4a_dns_name = -1;
static int hf_socks_dstport = -1;
static int hf_socks_cmd = -1;
@@ -149,7 +153,7 @@
UserNameAuth,
UserNameAuthReply,
GssApiAuth,
- AuthReply,
+ GssApiAuthReply,
Done
};
@@ -174,6 +178,9 @@
row_pointer_type auth_method_row;
row_pointer_type user_name_auth_row;
row_pointer_type auth_version;
+ row_pointer_type gssapi_auth_row;
+ row_pointer_type gssapi_auth_reply_row;
+ row_pointer_type gssapi_auth_failure_row;
guint32 start_done_row;
guint32 dst_addr; /* this needs to handle IPv6 */
@@ -227,7 +234,13 @@
{0, NULL}
};
+static const value_string gssapi_command_table[] = {
+ { 1, "Authentication" },
+ { 0xFF, "Failure" },
+ { 0, NULL }
+};
+
/************************* Support routines ***************************/
@@ -614,6 +627,25 @@
proto_tree_add_text( tree, tvb, offset, 1, "Status: success");
offset ++;
}
+ else if (compare_packet( hash_info->gssapi_auth_row)) {
+ guint16 len;
+ proto_tree_add_item( tree, hf_gssapi_command, tvb, offset, 1, FALSE);
+ proto_tree_add_item( tree, hf_gssapi_length, tvb, offset+1, 2, FALSE);
+ len = tvb_get_ntohs(tvb, offset+1);
+ if (len > 0)
+ proto_tree_add_item( tree, hf_gssapi_payload, tvb, offset+3, len, FALSE);
+ }
+ else if (compare_packet( hash_info->gssapi_auth_failure_row)) {
+ proto_tree_add_item( tree, hf_gssapi_command, tvb, offset, 1, FALSE);
+ }
+ else if (compare_packet( hash_info->gssapi_auth_reply_row)) {
+ guint16 len;
+ proto_tree_add_item( tree, hf_gssapi_command, tvb, offset, 1, FALSE);
+ proto_tree_add_item( tree, hf_gssapi_length, tvb, offset+1, 2, FALSE);
+ len = tvb_get_ntohs(tvb, offset+1);
+ if (len > 0)
+ proto_tree_add_item( tree, hf_gssapi_payload, tvb, offset+3, len, FALSE);
+ }
else if ((compare_packet( hash_info->command_row)) ||
(compare_packet( hash_info->cmd_reply_row)) ||
(compare_packet( hash_info->bind_reply_row))){
@@ -784,8 +816,7 @@
hash_info->state = UserNameAuth;
else if ( AuthMethod == GSS_API_AUTHENTICATION)
-/*XXX should be this hash_info->state = GssApiAuth; */
- hash_info->state = Done;
+ hash_info->state = GssApiAuth;
else hash_info->state = Done; /*Auth failed or error*/
@@ -856,16 +887,39 @@
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 request");
hash_info->user_name_auth_row = get_packet_ptr;
- hash_info->state = AuthReply;
+ hash_info->state = UserNameAuthReply;
}
- else if ( hash_info->state == AuthReply){ /* V5 User Auth reply */
+ else if ( hash_info->state == GssApiAuth) {
+ if (check_col(pinfo->cinfo, COL_INFO))
+ col_append_str(pinfo->cinfo, COL_INFO,
+ " GSSAPI Authentication request");
+ hash_info->gssapi_auth_row = get_packet_ptr;
+ hash_info->state = GssApiAuthReply;
+ }
+ else if ( hash_info->state == GssApiAuthReply) {
+ if (tvb_get_guint8(tvb, offset+1) == 0xFF) {
+ if (check_col(pinfo->cinfo, COL_INFO))
+ col_append_str(pinfo->cinfo, COL_INFO,
+ " GSSAPI Authentication failure");
+ hash_info->gssapi_auth_failure_row = get_packet_ptr;
+ } else {
+ if (check_col(pinfo->cinfo, COL_INFO))
+ col_append_str(pinfo->cinfo, COL_INFO,
+ " GSSAPI Authentication reply");
+ if (tvb_get_ntohs(tvb, offset+2) == 0)
+ hash_info->state = V5Command;
+ else
+ hash_info->state = GssApiAuth;
+ hash_info->gssapi_auth_reply_row = get_packet_ptr;
+ }
+ }
+ else if ( hash_info->state == UserNameAuthReply){ /* V5 User Auth reply */
hash_info->auth_version = get_packet_ptr;
if (check_col(pinfo->cinfo, COL_INFO))
col_append_str(pinfo->cinfo, COL_INFO, " User authentication reply");
@@ -1155,6 +1209,18 @@
NULL, 0x0, "", HFILL
}
},
+ { &hf_gssapi_payload,
+ { "GSSAPI data", "socks.gssapi.data", FT_BYTES, BASE_NONE, NULL, 0x0, "", HFILL
+ }
+ },
+ { &hf_gssapi_command,
+ { "SOCKS/GSSAPI command", "socks.gssapi.command", FT_UINT8, BASE_DEC, VALS(gssapi_command_table), 0x0, "", HFILL
+ }
+ },
+ { &hf_gssapi_length,
+ { "SOCKS/GSSAPI data length", "socks.gssapi.length", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL
+ }
+ },
{ &hf_v4a_dns_name,
{ "SOCKS v4a Remote Domain Name", "socks.v4a_dns_name", FT_STRINGZ, BASE_NONE,
NULL, 0x0, "", HFILL
- Follow-Ups:
- Re: [Wireshark-dev] [PATCH] Socks GSSAPI support
- From: Jaap Keuter
- Re: [Wireshark-dev] [PATCH] Socks GSSAPI support
- Prev by Date: Re: [Wireshark-dev] wireshark multi-platform setup memos
- Next by Date: Re: [Wireshark-dev] wireshark multi-platform setup memos
- Previous by thread: Re: [Wireshark-dev] [Wireshark-commits] rev 26261:/trunk/epan/dissectors/ /trunk/epan/dissectors/: packet-xml.cpacket-xml.h
- Next by thread: Re: [Wireshark-dev] [PATCH] Socks GSSAPI support
- Index(es):