继续,尝试完成简单的zeek脚本,在原来的默认zeek脚本上,新增一些输出内容。
默认zeek脚本目录如下:/opt/zeek/share/zeek/base/protocols
给http协议新增解析展示数据
进入目录:/opt/zeek/share/zeek/base/protocols/http
新建文件request.zeek,新增请求数据的解析
request_body配置
新建/usr/local/zeek/share/zeek/base/protocols/http/request.zeek文件,文件内容:
##! This script reassembles full HTTP bodies and raises an event with the
##! complete contents.
module HTTP;
export {
redef record Info += {
request_body: string &log &optional;
};
}
## Users write a handler for this event to process the current HTTP body.
event http_entity_data(c: connection , is_orig: bool , length: count , data: string ) &priority=5
{
set_state(c,is_orig);
if(is_orig)
{
c$http$request_body = data;
}
}
在load.zeek文件中添加:@load ./request
所有http_header配置
新建/usr/local/zeek/share/zeek/base/protocols/http/header-all.zeek,文件内容:
module HTTP;
export {
redef record Info += {
request_header: vector of string &log &optional;
response_header: vector of string &log &optional;
};
option log_request_header = T;
option log_response_header = T;
}
event http_header(c: connection, is_orig: bool, name: string, value: string) &priority=5
{
if ( ! c?$http )
return;
if ( is_orig )
{
if ( log_request_header )
{
if ( ! c$http?$request_header )
c$http$request_header = vector();
c$http$request_header += name;
c$http$request_header += value;
}
}
else
{
if ( log_response_header )
{
if ( ! c$http?$response_header )
c$http$response_header = vector();
c$http$response_header += name;
c$http$response_header += value;
}
}
}
在load.zeek文件中添加:@load ./header-all
新建/usr/local/zeek/share/zeek/base/protocols/http/request.zeek文件,文件内容:
module HTTP;
export {
redef record Info += {
response_body: string &log &optional;
};
## Flag that indicates whether to hook reply bodies.
const hook_reply_bodies = T &redef;
}
## Users write a handler for this event to process the current HTTP body.
event http_begin_entity(c: connection, is_orig: bool)
{
if ( (is_orig) || (! is_orig && ! hook_reply_bodies) )
return;
c$http$response_body= "";
}
event http_entity_data(c: connection, is_orig: bool, length: count,
data: string) &priority=5
{
if ( ! c$http?$response_body)
return;
c$http$response_body += data;
}
在load.zeek文件中添加:@load ./response
zeekctl deploy #部署
注意:修改相关文件或配置需要执行zeekcctl deploy命令
然后查看日志
成功解析出数据,如下。
数据说明:根据业务实际需要,提取自己所需要的字段即可。
id.orig_h:原IP,必要字段
id.orig_p:原端口,必要字段
id.resp_h:目标IP,必要字段
id.resp_p:目标端口,必要字段
trans_depth:未知字段
method:请求方法,必要字段
host:请求包host,非必要字段
referrer:请求包referrer,非必要字段
version:请求包协议版本,非必要字段
user_agent:请求包user_agent,非必要字段
origin:请求包origin,非必要字段
request_body_len:请求体长度,非必要字段
response_body_len:返回体长度,非必要字段
status_code:http状态码,必要字段
status_msg:未知字段
tags:未知字段
orig_fuids:未知字段
orig_mime_types:未知字段
resp_fuids:未知字段
resp_mime_types:未知字段
request_body:请求体内容,必要字段
request_header:所有请求头,必要字段
response_header:所有返回头,必要字段
response_body:返回包内容,必要字段