1、发生在共享式局域网内的窃听

  所谓的“共享式”局域网(Hub-Based Lan),指的是早期采用集线器HUB作为网络连接设备的传统以太网的结构,在这个结构里,所有机器都是共享同一条传输线路的,集线器没有端口的概念,它的数据发送方式是“广播”, 集线器接收到相应数据时是单纯的把数据往它所连接的每一台设备线路上发送的,例如一台机器发送一条“我要和小金说话”的报文,那么所有连接这个集线器的设备都会收到这条报文,但是只有名字为“小金”的计算机才会接收处理这条报文,而其他无关的计算机则会“不动声色”的抛弃掉该报文。因此,共享以太网结构里的数据实际上是没有隐私性的,只是网卡会“君子”化的忽略掉与自己无关的“闲言碎语”罢了,但是很不巧,网卡在设计时是加入了“工作模式”的选项的,正是这个特性导致了噩梦。

  每块网卡基本上都会有以下工作模式:Unicast、Broadcast、Multicast、Promiscuous,一般情况下,操作系统会把网卡设置为Broadcast(广播)模式,在Broadcast模式下,网卡可以接收所有类型为广播报文的数据帧——例如ARP寻址,此外它会忽略掉目标地址并非自己MAC地址的报文,即只接收发往自身的数据报文、广播和组播报文,这才是网卡的正常工作模式;如果一块网卡被设置为Unicast或Multicast模式,在局域网里可能会引发异常,因为这两个模式限制了它的接收报文类型;而Promiscuous(混杂)模式,则是罪恶的根源。在混杂模式里,网卡对报文中的目标MAC地址不加任何检查而全部接收,这样就造成无论什么数据,只要是路过的都会被网卡接收的局面,监听就是从这里开始的。

  一般情况下,网卡的工作模式是操作系统设置好的,而且没有公开模式给用户选择,这就限制了普通用户的监听实现,但是自从嗅探器(Sniffer)家族发展到一定程度后,开始拥有了设置网卡工作模式的权力,而且矛头直指Promiscuous,任何用户只要在相应选择上打个勾,他的机器就变成了可以记录局域网内任何机器传输的数据的耳朵,由于共享式局域网的特性,所有人都是能收到数据的,这就造成了不可防御的信息泄漏。

  可是,最终这种监听方式还是被基本消灭了,人们用了什么手段呢?很简单,局域网结构升级了,变成“交换式局域网”。

2、发生在交换式局域网内的窃听

  作为与“共享式”相对的“交换式”局域网(Switched Lan),它的网络连接设备被换成了交换机(Switch),交换机比集线器聪明的一点是它连接的每台计算机是独立的,交换机引入了“端口”的概念,它会产生一个地址表用于存放每台与之连接的计算机的MAC地址,从此每个网线接口便作为一个独立的端口存在,除了声明为广播或组播的报文,交换机在一般情况下是不会让其他报文出现类似共享式局域网那样的广播形式发送行为的,这样即使你的网卡设置为混杂模式,它也收不到发往其他计算机的数据,因为数据的目标地址会在交换机中被识别,然后有针对性的发往表中对应地址的端口,决不跑到别人家里去。

  这一改进迅速扼杀了传统的局域网监听手段,但是历史往往证明了人是难以被征服的……

  (1)、对交换机的攻击:MAC洪水

  不知道是谁第一个发现了这种攻击模式,大概是因为交换机的出现破坏了嗅探器的工作,所以一肚子气泄到了交换机身上,另一种看法则是精明的技术人员设想交换机的处理器在超过所能承受信息量的时候会发生什么情况而进行的试验,无论是从什么论点出发的,至少这个攻击模式已经成为现实了:所谓MAC洪水攻击,就是向交换机发送大量含有虚假MAC地址和IP地址的IP包,使交换机无法处理如此多的信息而引起设备工作异常,也就是所谓的“失效”模式,在这个模式里,交换机的处理器已经不能正常分析数据报和构造查询地址表了,然后,交换机就会成为一台普通的集线器,毫无选择的向所有端口发送数据,这个行为被称作“泛洪发送”,这样一来攻击者就能嗅探到所需数据了。

  不过使用这个方法会为网络带来大量垃圾数据报文,对于监听者来说也不是什么好事,因此MAC洪水使用的案例比较少,而且设计了端口保护的交换机可能会在超负荷时强行关闭所有端口造成网络中断,所以如今,人们都偏向于使用地址解析协议ARP进行的欺骗性攻击。

  (2)、地址解析协议带来的噩梦

  回顾前面提到的局域网寻址方式,我们已经知道两台计算机完成通讯依靠的是MAC地址而与IP地址无关,而目标计算机MAC地址的获取是通过ARP协议广播得到的,而获取的地址会保存在MAC地址表里并定期更新,在这个时间里,计算机是不会再去广播寻址信息获取目标MAC地址的,这就给了入侵者以可乘之机。

  当一台计算机要发送数据给另一台计算机时,它会以IP地址为依据首先查询自身的ARP地址表,如果里面没有目标计算机的MAC信息,它就触发ARP广播寻址数据直到目标计算机返回自身地址报文,而一旦这个地址表里存在目标计算机的MAC信息,计算机就直接把这个地址作为数据链路层的以太网地址头部封装发送出去。为了避免出现MAC地址表保持着错误的数据,系统在一个指定的时期过后会清空MAC地址表,重新广播获取一份地址列表,而且新的ARP广播可以无条件覆盖原来的MAC地址表。

  假设局域网内有两台计算机A和B在通讯,而计算机C要作为一个窃听者的身份得到这两台计算机的通讯数据,那么它就必须想办法让自己能插入两台计算机之间的数据线路里,而在这种一对一的交换式网络里,计算机C必须成为一个中间设备才能让数据得以经过它,要实现这个目标,计算机C就要开始伪造虚假的ARP报文。

  ARP寻址报文分两种,一种是用于发送寻址信息的ARP查询包,源机器使用它来广播寻址信息,另一种则是目标机器的ARP应答包,用于回应源机器它的MAC地址,在窃听存在的情况下,如果计算机C要窃听计算机A的通讯,它就伪造一个IP地址为计算机B而MAC地址为计算机C的虚假ARP应答包发送给计算机A,造成计算机A的MAC地址表错误更新为计算机B的IP对应着计算机C的MAC地址的情况,这样一来,系统通过IP地址获得的MAC地址都是计算机C的,数据就会发给以监听身份出现的计算机C了。但这样会造成一种情况就是作为原目标方的计算机B会接收不到数据,因此充当假冒数据接收角色的计算机C必须担当一个转发者的角色,把从计算机A发送的数据返回给计算机B,让两机的通讯正常进行,这样,计算机C就和计算机AB形成了一个通讯链路,而对于计算机A和B而言,计算机C始终是透明存在的,它们并不知道计算机C在偷听数据的传播。只要计算机C在计算机A重新发送ARP查询包前及时伪造虚假ARP应答包就能维持着这个通讯链路,从而获得持续的数据记录,同时也不会造成被监听者的通讯异常。

  计算机C为了监听计算机A和B数据通讯而发起的这种行为,就是“ARP欺骗”(ARP Spoofing)或称“ARP攻击”(ARP Attacking),实际上,真实环境里的ARP欺骗除了嗅探计算机A的数据,通常也会顺便把计算机B的数据给嗅探了去,只要计算机C在对计算机A发送伪装成计算机B的ARP应答包的同时也向计算机B发送伪装成计算机A的ARP应答包即可,这样它就可作为一个双向代理的身份插入两者之间的通讯链路。