不论你的操作系统采取何种文件系统(FAT,NTFS或NFS),每种系统都有它的缺陷。例如,缺省情况下NTFS在文件夹和共享创建之初everyone组可完全控制。由于它是操作系统的组成部分(Windows NT),因此也成为许多攻击的目标。NFS文件系统可以共享被远程系统挂接,因此这也是攻击者入侵系统的途径之一。
IP欺骗和劫持:实例
IP欺骗是使验证无效的攻击手段之一,也是如何组合攻击策略攻击网络的典型实例。IP欺骗利用了Internet开放式的网络设计和传统的建立在UNIX操作系统之间信任关系。主要的问题是使用TCP/IP协议的主机假设所有从合法IP地址发来的数据包都是有效的。攻击者可以利用这一缺陷,通过程序来发送虚假的IP包,从而建立TCP连接,攻击者可以使一个系统看起来象另一个系统。
许多UNIX操作系统通过rhosts和rlogin在非信任的网络上(如Internet)建立信任的连接。这种传统的技术是流行的管理工具并减轻了管理负担。通常,这种系统由于把UNIX的验证机制和IP地址使用相结合从而提供了适当的安全。然而,这种验证机制是如此的独立于IP地址不会被伪造的假设,以至于很容易被击破。
Non-blind spoofing 和Blind spoofing
Non-blind spoofing是指攻击者在同一物理网段上操纵连接。Blind spoofing是指攻击者在不同的物理网段操纵连接。后者在实施上更困难,但也时常发生。
进行IP欺骗的攻击者需要一些程序,包括:
· 一个包嗅探器
· 一个能够同时终止TCP连接、产生另一个TCP连接、进行IP 伪装的程序
IP欺骗涉及了三台主机。像先前分析的那样,使用验证的服务器必须信任和它建立连接的主机。如果缺乏天生的安全特性,欺骗是非常容易的。
思考下列的场景,有三台主机分别是A,B和C。A使用TCP SYN连接与合法用户B初始一个连接。但是B并没有真正参与到这次连接中,因为C已经对B实施了拒绝服务攻击。所以,虽然A认为是在与B对话,但实际上是与C对话。IP欺骗实际上组合了几种攻击手法包括对系统实施了拒绝服务攻击,还包括利用验证技术。
作为审计人员,你不应该说服管理员终止这种信任关系,相反,你应当建议使用防火墙规则来检测有问题的包。
TCP/IP序列号生成方法
TCP的Initial Sequence Number(ISN)的预测
(图1)
正常的TCP连接基于一个三次握手(3-way handshake),一个客户端(Client)向服务器(Server)发送一个初始化序列号ISNc, 随后,服务器相应这个客户端ACK(ISNc),并且发送自己的初始化序列号ISNs,接着,客户端响应这个ISNs(如下图),三次握手完成。
C ---〉S: (ISNc)
S ---〉C: ACK(ISNc)+ ISNs
C ---〉S: ACK(ISNs)
C ---〉S: data
and / or
S ---〉C: data
下面,我以Windows2000 Advanced Server为例,来说一下两台主机是如何进行三次握手。
(图2)
(图3)
我们可以看到:
1) Smartboy首先发送一个seq:32468329的包给服务器202.116.128.6。
2) 然后, 202.116.128.6响应主机Smartboy, 它送给Smartboy自己的
seq:3333416325 而且响应Smartboy的ack:3240689240。
3) Smartboy再响应服务器202.116.128.6, seq:3240689240, ack:3333416326。
三次握手完毕,两台几建立起连接。
可以看出,在三次握手协议中,Clinet一定要监听服务器发送过来的ISNs, TCP使用的sequence number是一个32位的计数器,从0-4294967295。TCP为每一个连接选择一个初始序号ISN,为了防止因为延迟、重传等扰乱三次握手,ISN不能随便选取,不同系统有不同算法。理解TCP如何分配ISN以及ISN随时间变化的规律,对于成功地进行IP欺骗攻击很重要。
在Unix系统里,基于远程过程调用RPC的命令,比如rlogin、rcp、rsh等等,根据/etc/hosts.equiv以及$HOME/.rhosts文件进行安全校验,其实质是仅仅根据源IP地址进行用户身份确认,以便允许或拒绝用户RPC。这就给与了那些攻击者进行IP地址欺骗的机会。
让我们看X是如何冒充T来欺骗S,从而建立一个非法连接 :
X---->S: SYN(ISNx ) , SRC = T
S---->T: SYN(ISNs ) , ACK(ISNT) (*)
X---->S: ACK(ISNs+1 ) , SRC = T (**)
X---->S: ACK(ISNs +1) , SRC = T, 攻击命令(可能是一些特权命令)
但是,T必须要在第(**)中给出ISNs, 问题是ISNs在第(*)步中发给了T(X当然很难截取到),幸运的是,TCP协议有一个约定: ISN变量每秒增加250,000次,这个增加值在许多版本比较旧的操作系统中都是一个常量,在FreeBSD4.3中是125000次每秒,这就给X一个可乘之机。
看一下X是如何猜出ISNs :
a、首先, X发送一个SYN包来获取服务器现在的ISNs
X ---〉S: (ISNx)
S ---〉X: ACK(ISNx)+ ISNs# (1)
b、紧接着,X冒充T向服务器发送SYN包
X ---〉S: SYN(ISNx ) , SRC = T (2)
c、于是,服务器发出一个响应包给T(这个包X是收不到的)
S ---〉T: SYN(ISNs$) , ACK(ISNT ) (3)
d、X计算ISNs$:
ISNs$ = ISNs# + RTT×Increment of ISN (4)
其中,RTT(Round Trip Time),是一个包往返X和S所用的时间,可以通过Ping 来得到。
(图4)
上图显示了round trip times (RTT) 大概是0。