mirror of
https://github.com/zeek/zeek.git
synced 2025-10-08 01:28:20 +00:00
Merge remote-tracking branch 'origin/master' into topic/johanna/tls12-decryption
This commit is contained in:
commit
b8b6ac744e
1531 changed files with 109968 additions and 46436 deletions
|
@ -14,21 +14,21 @@ export {
|
|||
## Indicates that a certificate's NotValidAfter date has lapsed
|
||||
## and the certificate is now invalid.
|
||||
Certificate_Expired,
|
||||
## Indicates that a certificate is going to expire within
|
||||
## Indicates that a certificate is going to expire within
|
||||
## :zeek:id:`SSL::notify_when_cert_expiring_in`.
|
||||
Certificate_Expires_Soon,
|
||||
## Indicates that a certificate's NotValidBefore date is future
|
||||
## dated.
|
||||
Certificate_Not_Valid_Yet,
|
||||
};
|
||||
|
||||
## The category of hosts you would like to be notified about which have
|
||||
## certificates that are going to be expiring soon. By default, these
|
||||
## notices will be suppressed by the notice framework for 1 day after
|
||||
|
||||
## The category of hosts you would like to be notified about which have
|
||||
## certificates that are going to be expiring soon. By default, these
|
||||
## notices will be suppressed by the notice framework for 1 day after
|
||||
## a particular certificate has had a notice generated.
|
||||
## Choices are: LOCAL_HOSTS, REMOTE_HOSTS, ALL_HOSTS, NO_HOSTS
|
||||
option notify_certs_expiration = LOCAL_HOSTS;
|
||||
|
||||
|
||||
## The time before a certificate is going to expire that you would like
|
||||
## to start receiving :zeek:enum:`SSL::Certificate_Expires_Soon` notices.
|
||||
option notify_when_cert_expiring_in = 30days;
|
||||
|
@ -42,24 +42,24 @@ event ssl_established(c: connection) &priority=3
|
|||
! c$ssl$cert_chain[0]?$x509 || ! c$ssl$cert_chain[0]?$sha1 )
|
||||
return;
|
||||
|
||||
local fuid = c$ssl$cert_chain_fuids[0];
|
||||
local fuid = c$ssl$cert_chain[0]$fuid;
|
||||
local cert = c$ssl$cert_chain[0]$x509$certificate;
|
||||
local hash = c$ssl$cert_chain[0]$sha1;
|
||||
|
||||
|
||||
if ( cert$not_valid_before > network_time() )
|
||||
NOTICE([$note=Certificate_Not_Valid_Yet,
|
||||
$conn=c, $suppress_for=1day,
|
||||
$msg=fmt("Certificate %s isn't valid until %T", cert$subject, cert$not_valid_before),
|
||||
$identifier=cat(c$id$resp_h, c$id$resp_p, hash),
|
||||
$fuid=fuid]);
|
||||
|
||||
|
||||
else if ( cert$not_valid_after < network_time() )
|
||||
NOTICE([$note=Certificate_Expired,
|
||||
$conn=c, $suppress_for=1day,
|
||||
$msg=fmt("Certificate %s expired at %T", cert$subject, cert$not_valid_after),
|
||||
$identifier=cat(c$id$resp_h, c$id$resp_p, hash),
|
||||
$fuid=fuid]);
|
||||
|
||||
|
||||
else if ( cert$not_valid_after - notify_when_cert_expiring_in < network_time() )
|
||||
NOTICE([$note=Certificate_Expires_Soon,
|
||||
$msg=fmt("Certificate %s is going to expire at %T", cert$subject, cert$not_valid_after),
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
@deprecated "Remove in v5.1. Use log-certs-base64.zeek instead."
|
||||
|
||||
##! This script is used to extract host certificates seen on the wire to disk
|
||||
##! after being converted to PEM files. The certificates will be stored in
|
||||
##! a single file, one for local certificates and one for remote certificates.
|
||||
|
|
|
@ -165,14 +165,14 @@ event ssl_established(c: connection) &priority=3
|
|||
{
|
||||
if ( ! c$ssl?$cert_chain )
|
||||
return;
|
||||
|
||||
|
||||
if ( |c$ssl$cert_chain| < 1 )
|
||||
return;
|
||||
|
||||
|
||||
if ( ! c$ssl$cert_chain[0]?$x509 )
|
||||
return;
|
||||
|
||||
local fuid = c$ssl$cert_chain_fuids[0];
|
||||
local fuid = c$ssl$cert_chain[0]$fuid;
|
||||
|
||||
if ( ! c$ssl$cert_chain[0]?$sha1 )
|
||||
{
|
||||
|
|
19
scripts/policy/protocols/ssl/log-certs-base64.zeek
Normal file
19
scripts/policy/protocols/ssl/log-certs-base64.zeek
Normal file
|
@ -0,0 +1,19 @@
|
|||
##! This script is used to extract certificates seen on the wire to Zeek log files.
|
||||
##! The certificates are base64-encoded and written to ssl.log, to the newly added cert
|
||||
##! field.
|
||||
|
||||
@load base/protocols/ssl
|
||||
@load base/files/x509
|
||||
|
||||
redef record X509::Info += {
|
||||
## Base64 endoded X.509 certificate.
|
||||
cert: string &log &optional;
|
||||
};
|
||||
|
||||
event x509_certificate(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate) &priority=1
|
||||
{
|
||||
if ( ! f$info?$x509 )
|
||||
return;
|
||||
|
||||
f$info$x509$cert = encode_base64(x509_get_certificate_string(cert_ref));
|
||||
}
|
|
@ -6,71 +6,8 @@
|
|||
|
||||
module X509;
|
||||
|
||||
export {
|
||||
redef record Info += {
|
||||
## Logging of certificate is suppressed if set to F
|
||||
logcert: bool &default=T;
|
||||
};
|
||||
}
|
||||
|
||||
# We need both the Info and the fa_file record modified.
|
||||
# The only instant when we have both, the connection and the
|
||||
# file available without having to loop is in the file_over_new_connection
|
||||
# event.
|
||||
# When that event is raised, the x509 record in f$info (which is the only
|
||||
# record the logging framework gets) is not yet available. So - we
|
||||
# have to do this two times, sorry.
|
||||
# Alternatively, we could place it info Files::Info first - but we would
|
||||
# still have to copy it.
|
||||
redef record fa_file += {
|
||||
logcert: bool &default=T;
|
||||
};
|
||||
|
||||
hook X509::log_policy(rec: X509::Info, id: Log::ID, filter: Log::Filter)
|
||||
{
|
||||
if ( ! rec$logcert )
|
||||
if ( ! rec$host_cert )
|
||||
break;
|
||||
}
|
||||
|
||||
event file_sniff(f: fa_file, meta: fa_metadata) &priority=4
|
||||
{
|
||||
if ( ( ! f?$conns ) || ( |f$conns| != 1 ) )
|
||||
return;
|
||||
|
||||
if ( ! f?$info || ! f$info?$mime_type )
|
||||
return;
|
||||
|
||||
if ( ! ( f$info$mime_type == "application/x-x509-ca-cert" || f$info$mime_type == "application/x-x509-user-cert"
|
||||
|| f$info$mime_type == "application/pkix-cert" ) )
|
||||
return;
|
||||
|
||||
local c: connection &is_assigned;
|
||||
|
||||
for ( cid, c in f$conns )
|
||||
{
|
||||
if ( ! c?$ssl )
|
||||
return;
|
||||
}
|
||||
|
||||
local chain: vector of string;
|
||||
|
||||
if ( f$is_orig )
|
||||
chain = c$ssl$client_cert_chain_fuids;
|
||||
else
|
||||
chain = c$ssl$cert_chain_fuids;
|
||||
|
||||
if ( |chain| == 0 )
|
||||
{
|
||||
Reporter::warning(fmt("Certificate not in chain? (fuid %s)", f$id));
|
||||
return;
|
||||
}
|
||||
|
||||
# Check if this is the host certificate
|
||||
if ( f$id != chain[0] )
|
||||
f$logcert=F;
|
||||
}
|
||||
|
||||
event x509_certificate(f: fa_file, cert_ref: opaque of x509, cert: X509::Certificate) &priority=2
|
||||
{
|
||||
f$info$x509$logcert = f$logcert; # info record available, copy information.
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
@deprecated("Remove in v5.1. Please switch to other more modern approaches like SCT validation (validate-sct.zeek).")
|
||||
|
||||
@load base/protocols/ssl
|
||||
|
||||
module CertNotary;
|
||||
|
|
176
scripts/policy/protocols/ssl/ssl-log-ext.zeek
Normal file
176
scripts/policy/protocols/ssl/ssl-log-ext.zeek
Normal file
|
@ -0,0 +1,176 @@
|
|||
##! This file adds a lot of additional information to the SSL log
|
||||
##! It is not loaded by default since the information significantly expands
|
||||
##! the log and is probably not interesting for a majority of people.
|
||||
|
||||
@load base/protocols/ssl
|
||||
|
||||
redef record SSL::Info += {
|
||||
## Numeric version of the server in the server hello
|
||||
server_version: count &log &optional;
|
||||
## Numeric version of the client in the client hello
|
||||
client_version: count &log &optional;
|
||||
## Ciphers that were offered by the client for the connection
|
||||
client_ciphers: vector of count &log &optional;
|
||||
## SSL Client extensions
|
||||
ssl_client_exts: vector of count &log &optional;
|
||||
## SSL server extensions
|
||||
ssl_server_exts: vector of count &log &optional;
|
||||
## Suggested ticket lifetime sent in the session ticket handshake
|
||||
## by the server.
|
||||
ticket_lifetime_hint: count &log &optional;
|
||||
## The diffie helman parameter size, when using DH.
|
||||
dh_param_size: count &log &optional;
|
||||
## supported elliptic curve point formats
|
||||
point_formats: vector of count &log &optional;
|
||||
## The curves supported by the client.
|
||||
client_curves: vector of count &log &optional;
|
||||
## Application layer protocol negotiation extension sent by the client.
|
||||
orig_alpn: vector of string &log &optional;
|
||||
## TLS 1.3 supported versions
|
||||
client_supported_versions: vector of count &log &optional;
|
||||
## TLS 1.3 supported versions
|
||||
server_supported_version: count &log &optional;
|
||||
## TLS 1.3 Pre-shared key exchange modes
|
||||
psk_key_exchange_modes: vector of count &log &optional;
|
||||
## Key share groups from client hello
|
||||
client_key_share_groups: vector of count &log &optional;
|
||||
## Selected key share group from server hello
|
||||
server_key_share_group: count &log &optional;
|
||||
## Client supported compression methods
|
||||
client_comp_methods: vector of count &log &optional;
|
||||
## Server chosen compression method
|
||||
comp_method: count &optional;
|
||||
## Client supported signature algorithms
|
||||
sigalgs: vector of count &log &optional;
|
||||
## Client supported hash algorithms
|
||||
hashalgs: vector of count &log &optional;
|
||||
};
|
||||
|
||||
event ssl_client_hello(c: connection, version: count, record_version: count, possible_ts: time, client_random: string, session_id: string, ciphers: index_vec, comp_methods: index_vec)
|
||||
{
|
||||
if ( ! c?$ssl )
|
||||
return;
|
||||
|
||||
c$ssl$client_ciphers = ciphers;
|
||||
c$ssl$client_version = version;
|
||||
c$ssl$client_comp_methods = comp_methods;
|
||||
}
|
||||
|
||||
event ssl_server_hello(c: connection, version: count, record_version: count, possible_ts: time, server_random: string, session_id: string, cipher: count, comp_method: count)
|
||||
{
|
||||
if ( ! c?$ssl )
|
||||
return;
|
||||
|
||||
c$ssl$server_version = version;
|
||||
c$ssl$comp_method = comp_method;
|
||||
}
|
||||
|
||||
event ssl_session_ticket_handshake(c: connection, ticket_lifetime_hint: count, ticket: string)
|
||||
{
|
||||
if ( ! c?$ssl )
|
||||
return;
|
||||
|
||||
c$ssl$ticket_lifetime_hint = ticket_lifetime_hint;
|
||||
}
|
||||
|
||||
event ssl_extension(c: connection, is_orig: bool, code: count, val: string)
|
||||
{
|
||||
if ( ! c?$ssl )
|
||||
return;
|
||||
|
||||
if ( is_orig )
|
||||
{
|
||||
if ( ! c$ssl?$ssl_client_exts )
|
||||
c$ssl$ssl_client_exts = vector();
|
||||
c$ssl$ssl_client_exts[|c$ssl$ssl_client_exts|] = code;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ! c$ssl?$ssl_server_exts )
|
||||
c$ssl$ssl_server_exts = vector();
|
||||
c$ssl$ssl_server_exts[|c$ssl$ssl_server_exts|] = code;
|
||||
}
|
||||
}
|
||||
|
||||
event ssl_extension_ec_point_formats(c: connection, is_orig: bool, point_formats: index_vec)
|
||||
{
|
||||
if ( ! c?$ssl || ! is_orig )
|
||||
return;
|
||||
|
||||
c$ssl$point_formats = point_formats;
|
||||
}
|
||||
|
||||
event ssl_extension_elliptic_curves(c: connection, is_orig: bool, curves: index_vec)
|
||||
{
|
||||
if ( ! c?$ssl || ! is_orig )
|
||||
return;
|
||||
|
||||
c$ssl$client_curves = curves;
|
||||
}
|
||||
|
||||
event ssl_extension_application_layer_protocol_negotiation(c: connection, is_orig: bool, names: string_vec)
|
||||
{
|
||||
if ( ! c?$ssl )
|
||||
return;
|
||||
|
||||
if ( is_orig )
|
||||
c$ssl$orig_alpn = names;
|
||||
}
|
||||
|
||||
event ssl_dh_server_params(c: connection, p: string, q: string, Ys: string)
|
||||
{
|
||||
if ( ! c?$ssl )
|
||||
return;
|
||||
|
||||
local key_length = |Ys| * 8; # key length in bits
|
||||
c$ssl$dh_param_size = key_length;
|
||||
}
|
||||
|
||||
event ssl_extension_supported_versions(c: connection, is_orig: bool, versions: index_vec)
|
||||
{
|
||||
if ( ! c?$ssl )
|
||||
return;
|
||||
|
||||
if ( is_orig )
|
||||
c$ssl$client_supported_versions = versions;
|
||||
else
|
||||
c$ssl$server_supported_version = versions[0];
|
||||
}
|
||||
|
||||
event ssl_extension_psk_key_exchange_modes(c: connection, is_orig: bool, modes: index_vec)
|
||||
{
|
||||
if ( ! c?$ssl || ! is_orig )
|
||||
return;
|
||||
|
||||
c$ssl$psk_key_exchange_modes = modes;
|
||||
}
|
||||
|
||||
event ssl_extension_key_share(c: connection, is_orig: bool, curves: index_vec)
|
||||
{
|
||||
if ( ! c?$ssl )
|
||||
return;
|
||||
|
||||
if ( is_orig )
|
||||
c$ssl$client_key_share_groups = curves;
|
||||
else
|
||||
c$ssl$server_key_share_group = curves[0];
|
||||
}
|
||||
|
||||
event ssl_extension_signature_algorithm(c: connection, is_orig: bool, signature_algorithms: signature_and_hashalgorithm_vec)
|
||||
{
|
||||
if ( ! c?$ssl || ! is_orig )
|
||||
return;
|
||||
|
||||
local sigalgs: index_vec = vector();
|
||||
local hashalgs: index_vec = vector();
|
||||
|
||||
for ( i in signature_algorithms )
|
||||
{
|
||||
local rec = signature_algorithms[i];
|
||||
sigalgs[|sigalgs|] = rec$SignatureAlgorithm;
|
||||
hashalgs[|hashalgs|] = rec$HashAlgorithm;
|
||||
}
|
||||
|
||||
c$ssl$sigalgs = sigalgs;
|
||||
c$ssl$hashalgs = hashalgs;
|
||||
}
|
|
@ -26,7 +26,7 @@ export {
|
|||
|
||||
}
|
||||
|
||||
# MD5 hash values for recently validated chains along with the OCSP validation
|
||||
# SHA256 hash values for recently validated chains along with the OCSP validation
|
||||
# status are kept in this table to avoid constant validation every time the same
|
||||
# certificate chain is seen.
|
||||
global recently_ocsp_validated: table[string] of string = table() &read_expire=5mins;
|
||||
|
@ -49,7 +49,11 @@ event ssl_established(c: connection) &priority=3
|
|||
chain[i] = c$ssl$cert_chain[i]$x509$handle;
|
||||
}
|
||||
|
||||
local reply_id = cat(md5_hash(c$ssl$ocsp_response), join_string_vec(c$ssl$cert_chain_fuids, "."));
|
||||
local chain_fuids = "";
|
||||
for ( i in c$ssl$cert_chain )
|
||||
chain_fuids += cat(c$ssl$cert_chain[i]$fuid, ",");
|
||||
|
||||
local reply_id = cat(sha256_hash(c$ssl$ocsp_response), chain_fuids);
|
||||
|
||||
if ( reply_id in recently_ocsp_validated )
|
||||
{
|
||||
|
|
|
@ -55,7 +55,7 @@ event ssl_established(c: connection) &priority=3
|
|||
! c$ssl$cert_chain[0]?$x509 )
|
||||
return;
|
||||
|
||||
local fuid = c$ssl$cert_chain_fuids[0];
|
||||
local fuid = c$ssl$cert_chain[0]$fuid;
|
||||
local cert = c$ssl$cert_chain[0]$x509$certificate;
|
||||
local hash = c$ssl$cert_chain[0]$sha1;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue