|
本文的目的在于向读者解释IP欺骗的实现方法和预防措施。它要求您掌握 有关UIIX和TCP/IP的少量知识。如果您没有,也没有关系,相信下面的说明能 给您以足够的背景知识。
IP欺骗是适用于TCP/IP环境的一种复杂的技术攻击,它由若干部分组成。 目前,在Internet领域中,它成为黑客攻击时采用的一种重要手段,因此有必 要充分了解它的工作原理和防范措施;以充分保护自己的合法权益。
实际上,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中建立起两个帐户的相互信任关系,在主机A和主机B上您的home目录中创建.rhosts文件.从主机A上, 在您的home目录中输入e- cho"busername"> ~/.rhosts;从主机B上,在您的 home目录中输入echo" A username">~/.rhosts.至此,您能毫无阻碍地使用 任何以r*开头的远程调用命令,如:rlogin,rcall,rsh等,而无口令验证的烦恼。这些命令将允计以地址为基础的验证,或者允许或者拒绝以IP地址为基础 的存取服务。
Rlogin
Rlogin是一个简单的客户/服务器程序,它利用TCP传输。Rlogin允许用户从一台 主机登录到另一台主机上,并且,如果目标主机信任它,Rlogin将允许在不应答口令的情况下使用目标主机上的资源,安全对外开放证完全是基于源主机的IP地址,因此,根据以上所举的例子,我们能利用Rlogin来从B远程登录到A,而且 不会被提示输入口令,
lnternet协议(IP)
IP是TCP/IP协议组中非面向连接、非可靠传输的网络协议。它由两个数32bit的头字段提供地址信息。IP数据包占TCP/IP协议网络流量中的很大部分,可以说明最为繁书记的部分。IP的工作在于在网络环境中发送数据包,它不提供保证 可靠性的任何机制,对于可靠性的要求,由于层协议来完成。IP只是发送数据包,并且保证它的完整性。如果不能收到完整的IP数据包,IP会向源地址发送一个ICMP错误信息,希望重新处理。然而这个包也可能丢失(ICMP是网际控制消息 协议,Internet Control MessageProtocol,它是用于根据网络条件保证数据 传送的协议,主要是向IP层或其它层发送不同的错误信息)。由于IP是非面向连接的,所以不保持任何连接状态的信息。每个IP数据包被松散地发送出去而 不关心前一个和后一个数据包的情况。由此我们不难看出,可以对IP堆本进行修改,在源地址和目的地址中放入任意满足要求的IP地址,也就是说,提供 虚假的IP地址。
传输控制协议(TCP)
TCP是在TCP/IP协议组中面向边接、提供可靠传输的协议。面向连接意味着参 与对话的两个主机必须首先建立起连接,然后才能进行数据交换。可靠性是由数据包中的多位控制字来提供的,但是,其中仅仅有两个是与我们的讨论有关。 它们是数据序列和数据确认,分别有SYN和ACK来表示。TCP向每一个数据字节 分配一个序列号,并且可以向已成功接收的、源地址所发送的数据包表示确认(目的地址ACK所确认的数据包序列是源地址的数据包序列,而不是自己发送 的数据包序列(。ACK在确认的同时还携带也下一个期望获得的数据序列号。显然,TCP提供的这种可靠性相对于IP来说更难于愚弄。
序列编号、确认和其它标志信息
由于TCP是基于可靠性的,它能够提供处理数据包丢失,重复或是顺序率乱 等不良情况的机制实际上,通过向所传送出的所有字节分配序列编号,并且期待接收端对发送端所发出的数据提供收旋确认,TCP就能保证可靠的传送。接收端利用序列号确保数据的先后顺序,除去重复的数据包。TCP序列编号可以看作是否32位的计数器。它们从0至此2/32-1排列。每一个TCP连接(由一定的标未位来表示)交换的数据都是顺序编号的。在TCPA数据包中定义序列号(SYN)的标示位位于数据段的前端。确认位(ACK)对所接收的数据 进行确认,并且指出下一个期待接收的数据序列号。
TCP通过滑动窗口听要领来进行流量控制。设想在发送端发送数据的速度很快 而接收端接收速度却很慢的情况下,为了保证数据不丢失,显然需要进行流量控制协调好通信双方的工作节奏。所谓滑动窗口,可以理解成接收端所能提供 的缓冲区大小。TCP利用一个滑动的窗口来告诉发送端对它所发送的数据能提供多大的缓冲区。由于窗口由不得16位BIT所定义,所以接收端TCP能最大提供65535个字节的缓冲。由此,可以利用窗口大小和第一个数据的序列号计算出 最大可接收的数据序列号。
其它TCP标示位有RST(连接复位,Reset the connection)、PSH (压入功能,Push function)如果 RST被接收,TCP连接将立即断开。RST通常在接收端接收到一个与当前连接不相关的数据包时被发送。 有些时候,TCP模块需要立即传送数据而不能等整段都充满时再传。一个高层的进程将会触发在TCP头部的PSH标示,并且告诉TCPA模块立即 将所有排列好的数据发给数据接收端。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
图一
需要提醒读者的是,主机A和B的TCP模块分别使用自己的序列编号。在时刻1时,客户端通过设置标志位SYN=1告诉服务器它需要建立连接。同时,客户端在其TCP头中的序列号领域SEQ放置了它的初始序列号(ISN),并且告诉服务器序列号标示域是有效的,应该被检查。在时刻2时,服务器端在接收了上面的 SYN后,作出的反应是将自己的ISN和对客户端的ACKA发向客户端并且千知下一个期待获得的数据序列号是(ISN+1)。客户端在第一流时刻,对服务器 的ISN进行确认。这时,数据传输就可以进行了。
ISN与序列号的递增
了解序数编号如何选择初始序列号和如何根据时间变化是很重要的。似乎 应该有这种情况,当主机启动后序列编号初始化为1,但实际上并非如此。初始序列号是由tcp_init函数确定的。ISN每秒增加工厂128000,如果有连接出现,每次连接将反计数器的数值增加64000。很显然,这使得用于表示ISN的32位计数器在没有连接的情况下每9.32小时复位一次。之所以这样,是因为 这样有利于最大限度地减少旧有连接的信息干扰当前连接的机会。这里运用了望2MSL等待时间的概念(不在本文讨论的范围之内。)如果初始序列号是 随意选择的,那么不能保证现有序列号是不同于先前的。假设有这样一种情况,在一个路由回路中的数据包最终跳出了循环,回到了“旧有”的连接 (此时其实是不同于前者的现有连接(,显然会发生对现有连接的干扰。
端口号
为了提供对TCP模块的并行访问,TCP提供了叫做端口的用户接口。端口被 操作系统内核利用来标示不同的网络进程,也就是严格区分传输层入口的标示(就是说,IP不关心他们的存在)。TCP端口与IP地址一起提供网络端到端的通信。事实上,在任何时刻任何Internet连接都能由4个要素来措述:源IP地址、源地址端口号、目的IP地址和目的地址端口号。服务器程序一般被绑定在标准 的端口号上,便如,rlogin daemon 被绑定在TCP513的端口。
IP欺骗
IP欺骗由若干步骤组成,这里先简要地措述一下,随后再做详尽地解释。先做以下假定:首先,目标主机已经选一。其次,信任模式已被发现, 并找到了一个被目标主机信任的主机。黑客为了进行IP欺骗,进行以下工作:使得被信任的主机丧失工作能力,同时采样目标主机发出的TCP序列号, 猜测出它的数据序列号。然后,伪装成被信任的主机,同时建立起与目标主机基于地址验证的应用连接。如果成功,黑客可以使用一种简单的命令 放置一个系统后门,以进行非授权操作。
IP 欺骗是一种不光彩的进攻
一个经常被忽略,但却是非常关键的事实就是IP欺骗是不光彩的进攻。 进攻者将取代真正被信任的主机,从而破坏目标主机的安全体系。黑客常常利用如下所措述的方法使得真正被信任的主机丧失工作能力。安全防范程度 不高的主机在它正在和一个可以信赖的主机通信时,处于Internet某个阴暗角落的一个攻击者实际上是可以使真正被信任的主机处于停顿状态,而自己 大量模信心它的数据包,将之发向目标主机。可悲的是目标主机全然没有感觉。由攻击者模信心的TCPA数据包到达了目标地址,而由目标地址限往真 正被信任主机的TCPA数据包却永远到达不了攻击者的主机(两者的真实IP地址不同(。当然,一理目标地址发送的TCPA数据包到达 了真正被信任的主机时,信息虽然进入协议堆本,到达TCP蓰理模块,但是会被取消。所以,攻击者需要知道目标主机发送了什么,期待什么样的反应。 攻击者虽然不能看到目标主机发送的内容,但是它能预料到将发送的内容。围绕着这些内容,攻击者将展开它不光彩的进攻。
信任模式
在选择好进攻目标后,黑客需要确定该主机的信任模式。为了讨论起见,我们假设目标主机确实信任某个主机。找出某个主机信任谁或不信任谁是 不容易的。showmount-e’可以显示出文件系统在哪里被export,同时 ‘rpcinfo’也能提供有价值的信息。如果得到目标主机的足够背景信息,进行攻击是不会太困难的。如果所有尝试都失败了,黑客会尝试相邻的IP地址 ,以获取有价值的信息。
使被信任主机丧失工作能力
一旦发现被信任的主机,为了伪装成它,往往使其丧失工作能力, 由于攻击者将要代替零点正的被信任主机,他必须确保真正被信任的主机不能接收到任何有效的网络数据,否则将会被揭穿,。有许多方法可以做到这些 。在此,笔者只讨论一种方法,妈了“TCP SYN淹没”。前面已经谈到, 建立 TCP连接的第一步就是客户端向服务器发送SYN请求。
通常,服务器将向客户端发送SYN/ACK信号。这里客户端是由IP地址确定的。 客户端随后向服务器发送ACK(见图1),然后数据传输就可以进行了。然而,TCP处理模块有一个处理并行SYN请求的最上限,它可以看作是 存放多条连接的队列长度。其中,连接数目包括了那些三步握手法没有最终完成的连接,也包括了那些已成功完成握手但还没有被应用程序所 调用的连接。如果达到队列的最上限,TCP将拒绝所有连接请求,直到处理了部分连接链路,因此,这里是有机可乘的,黑客往往向被进攻 目标的TCPA端口发送大量SYN请求,这些请求的源地址是使用一个合法的但是虚假的IP地址(可能使用该合法IP地址的主机没有开机)。 而爱攻击的主机往往是会向该IP地址发送响应的,但可惜是查无音信。与此同时IP包会通知受攻击主机的TCP:该主机不可到达,但不TCP会认为 是一种暂时错误,并继续尝试连接(比如继续对该IP地址进行路由,发出SYN/ACK数据包等等),直至确信无法连接。当然,这时已流逝了 大量的宝贵时间。值得注意的是,黑客们是不会使用那些正在工作的IP地址的。因为这样一来,真正IP持有者会收到 SYN/ACK响应,而随之发送RST给受攻击 主机,从而数开连接。前面所措述的过程可以表示为图2的模式。
1 Z(X) ----SYN----> B Z(X) ----SYN----> B Z(X) ----SYN----> B
…………
2 X <----SYN/ACK---- B X <----SYN/ACK---- B
…………
3 X <----RST---- B
图2
在时刻1时,攻击主机把大批SYN请求发送到受攻击目标(在此阶段,是那个被信任的主机),使其TCP队列充满.在时刻2时,受攻击目标向它所相信的IP地址(虚假的IP)作出SYN/ACK反应;在这一期间,受攻击主机的TCP模块会对所有新的请求予以忽视.不同的TCP保持连接队列的长度是有所不同的.BSD一般是5,Linux一般是6。使被信任主机失去处理新连接的能力,所赢得的 宝贵空隙时间就是黑客进行攻击目标主机的时间,这使其伪装成被信任主机成为可能。
序列号取样和猜测
前面已经提到,要对目标主机进行攻击,必须知道目标主机使用的数据包序列号。现在,我们来讨论黑客是如何进行预测的。他们先与被攻击主机 的一个端口(SMTP是一个很好的选择)建立起政党的连接。通常,这个过程被重复若干次,并将目标主机最后所发送的ISN存储起来。黑客还 需要估计他的主机与被信任主机之间的RTT时间(往返时间),这个RTT时间是通过多次统计平均求出的。RTT对于估计下下个ISN是非常重要的。前面已经提到每秒钟ISN是非常重要的。前面已经提到每秒种ISN是非常重要的。前面已经提到每秒ISN是非常重要的。前面已经提到每秒钟ISN增加128000,每次连接增加64000。现在就不难估计出ISN的大小了,它是128000乘以RTT的一半, 如果此时目标主机刚刚建立过一个连接,那么再加上一个64000,再估计出ISN 大小后,立即就开始进行攻击。当黑客的虚假TCP数据包进目标主机时,
如果估计的序列号是准确的,进入的数据将被放置在接收缓冲器以供使用。
如果估计的序列号小于期待的数字,那么将被放弃。
如果估计的序列号大于期待的数字,并且在滑动窗口(前面讲的缓冲)之内, 那么,该数据被认为是一个未来的数据,TCP模块将等待其它缺少的数据。如果估计的序列号大于期待的数字,并且不在滑动窗口(前面讲的缓冲)之内,那么,TCP将会放弃该数据并返回一个期望获得的数据序列号。下面将要提到, 黑客的主机并不能收到返回的数据序列号。
破坏行为......
图3是攻击的全过程.
1 z(B) -----SYN-----> A
2 B <----SYN/ACK---- A
3 Z(B) -----ACK-----> A
4 Z(B) -----PSH-----> A
图3
攻击者伪装成被信任主机的IP地址,此时,该主机仍在处在停顿状态 (前面讲的丧失处理能力),然后向目标主机的513端口(rlogin的端口号)发送连接请求,如时刻1所示.在时刻2,目标主机对连接请求作出反应, 发送SYN/ACK数据包给被信任主机(如果被信任主机处于正常工作状诚心,那么会认为是错误并立即向目标主机返回RST数据包,但此时它处于停顿状态). 按照计划,被信任主机会抛弃该SYN/ACK数据包,然后在时刻3,攻击者向目标 主机发送ACK数据包,该ACK使用前面估计的序列号加1(因为是正确认).如果攻击者估计正胡的话,目标主机将会接收该ACK。至此连接正式建立起来了。 在时刻4,将开始数据传输。一般地,攻击者将在系统中放置一个后门,以便侵入。经常会使用‘CAI+ + >> ~/.rhosts。之所以这样是因为, 这个办法迅速、简单地为下一次侵入铺平了道路。
工作原理分析
IP欺骗之所以可以成功是因为信任服务的基础仅仅是建立在网络地址的验证上。 IP地址是容易被伪造的。攻击过程最难的部分是进行序列号估计,估计精度 的高低是成功与否的关键所在。
预防措施
抛弃基于地址的信任策略
阻止这类攻击的一种非常容易的办法就是放弃以地址为基础的验证。不允许 R*类远程调用命令的使用;删除rhosts文件;清空/etc/hosts equiv文件。 这将迫使所有用户使用其它远程通信手段。如telnet、ssh、skey等等。
进行包过滤
如果您的网络是通过路由器接人Internet的,那么可以利用您的路由器来 进行包过滤。确信只有您的内部LAN可以使用信任关系,而内部LAN上的 主LAN以外的主机要慎重处理。您的路由器可以帮助您过滤掉所有来自于外部 而希望与内部建立连接的请求。
使用加密法
阻止IP欺骗的另一种明显的方法是在通信时要求加密传输和通信和验证。 当有多种手段并存时,可能加密方法最为适用。
使用随机化的初始序列号
黑客攻击得以成功实现的一个很重要的因素就是,序列号不是随机选择的 或者随机增加的,Bellovin描述了一种弥补TCP不足的方法,就是分割序列号空是。每一个连接将有自己独立的序列号空间。序列号将仍然按照以前的 方式增加,但是在这些序列号空间中没有明显的关系。可以通过下列公式来 说明:
ISN=M+F(localhost, localport, remotehost,remoteport)
M:4微秒定时器
F:加密HASH函数
F产生的序列号,对于外部来说是不应该能够被计算出或者被猜测出的。 Bellovin建议F是一个结合连接标识符和特殊矢量(随机数,基于启动时间 的密码)的HASH函数。
|
|