TCP/IP协议栈的设计和利用还是让我觉得太炫酷了!!
环境分析
涉及到四台机器:
攻击者:Mitnick
受害者:Shimomura
中间被利用者:Remote
测试ISN算法机器:Tester
攻击入口
被攻击机器S与远程服务器R之间,R可以通过在TCP 513 端口运行rlogin访问S。其中rlogin使用不安全的认证方式:基于源IP。
最终目标
劫持R的IP身份,使得M与S建立TCP连接。
原理简介
在M上通过伪造R的IP身份,向S发送连接请求(SYN,第一次握手),并且直接跳过S的ACK+SYN响应(第二次握手),做出一个虚假的第三次握手。这样执行之后,结果就是:M与S建立了TCP连接,而其中M用的IP身份完全就是R的。通俗地讲就是:S以为自己对面连接的是R,其实对面是M。
具体执行
1、找出一台能对S进行rlogin登录的远程主机R。
2、让R无法响应。
3、使用M伪造R的IP身份,向S进行TCP第一次握手。
4、使用主机T,发送系列SYN请求给S,分析S的ISN算法。预测一个S会响应步骤3的第二次握手的ISN。
5、根据步骤4的预测ISN值,向S进行TCP第三次握手。完成攻击。
POINTS
1、使R无法响应
WHY:因为后边要使用R的IP来给S发送伪造请求(第一次握手),之后,还要给S发送伪造身份的第三次握手,而不能让真正的R进行握手。所以不能让R响应。
tag:在这个地方,我遇到了问题,先按住不表。其实上边这个WHY只是我个人理解,我看的一本书上是这样讲的:如果远程服务器发现有人尝试使用服务器IP地址进行假连接,它将发送TCP重置数据包关闭连接。。之后我理解了会再回来的。
DO:要让R不能响应,我们直接给它个 SYN Flood,让它闭嘴。
2、预测TCP序列号
WHY:让R不能响应之后,下一步我们要做的就是:在M上用R的IP身份向S发送一个TCP连接请求(第一次握手),这时候S会正常响应(第二次握手),但是它不会收到正常的第三次响应,因为真正的R被我们封口了。接着,我们直接从M上制造一个第三次握手响应S。。。这个过程总结起来其实就是:我们在M上跳过第二次握手,直接给了S一个第一次握手和第三次握手,建立起M<==>S的TCP连接,完成攻击。
而这其中的难点在于:由于每个TCP报文都会带一个TCP序列号,我们知道,当对一个SYN报文进行ACK的时候被要求将当前的TCP序列号加1。这样的计算量就是小学生都可以解决。问题是,我们现在是在讨论“初始”时候的TCP序列号。即Client发起TCP连接请求SYN的时候,会发送一个自己的初始序号ISN,而Server在响应这个SYN时,不仅要将这个ISN加1进行ACK,还要发送Server自己的ISN,这个跟Client那个ISN是没有关系的。两边的ISN都是双方根据自己的选择算法选择出来的。。。
而这个选择算法存在漏洞(tag:现在大部分的操作系统已经对此改进,将其随机化了)!
比如,RFC 793 [Postel 1981c]中说明是:ISN可看作是一个32比特的计数器,每4秒加1。。。仅仅用每4秒加1这么简单的算法来生成,那么我们只要自己从其它主机手动给S连接请求,然后分析从S返回的响应中的ISN,就可以完美地确定到我们上边那一次第三次握手时要给它的ISN+1是几了(其实也不完美,毕竟网络流量比较复杂,难保S会有其它连接使得ISN数据后移了。所以标题说“预测”。just try it)。
DO:(我们已经假定了S上存在“ISN漏洞”,但是具体情况并不一定是上边说的“每4秒加1”)使用测试主机T,对S发出一系统SYN请求,通过分析其响应中的属于Server方(被动连接方)的ISN,最终给出一个预测的TCP序列号值,准备用于上边那个第三次握手。