0x01
漏洞描述:
ISC BIND中的漏洞可能允许未经身份验证的远程攻击者在目标系统上导致拒绝服务(DoS)条件。
该漏洞是由于受影响的软件对用户提供的输入进行了不正确的验证。 攻击者可以通过向受影响的软件提交精心设计的查询响应来利用此漏洞。 成功利用可能允许攻击者使目标服务停止运行,从而导致目标系统出现DoS情况。
0x02
漏洞分析
当使用NSEC Record缓存DNS响应时,这个潜在的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
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 的任意端口的流量,其中
homenet的任意端口的流量,其中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关键字一起使用,则可以指定应在其中进行模式匹配的数据范围。结合4),5)可知此处表示在数据包数据部分的4字节到6字节之前匹配|00 01 00 01|,而00 01 00 01刚好就是2个字节长度,所以其实就是精准匹配
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关键字一起使用