dns协议类漏洞学习–结合snort分析(二)

  • Post author:
  • Post category:其他




cve-2014-8500

漏洞描述:

ISC BIND 9.0.x到9.8.x,9.9.0到9.9.6和9.10.0到9.10.1不限制delegation chaining,允许远程攻击者通过大量的或无限数量的referrals造成拒绝服务(内存消耗和named崩溃)



https://nvd.nist.gov/vuln/detail/CVE-2014-8500)


该漏洞产生于受影响的BIND服务器执行delegation query处理的方式。 在为name server生成查找时,named deamon可以在没有最大递归查询限制的情况下对更多name server进行额外查询,并且可以执行无限循环迭代。

未经身份验证的远程攻击者可以通过传输精心设计的DNS lookup query来触发漏洞(不受控制的迭代)。成功的攻击可能允许攻击者导致named daemon崩溃并导致DoS条件。

(

https://tools.cisco.com/security/center/viewAlert.x?alertId=36693

)

背景:

1)dns lookup 可以查找IP地址并对任何URL执行深度DNS查找,提供有关常见记录类型(如A,MX,NS,SOA和TXT)的详细信息。

2)Named:isc bind服务器的守护进程

3)Name server:域名服务器,每个域名服务器所负责管辖的范围叫做区(zone)

4)Delegation:当 com服务器被要求找到区域example.com的权限时,他们经常将这项工作委托给不同的名称服务器

(

https://dyn.com/blog/domain-name-system-dns-delegation-the-zone-authority-chain/

)

Snort规则分析

alert udp $HOME_NET 53 -> any any (msg:“PROTOCOL-DNS ISC BIND recursive resolver resource consumption denial of service attempt”; flow:to_client; byte_test:2,&,0x8080,2; content:”|00 01 C0 0C 00 02 00 01|”; offset:20; detection_filter:track by_dst, count 100, seconds 20; metadata:service dns; reference:cve,2014-8500; reference:url,

www.kb.cert.org/vuls/id/264212;

classtype:attempted-dos; sid:33583; rev:1;)

1)
在这里插入图片描述
指定的是服务器上从A到B的响应

2)
在这里插入图片描述
从数据头部开始向后偏移2个字节,再获取其后的两个字节的数据,如果内容为0x8080,则命中

3)
在这里插入图片描述
在数据部分起始处偏移20个字节,然后匹配|00 01 C0 0c 00 02 00 01|

4)
在这里插入图片描述
来自any(dst)的请求超过100次之后,在20秒的时间内,每次请求都会触发这条规则

Snort检测方案分析:

1.2)定位到了flags字段,检测其值为/x80/x80

2.3)定位到了正文区域的Queries字段,由于Name字段长度不固定,但是结合该漏洞背景(递归查询),判断出00 01 c0 0c为Name字段,00 02为Type,对应的查询类型为NS,即查询域名服务器00 01为Class字段,值为1,表示class数据



cve-2016-1285

0x01

漏洞描述:

ISC BIND中的漏洞可能允许未经身份验证的远程攻击者导致拒绝服务(DoS)情况。

该漏洞是由于受影响的软件对用户提供的输入进行了不正确的验证。攻击者可以通过向受影响的软件中的control channel(rndc)提交恶意数据包来利用此漏洞。成功利用可能允许攻击者触发断言失败,从而在目标系统上导致DoS条件。

(

https://tools.cisco.com/security/center/viewAlert.x?alertId=44030

)

在9.9.8-P4和9.10.x之前在ISC BIND 9.x中命名,在解析获取回复消息时,9.10.3-P4没有正确处理DNAME记录,这允许远程攻击者导致拒绝服务(断言失败和守护进程) 退出)通过格式错误的数据包到rndc(又名control channel)接口,与alist.c和sexpr.c相关。(

https://nvd.nist.gov/vuln/detail/CVE-2016-1285

)

0x02

背景:

1)rndc

BIND分发包含的远程名称守护程序控制(rndc)程序提供了一个control channel来执行BIND 9 DNS服务器操作。 rndc命令提供执行这些操作的访问权限

