官网:https://zeek.org

概述

Zeek定义:Zeek is a passive, open-source network traffic analyzer.

 Many operators use Zeek as a network security monitor (NSM) to support investigations of suspicious or malicious activity. 它主要被用作安全监测设备来检查链路上的所有流量中是否有恶意活动的痕迹。但更普遍地,Zeek支持大量安全领域外的流量分析任务,包括性能测量和帮助排查问题。

Zeek并不是传统意义上的基于特征的入侵检测系统(IDS)。

许多地方部署Zeek是为了保护它们的网络基础设施。Zeek主要关注于高速率、大流量的网络监测。

Zeek provides users a domain-specific, Turing-complete scripting language for expressing arbitrary analysis tasks. 可以把zeek看作“domain-specific Python”。

all of Zeek’s default analyses, including logging, are done via scripts。

when trying to detect and respond to suspicious and malicious activity, security teams generally depend upon four sorts of data sources:

(1)third party sources; 例如执法部门、同行以及商业或非营利威胁情报组织

(2)network data;

(3)infrastructure and application data; 包括来自云环境的日志

(4)endpoint data

Zeek is primarily a platform for collecting and analyzing the second form of data – network data. 

There are four types of data derived from the network available to analysts. As defined by the network security monitoring paradigm, these four data types are :

(1)full content

(2)transaction data

(3)extracted content,

(4)alert data

The principles of network security monitoring (NSM) are the collection, analysis, and escalation of indications and warnings to detect and respond to intrusions. NSM is a way to find intruders on your network and do something about them before they damage your enterprise.

然而在2013年的The Practice of Network Security Monitoring (PNSM),将NSM data types增加至七种:

该网站中,可以找到每种类型的示例。

Zeek的管理框架——ZeekControl——支持开箱即用的集群配置。

图灵机:是图灵在论文中提出的数学模型。论文描述了它是什么,并且证明了,只要图灵机可以被实现,就可以用来解决任何可计算问题。  简而言之,对于一个问题,对于任意输入,只要人类可以保证计算出结果(不管花多长时间),那么图灵机就可以保证算出结果(不管花多少时间)。

图灵完备:是针对一套数据操作规则而言的概念。数据操作规则可以是一门编程语言,也可以是计算机里具体实现了的指令集。当这套规则可以实现图灵机模型里的全部功能时,就称它具有图灵完备性。

如今主流的编程语言(C++、Java、python等)都是图灵完备语言。它们的底层可以实现的功能其实完全一样,并且本质上就是一个图灵机。简单判定图灵完备的方法就是看是否能模拟出图灵机。

图灵不完备的语言常见原因有循环或递归受限(无法写出不终止的程序),无法实现类似数组或列表这样的数据结构,这样会使能写的程序受限。图灵不完备的意义也存在,有些场景需要限制语言本身,如限制循环和递归,可以保证语言能写的程序一定是终止的。

图灵完备可能带来坏处:如我们可以完全写出使得编译器陷入死循环的程序。

Zeek也叫做Broker。

Zeek不是多线程的,所以一旦达到了单核的处理瓶颈,现在唯一的方法只能是把负载分配到多个核心上,或者甚至多台物理机器上。Zeek的集群部署场景就是当前构建大型系统的方案。

zeek架构:

事件引擎 (或者 core ):把进入的数据包流简化为一系列高级的 事件 。这些事件以策略无关的形式反映了网络活动,比如,他们描述了 什么 已经出现,而不是 为什么 ,或者是否它是特别的。

事件处理 程序:使用Zeek脚本语言编写的 。这些脚本能够表达安全策略,更普遍地,它们能够从输入流量中得到任何想要的属性和统计数据。Zeek语言内置了许多特定领域的类型和支持功能;而且,更重要的是,允许脚本维护时间状态,从而使得它们能够对不同会话和主机之间的通信进行追踪和关联。Zeek脚本能够生成实时的警报和执行任意的外部程序,比如,触发对一次攻击的积极响应。

