diff --git a/CHANGES b/CHANGES index c07db9563b..bc2484889e 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,10 @@ +2.5-498 | 2018-04-03 01:59:46 -0400 + + * Improvements to GSSAPI handling of Kerberos messages (John E. Rollinson, Seth Hall, juno0812, Justin Oursler) + + * Improve SMB2 Create command events and add newly parsed data. (Julien Wallior) + 2.5-483 | 2018-03-29 14:10:48 -0700 * Source code clean up (Johanna Amann) diff --git a/VERSION b/VERSION index c97e09d82b..23f0a6ac17 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.5-483 +2.5-498 diff --git a/src/analyzer/protocol/gssapi/gssapi-analyzer.pac b/src/analyzer/protocol/gssapi/gssapi-analyzer.pac index 64e8dd5e50..3478e66c93 100644 --- a/src/analyzer/protocol/gssapi/gssapi-analyzer.pac +++ b/src/analyzer/protocol/gssapi/gssapi-analyzer.pac @@ -28,28 +28,29 @@ refine connection GSSAPI_Conn += { function forward_blob(val: GSSAPI_NEG_TOKEN_MECH_TOKEN, is_orig: bool): bool %{ - if ( ${val.mech_token}.length() >= 7 && - memcmp("NTLMSSP", ${val.mech_token}.begin(), 7) == 0 ) + if ( ${val.has_ntlm} && + ${val.ntlm}.length() >= 7 && + memcmp("NTLMSSP", ${val.ntlm}.begin(), 7) == 0 ) { // ntlmssp if ( ! ntlm ) ntlm = analyzer_mgr->InstantiateAnalyzer("NTLM", bro_analyzer()->Conn()); if ( ntlm ) - ntlm->DeliverStream(${val.mech_token}.length(), ${val.mech_token}.begin(), is_orig); + ntlm->DeliverStream(${val.ntlm}.length(), + ${val.ntlm}.begin(), is_orig); } - else if ( ${val.mech_token}.length() == 9 && - (memcmp("\x2a\x86\x48\x86\xf7\x12\x01\x02\x02", ${val.mech_token}.begin(), ${val.mech_token}.length()) == 0 || - memcmp("\x2a\x86\x48\x82\xf7\x12\x01\x02\x02", ${val.mech_token}.begin(), ${val.mech_token}.length()) == 0 ) ) + + else if ( ${val.has_krb} ) { - // krb5 && ms-krb5 if ( ! krb5 ) krb5 = analyzer_mgr->InstantiateAnalyzer("KRB", bro_analyzer()->Conn()); - // 0x0100 is a special marker - if ( krb5 && memcmp("\x01\x00", ${val.mech_token}.begin(), 2) == 0 ) + if ( krb5 ) // accepting all KRB types (REQ, REP, etc) { - krb5->DeliverPacket(${val.mech_token}.length()-2, ${val.mech_token}.begin()+2, is_orig, 0, 0, 0); + krb5->DeliverPacket(${val.krb.blob}.length(), + ${val.krb.blob}.begin(), + is_orig, 0, 0, 0); } } diff --git a/src/analyzer/protocol/gssapi/gssapi-protocol.pac b/src/analyzer/protocol/gssapi/gssapi-protocol.pac index abd58d7a4d..48e360d295 100644 --- a/src/analyzer/protocol/gssapi/gssapi-protocol.pac +++ b/src/analyzer/protocol/gssapi/gssapi-protocol.pac @@ -50,7 +50,23 @@ type GSSAPI_NEG_TOKEN_RESP_Arg = record { }; type GSSAPI_NEG_TOKEN_MECH_TOKEN(is_orig: bool) = record { - meta : ASN1EncodingMeta; - mech_token : bytestring &length=meta.length; + meta : ASN1EncodingMeta; + token : bytestring &length=meta.length; +} &let { + ntlm = token &if($context.connection.is_first_byte(token, 0x43)); + krb : KRB_BLOB withinput token &if($context.connection.is_first_byte(token, 0x60)) &restofdata; }; +type KRB_BLOB = record { + meta : ASN1EncodingMeta; + oid : ASN1OctetString; + token_id : uint16 &byteorder=littleendian; + blob : bytestring &restofdata; +}; + +refine connection GSSAPI_Conn += { + function is_first_byte(token: bytestring, byte: uint8): bool + %{ + return token[0] == byte; + %} +}; diff --git a/testing/btest/Baseline/scripts.base.protocols.krb.smb_gssapi/kerberos.log b/testing/btest/Baseline/scripts.base.protocols.krb.smb_gssapi/kerberos.log new file mode 100644 index 0000000000..d55cd5281a --- /dev/null +++ b/testing/btest/Baseline/scripts.base.protocols.krb.smb_gssapi/kerberos.log @@ -0,0 +1,10 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path kerberos +#open 2017-09-17-21-25-06 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p request_type client service success error_msg from till cipher forwardable renewable client_cert_subject client_cert_fuid server_cert_subject server_cert_fuid +#types time string addr port addr port string string string bool string time time string bool bool string string string string +1165958411.822000 CHhAvVGS1DHFjwGM9 10.24.64.228 1227 10.24.8.44 445 - - - - - - - - - - - - - - +#close 2017-09-17-21-25-06 diff --git a/testing/btest/Traces/krb/smb_gssapi.trace b/testing/btest/Traces/krb/smb_gssapi.trace new file mode 100755 index 0000000000..140ce3a914 Binary files /dev/null and b/testing/btest/Traces/krb/smb_gssapi.trace differ diff --git a/testing/btest/scripts/base/protocols/krb/smb_gssapi.test b/testing/btest/scripts/base/protocols/krb/smb_gssapi.test new file mode 100644 index 0000000000..f4995cd2f6 --- /dev/null +++ b/testing/btest/scripts/base/protocols/krb/smb_gssapi.test @@ -0,0 +1,11 @@ +# This test verifies that GSSAPI is correctly passing events to +# the Kerberos analyzer. The specific trace example is a +# SMB authentication event and therfore relies on the SMB +# analyzer as well. + +# @TEST-EXEC: bro -b -C -r $TRACES/krb/smb_gssapi.trace %INPUT +# @TEST-EXEC: btest-diff kerberos.log +# @TEST-EXEC: btest-diff-rst scripts.base.protocols.krb + +@load base/protocols/krb +@load policy/protocols/smb