这是我到《公开化安全》的第一篇文章，很多不足的地方，希望大家来信指点^_*<br><br>什么是IP欺骗？IP欺骗是不是用某种软件把自己的IP隐藏起来？回答当然是NO！！！。这里我要说的IP欺<br>骗是一种攻击方法，即使主机系统本身没有任何漏洞，但仍然可以使用各种手段来达到攻击目的，这种欺<br>骗纯属技术性的，一般都是利用TCP/IP协议本身存在的一些缺陷。当然，这也是有一定难度的。下面我们<br>看一下IP欺骗攻击是如何实现的？ <br><br><br>建立信任关系。 <br><br>IP欺骗是利用了主机之间的正常信任关系来发动的，所以在介绍IP欺骗攻击之前，先说明一下什么是信任<br>关系，信任关系是如何建立的。 <br><br>在UNIX主机中，存在着一种特殊的信任关系。假设有两台主机hosta和hostb，上面各有一个帐户Tomy，在<br>使用中会发现，在hosta上使时要输入在hosta上的相应帐户Tomy，在hostb上使用时必须输入用hostb的帐<br>户Tomy，主机hosta和hostb把Tomy当做两个互不相关的用户，这显然有些不便。为了减少这种不便，可以<br>在主机hosta和hostb中建立起两个帐户的相互信任关系。在hosta和hostb上Tomy的home目录中创建.rhosts<br>文件。从主机hosta上，在你的home目录中用命令echo “hostb Tomy”&gt;~/.hosts实现hosta&amp;hostb的信任关<br>系，这时，你从主机hostb上，你就能毫无阻碍的使用任何以r开头的远程调用命令，如：rlogin、rsh、<br>rcp等，而无需输入口令验证就可以直接登录到hosta上。这些命令将充许以地址为基础的验证，允许或者<br>拒绝以IP地址为基础的存取服务。这里的信任关系是基于IP的地址的。 <br><br>当/etc/hosts.equiv中出现一个 “+”或者$HOME/.rhosts中出现 “++”时，表明任意地址的主机可以无须口<br>令验证而直接使用r命令登陆此主机，这是十分危险的，而这偏偏又是某些管理员不重视的地方。下面我们<br>看一下rlogin的用法。 <br><br>rlogin是一个简单的/服务器程序，它的作用和telnet差不多，不同的是telnet完全依赖口令验证，而<br>rlogin是基于信任关系的验证，其次到才进行口令验证的，它使用了TCP协议进行传输。当用户从一台主机<br>登陆到另一台主机上，并且，如果目录主机信任它，rlogin将允许在不应答口令的性况下使用目标主机上<br>的资源，安全验证完便基于源主机的IP地址。因此，根据以上所举的例子，我们能利用rlogin来从hostb远<br>程登陆到hosta，而且不会被提示出入口令！ <br><br><br>IP欺骗的理论根据 <br><br>看到上面的说明，每一个黑客都会想到：既然hosta和hostb之间的信任关系是基于IP址而建立起来的，那<br>么假如能够冒充hostb的IP，就可以使用rlogin登录到hosta，而不需任何口令验证。这，就是IP欺骗的最<br>根本的理论依据。 <br><br>但是，事情远没有想像中那么简单！虽然，可以通过编程的方法随意改变发出的包的IP地址，但TCP协议对<br>IP进行了进一步的封装，它是一种相对可靠的协议，不会让黑客轻易得逞。不信？好，先来看一下一次正<br>常的TCP/IP会话的过程。 <br><br>由于TCP是面向连接的协议，所以在双方正式传输数据之前，需要用“三次握手”来建立一个稳重的连接。假<br>设还是hosta和hostb两台主机进行通信，hostb首先发送带有SYN标志的数据段通知hosta建立TCP连接，TCP<br>的可靠性就是由数据包中的多位控制字来提供的，其中最重要的是数据序列SYN和数据确认标志ACK。B将<br>TCP报头中的SYN设为自己本次连接中的初始值（ISN）。 <br><br>当hosta收到hostb的SYN包之后，会发送给hostb一个带有SYN+ACK标志的数据段，告之自己的ISN，并确认<br>hostb发送来的第一个数据段，将ACK设置成hostb的SYN+1。 <br><br>当hostb确认收到hosta的SYN+ACK数据包后，将ACK设置成hosta的SYN+1。Hosta收到hostb的ACK后，连接成<br>功建立，双方可以正式伟输数据了，整个过程如图所示： <br><br><br><br>（黑色为hostb红色为hosta） <br><br>（大家也就将就将就着看吧……本人的绘画水平也说是这样了……能看明白就行了哦J ） <br><br>看了这个过程，我们就很容易想到，假如想冒充hostb对hosta进行攻击，就要先使用hostb的IP地址发送<br>SYN标志给hosta，但是当hosta收到后，并不会把SYN+ACK发送到我们的主机上，而是发送到真正的hostb上<br>去，这时……嘿嘿……露陷了吧？因为hostb根本没发送发SYN请请。所以如果要冒充hostb，首先要让hostb失<br>去工作能力。也就是所谓的拒绝服务攻击，让hostb瘫痪。 <br><br>可是……这样还是远远不够的……，最难的就是要对hosta进行攻击，必须知道hosta使用的ISN。TCP使用的ISN<br>是一个32位的计数器，从0到4 294 967 295。TCP为每一个连接选择一个初始序列号ISN，为了防止因为延<br>迟、重传等扰乱三次握手，ISN不能随便选取，不同的系统有着不同的算法。理解TCP如何分配ISN以及ISN<br>随时间的变化规律，对于成功的进行IP欺骗攻击是很重要的！ISN约每秒增加128 000，如果有连接出现，<br>每次连接将把计数器的数值增加64 000。很显然，这使得用于表示ISN的32位计数器在没有连接的情况下每<br>9.32小时复位一次。这所以这样，是因为它有利于最大于度地减少“旧有”连接的信息干扰当前连接的机会<br>。如果初始序例号是随意选择的，那么不能保证现有序例号是不同于先前的。假设有这样一种情况，在一<br>个路由回路中的数据包最终跳出循环，回到了“旧有”的连接，显然这会对现有连接产生干扰。预测出攻击<br>目标的序例号非常困难，而且各个系统也不想同，在Berkeley系统，最初的序列号变量由一个常数每秒加1<br>产生，等加到这个常数的一半时，就开始一次连接。这样，如果开始啊一个合法连接，并观察到一个ISN正<br>在使用，便可以进行预测，而且这样做有很高的可信度。现在我们假设黑客已经使用某种方法，能预测出<br>ISN。在这种情况下，他就可以将ACK序便号送给hosta，这时连接就建立了。 <br><br>“嗯，先喝口水（哇噻，3：30了耶）……说了这么多，明白了点吗？” <br><br>“不明白……兄弟，你在干啥呢？上数学课啊？” <br><br>!@#$^^%&amp;*&amp;$^%^%@$^% 又眼一翻……口吐白沫……两腿一蹬……站了起来……叫了声：“接着看……” <br><br><br>IP欺骗攻击过程解析 <br><br>IP欺骗由若干步骤组成，下面是它的详细步骤，（嘿嘿……小心点看哦……不明白的请举手……，不再重复……我<br>够阴的吧……嗯嗯……没烟了……不说了……大家自学吧……）晃铛……一只“意大利真皮”飞过来……正中脑瓜……唉……俺“<br>众”不敌“寡”，先忍着算了……真可怜……怎么没人用“中华”丢过来…… <br><br>接着…首先假定信任关系已经被发现（至于如何发现，不是本章内容）。黑客为了进行IP欺骗，要进行以下<br>工作：使被信任关系的主机失去工作能力，同时采样目标主机发出的TCP序例号，猜测出它的数据序例号。<br>然后，伪装成被信任的主机，同时建立起与目标主机基于地址验证的应用连接。连接成功后，黑客就可以<br>入置backdoor以便后日使用J 。 <br><br><br>使被信任主机失去工作能力 <br><br>为了伪装成被信任主机而不露陷，需要使其完全失去工作能力。由于攻击者将要代替真正的被信任主机，<br>他必须确保真正的被信任主机不能收到任何有效的网络数据，否则将会被揭穿。有许多方法可以达到这个<br>目的（如SYN洪水攻击、TTN、Land等攻击）。现假设你已经使用某种方法使得被信任的主机完全失去了工<br>作能力。 <br><br><br>序例号取样和猜测 <br><br>前面讲到了，对目标主机进行攻击，必须知道目标主机的数据包序例号。通常如何进行预测呢？往往先与<br>被攻击主机的一个端口（如：25）建立起正常连接。通常，这个过程被重复N次，并将目标主机最后所发送<br>的ISN存储起来。然后还需要进行估计他的主机与被信任主机之间的往返时间，这个时间是通过多次统计平<br>均计算出来的。往返连接增加64 000.现在就可以估计出ISN的大小是128 000乘以往返时间的一半，如果此<br>时目标主机刚刚建立过一个连接，那么再加上64 000。（我靠……怎么像在上数学课啊？） <br><br>一旦估计出ISN的大小，就开始着手进行攻击，当然你的虚假TCP数据包进入目标主机时，如果刚才估计的<br>序例号是准确的，进入的数据将被放置在目标机的缓冲区中。但是在实际攻击过程中往往没这么幸运，如<br>果估计序例号的小于正确值，那么将被放弃。而如果估计的序例号大于正确值，并且在缓冲区的大小之内<br>，那么该数据被认为是一个未来的数据，TCP模块将等待其他缺少的数据。如果估计序例号大于期待的数字<br>且不在缓冲区之内，TCP将会放弃它并返回一个期望获得的数据序例号。 <br><br>你伪装成被信任的主机IP，此时，该主机仍然处在瘫痪状态，然后向目标主机的513端口（rlogin）发送连<br>接请求。目标主机立刻对连接请求作出反应，发更新SYN+ACK确认包给被信任主机，因为此时被信任主机仍<br>然处于瘫痪状态，它当然无法收到这个包，紧接关攻击者向目标主机发送ACK数据包，该包使用前面估计的<br>序例号加1。如果攻击者估计正确的话，目标主机将会接收该ACK。连接就正式建立起了，可以开始数据传<br>输了。这是，你就可以将cat ‘++’&gt;&gt;~/.rhosts命令发送过去，这样完成本次攻击后就可以不用口令直接登<br>录到目标主机上了。如果达到这一步，一次完整的IP欺骗就算完成了。你已经在目标机上得到了一个Shell<br>贴，接下就就是利用系统的溢出或错误配置扩大权限，当然如何搞到root已经不是本章的内容了。 <br><br>总结一下IP攻击的整个步骤： <br><br><br>首先使被信任主机的网络暂时瘫痪，以免对攻击造成干扰。 <br><br><br>然后连接到目标机的某个端口来猜测ISN基值和增加规律！！！（重点！难点！） <br><br><br>接下来把源址址伪装成被信任主机，发送带有SYN标志的数据段请求连接。 <br><br><br>然后等待目标机发送SYN+ACK包给已经瘫痪的主机，因为你现在看不到这个包。 <br><br><br>最后再次伪装成被信任主机向目标机发送的ACK，此时发送的数据段带有预测的目标机的ISN+1。 <br><br><br>连接建立，发送命令请求。 <br><br><br>擦屁股、开后门、下网、关机、睡觉。~~~zzzZZZzzz~~~ <br><br>“Game Over” <br><br>“~~~zzzZZZzzz~~~” <br><br>“哎呀呀……你爷爷的（韦小宝），我在上面口水都说干了，你们在下面梦周公（英语老师），走！到政教处<br>去……” <br><br>“下课！” <br><br>“唰……老师再见！” <br><br>“嘿……睡醒了啊？每人照抄一百遍……下许检查！” <br><br>俺今天要当足老师的瘾……被他们训了这么久，多少也学会点了，嘿嘿……够奸了吧？ <br><br>