如何伪造IP地址简介IP欺骗是个非常困难的事情传说中也只有凯文米特尼克曾经成功的实现过不过这个一般人是可望不可即的但是在特殊条件下我们则可以比较简单的实现IP欺骗并利用这个来做一点点事情比如入侵有IP地址限制的系统本文主要介绍实现IP欺骗的方法一基本原理举个例子来说某人已经渗透进入了一个网络并且在1231上面通过ARP欺骗嗅探到了http1234admin的密码但是这个系统对登录的源IP地址有限制至允许来自123250的登录有密码却登录不进去该如何继续目前来说至少有两种办法最容易想到的是渗透123250得到控制权限再登陆或者直接尝试渗透1234另外一种自然就是IP地址欺骗了因为是在一个C类网络中IP地址欺骗实现起来就非常的容易了IP欺骗最困难的是对TCP序列号的预测其次是禁止目标主机的响应这两个问题在互联网上实施IP欺骗时的解决办法是蒙和DDoS攻击但是在同一个C类时则不需要这么暴力只需要温柔的ARP欺骗即可简单的说以下几个步骤1在1234和123250之间实施ARP欺骗嗅探并拦截他们之间的所有流量2在1231上面伪装成123250向1234发送SYN包3根据嗅探得到的TCP序列号继续伪装返回ACK包依此完成三次握手4握手完成后继续下面的POST包等操作完成登陆二详细说明从某种意义上说如果能够制造TCP伪连接那么DoS也就比较容易实现了以前LionD8就曾经用这个思路做出了一个新型DoS而今天我用的也是这个思路但是如果直接伪造TCP三次握手而不作其他任何处理那却是不行的因为当攻击的目标主机接收到我们发过去的伪造的SYN包后会发回一个SYNACK包也就是第二次握手而当我们的系统收到这个SYNACK包后由于系统内并没有发起真正的TCP连接因此系统会发回一个RST包这个包将使目标主机重置连接这样这个伪连接就建立失败了要解决这个问题办法有不少而我这里要用的方法就是ARP欺骗首先我们要对目标主机进行ARP欺骗让它认为我们是同一网段中的另一台机器然后我们就可以伪装这台机器向目标主机发起TCP伪连接了这样一来即使目标主机返回一个SYNACK包这个包也不会进入到我们的系统因为这个包的目的IP不会是我们而应该是我们伪装的那台主机的IP这样我们的系统也不会向目标主机发送RST包了打个比方假设我们是主机A现在我想要攻击主机B首先我先伪装主机C对B进行ARP欺骗以C的IP地址和A的MAC地址构造ARP应答包发送到B这样B的ARP缓存中就会记录下C的IP对应A的MAC地址然后我们再以C的IP为源IP构造SYN数据包向B发起TCP伪连接当B收到这个SYN包之后它会构造一个SYNACK包发往C但是由于此时在B的ARP缓存中记录着C的IP对应A的MAC地址因此这个SYNACK包实际上被发送到了A虽然这个包将被A的系统所丢弃因为这个包的目的IP是C的IP而不是A的IP所以A的系统将会丢弃这个包但是我们仍然可以从链路层直接将这个数据帧获取下来得到了这个SYNACK包之后我们需要再次伪装C向B发回一个ACK包完成第三次握手这样TCP初始化连接的三次握手都完成了我们的伪连接也成功建立了伪连接建立之后我们还可以继续向目标主机发送数据来保证TCP连接的存活这里有几个需要注意的问题首先为了保证攻击过程中目标主机的ARP缓存不被更改我们需要持续不断的对其进行ARP欺骗第二为了防止在攻击过程中我们伪装的主机向目标主机发起通信刷新目标主机的ARP缓存对我们的攻击造成影响我们还可以对伪装主机也同时进行ARP欺骗以增加攻击成功的几率三TCP序列号预测IP只是发送数据包并且保证它的完整性如果不能收到完整的IP数据包IP会向源地址发送一个ICMP错误信息希望重新处理然而这个包也可能丢失由于IP是非面向连接的所以不保持任何连接状态的信息每个IP数据包被松散地发送出去而不关心前一个和后一个数据包的情况由此看出可以对IP堆栈进行修改在源地址和目的地址中放入任意满足要求的IP地址也就是说提供虚假的IP地址TCP提供可靠传输可靠性是由数据包中的多位控制字来提供的其中最重要的是数据序列和数据确认分别用SYN和ACK来表示TCP向每一个数据字节分配一个序列号并且可以向已成功接收的源地址所发送的数据包表示确认目的地址ACK所确认的数据包序列是源地址的数据包序列而不是自己发送的数据包序列ACK在确认的同时还携带了下一个期望获得的数据序列号显然TCP提供的这种可靠性相对于IP来说更难于愚弄四序列编号确认和其它标志信息由于TCP是基于可靠性的它能够提供处理数据包丢失重复或是顺序紊乱等不良情况的机制实际上通过向所传送出的所有字节分配序列编号并且期待接收端对发送端所发出的数据提供收讫确认TCP就能保证可靠的传送接收端利用序列号确保数据的先后顺序除去重复的数据包TCP序列编号可以看作是32位的计数器它们从0至2321排列每一个TCP连接由一定的标示位来表示交换的数据都是顺序编号的在TCP数据包中定义序列号SYN的标示位位于数据段的前端确认位ACK对所接收的数据进行确认并且指出下一个期待接收的数据序列号TCP通过滑动窗口的概念来进行流量控制设想在发送端发送数据的速度很快而接收端接收速度却很慢的情况下为了保证数据不丢失显然需要进行流量控制协调好通信双方的工作节奏所谓滑动窗口可以理解成接收端所能提供的缓冲区大小TCP利用一个滑动的窗口来告诉发送端对它所发送的数据能提供多大的缓冲区由于窗口由16位bit所定义所以接收端TCP能最大提供65535个字节的缓冲由此可以利用窗口大小和第一个数据的序列号计算出最大可接收的数据序列号其它TCP标示位有RST连接复位ResettheconnectionPSH压入功能Pushfunction和FIN发送者无数据Nomoredatafromsender如果RST被接收TCP连接将立即断开RST通常在接收端接收到一个与当前连接不相关的数据包时被发送有些时候TCP模块需要立即传送数据而不能等整段都充满时再传一个高层的进程将会触发在TCP头部的PSH标示并且告诉TCP模块立即将所有排列好的数据发给数据接收端FIN表示一个应用连接结束当接收端接收到FIN时确认它认为将接收不到任何数据了TCP序列号预测最早是由Morris对这一安全漏洞进行阐述的他使用TCP序列号预测即使是没有从服务器得到任何响应来产生一个TCP包序列这使得他能欺骗在本地网络上的主机通常TCP连接建立一个包括3次握手的序列客户选择和传输一个初始的序列号SEQ标志ISNC并设置标志位SYN告诉服务器它需要建立连接服务器确认这个传输并发送它本身的序列号ISNS并设置标志位ACK同时告知下一个期待获得的数据序列号是ISN1客户再确认它在这三次确认后开始传输数据整个过程如下所示CClientSServerCSSYNISNCSCSYNISNSACKISNCCSACKISNSCS数据或SC数据也就是说对一个会话C必须得到ISNS确认ISNS可能是一个随机数了解序数编号如何选择初始序列号和如何根据时间变化是很重要的似乎应该有这种情况当主机启动后序列编号初始化为1但实际上并非如此初始序列号是由tcpinit函数确定的ISN每秒增加128000如果有连接出现每次连接将把计数器的数值增加64000很显然这使得用于表示ISN的32位计数器在没有连接的情况下每932小时复位一次之所以这样是因为这样有利于最大限度地减少旧有连接的信息干扰当前连接的机会这里运用了2MSL等待时间的概念不在本文讨论的范围之内如果初始序列号是随意选择的那么不能保证现有序列号是不同于先前的假设有这样一种情况在一个路由回路中的数据包最终跳出了循环回到了旧有的连接此时其实是不同于前者的现有连接显然会发生对现有连接的干扰假设一个入侵者X有一种方法能预测ISNS在这种情况下他可能将下列序号送给主机T来模拟客户的真正的ISNSXSSYNISNXSRCTSTSYNISNSACKISNXXSACKISNSSRCT尽管消息ST并不到X但是X能知道它的内容因此能发送数据如果X要对一个连接实施攻击这个连接允许执行命令那么另外的命令也能执行产生随机的ISN在Berkeley系统最初的序列号变量由一个常数每秒加一产生等到这个常数一半时就开始一次连接这样如果开始了一个合法连接并观察到一个ISNS在用便可以计算有很高可信度ISNS用在下一个连接企图Morris指出回复消息STSYNISNSACKISNX事实上并不消失真正主机将收到它并试图重新连接这并不是一个严重的障碍Morris发现通过模仿一个在T上的端口并向那个端口请求一个连接他就能产生序列溢出从而让它看上去ST消息丢失了另外一个方法可以等待知道T关机或重新启动五IP欺骗IP欺骗由若干步骤组成这里先简要地描述一下随后再做详尽地解释先做以下假定首先目标主机已经选定其次信任模式已被发现并找到了一个被目标主机信任的主机黑客为了进行IP欺骗进行以下工作使得被信任的主机丧失工作能力同时采样目标主机发出的TCP序列号猜测出它的数据序列号然后伪装成被信任的主机同时建立起与目标主机基于地址验证的应用连接如果成功黑客可以使用一种简单的命令放置一个系统后门以进行非授权操作使被信任主机丧失工作能力一旦发现被信任的主机为了伪装成它往往使其丧失工作能力由于攻击者将要代替真正的被信任主机他必须确保真正被信任的主机不能接收到任何有效的网络数据否则将会被揭穿有许多方法可以做到这些这里介绍TCPSYN淹没前面已经谈到建立TCP连接的第一步就是客户端向服务器发送SYN请求通常服务器将向客户端发送SYNACK信号这里客户端是由IP地址确定的客户端随后向服务器发送ACK然后数据传输就可以进行了然而TCP处理模块有一个处理并行SYN请求的最上限它可以看作是存放多条连接的队列长度其中连接数目包括了那些三步握手法没有最终完成的连接也包括了那些已成功完成握手但还没有被应用程序所调用的连接如果达到队列的最上限TCP将拒绝所有连接请求直至处理了部分连接链路因此这里是有机可乘的黑客往往向被进攻目标的TCP端口发送大量SYN请求这些请求的源地址是使用一个合法的但是虚假的IP地址可能使用该合法IP地址的主机没有开机而受攻击的主机往往是会向该IP地址发送响应的但可惜是杳无音信与此同时IP包会通知受攻击主机的TCP该主机不可到达但不幸的是TCP会认为是一种暂时错误并继续尝试连接比如继续对该IP地址进行路由发出SYNACK数据包等等直至确信无法连接