TODO packet-kerberos: dissect non-ntstatus PA-PW-SALT fields
authorStefan Metzmacher <metze@samba.org>
Fri, 27 Feb 2015 13:02:56 +0000 (14:02 +0100)
committerStefan Metzmacher <metze@samba.org>
Sun, 20 Jan 2019 22:14:58 +0000 (23:14 +0100)
These are generated by Samba KDC's (at least 4.0, 4.1 and 4.2)
in an AS-REP instead of having a PA-EYTPES-INFO2 entry with the salt
information.

Change-Id: I19345cb3f9c863e54a8f16002987912487f7d76a

epan/dissectors/asn1/kerberos/k5.asn
epan/dissectors/asn1/kerberos/kerberos.cnf
epan/dissectors/asn1/kerberos/packet-kerberos-template.c

index d90c337..ecfeec8 100644 (file)
@@ -864,6 +864,8 @@ KERB-AD-RESTRICTION-ENTRY ::= [UNIVERSAL 16] SEQUENCE {
        restriction             [1] OCTET STRING -- LSAP_TOKEN_INFO_INTEGRITY structure
 }
 
+PA-PW-SALT ::= KerberosString
+
 END
 
 -- etags -r '/\([A-Za-z][-A-Za-z0-9]*\).*::=/\1/' k5.asn1
index 7fa8ae5..d37a306 100644 (file)
@@ -123,21 +123,24 @@ guint32 msgtype;
        proto_item_append_text(tree, " %s", val_to_str(msgtype, krb5_msg_types, "Unknown:0x%x"));
 ##endif
 
-#.FN_BODY ERROR-CODE VAL_PTR = &krb5_errorcode
+#.FN_BODY ERROR-CODE VAL_PTR = &private_data->errorcode
+       kerberos_private_data_t *private_data = kerberos_get_private_data(actx);
 %(DEFAULT_BODY)s
 
 #.FN_FTR ERROR-CODE
-       if(krb5_errorcode) {
+       if (private_data->errorcode) {
                col_add_fstr(actx->pinfo->cinfo, COL_INFO,
                        "KRB Error: %s",
-                       val_to_str(krb5_errorcode, krb5_error_codes,
+                       val_to_str(private_data->errorcode, krb5_error_codes,
                        "Unknown error code %#x"));
        }
 
        return offset;
 #.END
 #.FN_BODY KRB-ERROR/_untag/e-data
-       switch(krb5_errorcode){
+       kerberos_private_data_t *private_data = kerberos_get_private_data(actx);
+
+       switch (private_data->errorcode) {
        case KRB5_ET_KRB5KDC_ERR_BADOPTION:
        case KRB5_ET_KRB5KDC_ERR_CLIENT_REVOKED:
        case KRB5_ET_KRB5KDC_ERR_KEY_EXP:
@@ -145,6 +148,7 @@ guint32 msgtype;
                /* ms windows kdc sends e-data of this type containing a "salt"
                 * that contains the nt_status code for these error codes.
                 */
+               private_data->try_nt_status = TRUE;
                offset=dissect_ber_octet_string_wcb(FALSE, actx, tree, tvb, offset, hf_kerberos_e_data, dissect_kerberos_PA_DATA);
                break;
        case KRB5_ET_KRB5KDC_ERR_PREAUTH_REQUIRED:
index f5bac0f..84af7db 100644 (file)
@@ -100,6 +100,8 @@ typedef struct {
        guint32 msg_type;
        gboolean kdc_response_initialized;
        gboolean kdc_response;
+       guint32 errorcode;
+       gboolean try_nt_status;
        guint32 etype;
        guint32 padata_type;
        guint32 is_enc_padata;
@@ -129,6 +131,7 @@ static int dissect_kerberos_PA_ENC_TS_ENC(gboolean implicit_tag _U_, tvbuff_t *t
 static int dissect_kerberos_KERB_PA_PAC_REQUEST(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);
 static int dissect_kerberos_PA_S4U2Self(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);
 static int dissect_kerberos_PA_S4U_X509_USER(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);
+static int dissect_kerberos_PA_PW_SALT(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);
 static int dissect_kerberos_ETYPE_INFO(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);
 static int dissect_kerberos_ETYPE_INFO2(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);
 static int dissect_kerberos_AD_IF_RELEVANT(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);
@@ -233,7 +236,6 @@ static expert_field ei_krb_gssapi_dlglen = EI_INIT;
 static dissector_handle_t krb4_handle=NULL;
 
 /* Global variables */
-static guint32 krb5_errorcode;
 static guint32 gbl_keytype;
 static gboolean gbl_do_col_info;
 
@@ -1802,15 +1804,35 @@ dissect_krb5_PA_PROV_SRV_LOCATION(gboolean implicit_tag _U_, tvbuff_t *tvb _U_,
 static int
 dissect_krb5_PW_SALT(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_)
 {
-       guint32 nt_status;
+       kerberos_private_data_t *private_data = kerberos_get_private_data(actx);
+       guint32 nt_status = 0;
+       guint32 val_0 = 0;
+       guint32 val_1 = 0;
+
+       if (private_data->errorcode == 0) {
+               goto no_error;
+       }
+
+       if (!private_data->try_nt_status) {
+               goto no_error;
+       }
+
+       if (tvb_reported_length_remaining(tvb, offset) != 12) {
+               goto no_error;
+       }
+
+       nt_status=tvb_get_letohl(tvb, offset);
+       val_0=tvb_get_letohl(tvb, offset + 4);
+       val_1=tvb_get_letohl(tvb, offset + 8);
+
+       if (val_0 != 0 || val_1 != 1) {
+               goto no_error;
+       }
 
        /* Microsoft stores a special 12 byte blob here
         * guint32 NT_status
-        * guint32 unknown
-        * guint32 unknown
-        * decode everything as this blob for now until we see if anyone
-        * else ever uses it   or we learn how to tell whether this
-        * is such an MS blob or not.
+        * guint32 unknown (== 0)
+        * guint32 unknown (== 1)
         */
        proto_tree_add_item(tree, hf_krb_smb_nt_status, tvb, offset, 4,
                        ENC_LITTLE_ENDIAN);
@@ -1832,6 +1854,10 @@ dissect_krb5_PW_SALT(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U
        offset += 4;
 
        return offset;
+
+ no_error:
+       return dissect_kerberos_PA_PW_SALT(implicit_tag, tvb, offset,
+                                          actx, tree, hf_index);
 }
 
 static int