On Sun, Sep 08, 2002 at 08:46:59PM -0700, Jaime Fournier wrote:
> I have found on several idempotent calls, such as
> storedata in dfs, that the last 24 bytes of the packet
> are marked as kerberos. This makes sense since AUTH is
> set to 01.
It only makes sense if AUTH is set to 1 *AND* the first octet of the
authentication verifier is set to 6, i.e. dce_c_authn_level_pkt_privacy.
The stuff at
http://www.opengroup.org/onlinepubs/009629399/chap13.htm#tagcjh_18_03_04
says
Authentication Verifier Encodings
Connectionless PDUs contain an authentication verifier if the
PDU header field auth_proto is non-zero. Otherwise, the
authentication verifier is not present.
The encoding and length of the authentication verifier depends
on the authentication service, as identified by the PDU header
field auth_proto.
The authentication data encodings for the PDU authentication
verifier are specified in the following sections for
auth_proto=dce_c_rpc_authn_protocol_krb5.
Unless specified otherwise, the data types and values are
encoded in the NDR transfer syntax. Note that no padding
between elements within a data structure is assumed and that the
alignment requirements for the PDU header (see Alignment ) also
apply to the authentication verifier of the PDU trailer.
When the PDU header field
auth_proto=dce_c_rpc_authn_protocol_krb5, every PDU contains a
20 or 24-byte authentication verifier. The first three fields
of the verifier consist of a plaintext header followed by an
16-byte ciphertext authentication value, as follows:
typedef struct {
u_int8 protection_level;
u_int8 key_vers_num;
byte[pad_length] pad;
byte[16] auth_value;
} auth_trailer_cl_t;
protection_level
The protection level of the RPC. It indicates the level
of service as determined by the protection level values (see
The Generic RPC Security Model ).
key_vers_num
The version number of the key that indicates the key used
to encrypt or to calculate the checksum of any ciphertext in
the authentication value.
pad
A padding field whose value is all zeros. The length of
this array (pad_length) is 6 bytes for protection level
dce_c_authn_level_privacy, 2 bytes otherwise.
auth_value
The ciphertext of the authentication verifier. The format
of auth_value depends on the level of service. The
plaintext is encoded in the transfer syntax as specified in
the PDU header field drep.
so a 24-byte authentication verifier would only make sense for
auth_proto=dce_c_rpc_authn_protocol_krb5 and
protection_level=dce_c_authn_level_pkt_privacy, i.e. 6. Otherwise, the
verifier should be 20 bytes long, unless this is some difference between
DCE RPC 1.1 and some later version, which could perhaps be determined
from the key version number field.
I've checked in code to dissect that. It shows that the protection
level in the verifier in your packet is 4, namely dce_c_authn_level_pkt.
The key version number is 1, and the authentication verifier includes
some of the mysterious bytes you refer to:
> The problem I am seeing is actual payload
> at the end of the "kerberos" area. I am not that
> familiar with the lay out of the encrypted checksums,
> but I was curious if maybe there was a problem with
> identifying non kerberos data as part of the checksum.
The extra 4 bytes at the end appear to continue the sequence of letters
in the previous bytes; perhaps the packet's authentication verifier is
malformed?