zeek事件驱动脚本简介

zeek拥有自己的事件驱动脚本语言来提供扩展和定制Zeek功能的主要途径。由于Zeek的脚本语言是事件驱动的,因此我们可以定义在网络流量分析过程中遇到需要Zeek响应的事件。

zeek脚本事件(script events):当开发一个zeek脚本时,脚本的功能被包装在各自的事件中。

例如: 事件里面写脚本代码

zeek_init event:当zeek第一次初始化的时候就被激活。

zeek_done event: 在zeek关闭之前被激活。

tcp_packet event: 处理包含tcp header的数据包时激活。

udp_request event: 在处理包含UDP请求头的数据包时激活。

udp_reply event: 在处理包含UDP应答头的数据包时激活。

其他的events以及parameters详情参考官方文档:https://docs.zeek.org/en/current/examples/scripting/

zeek 模块工作区(module workspace):使用module关键字来为脚本分配一个namespace,那么就可以通过包含匹配的module来访问来自其他脚本的代码。使用export关键字,用于导出在module工作区的block块中输入的代码。

例如:

module ZeekScript: changes the module workspace to ZeekScript.

export block: code entered here will be exported with the module workspace.

优点:使用模块来导出代码可以在其他脚本之上构建更高级的脚本。

zeek 日志流(log streams):在开发Zeek脚本时,所有经过处理的输出都将被发送到特定的日志流。这些日志流会包含相应日志文件输出的格式。我们可以创建新的流,修改原始流或附加额外的参数到现有的流。

例如:

connection_established event: 当主机连接到接收器(receiver)时激活。

Log::create_stream: 创建具有名称、格式结构和路径的新日志流。

Log::write: 将包含的数据写入指定的日志流。

 使用脚本对日志分析(analysis)

使用Zeek的事件驱动脚本语言,我们可以创建特定的基于事件的过滤器,以便在数据包捕获分析期间应用。下面展示几个用于网络分析的脚本。

启动Zeek的新实例:

cd $ZEEK_INSTALL/bin && sudo ./zeekctl start

这个命令进入Zeek的默认安装目录,并调用Zeekctl工具来启动一个新实例。当提示输入密码时,键入password并按Enter。

Zeek的一个新实例现在处于活动状态,这样就已经准备好可以进入实验室的下一部分。

1.执行一个UDP Zeek脚本

(1)cd ~/Zeek-Labs/Lab-Scripts/    

导航到Lab-Scripts(备注:这些目录都都是自己创建的目录,文件也是自己添加的),该文件夹包含了会使用到的所用zeek脚本文件。在该目录下,所有的脚本都可以被访问,查看,以及修改。

(2)nl lab6_sec2-2.zeek

如果要展示其中的一个zeek脚本,则可以使用 nl 命令,该命令会详细的展示文件内容。例如上面命令展示的就是lab6_sec2-2.zeek文件。

对这个zeek脚本的详解如下: 第一行:当包含UDP Request header 的包被处理时 udp_request event就被激活,相关的包header信息将会被存储在通过 u 变量传递给函数的连接数据结构中。第二行:打印指定的字符串:%s指定了字符格式是 fmt ,它表示相应变量的信息在字符串中的位置,u$id$resp_h 表示从UDP数据包中检索目标IP地址。第四行:当包含UDP Replyt header 的包被处理时 udp_reply event就被激活,相关的包header信息将会被存储在通过 u 变量传递给函数的连接数据结构中。第5行:打印指定的字符串,u$id$resp_h 表示从UDP数据包中检索目标IP地址。

(3)cd Zeek-Labs/UDP-Traffic/

导航到UDP-Traffic工作区目录。

(4)zeek –C –r ../Sample-PCAP/smallFlows.pcap ../Lab-Scripts/lab6_sec2-2.zeek

