网络通信 频道

IP欺骗的原理

背景

  假设B上的客户运行rlogin与A上的rlogind通信:

  1. B发送带有SYN标志的数据段通知A需要建立TCP连接,并将TCP报头中的Sequence Number设置成自己本次连接的初始值ISN。

  2. A回传给B一个带有SYS+ACK标志的数据段,告之自己的ISN,并确认B发送来的第一个数据段,将Acknowledge Number设置成B的ISN+1。

  3. B确认收到的A的数据段,将Acknowledge Number设置成A的ISN+1。

  B ---- SYN ----> A

  B <---- SYN+ACK A

  B ---- ACK ----> A

  TCP使用的Sequence Number是一个32位的计数器,从0~4294967295。

  TCP为每一个连接选择一个初始序号ISN,为了防止因为延迟、重传等扰乱三次握手,ISN不能随便选取,不同系统有不同算法。理解TCP如何分配ISN以及ISN随时间变化的规律,对于理解IP欺骗攻击很重要。

  基于远程过程调用RPC的命令,比如rlogin、rcp、rsh等,是根据/etc/hosts.equiv以及$HOME/.rhosts文件进行安全校验的,其实质是仅仅根据信源IP地址进行用户身份确认,以便允许或拒绝用户RPC。

  IP欺骗攻击过程

  1. 假设Z企图攻击A,而A信任B,所谓信任指/etc/hosts.equiv和$HOME/.rhosts中有相关设置。

  2. 假设Z已经知道了被信任的B,往往先使B的网络功能暂时瘫痪,以免对攻击造成干扰。著名的SYN flood常常是一次IP欺骗攻击的前奏,请看一个并发服务器的框架:

  int initsockid, newsockid;

  if ((initsockid = socket(...)) <0) {

  error("can’t create socket");

  }

  if (bind(initsockid, ...) <0) {

  error("bind error");

  }

  if (listen(initsockid, 5) <0) {

  error("listen error");

  }

  for (;;) {

  newsockid = accept(initsockid, ...); /* 阻塞 */

  if (newsockid <0) {

  error("accept error");

  }

  if (fork() == 0) { /* 子进程 */

  close(initsockid);

  do(newsockid); /* 处理客户方请求 */

  exit(0);

  }

  close(newsockid);

  }

  listen函数中第二个参数是5,意思是在initsockid上允许的最大连接请求数目。如果某个时刻initsockid上的连接请求数目已经达到5个,后续到达initsockid的连接请求将被TCP丢弃。

  注意一旦连接通过三次握手建立完成,accept调用已经处理这个连接,则TCP连接请求队列空出一个位置,所以这个5不是指initsockid上只能接受5个连接请求。SYN flood正是一种Denial of Service,可以导致B的网络功能暂时瘫痪: Z向B发送多个带有SYN标志的数据段请求连接,信源IP地址被换成了一个不存在的主机X;B向子虚乌有的X发送SYN+ACK数据段,但没有任何来自X的ACK出现; B的IP层会报告B的TCP层,X不可达,但B的TCP层对此不予理睬,认为只是暂时的,于是B在这个initsockid上再也不能接收正常的连接请求。

  Z(X) ---- SYN ----> B

  Z(X) ---- SYN ----> B

  Z(X) ---- SYN ----> B

  Z(X) ---- SYN ----> B Z(X) ---- SYN ----> B

  ......

  X <---- SYN+ACK B

  X <---- SYN+ACK B

  X <---- SYN+ACK B

  X <---- SYN+ACK B

  X <---- SYN+ACK B ......

  3. Z必须确定A当前的ISN。首先连向25端口(SMTP是没有安全校验机制的),与1中类似,不过这次需要记录A的ISN,以及Z到A的大致的RTT(Round Trip Time)。这个步骤要重复多次以便求出RTT的平均值。现在Z知道了A的ISN基值和增加规律(比如每秒增加128000,每次连接增加64000),也知道了从Z到A需要RTT/2的时间。攻击往往在此时发生,否则在这之间有其他主机与A连接,ISN将比预料的多出64000。

  4. Z向A发送带有SYN标志的数据段请求连接,只是信源IP改成了B,注意是针对TCP513端口(rlogin)的。A向B回送SYN+ACK数据段,B已经无法响应,B的TCP层只是简单地丢弃A的回送数据段。

  5.Z暂停一小会儿,让A有足够时间发送SYN+ACK,因为Z看不到这个包。然后Z再次伪装成B向A发送ACK,此时发送的数据段带有Z预测的A的ISN+1。如果预测准确,连接建立,数据传送开始。问题在于即使连接建立,A仍然会向B发送数据,而不是Z,Z仍然无法看到A发往B的数据段,Z必须蒙着头按照rlogin协议标准假冒B向A发送类似 "cat + + >> ~/.rhosts" 这样的命令,于是攻击完成。如果预测不准确,A将发送一个带有RST标志的数据段终止异常连接,Z只有从头再来。

  Z(B) ---- SYN ----> A

  B <---- SYN+ACK A

  Z(B) ---- ACK ----> A

  Z(B) ---- PSH ----> A

  ......

  6. IP欺骗攻击利用了RPC服务器仅仅依赖信源IP地址进行安全校验的特性。攻击最困难的地方在于预测A的ISN。考虑这种情况,如果入侵者控制了一台由A到B之间的路由器,假设Z就是这台路由器,那么A回送到B的数据段,现在Z是可以看到的,显然攻击难度骤然下降了许多。

  7. 注意IP欺骗攻击理论上是从广域网上发起的,不局限于局域网,这也正是这种攻击广受青睐的原因所在。利用IP欺骗攻击得到一个A上的shell,对于许多高级入侵者来说,得到目标主机的shell,离root权限就不远了,最容易想到的当然是接下来进行buffer overflow攻击。

  8. 也许有人要问,为什么Z不能直接把自己的IP设置成B的?这个问题很不好回答,要具体分析网络拓扑,当然也存在ARP冲突、出不了网关等问题。如果Z向A发送数据段时,企图解析A的MAC地址或者路由器的MAC地址,必然会发送ARP请求包,但这个ARP请求包中源IP以及源MAC都是Z的,自然不会引起ARP冲突。而ARP Cache只会被ARP包改变,不受IP包的影响,所以可以肯定地说,IP欺骗攻击过程中不存在ARP冲突。相反,如果Z修改了自己的IP,这种ARP冲突就有可能出现,视具体情况而言。黑客在攻击中连带B一起攻击,其目的无非是防止B干扰攻击过程。

  未雨绸缪

  虽然IP欺骗攻击有着相当难度,但我们应该清醒地意识到,这种攻击非常广泛,入侵往往由这里开始。预防这种攻击还是比较容易的,比如删除所有的/etc/hosts.equiv、$HOME/.rhosts文件或修改/etc/ inetd.conf文件,使得RPC机制无法运作,还可以杀掉portmapper,或是设置路由器,过滤来自外部而信源地址却是内部IP的报文,Cisco公司的产品就有这种功能。不过路由器只防得了外部入侵,内部入侵呢?

  TCP的ISN选择不是随机的,增加也不是随机的,这使攻击者有规律可循,可以修改与ISN相关的代码,因此选择好的算法,使得攻击者难以找到规律,也是有效的防范手段。 ,

 

转载地址:http://www.voipchina.cn/technology/2004-03-24/36939.shtml

0
相关文章