Zeek是一个开源的、被动网络流量分析软件。它主要被用作安全监测设备来检查链路上的所有流量中是否有恶意活动的痕迹。但更普遍地,Zeek支持大量安全领域外的流量分析任务,包括性能测量和帮助排查问题。
zeek架构
Zeek是一个被动的开源网络流量分析器。许多运营商将Zeek用作网络安全监视器(NSM),以支持对可疑或恶意活动的调查。Zeek还支持安全领域以外的各种流量分析任务,包括性能评估和故障排除。
新用户从Zeek获得的第一个好处是描述网络活动的大量日志。这些日志不仅包括网络上看到的每个连接的全面记录,还包括应用程序层记录。这些包括所有HTTP会话及其请求的URI,密钥标头,MIME类型和服务器响应,带回复的DNS请求,SSL证书,SMTP会话的关键内容,以及更多。默认情况下,Zeek将所有这些信息写入结构良好的制表符分隔或JSON日志文件中,这些文件适合使用外部软件进行后处理。用户还可以选择让外部数据库或SIEM产品使用,存储,处理和显示数据以进行查询。
除了日志外,Zeek还具有用于一系列分析和检测任务的内置功能,包括:
1.从HTTP会话中提取文件
2.通过与外部注册表进行接口来检测恶意软件
3.报告网络上可见的易受攻击的软件版本
4.识别流行的网络应用程序
5.检测SSH暴力破解
6.验证SSL证书链
在很高的层次上,Zeek在体系结构上分为两个主要组件。它的事件引擎(或核心)将传入的数据包流减少为一系列更高级别的事件。这些事件以与策略无关的方式反映了网络活动,即,它们描述了已看到的内容,而不是原因或意义是否重大。
例如,线路上的每个HTTP请求都变成一个相应的 http_request事件,该事件带有所涉及的IP地址和端口,所请求的URI以及所使用的HTTP版本。但是,该事件未传达任何进一步的解释,例如该URI是否对应于已知的恶意软件站点。
事件引擎组件包括多个子组件,特别是包括以下内容的包处理管道:输入源,包分析,会话分析和文件分析。输入源从网络接口摄取传入的网络流量。数据包分析处理较低级别的协议,从链路层一直开始。会话分析处理应用程序层协议,例如HTTP,FTP等。文件分析剖析了通过会话传输的文件的内容。事件引擎提供了一个插件架构,可以从Zeek核心代码库的外部添加其中的任何一个,从而可以根据需要扩展Zeek的功能。
与事件相关的语义是由Zeek的第二个主要组件脚本解释器派生的,该脚本解释器执行一组用Zeek的自定义脚本语言编写的事件处理程序。这些脚本可以表示站点的安全策略,例如,当监视器检测到不同类型的活动时要采取的操作。
更一般而言,脚本可以从输入流量中得出任何所需的属性和统计信息。实际上,Zeek的所有默认输出都来自发行版中包含的脚本。Zeek的语言带有广泛的特定于域的类型和支持功能。至关重要的是,Zeek的语言允许脚本随时间保持状态,从而使脚本能够跟踪并关联跨连接和主机边界观察到的内容的演变。Zeek脚本可以生成实时警报,还可以根据需要执行任意外部程序。人们可能会使用此功能来触发对攻击的主动响应。
安装依赖
1.Libpcap (http://www.tcpdump.org)
2.OpenSSL libraries (https://www.openssl.org)
3.BIND8 library
4.Libz
5.Bash (for ZeekControl)
6.Python 3.5 or greater (https://www.python.org/)
单机安装
本例安装环境:debian10.0.5
硬件配置:4C 8G 120G硬盘
root@Zeek:~# apt-get install cmake make gcc g++ flex bison libpcap-dev libssl-dev python3 python3-dev swig zlib1g-dev
root@Zeek:~# apt-get install gnupg curl
root@Zeek:~# apt install -y automake make g++ bison flex libelf-dev libssl-dev bc
root@Zeek:~# apt-get install python3-git python3-semantic-version
root@Zeek:~#git clone --recursive https://github.com/zeek/zeek
root@Zeek:~# cd zeek
root@Zeek:~#./configure
root@Zeek:~#make
root@Zeek:~#make install
增加zeek环境变量
[root@Zeek ~]# vim /etc/profile
在末尾增加
export PATH=/opt/zeek/bin:$PATH
[root@Zeek ~]# source /etc/profile
初始化
[root@Zeek ~]# zeekctl
[ZeekControl] > install
[ZeekControl] > start
使用教程
zeek默认的日志存放目录为/opt/zeek/logs,当前的日志默认存放为current路径
默认产生的日志如下:
[root@Zeek current]# tree
├── capture_loss.log
├── conn.log
├── dhcp.log
├── dns.log
├── dpd.log
├── files.log
├── http.log
├── notice.log
├── ntp.log
├── software.log
├── ssh.log
├── ssl.log
├── stats.log
├── stderr.log
├── stdout.log
├── weird.log
└── x509.log
conn.log 连接日志
dhcp.log DHCP日志
dns.log DNS日志
files.log 文件日志
http.log HTTP日志
ssl.log SSL日志
zeek既可以通过网络流的形式分析报文,也可以通过上传原始报文PCAP格式文件的形式进行分析
zeek的可以灵活的通过zeek脚本对网络中的异常行为或者特定的网络流量进行分析
1)通过zeek读取PCAP格式的原始报文进行行为分析
本例编写脚本,分析PCPA报文中的文件内容,zeek脚本内容如下:
event connection_state_remove(c: connection) { print "connection_state_remove"; print c$uid; print c$id; for ( s in c$service ) print s; } event file_state_remove(f: fa_file) { print "file_state_remove"; print f$id; for ( cid in f$conns ) { print f$conns[cid]$uid; print cid; } print f$source; }
执行PCPA文件分析,如下:
[root@Zeek ~]# zeek -r http.pcap file_analysis_01.zeek
在不指定日志目录的情况下会在该目录下生成响应的日志,如下图:
Zeek脚本的编写
zeeek是单线程而不是多线程,大规模使用需要考虑集群化部署。
事件引擎(或者core):把进入的数据包流简化为一系列高级的事件,这些事件以策略无关的形式反映了网络活动。
事件处理程序:使用zeek脚本语言编写,这些脚本能够表达安全策略,更普遍地,他们能够对输入流量得到任何想要的属性和统计数据。
zeek事件驱动脚本
zeek脚本事件(script events):当开发一个zeek脚本时,脚本的功能被包装在各自的事件中。
例如:
event zeek_init()
{
/*code*/
}
event zeek_done()
{
/*code*/
}
zeek_init event:当zeek第一次初始化时候就被激活
zeek_done event:在zeek关闭之前被激活
tcp_packet event:处理包含tcp_header的数据包时激活
udp_request event:在处理包含UDP请求头的数据时激活
udp_reply event:在处理包含UDP应答头的数据包时激活
zeek模块工作区(module workspace):使用module关键字来为脚本分配一个namespace,那么就可以通过包含分配的module开访问来自其他脚本的代码,使用export关键字,用于导出在module工作区的block块中输入的代码
module zeekscript;
export {
/**/
/**/
}
使用模块来导出到吗可以在其他脚本之上构建更高级的脚本。
zeek日志流(log stream)在开发zeek脚本时,所有经过处理的输出将被发送到特定的日至流。这些日志流会包含响应的日志文件格式输出。
event connection_established(){
log::create_stream(LOG,format,path);
log::write(Logsream,data)
}
connection_established event:当主机连接到接收器(receiver)时激活
Log::create_stream:创建具有名称、格式输出结构和路径的新日志流
Log::write:将包含的数据写入指定的日志流
使用脚本对日志分析(analysis)
使用zeek的事件驱动脚本语言,我们可以创建特定的基于事件的过滤器,以便在数据包中捕获和分析期间的应用。
nl命令用来展示zeek脚本
检测http代理的zeek脚本 http_proxy.zeek
module HTTP; export { global success_status_codes: set[count] = { 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 304 }; } event http_reply(c: connection, version: string, code: count, reason: string) { if ( /^[hH][tT][tT][pP]:/ in c$http$uri && c$http$status_code in HTTP::success_status_codes ) print fmt("A local server is acting as an open proxy: %s", c$id$resp_h); }