Zeek 9.0.0:情报框架
简介
Zeek 情报框架的目标是接收情报数据、使其可用于匹配,并提供基础设施来改善性能与内存利用率。
框架中的数据是一项原子情报,例如 IP 地址或电子邮件地址。情报项附带元数据,例如自由格式的来源字段、描述字段,以及可提供该条目更多信息的 URL。默认脚本有意让元数据保持精简。
快速入门
先定义需要匹配的情报数据。这里查找域名 www.reddit.com。文件格式详情见下文“加载情报”。
yourfile.txt
#fields indicator indicator_type meta.source
www.reddit.com Intel::DOMAIN my_special_source
接着让 Zeek 读取数据。在 local.zeek 中加入以下内容,加载情报文件:
redef Intel::read_files += { "/somewhere/yourdata.txt" };
在集群中,文本文件只需放在 manager 节点。
在 local.zeek 中加入下一行,加载将“已观察到”(seen)数据发送给框架的脚本,用它与已加载情报匹配:
@load frameworks/intel/seen
命中结果写入 intel.log。对 www.reddit.com 的命中可能如下:
{
"ts":1320279566.452687,
"uid":"C4llPsinsviGyNY45",
"id.orig_h":"192.168.2.76",
"id.orig_p":52026,
"id.resp_h":"132.235.215.119",
"id.resp_p":80,
"seen.indicator":"www.reddit.com",
"seen.indicator_type":"Intel::DOMAIN",
"seen.where":"HTTP::IN_HOST_HEADER",
"seen.node":"zeek",
"matched":[
"Intel::DOMAIN"
],
"sources":[
"my_special_source"
]}
可以在 try.zeek.org 探索该示例。
架构
可以把情报框架看作三个部分:加载情报数据;报告已观察到需要检查的数据;以及处理已经发现的匹配。