(

http://www.ipamworldwide.com/ipam/bind-control.html

)

2)DNAME记录

rfc2672描述了DNAME,rfc的标题是”Non-Terminal DNS Name Redirection”, 与CNAME的意思类似, 但他并不是别名了单独的一个名字, 而是别名了整个域名.当发现DNAME时, 并没结束, 而是计算出一个新的名字并且解析它

DNAME

作用是, 整个owner标识的整个子树被映射到目标域名上. 这是为了创建一种机制, 以帮助当网络重新规划后, 域名方便的重新命名, 包括原来的和新添加的域名.

0x03

Snort规则分析

该漏洞有两条snort

1.alert tcp any any -> $HOME_NET any (msg: “ATTACK [PTsecurity] Attempt to crash named using malformed RNDC packet”; flow: established, to_server; content:”_auth”; depth: 20; fast_pattern; content: !”|02 00 00 00|”; within: 4; content: “_ctrl”; content: “_ser”; content: “_tim”; content: “_exp”; reference: cve, 2016-1285; classtype: attempted-dos; reference: url,

github.com/ptresearch/AttackDetection;

metadata: Open

Ptsecurity.com

ruleset; sid: 10000005; rev: 3; )

直接解释重点

1)
在这里插入图片描述
表示指定客户端上从A到B的请求

2)
在这里插入图片描述
第一次匹配,表示在数据部分的前20个字节内匹配ascii字符_auth,fast_pattern单独使用时,其含义仅仅是使用指定的内容作为规则的快速模式内容。

3)
在这里插入图片描述
在距离2)匹配后的4个字节内匹配|02 00 00 00|

4)

在这里插入图片描述

匹配相应的内容

2.alert tcp any any -> $HOME_NET any (msg: “ATTACK [PTsecurity] Attempt to crash named using malformed RNDC packet”; flow: established, to_server; content:”_auth”; depth: 20; fast_pattern; content: !”|01 00 00 00|”; distance: 10; within: 4; content: “_ctrl”; content: “_ser”; content: “_tim”; content: “_exp”; reference: cve, 2016-1285; classtype: attempted-dos; reference: url,

github.com/ptresearch/AttackDetection;

metadata: Open

Ptsecurity.com

ruleset; sid: 10000006; rev: 3; )

1)
在这里插入图片描述
第一次匹配,表示在数据部分的前20个字节内匹配ascii字符_auth,fast_pattern单独使用时,其含义仅仅是使用指定的内容作为规则的快速模式内容

2)
在这里插入图片描述
从1)匹配后偏移10个字节,然后再给位置开始的4个字节内匹配|01 00 00 00|

3)
在这里插入图片描述

匹配上述内容

Snort检测方案分析:

第一条:

1.在数据起始的前20字节内检测_auth,但是前12字节为header,所以定位到13~20字节,13字节开始正文区域的Queries字段,虽然Name长度不固定,但是因为以4字节为单位,而且结合2)的特征以及dns报文格式,将1)定位到queries字段

2.在匹配到_auth之后继续理解接着匹配/x02/x00/x00/x00,由于1以及报文格式,可知,/x02/x00为Type字段,/x00/x00为Class字段

3.匹配4)的多个content,没定位到具体字段

第二条:

1.在数据起始的前20字节内检测_auth,但是前12字节为header,所以定位到13~20字节,13字节开始正文区域的Queries字段,虽然NAme长度不固定,但是因为以4字节为单位,而且结合2)的特征以及dns报文格式,将1)定位到queries字段

2.在匹配到_auth之后继续理解接着匹配/x01/x00/x00/x00,由于1以及报文格式,可知,/x01/x00为Type字段,/x00/x00为Class字段

3.匹配4)的多个content,没定位到具体字段



cve-2016-2088

0x01

漏洞描述:

在9.10.3-P4之前的ISC BIND 9.10.x中的named的resolver.c,当启用DNS cookie时,允许远程攻击者通过具有多个cookie的格式错误的数据包导致拒绝服务(INSIST断言失败和守护进程退出) 选项。

攻击者可以通过提交包含大量cookie的恶意数据包来利用此漏洞

