电脑报精华 · 2000 年 · 2000wl115

揭穿黑客的欺骗原理

揭穿黑客的欺骗原理

一、IP欺骗原理
Unix中信任关系的建立
在Unix领域中,信任关系能够很容易得到。假如在主机A和B上各有一个帐户,在使用当中会发现,在主机A上使用时需要输入在A上的相应帐户,在主机B上使用时必须输入在B上的帐户,主机A和B把你当作两个互不相关的用户,显然有些不便。为了减少这种不便,可以在主机A和主机B中建立起两个帐户的相互信任关系。在主机A和主机B上你的home目录中创建.rhosts 文件。从主机A上,在你的home目录中输入'echo"B username">~/.rhosts';从主机B上,在你的home目录中输入'echo"A username" >~/.rhosts'。至此,你能毫无阻碍地使用任何以r开头的远程调用命令,如:rlogin,rcall,rsh等,而无口令验证的烦恼。这些命令将允许以地址为基础的验证,或者允许或者拒绝以IP地址为基础的存取服务。
Rlogin
Rlogin是一个简单的客户/服务器程序,它利用TCP传输。Rlogin允许用户从一台主机登录到另一台主机上,并且,如果目标主机信任它,Rlogin 将允许在不应答口令的情况下使用目标主机上的资源。安全验证完全是基于源主机的IP地址。因此,根据以上所举的例子,我们能利用Rlogin来从B远程登录到A,而且不会被提示输入口令。
IP欺骗
IP欺骗由若干步骤组成,这里先简要地描述一下,随后再做详尽地解释。先做以下假定:首先,目标主机已经选定。其次,信任模式已被发现,并找到了一个被目标主机信任的主机。黑客为了进行IP欺骗,进行以下工作:使得被信任的主机丧失工作能力,同时采样目标主机发出的TCP 序列号,猜测出它的数据序列号。然后,伪装成被信任的主机,同时建立起与目标主机基于地址验证的应用连接。如果成功,黑客可以使用一种简单的命令放置一个系统后门,以进行非授权操作。
使被信任主机丧失工作能力
一旦发现被信任的主机,为了伪装成它,往往使其丧失工作能力。由于攻击者将要代替真正的被信任主机,他必须确保真正被信任的主机不能接收到任何有效的网络数据,否则将会被揭穿。有许多方法可以做到这些。这里介绍“TCP SYN淹没”。
建立TCP连接的第一步就是客户端向服务器发送SYN请求。
通常,服务器将向客户端发送SYN/ACK信号。这里客户端是由IP地址确定的。客户端随后向服务器发送ACK,然后数据传输就可以进行了。然而,TCP处理模块有一个处理并行SYN请求的最上限,它可以看作是存放多条连接的队列长度。其中,连接数目包括了那些三步握手法没有最终完成的连接,也包括了那些已成功完成握手,但还没有被应用程序所调用的连接。如果达到队列的最上限,TCP将拒绝所有连接请求,直至处理了部分连接链路。因此,黑客正是利用了这一可用之机是有机可乘。
黑客往往向被进攻目标的TCP端口发送大量SYN请求,这些请求的源地址是使用一个合法的但是虚假的IP地址(可能使用该合法IP地址的主机没有开机)。而受攻击的主机往往是会向该IP地址发送响应的,但可惜是杳无音信。与此同时IP包会通知受攻击主机的TCP:该主机不可到达,但不幸的是TCP会认为是一种暂时错误,并继续尝试连接(比如继续对该IP地址进行路由,发出SYN/ACK数据包等等),直至确信无法连接。当然,这时已流逝了大量的宝贵时间。值得注意的是,黑客们是不会使用那些正在工作的IP地址的,因为这样一来,真正IP持有者会收到SYN/ACK响应,而随之发送RST给受攻击主机,从而断开连接。
前面所描述的过程可以表示为如下模式:

1 Z(X)---SYN---> B
 Z(X)---SYN--->B
 Z(X)---SYN--->B
2 X<---SYN/ACK--B
 X<---SYN/ACK--B
3 X<---RST---B

