Suricata之dnslog域名检测

在进行SSRF、命令执行等漏洞的利用时,可以通过dnslog来获取目标的出口ip、外带命令执行的结果。
在流量层就可以对已知dnslog平台的域名查询流量进行检测,从而发现针对dnslog的利用。

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.cnceye.ioeyes.sh

应被编码为:

ZG5zbG9nLmNuY2V5ZS5pbw==ZXllcy5zaA==
但实际测试发现并未产生告警。
这就是因为dataset匹配与content匹配的差别。content匹配,只需要content的值在缓冲区中部分匹配而dataset则要求缓冲区的数据与数据集中的某一行数据完全匹配
例如dns.query存储的域名为:abc123.dnslog.cn,dataset想要产生告警,必须存在一行abc.123.dnslog.cn的记录。


pcrexform
为了解决以上问题,就需要引入pcrexform关键字。该关键字结合正则可以将关心的特征提取出来存储在一个临时缓冲区。例如以下两条提取出一级域名,存储在临时缓冲区,并进行匹配。
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”;不产生告警。

Suricata之dnslog域名检测


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条告警

Suricata之dnslog域名检测

Suricata之dnslog域名检测

原文始发于微信公众号(菜鸡瞎扯):Suricata之dnslog域名检测

版权声明:admin 发表于 2024年10月5日 上午9:01。
转载请注明:Suricata之dnslog域名检测 | CTF导航

相关文章