0x02

背景:

DNS cookie:DNS Cookie是一种轻量级的DNS事务安全机制,可为DNS服务器和客户端提供有限的保护,防止off-apth攻击者造成的各种日益普遍的拒绝服务和放大攻击/伪造攻击或缓存中毒攻击。 DNS Cookie可以兼容NAT,NAT-PT(网络地址转换 – 协议转换)和任播,并且可以逐步部署。 (由于DNS Cookie仅返回到最初收到它们的IP地址,因此它们不能用于跟踪Internet用户。)



https://tools.ietf.org/html/rfc7873)

0x03

Snort规则分析:

alert udp $EXTERNAL_NET 53 -> $HOME_NET any (msg:“PROTOCOL-DNS ISC BIND DNS duplicate cookie denial of service attempt”; flow:to_client; byte_test:1,&,0x80,2; content:”|00 00 29|”; content:”|00 00|”; within:2; distance:2; content:”|00 0A|”; within:2; distance:4; byte_jump:2,0,relative; content:”|00 0A|”; within:2; metadata:policy max-detect-ips drop, service dns; reference:cve,2016-2088; reference:url,

kb.isc.org/article/AA-01351/0/CVE-2016-2088%3A-A-response-containing-multiple-DNS-cookies-causes-servers-with-cookie-support-enabled-to-exit-with-an-assertion-failure.html;

classtype:attempted-dos; sid:40362; rev:1;)

1)
在这里插入图片描述
dns走的是udp,所以这里直接是udp,externel_net和home_net变量值写在snort.conf,一般默认是any

2)
在这里插入图片描述
msg规则选项告知日志记录和警报引擎要打印的消息以及数据包转储或警报。这里是打印出protocol-dns …

3)
在这里插入图片描述
这个选项要和TCP流重建联合使用。它允许规则只应用到流量流的某个方向上。这将允许规则只应用到客户端或者服务器端。这将能把内网客户端流览web页面的数据包和内网服务器所发送的数据包区分开来。这里的值设置为to_client,是触发服务器从A到B的响应

4)
在这里插入图片描述
表示从数据头开始,向后偏移2个字节,再获取它后面的1个字节的数据,如果内容为0x80,则命中

5)
在这里插入图片描述
第一处匹配,它允许用户设置搜索数据包有效负载中特定内容的规则,并根据该数据触发响应。这里的内容为16进制格式

6)
在这里插入图片描述
第二处匹配,表示从5)往后偏移2个字节开始(distance)到5)往后偏移2个字节为止(within),在这段区间内匹配\x00\x00,其实在这里就是匹配5)往后偏移2个字节处的内容是否为\x00\x00

7)
在这里插入图片描述
第三处匹配,我认为写出了,distance的值应小于within的值

8)
在这里插入图片描述
在7)匹配的位置上偏移0个字节,然后取2个字节的数据,根据取出的结果,跳过相应的字节

9)
在这里插入图片描述
在8)的基础上偏移范围在2个字节之内,在其中匹配\x00\x0a

10)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

这些都不重要,不再分析

Snort检测方案分析:

1.数据包为dns response

2.4)定位到flags字段,取flags字段第一个字节的内容,如果值为/x80则命中

3.5)匹配十六进制00 00 29,没有定位到字段

4.由于5)的原因,因为6是相对偏移所以也没有定位到具体字段,匹配16进制00 0a

5.8),9)因为同样的原因,没有匹配到具体的字段,匹配16+进制00 0a



cve-2016-9147

0x01

漏洞描述:

ISC BIND中的漏洞可能允许未经身份验证的远程攻击者在目标系统上导致拒绝服务(DoS)条件。

该漏洞是由于受影响的软件对用户提供的输入进行了不正确的验证。 攻击者可以通过向受影响的软件提交精心设计的查询响应来利用此漏洞。 成功利用可能允许攻击者使目标服务停止运行,从而导致目标系统出现DoS情况。

0x02

漏洞分析

当使用NSEC Record缓存DNS响应(query response)时,这个潜在的DoS漏洞是由Resolver.c中的RUNTIME CHECK错误引起的。

