不管你有没有意识到,网络嗅探需要经过几个阶段:ARP 欺骗 -> 数据包截取 -> 数据包分析 -> 记录和/或显示感兴趣的信息。如果我们想真实地体会一下这个过程,那么建议用最原始的方法,手工执行上述过程:用 ARP 欺骗软件,比如 arp-tools 发送 ARP 欺骗包,让其它两台机器之间的数据流通过我们的机器。注意,需要开启我们机器的路由功能;接下来,用抓包工具抓取那两台机器之间的数据包;然后用我们的眼睛查看(分析)抓取到的数据包;最后,如果看到了我们感兴趣的信息,记录下来。当然,手工的过程很麻烦,我们一般选择用嗅探软件,比如 Windows 平台下的 Cain,Linux 平台下的 Ettercap 等。然而,即使用嗅探软件,那么仍然需要经历这个过程,仍然需要做这些工作,只不过嗅探软件帮我们做了这些工作而已。
    在本系列文章的第一部分,我们来探讨 ARP 欺骗,主要探讨三个问题:
        1)为什么要进行 ARP 欺骗?
        2)为什么能够进行 ARP 欺骗?
        3)怎样进行 ARP 欺骗?
 
一. 为什么要进行 ARP 欺骗?
        所谓网络嗅探,其实就是对大量网络数据流进行分析,从中分离出我们感兴趣的东西并记录下来和/或显示出来。既然要对网络数据流进行分析,那么当然需要让这些网络数据流流经我们的机器,我们才有机会对其进行分析。接下来的问题当然就是:怎样才能让网络数据流流经我们的电脑呢?哪些技术可以帮我们达到这个目的呢?记得我曾经在《我谈网络扫描之三》讲过,SPAN 和 RSPAN 可以让特定交换机特定端口的网络数据流到达我们的入侵检测系统,那么这种技术能不能用来实现让网络数据流流经我们进行嗅探的电脑的目的呢?答案是肯定的。问题是,SPAN 和 RSPAN 需要在交换机上配置,需要我们首先搞定人家的交换机,不容易呀。而且,即使有幸搞定了人家的交换机,别忘了 SPAN 和 RSPAN 很容易导致网络流量异常,只要人家配置了流量监控,比如配置了 Cacti,就很容易被发现了。所以,这种技术虽然可行,但是实现难度太大,风险太高,我们不用。那么,可行而又方便的技术有没有呢?答案同样是肯定的,那就是“臭名昭著”的 ARP 欺骗。ARP 欺骗实现起来很容易,因为一般的网络嗅探软件都会根据我们机器的IP地址和网关设置,自动向外发送 ARP 欺骗包,进行 ARP 欺骗。而且,ARP 欺骗不容易被发现,隐蔽性较好。
   
二. 为什么能够进行 ARP 欺骗?
        TCP/IP 协议族有比较多的“瑕疵”,作为 TCP/IP 协议族的成员之一,ARP 协议也不例外。ARP 欺骗正是利用了 ARP 协议的“瑕疵”,来达到目的。我们都知道,一台机器要想把数据包准确发送给自己期望的目标机器,必须保证发出去的数据包的目标 IP 地址正确,封装这些数据包的数据帧的目标 MAC 地址正确。保证发出去的数据包的目标 IP 地址正确并不困难,因为这个地址通常由我们手工指定的(如果指定 DNS 域名的话,就可能被 DNS 欺骗,导致使用错误的IP 地址),只要我们指定正确的 IP 地址即可。但是,要保证封装这些数据包的数据帧的目标 MAC 地址正确,就不是那么容易的事情了。因为 MAC 地址不是我们手工指定,而是我们的机器自动通过 ARP 协议获得的,并且,我们的机器并不能保证自己通过 ARP 协议获得准确的 MAC 地址。所以,一旦获得了错误的 MAC 地址(被 ARP 欺骗了,呵呵),那么就会导致发出去的数据帧的目标 MAC 地址不正确。最终,数据帧就会被发送到其它的机器,而不是我们期望的目标机器。当我们的机器需要使用目标机器的 MAC 地址来封装数据帧时,它会发送 ARP 广播,请求目标机器告诉自己其 MAC 地址。既然是广播,那么同一个 VLAN 里的所有机器都能够收到,目标主机可以发送 ARP 响应,告诉我们的机器其 MAC 地址,其它机器也可以发送恶意 ARP 响应,告诉我们的机器目标主机的 MAC  地址是它的 MAC 地址,并且,我们机器的 ARP 协议“很傻很天真”,没有任何方法来辨别真伪,从而就有可能导致我们的机器使用错误的 MAC 地址。更进一步说,即使我们的机器根本有没有向外发送 ARP 请求,恶意机器也可以发送虚假的 ARP 响应或 ARP 请求(Gratuitous ARP)给我们的机器,并且,我们机器的 ARP 协议仍然“很傻很天真”,信以为真,把这些错误的信息保存起来,供以后使用。正是 ARP 协议的这种傻和天真,ARP 欺骗才得以横行霸道。
 
三. 怎样进行 ARP 欺骗?
        ARP 欺骗的过程比较简单,假如我们想嗅探 A 机跟 B 机之间的数据流,我们同时向 A 机和 B 机发送虚假的 ARP 响应或请求(Gratuitous ARP),让 A 机认为 B 机的 MAC 地址是我们机器的 MAC 地址,从而使它用我们机器的 MAC 地址来填充发给 B 机的数据帧,于是,这些数据帧就理所当然地发给了我们的机器。同样地,让 B 机把它本来想发送给 A 机的数据帧发送给我们的机器。另外,我们将自己机器的网卡置于杂凑模式,并且开启路由中转(一般的网络嗅探软件都能够路由和中转数据包,所以不一定需要开启 OS 的路由功能),以便接收并转发这些数据包。这样,我们就可以静悄悄地隐藏在角落,嗅探 A 机跟 B 机之间的数据通信了。下面以图形表示 ARP 欺骗: