网络流量分析 | Zeek(上)
介绍
Zeek 是一个开源且商用的网络监控和流量分析工具,许多的运维人员将 Zeek 作为网络安全监控器(Network Security Monitor,NSM),以支持可疑或恶意活动的调查。在安全领域之外,Zeek 还可被用于各种流量分析,包括性能测量和故障排除。
而在开始接触 Zeek 之前,需要先简单区分一下网络监控(Network Monitoring)和网络安全监控(Network Security Monitoring)。
网络监控&网络安全监控
网络监控是一套管理措施,用于观察并持续概括网络流量,同时有选择地保存网络流量以作进一步调查。它主要关注IT资产的正常运行时间(可用性)、设备健康和连接质量(性能)以及网络流量平衡和管理(配置)等。通常这并不包括识别漏洞和重大安全问题等任务。
网络安全监控则侧重于网络的异常情况,监控和可视化网络流量并调查可疑事件是网络安全监控的核心部分。
Zeek vs Snort
虽然这两者都被称为 IDS/NIDS,但二者各有所长,了解二者各自的优劣势并在合适场景选择正确工具往往能让我们事半功倍。
工具 | Zeek | Snort |
---|---|---|
能力 | 常被用作NSM和IDS,其重点在于网络分析。Zeek 聚焦于触发警报的特定威胁,检测机制侧重于“事件” | 常被用作IDS/IPS。Snort 利用“签名”来检测漏洞,检测机制侧重于签名模式和数据包 |
优势 | - 提供深入的流量可视度 - 对威胁猎取很有帮助 - 可以检测到复杂威胁 - 具有脚本语言且支持事件关联 - 日志阅读非常简单 | - 规则编写简单 - Cisco 支持的规则 - 社区支持 |
劣势 | - 难以使用 - 分析需要依靠手动或自动化 | - 难以检测到复杂威胁 |
常见使用情况 | - 网络监控 - 深入的流量调查 - 连锁事件中的入侵检测 | - 入侵检测和防御 - 终止已知的攻击或威胁 |
Zeek 的结构
在此只关注 Zeek 最主要的两层:事件引擎(Event Engine)和策略脚本解释器(Policy Script Interpreter)。
事件引擎的核心任务是生成事件。它会提取收到的数据包中的基础信息,比如源地址和目标地址、协议类型、会话状态和所含文件等,之后生成事件。
策略脚本解释器用于语义分析,它通过Zeek脚本对事件进行逻辑分析,并将事件与响应关联。
Zeek 框架
Zeek 在脚本层有许多框架可供使用,这些框架是 Zeek 在脚本层面提供的模块化工具集,用于扩展其功能性,增强Zeek的灵活性以及与其他网络组件的兼容性。
部分框架针对相对特定的用例设计,而另一些框架则几乎运行于所有Zeek部署环境中,比如“Logging”框架为所有Zeek日志提供了底层支持。
由于框架之间相互依赖构建,因此了解每个框架的功能至关重要。
框架 | 功能 |
---|---|
Logging | 日志 |
Notice | 告警 |
Input | 数据输入 |
Configuration | 配置 |
Intelligence | 情报分析 |
Cluster | 集群 |
Broker Communication | 通讯 |
Supervisor | 监控 |
GeoLocation | 地理定位 |
File Analysis | 文件分析 |
Signature | 数字签名 |
Summary | 摘要 |
NetControl | 网络流量控制 |
Packet Analysis | 数据包解析 |
TLS Decryption | 解密TLS流量 |
Zeek 的输出
当我们运行Zeek时,它会自动开始调查流量或调查指定的pcap文件并自动生成日志。如果用Zeek处理pcap文件,那么它会将日志生成到工作目录下;如果将Zeek作为一个服务,那么日志会被默认放在/opt/zeek/logs/
目录下。
与Zeek一起工作!
Zeek 有两种操作选项,第一个选项是将其作为服务运行,第二个选项是使用Zeek处理pcap文件。
我们先使用第一种选项,将Zeek作为服务进行运行。
首先我们需要确认Zeek是否已安装,通过zeek -v
命令查看:
确认Zeek已经安装之后,就正式将Zeek作为一个服务运行!将其作为服务运行需要利用ZeekControl
模块,而运行该模块需要根用户权限,因此需要先提权再执行该模块:
ZeekControl 有三个命令:
- status:查看服务状态
- start:启动服务
- stop:停止服务
当我们需要监听实时网络流量时,将Zeek作为服务是唯一的实现方式。而除了将Zeek作为网络监控工具外,我们还可以将它用作数据包调查工具,这就需要使用第二个选项,用Zeek处理pcap文件,在处理完pcap文件后,Zeek会根据流量自动创建日志文件。
要使用第二个选项也很简单,只需要使用zeek -C -r [xxx.pcap]
即可。其中,-C
表示忽视校验和错误;-r
表示阅读选项,会读取或处理pcap文件。
运行上述命令后,工作目录下生成了许多日志文件:
Zeek 日志
Zeek 可以根据流量数据生成日志文件,并且 Zeek 生成的日志是结构严谨且以制表符分隔的ASCII文件,因此阅读和处理它们是比较容易的,但是需要付出一点努力。我们应当熟悉网络和协议,以便在调查中关联日志,知道哪里是重点,并找到证据。
每个日志都有许多fields,每一个field由许多流量数据组成。关联性通过一个被称作“UID(Unique Identifier)”的唯一值完成。
在 Zeek 中,日志被分为七类,下面将其具体列出:
分类 | 描述 | 日志文件 |
---|---|---|
Network | 网络协议日志 | conn.log, dce_rpc.log, dhcp.log, dnp3.log, dns.log, ftp.log, http.log, irc.log, kerberos.log, modbus.log, modbus_register_change.log, mysql.log, ntlm.log, ntp.log, radius.log, rdp.log, rfb.log, sip.log, smb_cmd.log, smb_files.log, smb_mapping.log, smtp.log, snmp.log, socks.log, ssh.log, ssl.log, syslog.log, tunnel.log |
Files | 文件分析结果日志 | files.log, ocsp.log, pe.log, x509.log |
NetControl | 网络控制和流量日志 | netcontrol.log, netcontrol_drop.log, netcontrol_shunt.log, netcontrol_catch_release.log, openflow.log |
Detection | 检测以及可能的指标日志 | intel.log, notice.log, notice_alarm.log, signatures.log, traceroute.log |
Network Observations | 网络流量日志 | known_certs.log, known_hosts.log, known_modbus.log, known_services.log, software.log |
Miscellaneous | 包括外部警报、输入和故障的其他日志 | barnyard2.log, dpd.log, unified2.log, unknown_protocols.log, weird.log, weird_stats.log |
Zeek Diagnostic | 包括系统信息、操作和一些统计数据的Zeek 诊断日志 | broker.log, capture_loss.log, cluster.log, config.log, loaded_scripts.log, packet_filter.log, print.log, prof.log, reporter.log, stats.log, stderr.log, stdout.log |
如此多的协议和日志,这也正是Zeek工具的难点:掌握所需的网络知识和调查思维。但这些都可以慢慢通过后期学习学会,加油学吧!
在实践中为了能够让调查更加清晰、更加具有效率,我们可以在调查之前挑选对应几个日志进行小分类,这些小分类为:
- Overall Info:用于一次性审查全局连接、共享文件、加载脚本和指标。这是调查的第一步
- Protocol Based:当审查全局流量并发现可疑指标或想要继续深入调查,就需要聚焦某一个协议
- Detection:使用预构建或自定义脚本和签名结果,通过附加指标或关联行动来支持我们的调查结果
- Observation:关于主机、服务、软件和意料之外的行为统计将帮助我们发现可能的遗漏点,最终结束我们的调查
根据自己的需要挑选对应的日志能够让我们的调查工作事半功倍。
浏览日志
前文我们提到,Zeek 的日志虽然便于阅读和处理,但是仍然需要额外的一些工作。调查Zeek生成的日志会用到命令行工具或其他工具(如zeek-cut
)。现在我们先使用命令行工具浏览日志。
首先我们用cat
命令和记事本来浏览日志:
可以明显感觉到,使用命令行工具或记事本这样的方式阅读日志是很难去快速发现异常的。一般我们可以使用ELK或者Splunk等外部可视化和关联工具来分析日志,但这两个不是本文重点,我们接下来重点讲解如何动手去处理日志。这就需要用到另一个辅助程序——zeek-cut
.
zeek-cut
可以帮助减少日志文件展示的列。因为每个日志文件都会有“#fields”和“#types”字段,如上图红框所示。而我们就可以通过zeek-cut
来从“#fields”字段中挑选出我们真正想要的列,这样得到的日志结果也就更加清晰。比如现在我们想要看日志中的uid、协议、源地址、目的地址、源端口、目的端口这几列,那么我们就可以通过如下命令进行过滤:
root@ubuntu$ cat conn.log | zeek-cut uid proto id.orig_h id.orig_p id.resp_h id.resp_p
相比之下,确实得到的结果也更加清晰了。
CLI功夫修炼
不得不承认,图形化界面确实方便,但是它也有不足之处,比如面对大量的数据时,图形化界面的稳定性和效率其实是比命令行接口(Command Line Interface,CLI)要差的。
因此,掌握CLI技术对日后的文件分析是非常有利的,因此本小节将展示一些有用的CLI查询语句,日后想用就来此处翻一翻:
基本语句
- 浏览历史命令:
history
- 执行历史命令中的第x条:
![x]
- 执行前一条命令:
!!
读文件
- 读文件:
cat [x]
- 读文件前十行:
head [x]
- 读文件最后十行:
tail [x]
查找&过滤
- 切割出第y个部分:
cat [x] | cut -f [y]
- 切割出第y列:
cat [x] | cut -c [y]
- 过滤出某一个关键词 z:
cat [x] | grep [z]
- 按字母顺序对输出排序:
cat [x] | sort
- 按数字顺序对输出排序:
cat [x] | sort -n
- 消除重复行:
cat [x] | uniq
- 计算行数:
cat [x] | wc -l
- 展示行数:
cat [x] | nl
高级
- 打印第y行:
cat [x] | sed -n '[y]p'
或cat [x] | awk 'NR == [y] {print $0}'
- 打印第y-z行:
cat [x] | sed -n '[y,z]p'
- 打印行号小于y的所有行:
cat [x] | awk 'NR < [y] {print $0}'
其他
- 删除重复值:
sort | uniq
- 删除重复值并计算每个值出现的次数:
sort | uniq -c
- 对数值进行数值排序和递归排序:
sort -nr
- 反转字符串:
rev
- 将字符串按
.
分割,并保留前两部分:cut -d '.' -f 1-2
- 显示与“test”字符串不匹配的行:
grep -v 'test'
- 显示不匹配字符串“test1”和“test2”其中一个或全部:
grep -v -e 'test1' -e 'test2'