NSEC记录(记录类型47)由域名系统安全扩展(DNSSEC)提供,以处理DNS中不存在的名称。它链接区域中的所有名称,并列出与每个名称相关的所有记录类型。作为DNSSSEC验证的一部分,解析器使用NESC记录提供的信息来验证区域中DNS查询名称或记录类型是否不存在。

NSEC记录始终包含在DNS响应的AUTHORITY部分中。如果启用了DNSSEC,则在处理和缓存DNS响应的ANSWER部分中的记录时,BIND命名将提取NSEC记录的信息以进行进一步的DNSSEC验证。提取信息后,BIND将其与DNS响应的ANSWER部分中的记录相关联。如果关联不成功,则会触发Resolver.c的函数“cache_name()”中的RUNTIME CHECK错误,并使named为exit。

0x03

背景:

1)NSEC Record:

NSEC记录链接到区域中的下一个记录的名称(在DNSSEC排序顺序中),并列出记录名称的记录类型。

解析器作为DNSSEC验证的一部分,可以使用这些记录来验证记录名称和类型是否不存在。

NSEC记录具有以下数据元素:

下一个域名:区域中的下一个记录名称(DNSSEC排序顺序)

记录类型:此NSEC记录名称的DNS记录类型。

2)Authoritative Section:

可以查询任何 DNS服务器来回答发送的查询。不过,该服务器可以选择从缓存中回答查询。但是,如果想确保得到一个权威的响应,应该询问authoritative section中的服务器

3)Answer Section:

在这里插入图片描述

0x04

Snort规则分析:

alert dns any any -> $HOME_NET any (msg: “INFO [PTsecurity] DNS RRSIG without covered RR (CVE-2016-9147)”; flow: established, from_server; content: “|00 01 00 01|”; offset: 4; depth: 6; content: “|00 00|”; distance: 0; content: “|00 01|”; distance: 1; within: 2; content: “|00 2E 00|”; fast_pattern; distance: 0; pcre: “/.{4,6}\x00\x01\x00\x01.{4}[

\x00]+\x00.{4}[

\x00]+\x00(?:\x2e|\x00\x2e)/”; reference: cve, 2016-9147; reference: url,

kb.isc.org/article/AA-01440/74/CVE-2016-9147%3A-An-error-handling-a-query-response-containing-inconsistent-DNSSEC-information-could-cause-an-assertion-failure-.html;

classtype: attempted-dos; reference: url,

github.com/ptresearch/AttackDetection;

metadata: Open

Ptsecurity.com

ruleset; sid: 10000892; rev: 2; )

1)
在这里插入图片描述
dns协议,表示任意主机任意端口到



h

o

m

e

n

e

t

home_net 的任意端口的流量,其中






h


o


m



e










n


















e


t






































home_net一般在snort.conf定义,默认为any

2)
在这里插入图片描述
这是出现符合特征的流量时alert发出的报文

3)
在这里插入图片描述
flow关键字用于将会话的规则应用于在特定方向上流动的数据包,这里设置的established表示仅将规则用于已建立的会话,from_server,from开头的表示请求,所以from_server触发服务器上从A到B的请求

4)
在这里插入图片描述
content能够在数据包内找到数据模式。模式可以以ASCII字符串的形式呈现,或者以十六进制字符的形式呈现为二进制数据。被||包围这是16进制形式。Content一般和offset,depth,nocase进行搭配使用

5)
在这里插入图片描述
offset关键字与content关键字结合使用。使用此关键字,可以在距数据包数据部分开头的某个偏移处开始搜索。使用数字作为此关键字的参数,单位为字节;这里表示在数据包的数据部分起始偏移4个字节后开始搜索4)的content

6)
在这里插入图片描述
depth关键字与content关键字结合使用,指定模式匹配的上限。使用depth关键字,则不搜索该偏移之后的数据。如果同时将offset和depth关键字与content关键字一起使用,则可以指定应在其中进行模式匹配的数据范围。

7)
在这里插入图片描述
这是第二个匹配