在时刻1时,攻击主机把大批SYN 请求发送到受攻击目标(在此阶段,是那个被信任的主机),使其TCP队列充满。在时刻2时,受攻击目标向它所相信的IP地址(虚假的IP)作出SYN/ACK反应。在这一期间,受攻击主机的TCP模块会对所有新的请求予以忽视。不同的TCP保持连接队列的长度是有所不同的。BSD一般是5,Linux一般是6。使被信任主机失去处理新连接的能力,所赢得的宝贵空隙时间就是黑客进行攻击目标主机的时间,这使其伪装成被信任主机成为可能。
二、DNS欺骗原理
在网络中,当客户向一台服务器请求服务时,服务器方一般会根据客户的ip反向解析出该ip对应的域名。这种反向域名解析就是一个查DNS (Domain Name Service)的过程。
如果客户的ip对应有域名,那么DNS查询会返回其域名。服务器端得到这一机器名后会将其记录下来并传递给应用程序,于是我们可以看到有人上bbs 来自argo.zsu.edu.cn,其实她来自202.116.64.6枣“逸仙时空”BBS。
细心的人会发现BBS上显示ip的栏是有长度局限的,因此若客户机的域名足够长便可隐藏住自己机器名,如parallelcomput其实是parallelcomputing.xx.xxx.xxx.xx。这便是隐藏ip的方法之一,当然此法要和网管比较熟才行。
但让我们换个思路:如果服务器在进行DNS查询时能够人为地给它我们自己的应答信息结果会怎样呢?答案显然不用我说了,这就是著名的DNS欺骗(dns spoofing)。
现有的大多数DNS服务实现存在两个可利用的特点。
其一为当DNS服务器收到一合法的DNS应答信息时它会接受这一返回包中的所有信息,并存入CACHE。举一个例子:在10.10.1.2的用户要TELNET到100.100 .100.100上,100.100.100.100使用的DNS为100.100.100.200。
三次握手后100.100.100.100会向100.100.100.200发一PTR类型的DNS查询(由IP查主机名):
100.100.100.100 -> 100.100.100.200 [Query]
NQY: 1 NAN: 0 NNS: 0 NAD: 0
QY: 2.1.10.10.in-addr.arpa PTR
而100.100.100.200并没有关于用户IP对应域的信息。它首先根据DNS协议及其配置查找出10.10.1.2的授权DNS服务器枣10.10.1.5。然后向其发出查询包:
100.100.100.200 -> 10.10.1.5 [Query]
NQY: 1 NAN: 0 NNS: 0 NAD: 0
QY: 2.1.10.10.in-addr.arpa PTR
这里隐蔽了iterative与recursive两种方式的区别,一般的DNS设置为iterative,recursive为可选。
10.10.1.5收到该查询信息后便可返回10.10.1.2对应的域名:
10.10.1.5 -> 100.100.100.200 [Answer]
NQY: 1 NAN: 2 NNS: 1 NAD: 1
QY: 2.1.10.10.in-addr.arpa PTR
AN: 2.1.10.10.in-addr.arpa PTR client.host.com
AN: client.host.com A 10.10.1.2
NS: 1.10.10.in-addr.arpa NS ns.host.com
AD: ns.host.com A 10.10.1.5
返回的包中给出了10.10.1.2对应的域名为client.host.com,并指出client.host.com
对应的IP为10.10.1.2(请注意这两个对应的是不同的概念!)。如果这个返回包能由我们给出,岂不是爽呆了!
那么怎么做呢?可以控制住你的DNS,然后你想设成什么就是什么。但是太暴力了,偶不推荐这种方式。还有更温和的方法枣如果局域网内有DNS 服务器,那么可以通过监听、响应的方法实现DNS欺骗。
即先sniff传到局域网来的DNS查询包,然后代替本网段的DNS服务器给出应答信息。
但是本网段的DNS服务器也会同时给出应答信息,这样我们构造的包与它的包会有冲突,通常是我们的慢。这样的DNS欺骗是不成功的。
为了获得稳定的DNS欺骗的效果,这就涉及到DNS实现的第二特点。
当DNS服务器发查询包时,它在包内设有一query id,answer只有query id及ip都对上时才能为服务器所接受。而这一id每次加一,所以可以通过第一次向要欺骗的DNS SERVER发一个查询并监听到该id值,随后再发一查询,紧接着马上send我们构造好的应答包,包内的query id为预测的queryid值(可以指定一个范围,比如从previous_id+1到previous_id+100)。
接上例,如10.10.1.2的用户要欺骗100.100.100.100,他可以对100.100.100.200进行欺骗:
11.11.11.11 -> 100.100.100.200 [Query]
NQY: 1 NAN: 0 NNS: 0 NAD: 0
QY: 12345.host.com A
由于host.com的域名由10.10.1.5控制,100.100.100.200向10.10.1.5发查询包:
100.100.100.200 -> 10.10.1.5 [Query]
NQY: 1 NAN: 0 NNS: 0 NAD: 0 QID: 2345
QY: 12345.host.com A
10.10.1.2的用户可以监听到给包,得到QID: 2345。然后再向100.100.100.200发第二次查询:
11.11.11.11 -> 100.100.100.200 [Query]
NQY: 1 NAN: 0 NNS: 0 NAD: 0
QY: 67890.host.com A
紧接着发带预测QID的应答包:
10.10.1.5 -> 100.100.100.200 [Answer]
NQY: 1 NAN: 0 NNS: 0 NAD: 0 QID: 2346
QY: 2.1.10.10.in-addr.arpa PTR
AN: 2.1.10.10.in-addr.arpa PTR you.want.name
you.want.name就是用户自己指定的域名。注意发这个包时应该用10.10.1.5这一IP地址,且query id为2346=2345+1。
(bibble)