dns协议类漏洞学习--结合snort分析(一)

cve-2002-0029

0x01
漏洞描述:
ISC BIND 4.9.2到4.9.10中的DNS存根解析程序库(stub resolver library)中的缓冲区溢出,以及其他派生库(如BSD libc和GNU glibc)允许远程攻击者通过DNS服务器response执行任意代码,触发溢出,出现漏洞的函数在(1) getnetbyname,或(2)getnetbyaddr函数,又名“LIBRESOLV:缓冲区溢出”

0x02
背景:
1)udns:stub DNS resolver library ,DNS库udns实现了线程安全存根DNS解析器功能,它可以与传统的同步方式和异步方式一起使用,也可以与应用程序提供的事件循环一起使用。

0x03
Snort规则解析:
alert udp $EXTERNAL_NET 53 -> $HOME_NET any (msg:“OS-LINUX Red Hat Enterprise Linux DNS resolver buffer overflow attempt”; flow:to_client; content:"|D3 A9 85 80 00 01 00|2"; metadata:service dns; reference:bugtraq,6186; reference:cve,2002-0029; classtype:attempted-admin; sid:15963; rev:5;)
1)在这里插入图片描述触发服务器上从A到B的响应
2)在这里插入图片描述匹配内容

Hex to text如下:
在这里插入图片描述

cve-2007-0494

0x01
漏洞描述:
ISC BIND 9.0.x,9.1.x,9.2.0至9.2.7,9.3.0至9.3.3,9.4.0a1至9.4.0a6,9.4.0b1至9.4.0b4,9.4.0rc1, 和9.5.0a1(仅限Bind Forum)允许远程攻击者通过包含大量RRsets的type *(ANY)DNS query response 导致拒绝服务(退出),这会触发断言错误,即“DNSSEC验证”漏洞。

该漏洞是由于在使用DNSSEC扩展的系统上处理格式错误的DNS query时发生的断言错误。 未经身份验证的远程攻击者可以通过制作精心设计的DNS request来利用此漏洞,从而导致将恶意RRSET返回给守护程序。此操作可能导致BIND进程崩溃。利用漏洞可以防止系统处理进一步的DNS请求,拒绝授权用户的服务。当受影响的应用程序处理包含多个RRset的DNS response时,可能会发生此错误。

0x02
背景:
1)DNSSec:Domain Name System Security Extensions (DNSSEC)DNS安全扩展,是由IETF提供的一系列DNS安全认证的机制(可参考RFC2535)。它提供了一种来源鉴定和数据完整性的扩展,但不去保障可用性、加密性和证实域名不存在。
2)RRset:多个相同类型的资源记录的集合称为资源记录集RRset,RRset是dns传输的基本单元,也就是说查询一个域名对应的某种信息。Dns系统不会返回一条RR,而是返回一个RRset。

0x03
Snort规则分析:
alert udp $EXTERNAL_NET any -> $DNS_SERVERS 53 (msg:“SERVER-OTHER ISC BIND DNSSEC Validation Multiple RRsets DoS”; flow:to_server; content:"|01 10|"; depth:2; offset:2; content:"|00 80 01 00 01 00 00 29|"; isdataat:!9,relative; content:"|03|com"; content:"|03|com"; within:4; distance:4; metadata:policy max-detect-ips drop, service dns; reference:bugtraq,22231; reference:cve,2007-0494; classtype:attempted-dos; sid:17680; rev:10;)

1)在这里插入图片描述流向dns server的数据流
2)在这里插入图片描述将规则只应用到客户端,触发客户端上从A到B的请求
3)在这里插入图片描述从数据起始处偏移两个字节后,再在两个字节长度之内匹配|01 10|
4)在这里插入图片描述第二处匹配
5)在这里插入图片描述在4)匹配之后没有9个字节,则alert
6)在这里插入图片描述匹配第一个.com
7)在这里插入图片描述在5)匹配偏移4个字节,再在往后4个字节的范围内匹配.com