8)
在这里插入图片描述
distance关键字在开始搜索相对于前一个模式匹配结束后指定Snort应该忽略的数据包的长度。和offset很像,只不过它是相对于最后一个模式匹配的结束而不是数据包的开头。 这里distance设置为0,指的是在匹配完4)之后立刻开始匹配7)

9)
在这里插入图片描述
这是第三处匹配,结合8)可知这是在匹配完7)之后,间隔1个字节,开始匹配|00 01|

10)
在这里插入图片描述
within确保使用content关键字在模式匹配之间最多N个字节(参见章节[*])。 它与distance选项一起使用。 这个与depth很像。就像offset和depth搭配限制了一个范文,distance与within搭配限制了一个范围。只不过offset,depth以数据包的数据部分起始处开始计算,而distance,within以上一个content为起始进行计算。此处表示在距离7)两个字节以内,结合9)可知,起始匹配的长度就只有1个字节长度,内容为|00 01|,这也是精确的匹配。

11)
在这里插入图片描述
这是第四处匹配

12)
在这里插入图片描述

这是与11)配合的选项。distance=0指的是在9)之后立即开始匹配;fast_pattern可以配合参数使用也可以单独使用,这里单独使用,其含义仅仅是使用指定的内容作为规则的快速模式内容。这里就是表示|00 2e 00|与快速模式匹配器一起使用;pcre关键字允许使用perl兼容的正则表达式编写规则,一般pcre与content搭配,这允许快速模式匹配器过滤掉不匹配的数据包,这样就不会对每个数据包执行pcre检测。这里pcre就是给出正则匹配的规则,然后与11)进行匹配。.表示匹配除换行符以外所有字符,{4,6}表示最少匹配4次,最多匹配6次 {4}表示确定匹配4次,[^\x00]表示匹配不符合\x00的字符 .{4,6}\x00\x01\x00\x01.{4}[

\x00]+\x00.{4}[

\x00]+\x00(?:\x2e|\x00\x2e)

.{4,6}\x00\x01\x00\x01.{4}[^\x00] 匹配除换行符外所有字符,最少4个最多6个,

\x00(?:\x2e|\x00\x2e) 意思是\x00\x2e或者\x00\x00\x2e

pcre: “/.{4,6}\x00\x01\x00\x01.{4}[

\x00]+\x00.{4}[

\x00]+\x00(?:\x2e|\x00\x2e)/”

意思:匹配4-6个字符中,其中要包括\x00\x01\x00\x01,连续匹配4个除\x00之外的字符;加上\x00和连续匹配的4个除\x00之外的字符;加上\x00\x2e或者\x00\x00\x2e

13)
在这里插入图片描述

在这里插入图片描述

这两条reference表示参考引用,不重要

14)
在这里插入图片描述
classtype关键字用于将规则分类为检测作为更一般类型的攻击类的一部分的攻击。 Snort提供了一组默认的攻击类,它们由它提供的默认规则集使用。定义规则的分类提供了一种更好地组织Snort生成的事件数据的方法。这里把该攻击归类到classtype

15)
在这里插入图片描述
metadata允许规则编写者嵌入有关规则的其他信息,通常采用键值格式。

16)
在这里插入图片描述
sid关键字用于唯一标识Snort规则。 此信息允许输出插件轻松识别规则。此选项应与rev关键字一起使用

17)
在这里插入图片描述
rev关键字用于唯一标识Snort规则的修订版。 修订以及Snort规则ID允许改进签名和描述并用更新的信息替换。 此选项应与sid关键字一起使用

Snort检测方案解析:

1.根据4),5),6)可知定位数量字段,由于depth为6字节,所以定位到Questions、Answer RRs、Authority RRs字段,检测十六进制00 01 00 01

2.结合9)的distance,根据整体性原则,7应定位到Additional RRs,结合8)可知,4),5),6)定位到检测Answer RRs为00 01 、Authority RRs为00 01

3.9)开始定位queries字段,结合12)的正则,可知9)一直到12)都属于Name字段,匹配的内容:name字段的第2个字节和第3个字节为00 01,全文匹配00 2e 00,正则部分没看明白,后续再做分析



版权声明:本文为yalecaltech原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。