过滤条件:
dst port 53 and (udp[36:2]=3)
目的端口是53 且 UDP的第36字节向后偏移2个字节,如果值=3 说明是class为chaos的DNS解析请求。原理分析:
一 首先抓取一个正常的txt chaos dns请求,例如
dig @202.106.0.20 txt ch authors.bind
从上图中观察,我们只要过滤到class=ch即可,class:ch 位于包的最后,占2个字节。
udp包头占了8个字节(0-7),UDP包中的有效负载部分才是实际的DNS请求数据,因此udp[8]表示DNS实际部分的开始,根据上图DNS包格式:
query id占2个字节 + flags部分2个字节 + questions 2个字节 + answer RRS 2个字节 + authority RRS 2个字节 + additional RRS 2个字节
因而当到达实际的 queries 部分时是udp[20]即第20个字节,从udp[20]开始,authors.bind占去了14个字节, type:txt占去2个字节,因此udp[36]表示class:ch位置的开始,而class:ch占用2个字节,因此
udp[36:2]=3 即为class:ch
所以 dst port 53 and (udp[36:2]=3) 表示对chaos class的dns请求。
同理,对于dig @202.106.0.20 txt ch version.bind
其他没有变化,且version占用的字节和authors占用字节一样,因此 dst port 53 and (udp[36:2]=3) 也对其成立。
但是!
dig @202.106.0.20 txt ch hostname.bind 这个由于hostname多了一个字母而导致多占用一个字节,所以 dst port 53 and (udp[37:2]=3) 即可。
对于测试抓包,这样就可以了,但是实际要对上面几种请求都能过滤的话,就必须绕过由于请求的域名不同而导致的class:ch位置的变化,由于对这种请求,class:ch都在最后2位,因此利用UDP包的长度减去-2 就可以绕过上述问题:
dst port 53 and udp[((udp[4:2])-2):2]=3
udp[4:2] 表示的是取UDP包头中的UDP包长度的值,减去2 就表示class:ch的位置
实际效果:
对于任意的*.bind查询都可以过滤。
文章评论