攻击与渗透 (7)

ISN自身的值是按照一个常数值稳定增加的,所以F()需要保持相对的稳定性。而根据Bellovin 所提出的,是一个系统特定的值(例如机器的启动时间,密码,初始随机数等),这些值并不 会经常变。

但是,如果Hash函数在实现上存在漏洞(我们无法保证一个绝对安全的Hash函数,况且,它的实现又与操作系统密切相关),攻击者就可以通过大量的采样,来分析,其中,源IP地址,源端口,目的IP地址,目的端口都是不变的,这减少了攻击者分析的难度。

Linux TCP的ISN生成器避免了这一点。它每5分钟计算一次值,把泄漏的风险降到了最低。

有一个办法可以做的更好:

取M = M + R(t)

ISN = M + F(sip, sport, dip, dport, )

其中

R(t) 是一个关于时间的随机函数

  很有必要这样做,因为它使攻击者猜测ISN的难度更大了(弱点在理论上还是存在的)。 

其它一些方法

构造TCP ISN生成器的一些更直接的方法是:简单地选取一些随机数作为ISN。这就是给定一个32位的空间,指定 ISN = R(t)。(假设R()是完全的非伪随机数生成函数)

固然,对于完全随机的ISN值,攻击者猜测到的可能性是1/232是,随之带来的一个问题是ISN空间里面的值的互相重复。这违反了许多RFC(RFC 793, RFC 1185, RFC 1323, RFC1948等)的假设----ISN单调增加。这将对TCP协议的稳定性和可靠性带来不可预计的问题。

其它一些由Niels Provos(来自OpenBSD 组织)结合完全随机方法和RFC 1948解决方案:

ISN = ((PRNG(t)) << 16) + R(t)     32位

其中

PRNG(t) :一组随机指定的连续的16位数字  0x00000000 -- 0xffff0000

R(t) :16位随机数生成器(它的高位msb设成0)0x00000000 -- 0x0000ffff

上面的公式被用于设计OpenBsd的ISN生成器,相关的源代码可以从下面的网址获得

Provos的实现方法有效地生成了一组在给定时间内的不会重复的ISN的值,每两个ISN值都至少相差32K,这不但避免了随机方法造成的ISN的值的冲突,而且避免了因为哈希函数计算带来的性能上的下降,但是,它太依赖于系统时钟,一旦系统时钟状态给攻击者知道了,就存在着系统的全局ISN状态泄密的危机。

TCP ISN生成器的构造方法的安全性评估

ISN与PRNGs(伪随机数生成器)

我们很难用一台计算机去生成一些不可预测的数字,因为,计算机被设计成一种以重复和准确的方式去执行一套指令的机器。所以,每个固定的算法都可以在其他机器上生成同样的结果。如果能够推断远程主机的内部状态,攻击者就可以预测它的输出;即使不知道远程主机的PNRG函数,但因为算法最终会使ISN回绕,按一定的规律重复生成以前的ISN,所以,攻击者仍然可以推断ISN。幸运的是,目前条件下,ISN的重复可以延长到几个月甚至几年。但是,仍然有部分PRNG生成器在产生500个元素后就开始回绕。解决伪随机数的方法是引入外部随机源,击键延时,I/O中断,或者其它对攻击者来说不可预知的参数。把这种方法和一个合理的HASH函数结合起来,就可以产生出32位的不可预知的TCP ISN的值,同时又隐蔽了主机的PNRG的内部状态。不幸的是,很少的TCP ISN产生器是按这种思路去设计的,但即使是这样设计的产生器,也会有很多的实现上的漏洞使这个产生器产生的ISN具有可猜测性。

RFC1948的建议提供了一种比较完善的方法,但是,对攻击者来说,ISN仍然存在着可分析性和猜测性。其中,PRNG的实现是个很关键的地方。

Spoofing 集合

需要知道一点是,如果我们有足够的能力能够同时可以发出232个包,每个包由不同的ISN值,那么,猜中ISN的可能性是100%。但是,无论从带宽或计算机的速度来说都是不实际的。但是,我们仍然可以发大量的包去增加命中的几率,我们把这个发出的攻击包的集合称为Spoofing集合。通常,从计算机速度和网络数据上传速率两方面来考虑,含5000个包的Spoofing的集合对众多的网络用户是没有问题的,5000-60000个包的Spoofing集合对宽带网的用户也是不成问题的,大于60000个包的Spoofing集合则超出一般攻击者的能力。网络的速度和计算机性能的不断增加会提高那种使用穷尽攻击方法猜测ISN的成功率。从攻击者的立场,当然希望能够通过定制一个尽可能小的Spoofing集合,而命中的几率又尽可能高。我们假定我们攻击前先收集50000个包作为ISN值的采样,然后,我们把这些ISN用作对将来的ISN的值猜测的依据。
一种称为“delay coordinates”的分析方法

在动态系统和非线性系统中,经常使用一种叫做“delay coordinates”的分析法,这种方法使我们可以通过对以前的数据的采样分析来推想以后的数据。

我们试图以建立一个三维空间(x,y,z)来观察ISN值(seq[t])的变化,其中t取0,1,2, ……

(图6)

方程组(E1)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgjzxj.html