zeek解析pcap流量文件
解析pcap文件
zeek -C -r /home/1.pcap
json格式解析pcap文件到当前目录下
zeek -C -r /home/1.pcap LogAscii::use_json=T
注意:需要zeek运行状态下
zeek脚本
概述
概述扩展名为.zeek
默认目录:share/zeek
放在share/zeek/site的不会在升级时被覆盖或者修改
zeek生成的事件可以参考:base/bif/event.bif.zeek
*.bif是zeek的内建函数文件,也是生成在线文档的基础。
zeek脚本语法参考:Script Reference — Book of Zeek (v4.1.1)
框架参考:Frameworks — Book of Zeek (v4.1.1)
默认脚本保存位置
/opt/zeek/share/zeek/base/protocols目录下,保存各个协议的具体解析脚本,
脚本示例
@load
定义脚本使用的库
例如:/opt/zeek/share/zeek/test-all-policy.zeek 中
使用了如下的这些库
module
定义命名空间
module TeamCymruMalwareHashRegistry;
例如:example.zeek文件中
export
解释自定义变量,作为脚本命令空间的一部分
重新定义了一个可枚举的常量,描述了将使用通知框架生成的通知类型。
定义一些常量用作阈值等
function
函数
event
针对特定事件执行的内容
file_hash事件处理程序,传递file,哈希算法的种类,哈希值
zeek执行异步操作不影响性能时使用when语句块
事件队列和事件处理器:zeek的脚本语言是事件驱动的,zeek的核心功能是把事件放入有序的事件队列中,允许事件处理程序在先到先服务的基础上处理事件。
当zeek检测到发起的dns请求时,触发dns_request事件,并传递数据
数据类型和数据结构
范围(scope)
声明变量的两种形式:
scope name: type
scope name = expression
expression的计算结果和type一样,例如:
local a:int
local a=10
全局变量
当脚本使用module关键字提供了命名空间时,必须更加注意全局声明以确保预期的效果。
在带有命名空间的脚本中声明全局变量时,两种可能的结果:
仅在命名空间的上下文可用
如果在export块中声明了全局变量,可以通过<module name>::<variable name>来对其他脚本生效
常量
const关键字,使用&redef的话,只能在解析时设置或者更改常量,以后(运行时)不可更改。redef常量不能在事件处理程序中更改。
举例:
base/protocols/http/main.zeek文件中:
module HTTP;
export {
## This setting changes if passwords used in Basic-Auth are captured or
## not.
const default_capture_password = F &redef;
}
如果想打开这个default_capture_password设置,需要在启动zeek之前在site/local.zeek添加如下行:
@load base/protocols/http
redef HTTP::default_capture_password = T;
局部变量
函数function内定义的local的局部变量,在函数结束后会被销毁。同理事件event中的变量在事件结束后会被销毁
数据结构原子类型
Data Type Description zh-cn
int 64 bit signed integer 64位有符号整数
count 64 bit unsigned integer 64位无符号整数
double double precision floating precision 双精度浮点
bool boolean (T/F) 布尔类型
addr IP address, IPv4 and IPv6 IP地址
port transport layer port 传输层端口
subnet CIDR subnet mask CIDR格式子网掩码
time absolute epoch time 绝对时间
interval a time interval 时间间隔
pattern regular expression 正则表达式
集合
储存相同数据类型的唯一元素。
可用的方法:add,delete,for ( i in ssl_ports )
for循环无法保证集合遍历的顺序
表
类似python字典,键-值映射,值不唯一,键唯一
local ssl_services: table[string] of port;
ssl_services = table(["SSH"] = 22/tcp, ["HTTPS"] = 443/tcp);
向量
类似python列表,有序
local v1: vector of count;
local v2 = vector(1, 2, 3, 4);
原子类型
addr:主机名定义的话zeek会发送dns查询,得到一个set[addr]
port:无符号整数/协议名(tcp,udp,icmp,unknown),协议大小顺序unknown < tcp < udp < icmp,例如65535/tcp<0/udp
subnet:cidr表示法
time:current_time系统时间, network_time来自实时流或者pcap最后处理数据包的时间戳
interval:usec, msec, sec, min, hr, or day
pattern:正则匹配
复合类型
记录数据类型:结合type关键词和record可以生成复合类型
type Service: record {
name: string;
ports: set[port];
rfc: count;
};
简单的使用更具描述性的名称定义数据结构:type string_array: table[count] of string;
自定义日志
Introduction to Scripting — Book of Zeek (v4.1.1)
抛出通知