上图展示三者如何协作:加载情报时,将数据插入由框架管理的内存数据存储;分析流量时,脚本把已观察到的数据报告给框架,检查它是否与已加载条目匹配。
加载情报
默认通过 Input Framework 从纯文本文件加载情报。在集群中,只有 manager 需要持有情报数据;框架的分发机制会把数据推送到需要它的各个节点。
以下是情报数据格式示例。各字段必须由单个制表符分隔;字段值仅为连字符时表示空值。已加载扩展可能添加额外字段,例如下文的 policy/frameworks/intel/do_notice.zeek。
donotice.txt
#fields indicator indicator_type meta.source meta.desc meta.url
1.2.3.4 Intel::ADDR source1 Sending phishing email http://source1.com/badhosts/1.2.3.4
a.b.com Intel::DOMAIN source2 Name used for data exfiltration -
全部内置 indicator_type 值见 \u00001\u0000。
创建文件后,在 local.zeek 中指定需要加载的情报文件,替换为实际文件名:
redef Intel::read_files += {
"/somewhere/feed1.txt",
"/somewhere/feed2.txt",
};
在集群部署中,这些文件只需要存在于 manager 节点的文件系统。
情报框架很灵活,可以用多种方式扩展匹配。例如,policy/frameworks/intel/do_notice.zeek 提供简单机制,在用户指定的情报命中时生成 Intel::Notice 类型的 Zeek notice。要启用,在 local.zeek 中加入:
@load frameworks/intel/do_notice
该脚本添加额外元数据字段。尤其是,当一个情报项的布尔字段 do_notice 设为 T 时,命中该项会生成 notice。
已观察到的数据
从网络流量提取某项数据后(例如 SMTP 消息 From 头中的邮件地址),必须通知情报框架,以便将其与已加载情报进行检查。这通过 Intel::seen 函数完成。
Zeek 自带一组向情报框架发送数据的默认脚本。要加载所有报告 seen 数据的内置脚本,在 local.zeek 中加入:
@load frameworks/intel/seen
也可以只加载该目录中的特定脚本。请注意,随着发送给框架的数据增加,CPU 负载会随 Intel::seen 的调用次数上升,具体影响取决于监控流量的性质与规模。
只有对应观察结果被报告为 seen 时,框架才能匹配已加载条目。例如,Zeek 内置脚本默认仅向框架报告已建立 TCP 连接的 IP 地址,因此 UDP 流量和单向流量默认不会触发情报命中。不过,可以轻松报告额外观察结果。
下面把所有连接的 IP 地址报告给情报框架,包括 ICMP、UDP 和单向流量:
event new_connection(c: connection)
{
Intel::seen([$host=c$id$orig_h, $conn=c, $where=Conn::IN_ORIG]);
Intel::seen([$host=c$id$resp_h, $conn=c, $where=Conn::IN_RESP]);
}
使用 new_connection 可能显著影响整体性能,因为框架将处理更多数据。
情报匹配
框架每次发现匹配时都会生成 Intel::match 事件,接收两个参数。第一个是 Intel::Seen 记录,描述上报的观察结果:看到了什么(例如 www.slideshare.net)、在哪里看到(例如 X509 证书),以及可获得的其他上下文(例如连接或文件记录)。
第二个参数是匹配此观察结果的情报项集合。使用集合,是因为一个观察结果可能匹配多个条目。例如,从来源 A 和 B 都导入 IP 1.2.3.4,并从 B 导入子网 1.2.3.0/24;流量中看到 1.2.3.4 时,事件会收到全部三个条目。
在集群中,匹配事件在 manager 上触发。编写事件处理脚本时必须记住:上下文通过参数传入,但处理器本身在 manager 执行,无法访问最初报告观察结果的 worker 的本地状态,其他交互也有限制。
例如,无法可靠地在情报命中后才触发文件提取:manager 处理事件并决定提取文件时,触发命中的 worker 很可能已经处理完相应数据。可行方式是先提取所有可能相关的文件,保留与情报命中有关的文件,并定期丢弃其余文件。
情报命中写入 intel.log,字段详情见 \u00001\u0000 文档。
以下是示例 intel.log 中的两次命中:
{
"ts": "2019-03-12T18:22:19.252191Z",
"uid": "Cpue7J1KNReqCodXHc",
"id.orig_h": "192.168.4.6",
"id.orig_p": 64738,
"id.resp_h": "13.107.18.13",
"id.resp_p": 443,
"seen.indicator": "www.slideshare.net",
"seen.indicator_type": "Intel::DOMAIN",
"seen.where": "X509::IN_CERT",
"seen.node": "so16-enp0s8-1",
"matched": [
"Intel::DOMAIN"
],
"sources": [
"from http://hosts-file.net/fsa.txt via intel.criticalstack.com"
],
"fuid": "FnRp0j1YMig5KhcMDg",
"file_mime_type": "application/x-x509-user-cert",
"file_desc": "13.107.18.13:443/tcp"
}
{
"ts": "2019-03-12T18:32:19.821962Z",
"uid": "CvusFJ2HdbTnCLxEUa",
"id.orig_h": "192.168.4.6",
"id.orig_p": 64826,
"id.resp_h": "13.107.42.14",
"id.resp_p": 443,
"seen.indicator": "www.slideshare.net",
"seen.indicator_type": "Intel::DOMAIN",
"seen.where": "X509::IN_CERT",
"seen.node": "so16-enp0s8-1",
"matched": [
"Intel::DOMAIN"
],
"sources": [
"from http://hosts-file.net/fsa.txt via intel.criticalstack.com"
],
"fuid": "FUrrLa45T7a8hjdRy",
"file_mime_type": "application/x-x509-user-cert",
"file_desc": "13.107.42.14:443/tcp"
}
示例显示,X509 证书中观察到的域名 www.slideshare.net 命中了情报。该域名也有合法用途,因此这种命中值得审查。这说明分析人员必须评估情报源是否适合本地使用,而不能把命中直接等同于恶意。
来源:Intelligence Framework,依据 Book of Zeek 9.0.0。版权属于 Zeek 项目及文档贡献者。原文日志中的地址为示例数据。
文档遵循 CC BY 4.0,见 Zeek 文档仓库许可。











暂无评论内容