部署完zeek后,采集日志进行后续分析是使用zeek的必经之路。zeek默认采用tsv文件格式存储所有日志。我们可以修改为更为通用的JSON格式。例如在local.zeek中可以进行如下配置:
root
:
/home/
zeek/site# vim local.zeek
redef LogAscii::use_json = T;
在接收日志进行解析时,我这里用到了thrift,很不巧,conn.log日志中的字段名service与thrift中的关键字冲突了,这时需要对service这个字段名进行重命名,这个需求也可以编辑local.zeek文件,添加以下配置来实现:
root@nta01
:/home/zeek/site
# vim local.zeek
redef Log::default_field_name_map = {
[
"service"
] =
"_service"
};
后面发生了更不巧的事情,zeek的日志字段名是以.分隔的,例如字段名id.orig.h。而thrift声明时也不允许字段名包含.符号。因此还需要把分隔符.替换成其他字符。幸运的是zeek的研发早预料到了这种需求。我们依然修改local.zeek文件来实现:
root@nta01
:/home/zeek/site
# vim local.zeek
redef Log::default_scope_sep =
"_"
;
再后来,我们增加了zeek节点,需要区分日志是从哪个zeek节点采集到的,当然,采集工具本身是可以在日志内容中增加agent信息的字段的。但是这会影响原有的JSON结构。例如如果用agent来增加信息,格式如下:
{
"message"
: {
"zeek-log......"
},
"hostname"
:
"zeek-01"
}
这样做原来的日志外面会嵌套一层数据。这样修改会影响之前的JSON解析逻辑,因此我们选择直接在zeek日志中增加字段。依然是修改local.zeek文件
root@nta01
:/home/zeek/site
# vim local.zeek
@load base/protocols/conn
redef record Conn::Info += {
dev_hostname:
string &optional &log;
};
event connection_state_remove(
c:
connection) {
c$conn$dev_hostname = gethostname();
}
ok,我们自己写一个指纹识别MySQL。那么分析协议特征的过程先略过。文件需要放置在mysql协议脚本的路径下。文件的内容是这样的:
root@nta01
:/home/zeek/site
# vim /usr/share/zeek/share/zeek/base/protocols/mysql/dpd.sig
# MySQL Protocol Signature
signature mysql_client8 {
ip-proto == tcp
payload /x01x0fxa6x3e.*caching_sha2_password/
tcp-state originator
enable
"mysql"
}
signature mysql_client5 {
ip-proto == tcp
payload /x01x0fxa6x3e.*mysql_native_password/
tcp-state originator
enable
"mysql"
}
signature mariadb_client {
ip-proto == tcp
payload /x01x8axa7xbex01.*mysql_native_password/
tcp-state originator
enable
"mysql"
}
signature mysql_server8 {
ip-proto == tcp
payload /x4ax0
0
x0
0
.*caching_sha2_password/
tcp-state responder
enable
"mysql"
}
signature mysql_server5 {
ip-proto == tcp
payload /x4ax0
0
x0
0
.*mysql_native_password/
tcp-state responder
enable
"mysql"
}
signature mariadb_server11 {
ip-proto == tcp
payload /x69x0
0
x0
0
.*mysql_native_password/
tcp-state responder
enable
"mysql"
}
对signature的格式的解释如下:
signature 特征名 {
=
= tcp # ip协议的上层
payload /xcaching_sha2_password/ #使用正则匹配数据包内容
tcp-state originator #匹配流方向,originator是client,respender是server
enable "mysql" # 匹配特征后调用的协议解析器名称
}
原文始发于微信公众号(Desync InfoSec):Zeek使用与实践探索二
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论