使用Zeek脚本处理数据包捕获文件(packet capture file),在输入的时候可以使用tab键自动补全。包捕获文件会被处理输出为日志文件,由于我们没有创建新的日志流,所以脚本的输出显示在标准输出(屏幕)上。当触发udp_request或者udp_reply event 时,生成的数据包信息将会被显示出来。

2.执行一个TCP Zeek脚本

(1)nl ../Lab-Scripts/lab6_sec2-3.zeek

查看lab6_sec2-3.zeek脚本内容。对这个脚本的详解:第一行:当包含TCP header 的包被处理时 tcp_packet event就被激活,相关的包header信息将会被存储在通过 c 变量传递给函数的连接数据结构中,其他与TCP相关的信息以类似的方式传递。第二行:打印指定的字符串:%s指定了字符格式是 fmt ,它表示相应变量的信息在字符串中的位置,c$id$resp_h 表示从TCP数据包中检索目标IP地址。

(2)zeek –C -r ../Sample-PCAP/smallFlows.pcap ../Lab-Scripts/lab6_sec2-3.zeek

使用Zeek脚本处理数据包捕获文件(packet capture file)


当触发tcp_packet event 时,生成的数据包信息将会被显示出来。这些例子突出了Zeek跟踪特定流量的能力。例如,可以设计一个脚本来每天收集所有80端口的通信量,并将其导出到日志文件中。在下一节中,我们将介绍日志流。

修改zeek日志流(Modifying)

Zeek日志流决定事件的输出将返回到哪里,以及如何格式化。可以附加新流、修改默认流或删除流。

在开始前,清除工作目录

nl ../Lab-Scripts/lab_clean.sh  查看

./../Lab-Scripts/lab_clean.sh  执行

实际上lab_clean.sh是写的一个shell脚本,内容是一些linux命令。清除删除Zeek使用默认日志流处理生成的文件列表。执行这个shell脚本将清除以前生成的日志文件目录。

1.重命名conn.log日志

(1)nl ../Lab-Scripts/lab6_sec3-1.zeek    查看zeek脚本

第一行:当zeek第一次初始化的时候,zeek_init event被激活。第三行:创建初始化为默认Conn::LOG筛选器的局部变量update。第四行:设置变量update的path为UpdatedConn.log。第五行:将新的筛选器附加到活动的日志流。

(2)zeek –C -r ../Sample-PCAP/smallFlows.pcap ../Lab-Scripts/lab6_sec3-1.zeek       执行zeek脚本

 

UpdatedConn.log实际上就是conn.log文件的替代。

2.更新conn.log日志

(1)  ./../Lab-Scripts/lab_clean.sh   清除所有log文件
          nl ../Lab-Scripts/lab6_sec3-2.zeek  查看zeek脚本

第一行:Boolean函数,参数是rec,是一个Conn::Info的实例。第三行:如果rec中存储的服务是HTTP协议,则返回True。第5行:当zeek初始化的时候,zeek_init event就激活。第6行:创建具有http相关命名和路径的本地变量filter。第7行:将新的筛选器附加到活动的日志流。

(2)zeek –C -r ../Sample-PCAP/ smallFlows.pcap ../Lab-Scripts/lab6_sec3-2.zeek


conn-http.log拥有和conn.log相同的格式,但是只包含HTTP traffic。

3.关闭当前zeek实例

当使用完zeek之后,必需要及时关闭当前活动的zeek实例。在活动实例存在时关闭计算机将导致Zeek不正确地关闭,并可能在将来的实例中导致错误。

cd $ZEEK_INSTALL/bin && sudo ./zeekctl stop

参考资料:

官方文档

“Logging framework”, Zeek user manual, [Online], Available

“Monitoring HTTP traffic”, Zeek user manual, [Online], Available

“Writing scripts”, Zeek user manual, [Online], Available

zeek的集群安装以及结合被动扫描器的实践(freebuf网站)

Zeek:高度定制化的DNS事件及文件还原(freebuf网站)

michalpurzynski / zeek-scripts

zeek / bro-scripts

bro/packages

社区文档

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