Zeek Scripting "Отсутствует значение поля ошибки"
Я пытаюсь написать сценарий Zeek, чтобы разделить трафик DNS на два файла журнала (запрос и ответ). Ошибка "Поле отсутствует значение" для кода $TTL=c$dns$TTLs
в dns_query_reply
событие. Я не понимаю причину этой ошибки, поскольку файл dns.log правильно содержит значение.
Код выглядит следующим образом:
module DnsFeatureExtractor;
export{
redef enum Log::ID += {QueryDNS};
redef enum Log::ID += {ReplyDNS};
type InfoQuery: record{
uid: string &log;
id: conn_id &log;
domain: string &log &optional;
query_type: string &log &optional;
timestamp: time &log;
};
type InfoReply: record{
uid: string &log;
id: conn_id &log;
response_code: count &log &optional;
TTL: vector of interval &log &optional;
resolved_IP: vector of string &log &optional;
timestamp: time &log;
};
}
event zeek_init(){
Log::create_stream(QueryDNS, [$columns=InfoQuery, $path="QueryDNS"]);
Log::create_stream(ReplyDNS, [$columns=InfoReply, $path="ReplyDNS"]);
}
event dns_request(c: connection, msg: dns_msg, query: string, qtype: count, qclass: count){
local name_qtype = DNS::query_types[qtype];
local rec: DnsFeatureExtractor::InfoQuery = [$uid=c$uid, $id=c$id, $domain=query, $query_type=name_qtype, $timestamp=c$start_time];
Log::write(DnsFeatureExtractor::QueryDNS, rec);
}
event dns_query_reply(c: connection, msg: dns_msg, query: string, qtype: count, qclass: count){
local rec_r: DnsFeatureExtractor::InfoReply = [$uid=c$uid, $id=c$id, $response_code=msg$rcode, $TTL=c$dns$TTLs, $resolved_IP=c$dns$answers, $timestamp=c$start_time];
Log::write(DnsFeatureExtractor::ReplyDNS, rec_r);
}
1 ответ
Этот тонкий: вы видите проблему с заказом. Вdns_query_reply
обработчик событий вызывается перед обработчиком события, которое фактически заполняет TTL (например, dns_A_reply
).
В c$dns
поля, о которых идет речь, заполняются в DNS::do_reply
крючок, поэтому лучше всего убедиться, что вы добавляете на крючок. Если вы используете приоритет по умолчанию, он будет запускаться после того, который заполняет поля. Попробуйте это вместоdns_query_reply
обработчик:
hook DNS::do_reply(c: connection, msg: dns_msg, ans: dns_answer, reply: string) {
local rec_r: DnsFeatureExtractor::InfoReply = [$uid=c$uid, $id=c$id, $response_code=msg$rcode, $TTL=c$dns$TTLs, $resolved_IP=c$dns$answers, $timestamp=c$start_time];
Log::write(DnsFeatureExtractor::ReplyDNS, rec_r);
}
Обратите внимание, что вы все еще имеете дело с необязательными значениями записей, поэтому возможно, что, несмотря на вышесказанное, вы по-прежнему не видите все значения полей. Чтобы защититься от этого, вы можете проверить, действительно ли определены дополнительные значения, и скопировать их только в этом случае:
hook DNS::do_reply(c: connection, msg: dns_msg, ans: dns_answer, reply: string)
{
local rec_r: DnsFeatureExtractor::InfoReply = [$uid=c$uid, $id=c$id, $response_code=msg$rcode, $timestamp=c$start_time];
if ( c$dns?$TTLs )
rec_r$TTL = c$dns$TTLs;
if ( c$dns?$answers )
rec_r$resolved_IP = c$dns$answers;
Log::write(DnsFeatureExtractor::ReplyDNS, rec_r);
}