Snort检测方案的解析:
1.dns头部的flags即标志,为2个字节
在这里插入图片描述
0x03的3)中为16进制的0110,就是用于匹配flags字段的值是否为/x01/x10(从第一位QR指的是0就可以看出是查询)

2.0x03的4)的匹配是匹配数据字段,总共八个字节,分别是Questions、Answer RRs、Authority RRs、Additional RRs 各自表示后面的四个区域的数目。Questions表示查询问题区域节的数量,Answers表示回答区域的数量,Authoritative namesversers表示授权区域的数量,Additional recoreds表示附加区域的数量。

3.4)的后面就进入了Quires区域,先是Name字段,长度不固定,所以出现了5)这条规则

4.6)匹配第一个.com

5.7)则是在匹配到第一个.com之后偏移4个字节,然后匹配后面的四个字节是否为.com

cve-2007-2241

漏洞描述:
ISC BIND 9.4.0和9.5.0a1到9.5.0a3中query.c中未指定的漏洞,当启用递归时,允许远程攻击者通过query_addsoa函数处理的一系列query导致拒绝服务(守护程序退出) 。

Snort规则分析:
alert udp $EXTERNAL_NET any -> $DNS_SERVERS 53 (msg:“SERVER-OTHER ISC BIND RRSIG query denial of service attempt”; content:"|03 77 77 77 04 74 65 73 74 03 63 6F 6D 00 00 2E 00 01|"; fast_pattern:only; metadata:policy max-detect-ips drop, service dns; reference:bugtraq,23738; reference:cve,2007-2241; classtype:attempted-dos; sid:17299; rev:9;)
1)在这里插入图片描述
意思是将content中的内容用于快速模式匹配器,并且内容应仅用于快速模式匹配器,而不是作为content容规则选项进行评估

检测方案:
1.dns query数据包
2.在数据部分匹配十六进制的03 77 77 77 04 74 65 73 74 03 63 6F 6D 00 00 2E 00 01
另:个人认为不可靠,因为以上hex to text后为
在这里插入图片描述
正常黑客攻击是不会用test之类的

cve-2009-0696

0x01
漏洞描述:
多版本isc bind的named的db.c中的dns_db_findrdataset函数,当配置为主服务器时,允许远程攻击者通过精心设计的dynamic update message中的prerequisite section中的ANY record(发送恶意的dynamic update request)导致拒绝服务(断言失败和守护程序退出)

当dns_db_findrdataset()函数在name server上处理包含类型为ANY的记录的dynamic update message时,则造成漏洞。该name server包含Resource Record Set (RRset) ,这个RRset用于所请求的完全限定域名。(The vulnerability is in the dns_db_findrdataset() function when it processes a dynamic update message that contains a record with a type of ANY on a name server that contains a Resource Record Set (RRset) for the requested fully qualified domain name. )
https://tools.cisco.com/security/center/viewAlert.x?alertId=18730)

0x02
背景:
1)Dynamic update和prerequisite section:动态更新使DNS客户端计算机能够在发生更改时使用DNS服务器注册并动态更新其资源记录。 …先决条件资源记录包含一组资源记录先决条件,在权威DNS服务接收到更新消息时必须满足这些先决条件
(https://blogs.technet.microsoft.com/teamdhcp/2015/09/10/a-description-of-the-dns-dynamic-update-message-format/)

0x03
Snort规则分析
alert udp any any -> any 53 (msg:“ET DOS DNS BIND 9 Dynamic Update DoS attempt”; byte_test:1,&,40,2; byte_test:1,>,0,5; byte_test:1,>,0,1; content:"|00 00 06|"; offset:8; content:"|c0 0c 00 ff|"; distance:2; reference:cve,2009-0696; reference:url,doc.emergingthreats.net/2009701; classtype:attempted-dos; sid:2009701; rev:2; metadata:created_at 2010_07_30, updated_at 2010_07_30;)
1)在这里插入图片描述从数据起始处向后偏移2个字节,再取其后一个字节的数据,如果等于40,则命中
2)在这里插入图片描述从1)匹配的结尾开始向后偏移5个字节,再取其后一个字节的数据,如果大于0,则命中
3)在这里插入图片描述从2)匹配的结尾开始向后偏移1个字节,再取其后一个字节的数据,如果大于0,则命中
4)在这里插入图片描述据数据起始偏移8个字节后,开始匹配content中的内容
5)在这里插入图片描述在4)匹配结尾后偏移2个字节后,开始匹配content中的内容

