suricata支持dns协议,提供dns.query缓冲区来存储dns查询请求的目标域名。因此早期如果需要检测的dnslog平台不多,可以编写少量的content规则,直接匹配dns流量中的dnslog平台域名。例如:
alert dns any any -> any 53 (msg:"content detect dnslog domain - dnslog.cn";dns.query;content:".dnslog.cn";endswith;sid:1000;)
alert dns any any -> any 53 (msg:"content detect dnslog domain - ceye.io";dns.query;content:".ceye.io";endswith;sid:1001;)
alert dns any any -> any 53 (msg:"content detect dnslog domain - eyes.sh";dns.query;content:".eyes.sh";endswith;sid:1002;)
但是如果需要检测的dnslog域名过多,为每个域名编写一条content规则也是挺麻烦的事,则可以考虑将多条规则合并为一条pcre规则。之后只需要维护pcre规则中正则部分的域名列表即可:
alert dns any any -> any 53 (msg:"pcre detect dnslog domain";dns.query;pcre:"/\.(dnslog\.cn|ceye\.io|eyes.sh)$/";sid:1000;)
Dataset
pcre虽然可以提供匹配任一特征的能力,但是一旦需要检测的域名数据量庞大,生成的单条规则也会变得很长,这样的规则直观上就让人觉得很不舒服。
而suricata提供的dataset关键字,就可以把需要匹配的特征单独存储在一个数据集中,规则只需要判断指定缓冲区的数据是否与数据集中的数据匹配。
下面这条规则就将一个路径为datasets/dnslog_domain.list的本地文件加载为名为dnslog_domain的数据集。并且检测dns.query缓冲区的数据在dnslog_domain数据集中是否存在。
alert dns any any -> any 53 (msg:"dataset detect dnslog domain";dns.query;dataset:isset,dnslog_domain,type string,load datasets/dnslog_domain.list;sid:1000;)
dataset数据集中的一行就代表一条待匹配数据,每一行数据根据type类型的不同,应采取不同的编码,以上面一条规则使用的type string为例,每一行数据应采用base64编码:
因此以下数据集:
dnslog.cn
ceye.io
eyes.sh
应被编码为:
ZG5zbG9nLmNu
Y2V5ZS5pbw==
ZXllcy5zaA==
alert dns any any -> any 53 (msg:"pcrexform detect dnslog domain - 1";dns.query;pcrexform:"\.([a-zA-Z0-9-]{3,}\.[a-zA-Z]{2,}$)";content:"dnslog.cn";sid:1000;)
alert dns any any -> any 53 (msg:"pcrexform detect dnslog domain - 2 ";dns.query;pcrexform:"\.([a-zA-Z0-9-]{3,}\.[a-zA-Z]{2,}$)";content:".dnslog.cn";sid:1001;)
例如dns.query存储的域名为:abc123.dnslog.cn,通过pcrexform提取出dnslog.cn,则content:"dnslog.cn";产生告警,.content:"dnslog.cn";不产生告警。
pcrexform+dataset
通过pcrexform提取出一级域名后,就可以与dataset进行结合,对所有包含指定dnslog域名的流量进行检测了
alert dns any any -> any 53 (msg:"pcrexform+dataset detect dnslog domain";dns.query;pcrexform:"\.([a-zA-Z0-9-]{3,}\.[a-zA-Z]{2,}$)";dataset:isset,dnslog_domain,type string,load datasets/dnslog_domain.list;sid:1000;)
以上规则,针对如图的pcap包进行检测,成功产生3条告警