level 1
Suse
楼主
这是一篇简介IP-Spoofing(IP欺骗)原理的文章.想当年著名Hacker,Kevin与安全专家下村勤之间的较量就是以IP-Spoofing开始的.这篇文章需要你具有一定的unix基础和tcpip概念,IP-Spoofing 是一种比较复杂的攻击手段.但准确的说它是一次攻击的一个步骤.文章中使用的一些标记:A:目标主机B:被信任主机C:不可达主机Z:发起攻击的主机(1)2:主机1伪装成主机2文章中常用的一种图解:tick host a control host b1 A --SYN---> Btick:一段时间的泛指.host a:一台加入到tcp会话中的机器.control:tcp头中设置的相关的位.host b:一台加入到tcp会话中的机器.这里是说明主机A向主机B发了一条SYN置位的包.在Unix主机中,信任的方式时非常简单的.假如你在主机A和主机B中各有一个账号.你希望在主机A和主机B中能够比较方便的来回登录.你可以在自己的目录下建立一个.rhost文件.在A种的文件中可以简单的写上" B username",在B中的类似(在/etc/hosts.equiv中可以为整个系统建立信任关系,相关的具体语法可以参考其他资料).现在你就可以用那些以r开头的系统命令了,而不需要每次都输入密码.看看发生了什么,所有的认证都是基于主机的,也就是基于ip的,只要你是来自这个ip的就认为是可以信任的.ip-sproofing就是对基于ip认证的系统进行攻击的一种手段.比如说rlogin命令,就是一个通过这种机制,可以不输入密码就登录到远程主机的命令.我们都知道ip是无连接的,不可靠的协议.它的32bit的头中,包含了自己要去的目的主机的ip地址,几乎所有的tcp/ip协议的传输都是被包含在ip包中发送的.它的所有的可靠性都是由它的上层协议来保证的.如果不可达,icmp的不可达报文就会发送会主机.它的无状态的特性,说明它不保存上一个包的任何状态.因此,我们就可以通过修改ip协议栈的方法,把所需要的ip地址填写到我们所发送出去的ip包中,来达到冒充其他主机的目的.tcp协议是保证传递可靠的上层协议,它通过多种方法实现可靠传递.但我们所关心的只有两种,即数据的sequence号和Acknowledgement号.tcpip协议栈会对所有发出的数据分配seq号,对所有接收到的数据,会发出ack以表示确认.因为它要处理丢包,重发等等情况.seq号可以是一个32位的数字,所以它的范围在 0-- 4,294,967,295之间.所有的tcp头中的seq号是所发送的数据的第一个字节的序号.ack号是下一个所希望得到的数据的seq号.tcp还利用滑动窗口和窗口通告的方式来进行流控.窗口的大小是16比特的.所以这也限制了在特定情况下的seq号的上限.这为我们以后猜测seq号,缩小了范围.其他的tcp中的置位信息,如RST,PSH,FIN的意义可以参考一下相关的书籍.在传送数据之前要建立连接,就是常说的3次握手,示意图如下1 A ---SYN---> B2 A <---SYN/ACK--- B3 A ---ACK---> B在(1)中,客户端会同时发送它的seq起始号(ISN).在(2)中,服务器会返回自己的ISN和对(1)中ISN的一个回应ACK号(ISN(A)+1),在(3)中,客户端会返回对(2)中服务器的ISN的回应ACK号(ISN(B)+1).因为现在并没有传递什么数据,所以现在的seq,ack都是为了以后传递数据所进行的初始化.最重要的一点是,你要知道起始的seq号是如何被选择的和它们与时间变化所相关的联系.一般来说当机器启动的时候,seq被初始化成1.这种管理,已经被公认为是不好的.在一般的tcp_init()源程序的注释中你可以找到类似的注释.初始化的序列号(ISN)会每秒钟增加128,000,大概一个32位的ISN在没有任何连接的情况下,9.32个小时后会发生循环,而且,每发生一次connect()的调用,会增加64,000.为什么要使用这种可预测的ISN选取方式呢?为什么不用随机的方法呢?因为我们知道每次连接会有4个量来标记(一对tcp端口和ip地址).如果一个老的连接中的一个在网上游荡了很久的
2006年03月18日 13点03分
1