Snort方案解析:
1.1)从数据起始处向后偏移两个字节,则是到了flags字段,flags字段的第一个字节,如果等于40(十进制),则命中。40转成16进制/x28,即检测flags字段的第一个字节为/x28
2.2)则是定位到了数量字段的Authority RRs字段的第一个字节,此字段表示授权区域的数量,如果值大于0,则命中
3.3)定位到了数量字段的Authority RRs字段的第二个字节如果值大于0,则命中
4.由于4)只是指出了在Authorities RRs之后的内容里匹配/x00/x00/x06,没有指出具体从哪里开始,所以只能无法定位到具体字段
5.在4)匹配之后的位置两个字节之后匹配/xc0/x0c/x00/xff,同样无法定位到具体字段

cve-2011-1910

0x01
漏洞描述:
众多版本的isc bind中named的off-by-one错误允许远程DNS服务器通过包含大型RRSIG RRset的negative response导致拒绝服务(断言失败和deamon退出)。
https://nvd.nist.gov/vuln/detail/CVE-2011-1910)

 该漏洞是由于处理用户提交的Resource Record Signature(RRSIG)DNS query导致软件中的断言错误(assertion error)。该漏洞是由于对具有非常大的RRSIG资源记录集(RRsets)的域的DNS查询的不正确的负缓存造成的(The vulnerability is due to improper negative caching of DNS queries for a domain that has very large RRSIG resource record sets (RRsets))。DNS系统使用负缓存来避免对不存在的域重复执行查找。 
 未经身份验证的远程攻击者可以通过向系统发送精心设计的RRSIG查询来利用此漏洞。 如果成功,攻击者可能会在系统上导致DoS情况,从而拒绝访问合法用户。 

(https://tools.cisco.com/security/center/viewAlert.x?alertId=23266)

0x02
背景:
1)负缓存:否定缓存,也叫负缓存,是指对查询失败的域名进行缓存
2)RRsets:DNS记录集(RRsets)是一组具有相同记录类型的记录,例如,所有DNS A记录都是一个RRset。
要为每个zone level签名,还会引入一些其他记录类型:
资源记录签名(RRSig) - RRset的签名
DNSKey - 包含用于验证RRSig的公钥
委派签名者(DS) - 在子区域中引用DNSKey并添加到域名注册商

0x03
Snort规则分析
alert tcp $EXTERNAL_NET 53 -> $HOME_NET any (msg:“PROTOCOL-DNS ISC BIND DNSSEC authority response record overflow attempt”; flow:to_client, established; content:"|84 23|"; depth:2; offset:4; byte_test:2,>,40,4,relative; metadata:service dns; reference:cve,2011-1910; classtype:denial-of-service; sid:19125; rev:4;)

1)在这里插入图片描述指服务器上从A到B的响应
2)在这里插入图片描述表示从数据部分开始偏移4个字节,然后开始在2个字节长度范围内匹配|84 23|
3)在这里插入图片描述从2)匹配处偏移4个字节,取后面的两个字节数据,如果大于40,则命中

Snort检测方案分析:

1.数据包为dns response
2.2)偏移四个字节后到了数量字段的Questions字段,匹配/x84/x23
3.3)定位到了Additional RRs,取两个字节,即Additional RRs的内容,如果值大于40则命中

猜你喜欢

转载自blog.csdn.net/yalecaltech/article/details/89382898