在开发者的团体内,关于“什么是检测攻击的最有效的方法?”的问题的争论还在激烈的进行着,不过IDS的用户对目前的IDS技术还是感到满意的,为了获得更有优势的竞争,很多的IDS产品提供商,都在其产品中加入了主动响应的功能。这个功能的概念就是说IDS将检测攻击者的攻击行为,并组织攻击者继续进行攻击。不过,问题是稍有一点TCP/IP知识的攻击者都可以轻易的直接击败这些响应机制;或者利用这些机制实现阻断网络的功能,管理员将不得不关闭这些功能。对于管理员来说,明白主动响应的局限性将有助于管理员盲目的相信那些产品提供商。绝大多数响应机制是以下两种形式中的一种:
- 阻止会话
- 防火墙联动
1.“阻止会话”机制简介:
阻止会话到目前为止,是最IDS供应商最常用的方式。这种方式之所以流行,是因为它不需要外部设备的支持(如防火墙),而且它易于实现。这一机制非常简单,下面我们将逐步剖析这种机制,并揭示如何绕过它,我希望我的评价不会引起厂商们的反感。
下面我们以IIS的Unicode横向目录遍历攻击为例子,来讲解这一机制的工作方式。攻击者发出如下的请求,这个请求共51个字节,将这51个字节变成分段的破碎IP包,每个包长为20个字节,如下所示:
Data: /scripts/..%c0%af../winnt/systme32/cmd.exe/c+dir+foo +-------------------+-------------------+----------+ Offset: 0 20 40 51 Sec Num: 100 120 140 151
本文中提到的IDS是具有如下功能的产品:
- 有关于“system32/cmd.exe”这个攻击特征信号
- 能够重组所有的破碎包和流信息
- 能够进行unicode、hexcode(16进制编码)、escape和base64的解码
如果攻击者仅仅是简单的重复这样的行为,而不做任何变化的化,IDS将捕获到这样的攻击行为,并生成一个报警信息。一般说来,操作系统在处理时,会对以上所示的IP包在IP堆栈生成一个随机的ISN值,然后将数据用三个数据包发出。(当然,我们都知道简单的通过浏览器是无法实现这个情况的,这里只是一个例子而已)
有些系统的IP堆栈在每发出一个数据包以后,会等待一会儿以便收到来自接受方的确认信息,确认收到发出的那个数据包。而有的系统的IP堆栈会一次发出所有的三个包,然后在重发那些接受方没有确认收到的数据包。尽管不同的操作系统在一个会话建立以后(Established状态)处理IP堆栈的方式不一样,不过这里的关键是说明了堆栈肯定可以同时处理一定数量的数据包。在本例中,我们的IDS将会在收到第三个包的时候报警,因为它已经收到了第1个和第2个数据包,此时它已经可以重组整个会话,并匹配出合适的信号了。这时候,如果IDS具有会话阻断的功能,那么IDS将会向通信的两端各发送一个TCP RESET包,从而实现主动切断连接的目的,此时通信双方的堆栈将会把这个RESET包解释为另一端的回应,然后停止整个通信过程,释放缓冲区并撤销所有TCP状态信息。这个时候,攻击数据包可能还在目标主机操作系统TCP/IP堆栈缓冲区中,没有被提交给应用程序,由于缓冲区被清空了,所以攻击不会发生。
对于RESET包来说,IDS发出的RESET包的前提是知道整个会话当前的序列号和确认号,否则这个RESET包将会被忽略。本例中确认号必须为152(比最后的一个序列号大1)如果你发送的RESET包的确认号为142,那么堆栈将会认为这是一个无效的数据包或者被破坏的数据包而将它忽略掉。(嗯,好像问题开始变得明朗了)
2.绕过“会话阻止”
会话阻止的机制可以被攻击者所绕过,绕过这一机制的很多方法都是依靠时间选择方式。
如果攻击不需要一个交互式的会话过程,则攻击者可以通过简单设置TCP/IP数据包的PUSH堆栈来实现时间选择。TCP/IP堆栈一般不会立即将收到的大块数据送给应用程序处理。绝大多数时候,这样将造成应用程序花费比较高的系统中断调用和内容交换的代价来提高对小数据包的处理能力,堆栈将所有数据放在一个缓冲区中,当缓冲区满了以后,堆栈才将堆栈中所有的数据一次性提交给应用层的程序。在上面的例子中,所有的51字节的数据全部收到以后才会被一次性提交给应用层。
共3页: 上一页 1 [2] [3] 下一页
|