本文的目的在于向读者解释IP 欺骗的实现方法和预防措施。它要求您掌握有关Uni x 和TCP/IP 的少量知识。如果您没有,也没有关系,相信下面的说明能给您以足够的背景知识。
IP欺骗是适用于TCP/IP环境的一种复杂的技术攻击,它由若干部分组成。目前,在In ternet领域中,它成为黑客攻击时采用的一种重要手段,因此有必要充分了解它的工作原理和防范措施,以充分保护自己的合法权益。
实际上,IP 欺骗不是进攻的结果,而是进攻的手段。进攻实际上是信任关系的破坏。然而,在本文中,IP
欺骗将被看作是涉及到的整个攻击,对于利用IP欺骗建立起来的虚假信任关系进行破坏的其它行为不作为我们讨论的内容。本文将详尽地解释攻击的全过程,包括有关的操作系统与网络信息。
背景知识
有关主机定义
A:目标主机
B:对于A来说,可信任的主机
X:不能到达的主机
Z:进攻主机
1(2):主机1化装成主机2
图示符号定义
本文中有若干图示,它们将类比以下示例进行解释:
时间序列
主机a
控制
主机b
1
A
--SYN -->
B
时间序列:时间流逝的单位,可以无穷细化。一般认为是很小的单位,表示事件发生的先后顺序。
主机a:参与一次TCP 对话的机器。
控制:显示有关TCP控制字段头部的控制字符和该字段的流动方向
主机b:参与一次TCP 对话的机器。
这个图示中,在第一参考时间点上主机A发送TCP 字段给主机B,控制字段中的SYN控制位将作为该TCP字段的主要信息。除非特别说明,我们一般不关心TCP 字段中的数据部分。
信任关系
在Unix
领域中,信任关系能够很容易得到。假如您在主机A和B上各有一个帐户,您在使用当中发现,在主机A上使用时需要输入在A上的相应帐户,在主机B上使用时必须输入在B上的帐户,主机A和B把您当作两个互不相关的用户,显然有些不便。为了减少这种不便,您可以在主机A和主机B中建立起两个帐?У南嗷バ湃喂叵怠T谥骰鶤和主机B上您的home 目录中创建.rhosts 文件。从主机A上,在您的home目录中输入'echo " B username " > ~/.rhosts' ;从主机B上,在您的home目录中输入'echo " A username " >~/.rhosts '
。至此,您能毫无阻碍地使用任何以r*开头的远程调用命令,如:rlogin,rcall,rsh等,而无口令验证的烦恼。这些命令将允许以地址为基础的验证,或者允许或者拒绝以IP地址为基础的存取服务。
Rlogin
Rlogin 是一个简单的客户/服务器程序,它利用TCP传输。Rlogin允许用户从一台主机登录到另一台主机上,并且,如果目标主机信任它,Rlogin 将允许在不应答口令的情况下使用目标主机上的资源。安全验证完全是基于源主机的IP 地址。因此,根据以上所举的例子,我们能利用Rlogin
来从B远程登录到A,而且不会被提示输入口令。
Internet协议(IP)
IP 是TCP/IP协议组中非面向连接、非可靠传输的网络协议。它由两个32bit的头字段提供地址信息。IP数据包占TCP/IP协议网络流量中的很大部分,可以说是最为繁忙的部分。IP
的工作在于在网络环境中发送数据包,它不提供保证可靠性的任何机制,对于可靠性的要求,由上层协议来完成。IP只是发送数据包,并且保证它的完整性。如果不能收到完整的IP数据包,IP会向源地址发送一个ICMP 错误信息,希望重新处理。然而这个包也可能丢失(ICMP
是网际控制消息协议,Internet Control Message
Protocol,它是用于根据网络条件保证数据传送的协议,主要是向IP层或其它层发送不同的错误信息)。由于IP是非面向连接的,所以不保持任何连接状态的信息。每个IP数据包被松散地发送出去,而不关心前一个和后一个数据包的情况。由此我们不难看出,可以对IP堆栈进行修改,在源地址和?康牡刂分蟹湃肴我饴?阋?蟮腎P地址,也就是说,提供虚假的IP地址。
传输控制协议(TCP)
TCP
是在TCP/IP协议组中面向连接、提供可靠传输的协议。面向连接意味着参与对话的两个主机必须首先建立起连接,然后才能进行数据交换。可靠性是由数据包中的多位控制字来提供的,但是,其中仅仅有两个是与我们的讨论有关。它们是数据序列和数据确认,分别用SYN和ACK来表示。TCP
向每一个数据字节分配一个序列号,并且可以向已成功接收的、源地址所发送的数据包表示确认(目的地址ACK
所确认的数据包序列是源地址的数据包序列,而不是自己发送的数据包序列)。ACK在确认的同时,还携带了下一个期望获得的数据序列号。显然,TCP提供的这种可靠性相对于IP来说更难于愚弄。
序列编号、确认和其它标志信息
由于TCP是基于可靠性的,它能够提供处理数据包丢失,重复或是顺序紊乱等不良情况的机制。实际上,通过向所传送出的所有字节分配序列编号,并且期待接收端对发送端所发龅氖?萏峁┦掌?啡?TCP
就能保证可靠的传送。接收端利用序列号确保数据的先后顺序,除去重复的数据包。TCP 序列编号可以看作是32位的计数器。它们从0至232-1
排列。每一个TCP连接(由一定的标示位来表示)交换的数据都是顺序编号的。在TCP数据包中定义序列号(SYN)的标示位位于数据段的前端。确认位(ACK)对所接收的数据进行确认,并且指出下一个期
待接收的数据序列号。
TCP通过滑动窗口的概念来进行流量控制。设想在发送端发送数据的速度很快而接收端接收速度却很慢的情况下,为了保证数据不丢失,显然需要进行流量控制,协调好通信双方的工作节奏。所谓滑动窗口,可以理解成接收端所能提供的缓冲区大小。TCP利用一个滑动的窗口来告诉发送端对
它所发送的数据能提供多大的缓冲区。由于窗口由16位BIT所定义,所以接收端TCP 能最大提供65535个字节的缓冲。由此,可以利用窗口大小和第一个数据的序列号计算出最大可接收的数据序列号。
其它TCP标示位有RST(连接复位,Reset the connection)、PSH(压入功能,Push fun ction)和FIN (发送者无数据,No more data from sender)。如果RST 被接收,TCP连接将立即断开。RST
通常在接收端接收到一个与当前连接不相关的数据包时被发送。有些时候,TCP模块需要立即传送数据而不能等整段都充满时再传。一个高层的进程将会触发在TCP头部的PSH标示,并且告诉TCP模块立即将所有排列好的数据发给数据接收端。FIN
表示一个应用连接结束。当接收端接收到FIN时,确认它,认为将接收不到任何数据了。
TCP连接的建立
为了利用TCP 连接交换数据,主机间首先必须建立一个连接。TCP建立连接时可以分为3个步骤,称为三步握手法。如果主机A运行rlogin客户程序,并且希望连接到主机B上的 rlogin daemon服务器程序上,连接过程如图1所示。
1 A ---SYN---> B
2 A <--SYN/ACK-- B
3 A ---ACK---> B
图1
需要提醒读者的是,主机A和B的TCP模块分别使用自己的序列编号。在时刻1时,客户端通过设置标志位SYN=1告诉服务器它需要建立连接。同时,客户端在其TCP头中的序列号领域SEQ放置了它的初始序列号(ISN),并且告诉服务器序列号标示域是有效的,应该被检查。在时刻2时,服务器端在?邮樟松厦娴腟YN后,作出的反应是将自己的ISN 和对客户端的ACK发向客户端并且告知下一个期待获得的数据序列号是(ISN+1)。客户端在第3时刻,对服务器的ISN进行确认。这时,数据传输就可以进行了。
……