随着Internet及电子商务的日益普及,Internet的安全也越来越受到重视。而在Internet安全隐患中扮演重要角色的是Sniffer和Scanner,本文将介绍Sniffer以及如何阻止sniffer。  

大多数的***仅仅为了探测内部网上的主机并取得控制权,只有那些"雄心勃勃"的***,为了控制整个网络才会安装特洛伊***和后门程序,并清除记录。他们经常使用的手法是安装sniffer。  

在内部网上,***要想迅速获得大量的账号(包括用户名和密码),最为有效的手段是使用 "sniffer" 程序。这种方法要求运行Sniffer 程序的主机和被监听的主机必须在同一个以太网段上,故而在外部主机上运行sniffer 是没有效果的。再者,必须以root的身份使用sniffer 程序,才能够监听到以太网段上的数据流。  

***会使用各种方法,获得系统的控制权并留下再次侵入的后门,以保证sniffer能够执行。在Solaris 2.x平台上,sniffer 程序通常被安装在/usr/bin或/dev目录下。***还会巧妙的修改时间,使得sniffer程序看上去是和其它系统程序同时安装的。  

大多数 "ethernet sniffer"程序在后台运行,将结果输出到某个记录文件中。***常常会修改ps程序,使得系统管理员很难发现运行的sniffer程序。  

"ethernet sniffer"程序将系统的网络接口设定为混合模式。这样,它就可以监听到所有流经同一以太网网段的数据包,不管它的接受者或发送者是不是运行sniffer的主机。 程序将用户名、密码和其它***感兴趣的数据存入log文件。***会等待一段时间 ----- 比如一周后,再回到这里下载记录文件。  


一、什么是sniffer  

与电话电路不同,计算机网络是共享通讯通道的。共享意味着计算机能够接收到发送给其它计算机的信息。捕获在网络中传输的数据信息就称为sniffing(窃听)。  

以太网是现在应用最广泛的计算机连网方式。以太网协议是在同一回路向所有主机发送数据包信息。数据包头包含有目标主机的正确地址。一般情况下只有具有该地址的主机会接受这个数 据包。如果一台主机能够接收所有数据包,而不理会数据包头内容,这种方式通常称为"混杂" 模式。  

由于在一个普通的网络环境中,帐号和口令信息以明文方式在以太网中传输,一旦***者获 得其中一台主机的root权限,并将其置于混杂模式以窃听网络数据,从而有可能***网络中的所有计算机。  


二、sniffer工作原理  

通常在同一个网段的所有网络接口都有访问在物理媒体上传输的所有数据的能力,而每个网络接口都还应该有一个硬件地址,该硬件地址不同于网络中存在的其他网络接口的硬件地址,同时,每个网络至少还要一个广播地址。(代表所有的接口地址),在正常情况下,一个合法的网络接口应该只响应这样的两种数据帧:  

1、帧的目标区域具有和本地网络接口相匹配的硬件地址。  
2、帧的目标区域具有"广播地址"。  

在接受到上面两种情况的数据包时,nc通过cpu产生一个硬件中断,该中断能引起操作系统注意,然后将帧中所包含的数据传送给系统进一步处理。  

而sniffer就是一种能将本地nc状态设成(promiscuous)状态的软件,当nc处于这种"混杂"方式时,该nc具备"广播地址",它对所有遭遇到的每一个帧都产生一个硬件中断以便提醒操作系统处理流经该物理媒体上的每一个报文包。(绝大多数的nc具备置成promiscuous方式的能力)  

可见,sniffer工作在网络环境中的底层,它会拦截所有的正在网络上传送的数据,并且通过相应的软件处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体布局。值得注意的是:sniffer是极其安静的,它是一种消极的安全***。  

通常sniffer所要关心的内容可以分成这样几类:  

1、口令:  
我想这是绝大多数非法使用sniffer的理由,sniffer可以记录到明文传送的userid和passwd.就算你在网络传送过程中使用了加密的数据,sniffer记录的数据一样有可能使***者在家里边吃肉串边想办法算出你的算法。  

2、金融帐号:  
许多用户很放心在网上使用自己的信用卡或现金帐号,然而sniffer可以很轻松截获在网上传送的用户姓名、口令、信用卡号码、截止日期、帐号和pin。  

3、偷窥机密或敏感的信息数据:  
通过拦截数据包,***者可以很方便记录别人之间敏感的信息传送,或者干脆拦截整个的email会话过程。  

4、窥探低级的协议信息:  
这是很可怕的事,我认为,通过对底层的信息协议记录,比如记录两台主机之间的网络接口地址、远程网络接口ip地址、ip路由信息和tcp连接的字节顺序号码等。这些信息由非法***的人掌握后将对网络安全构成极大的危害,通常有人用sniffer收集这些信息只有一个原因:他正在进行一次欺诈,(通常的ip地址欺诈就要求你准确插入tcp连接的字节顺序号,这将在以后整理的文章中指出)如果某人很关心这个问题,那么sniffer对他来说只是前奏,今后的问题要大条得多。(对于高级的hacker而言,我想这是使用sniffer的唯一理由吧)。  


三、哪里可以得到sniffer  

Sniffer是***们最常用的***手段之一。你可以在经过允许的网络中运行sniffer,了解它是如何有效地危及本地机器安全。  

Sniffer可以是硬件,也可以是软件。现在品种最多,应用最广的是软件Sniffer, 绝大多数***们用的也是软件Sniffer。  

以下是一些也被广泛用于调试网络故障的sniffer工具:  

商用sniffer:  

1 Network General.  
Network General开发了多种产品。最重要的是Expert Sniffer,它不仅仅可以sniff,还能够通过高性能的专门系统发送/接收数据包,帮助诊断故障。还有一个增强产品"Distrbuted SnifferSystem"可以将UNIX工作站作为sniffer控制台,而将snifferagents(代理)分布到远程主机上。  

2 Microsofts Net Monitor  
对于某些商业站点,可能同时需要运行多种协议--NetBEUI、IPX/SPX、TCP/IP、802.3和SNA等。这时很难找到一种sniffer帮助解决网络问题,因为许多sniffer往往将某些正确的协议数据包当成了错误数据包。Microsoft的Net Monitor(以前叫Bloodhound)可以解决这个难题。它能够正确区分诸如Netware控制数据包、NTNetBios名字服务广播等独特的数据包。(etherfind只会将这些数据包标识为类型0000的广播数据包。)这个工具运行在MS Windows平台上。它甚至能够按MAC地址(或主机名)进行网络统计和会话信息监视。只需简单地单击某个会话即可获得tcpdump标准的输出。过滤器设置也是最为简单的,只要在一个对话框中单击需要监视的主机即可。  

免费软件sniffer  

1 Sniffit由Lawrence Berkeley 实验室开发,运行于Solaris、SGI和Linux等平台。可以选择源、目标地址或地址集合,还可以选择监听的端口、协议和网络接口等。这个SNIFFER默认状态下只接受最先的400个字节的信息包,这对于一次登陆会话进程刚刚好。  

2 SNORT:这个SNIFFER有很多选项供你使用并可移植性强,可以记录一些连接信息,用来跟踪一些网络活动。  

3 TCPDUMP:这个SNIFFER很有名,linux,FREEBSD还搭带在系统上,是一个被很多UNIX高手认为是一个专业的网 络管理工具,记得以前TsutomuShimomura(应该叫下村侵吧)就是使用他自己修改过的TCPDUMP版本来记录了KEVINMITNICK***他系统的记录,后来就配合FBI抓住了KEVINMITNICK,后来他写了一文:使用这些LOG记录描述了那次的***,How Mitnick hacked Tsutomu Shimomura with an IP sequence attack  
([url]http://www.attrition.org/securit[/url] ... iffer/shimomur.txt)  

4 ADMsniff:这是非常有名的ADM***集团写的一个SNIFFER程序。  

5 linsniffer:这是一个专门设计杂一LINUX平台上的SNIFFER。  

6 Esniffer:这个也是一个比较有名的SNIFFER程序。  

7 Solsniffer:这是个Solarissniffer,主要是修改了SunSniff专门用来可以方便的在Solair平台上编译。  

8 Ethereal是一基于GTK+的一个图形化Sniffer。  

9 Gobbler(for MS-DOS&Win95)、Netman、NitWit、Ethload...等等。  


四、sniffer的安装使用  

我主要以sniffit为例分别介绍在nt和linux下的应用。  

[1] 在linux下的sniffit安装:  

软件的安装  

1、用tarzvfxsniffit.*.*.*.tgz将下载下来的sniffit.*.*.*.tgz解压缩  
到你想要的目的文件夹,如果版本是0.3.7的话,你会看到该目录下出现一个sniffit.0.3.7的目录。  

2、cd sniffit.0.3.7  

3、./configure && make,只要在这个过程中终端上没有意外的error信息出现,你就算编译成功了--可以得到一个二进制的sniffit文件。  

4、makeclean把不用的垃圾扫掉……  

使用方法  

1、参数,有如下的命令选项:  
-v显示版本信息  
-t让程序去监听指定流向某IP的数据包  
-s让程序去监听从某IP流出的IP数据包,可以使用@通配符  
-t199.145.@  
-i显示出窗口界面,能察看当前在你所属网络上进行连接的机器  
-I扩展的交互模式,忽略所有其它选项,比-i强大得多……  
-c利用脚本来运行程序  
-F强制使程序使用网络硬盘  
-n显示出假的数据包。象使用ARP、RARP或者其他不是IP的数据包也会显示出来  
-N只运行plugin时的选项,使其它选项失效  

在-i模式下无法工作的参数:  

-b同时做-t和-s的工作……  
-d将监听所得内容显示在当前终端--以十六进制表示  
-a将监听所得内容显示在当前终端--以ASCII字符表示  
-x打印TCP包的扩展信息(SEQ,ACK,Flags),可以与-a,-d,-s,-t,-b一起运作,注意-- 它是输出在标准输出的,如果只用-t,-s,-b 而没有其它参数配合的话不会被写入文件  
-R将所有通信记录在文件中  
-r这一选项将记录文件送往sniffit,它需要-F的参数配合指明设备,假设你用eth0(第一块网 卡)来记录文件,你必须在命令行里面加上-Feth0或者或者或者或者或者-Feth-A遇到不认识的字符时用指定的字符代替  
-P定义监听的协议,DEFAULT为TCP--也可以选IP、ICMP、UDP……  
-p定义监听端口,默认为全部  
-l设定数据包大小,default是300字节  
-M激活插件  
-I,-i模式下的参数  
-D所有的记录会被送到这个磁盘上  
-c模式下的参数  
-L  
其中logparam可以是如下的内容:  
raw:轻度  
norm:常规  
telnet:记录口令(端口23)  
ftp:记录口令(端口21)  
mail:记录信件内容(端口25)  
比如说"ftpmailnorm"就是一个合法的logparam  

2、图形仿真界面  
就是上面所说的-i选项啦,我们输入sniffit-i会出现一个窗口环境,从中可以看到自己所在的网络中有哪些机器正在连接,使用什么端口号,其中可用的命令如下:  

q退出窗口环境,结束程序  
r刷新屏幕,重新显示正在在连线的机器  
n产生一个小窗口,包括TCP、IP、ICMP、UDP等协议的流量  
g产生数据包,正常情况下只有UDP协议才会产生,执行此命令要回答一些关于数据包的问题  
F1改变来源网域的IP地址,默认为全部  
F2改变目的网域的IP地址,默认为全部  
F3改变来源机器的端口号,默认为全部  
F4改变目的机器的端口号,默认为全部  

一些示例 

假设有以下的设置:在一个子网中有两台主机,一台运行了sniffer,我们称之为sniffit.com,另一台是66.66.66.7,我们称之为target.com。 

<1>你希望检查sniffer是否能运行sniffit:~/#sniffit-d-p7-t66.66.66.7,并且开另一个窗口: 
sniffit:~/$telnettarget.com7,你可以看到sniffer将你telnet到对方7号端口echo服务的包捕获了。 

<2>你希望截获target.com上的用户密码sniffit:~/#sniffit-p23-t66.66.66.7 

<3>target.com主机的根用户声称有奇怪的FTP连接并且希望找出他们的击键sniffit:~/#sniffit-p21-l0-t66.66.66.7 

<4>你希望能阅读所有进出target.com的信件sniffit:~/#sniffit-p25-l0-b-t66.66.66.7&,或者sniffit:~/#sniffit-p25-l0-b-s66.66.66.7& 

<5>你希望使用用户交互界面sniffit:~/#sniffit-i 

<6>有错误发生而且你希望截获控制信息sniffit:~/#sniffit-Picmp-b-s66.66.66.7 

<7>Gowildonscrollingthescreen. sniffit:~/#sniffit-Pip-Picmp-Ptcp-p0-b-a-d-x-s66.66.66.7,与之效果相当的是sniffit:~/#sniffit-Pipicmptcp-p0-b-a-d-x-s66.66.66.7 

<8>你可以用more66*读取下列方式记录下的密码sniffit:~/#sniffit-p23-A.-t66.66.66.7,或者sniffit:~/#sniffit-p23-A^-tdummy.net 

高级应用 

1、用脚本执行 
这是配合选项-c的,其执行方法也很简单,比如以如下方式编辑一个叫sh的文件 
selectfromhost180.180.180.1 
selecttohost180.180.180.10 
selectbothport21 
然后执行:sniffit-csh 
说明:监听从180.180.180.1送往180.180.180.10的数据包,端口为FTP口。这里不做更多说明,你可以自己去看里面的README。 

2、插件 
要获取一个插件是很简单的,你将它放入sniffit的目录下,并且象如下方式编辑sn_plugin.h文件: 
#definePLUGIN1_NAME"Myplugin" 
#definePLUGIN1(x)main_plugin_function(x) 
#include"my_plugin.plug" 

注意: 
a)你可以让plugin从0-9,所以从PLUGIN0_NAME到PLUGIN1_NAME……不必是连续的 
d)#include"my_plugin.plug"这是我的插件源代码放置的地方。如果想详细了解的话,还是看看里面的plugin.howto吧。 

3、介绍tod 
这东东便是sniffit最有名的一个插件了,为什么叫TOD呢--touchofdeath,它可以轻易地切断一个TCP连接,原理是向一个TCP连接中的一台主机发送一个断开连接的IP包,这个IP包的RST位置1,便可以了。 
将下载下来的tod.tar.gz拷贝到sniffit所在目录下,解压安装后ln-stodsniffit_key5,就可以将这相程序与F5键连接起来,想切断哪台机器的话,只要在窗口中将光标指到需要断线的机器上按下F5键就可以了。你可以自由地定义成其它的F功能键--F1~F4不行,它们已经被定义过了…… 

[2],在nt下的sniffit 
Sniffit 0.3.7推出了NT版本,也支持WINDOWS2000,这个sniffit需要WinPcap包,就是类似与libpcap的包,支持WIN32平台上可以信息包捕获和网络分析,是基于UNIX的libpcap和BPF(Berkeley 分帧过滤器)模型的包。它包括内核级的包过滤驱动程序,低级动态连接库(packet.dll),和高级系统无关性库(libpcap,基于0.4a6版本)。 
这个WinPcap信息包捕获启动程序可把设备驱动增加在Windows 95, Windows 98, Windows NT 和 Windows 2000 上,可以有能力捕获和发送通过原始套接口的信息包(raw packets),Packet.dll是一个能用来直接访问BPF驱动程序的API。 
WinPcap在[url]http://netgroup-serv.polito.it/windump[/url][url]http://netgroup-serv.polito.it/analyzer[/url]这两个工具中成功应用。最新的WinPcap是版本2.02,修补了2.01版本中的一些缺陷,并且支持WIN2000。具体信息和源代码可以在下面这个站点找到: 
[url]http://netgroup-serv.polito.it/winpcap/[/url] 

下面是在WIN2K中安装的步骤: 
1)先下载packet.exe这个程序后展开安装 
2)打开WINDOWS2000的控制面板 
3)从控制面板中双击"网络和拨号连接"图标,在打开"本地连接"图标,并选择属性选项 
4)在显示的对话框中选择"安装",安装网络组件 
5)再在出现的对话框中选择"协议",点击"增加" 
6)在出现的对话框中选择"从磁盘安装",选择正确路径,就是刚才你解压的网络设备驱动程序(这个文件夹中必须包含packet.inf和packet.sys)的地方,在选择确定 
7)在选择"Packet capture Driver v X.XX ",并按照指示来完成安装,往往要你WINDOWS2000的安装光盘 
8)查看网络组件中有没有 Packet capture Driver v X.XX 这一行,有的话说明这个驱动程序已经建立并绑定了网络接口 
再重新启动机器 

然后解压sniffit_nt.0.3.7.beta,再使用命令行模式,我简单的使用了一个命令行,刚开始是使用sniffit -t 192.168.0.1 -p 21,想监视下21 FTP端口的密码捕获成不成功,但出现"Automatic network device lookup not yet supported in Win32、version... use -F DevicePacket_{31BB7ED2-125E-11D4-8F11-D79985727802} 、to force the choice,Read the README.FIRST on how to force network devices. 的提示,于是我按照其提示所示,使用了sniffit -F Devicepacket_{31BB7ED2-125E-11D4-8F11-D79985727、802} -t 192.168.0.1 -p 21命令,这时出现下面的提示: 
Forcing device to Devicepacket_{31BB7ED2-125E-11D4-8F1 quested)... 
Make sure you have read the docs carefully. 
Sniffit.0.3.7 Beta is up and running.... (192.168.0.1) 

这就表明sniffit在工作了,于是在FTP到NT的端口,输入密码,随即就可以在刚才SNIFFIT的目录下看到一个关于192.168.0.2.1281-192.168.0.1.21的文件,打开后查看里面的内容如下所示: 
USER xundi 
PASS xxxxxxx-------->我隐藏了 
SYST 
PORT 192,168,0,2,5,2 
LIST 
PORT 192,168,0,2,5,3 
LIST 
CWD g: 
CWD c 
PORT 192,168,0,2,5,26 
LIST 
CWD hack 
PORT 192,168,0,2,5,88 
LIST 

看,是不是很整洁啊,至于文件名为何是这样192.168.0.2.1281-192.168.0.1.21,那是应该是一个客户/服务器模式,客户端的连接是随意开一个1281端口地址和192.168.0.1的21口连接。 


五、如何监测主机正在窃听(sniffed) 

如何才知道有没有sniffer在我的网上跑呢?这也是一个很难说明的问题,比较有说服力的理由证明你的网络有sniffer目前有这么几条: 

1、你的网络通讯掉包率反常的高。 
通过一些网络软件,你可以看到你的信息包传送情况(不是sniffer),向ping这样的命令会告诉你掉了百分几的包。如果网络中有人在听,那么你的信息包传送将无法每次都顺畅的流到你的目的地。(这是由于sniffer拦截每个包导致的) 

2、你的网络带宽将出现反常。 
通过某些带宽控制器(通常是火墙所带),你可以实时看到目前网络带宽的分布情况,如果某台机器长时间的占用了较大的带宽,这台机器就有可能在听。在非高速信道上,如56Kddn等,如果网络中存在sniffer,你应该也可以察觉出网络通讯速度的变化。 

3、通常一个sniffer的记录文件会很快增大并填满文件空间。在一个大型网络中,sniffer明 显加重机器负荷。这些警告信息往往能够帮助管理员发现sniffer。 

4、一个主机上的sniffer会将网络接口置为混杂模式以接收所有数据包。对于某些UNIX系统, 通过监测到混杂模式的网络接口。虽然可以在非混杂模式下运行sniffer,但这样将只能捕获本 机会话。只有混杂模式下的 sniffing才能捕获以太网中的所有会话,其它模式只能捕获本机会话。 

对于SunOS、linux和其它BSD Unix系统,如下命令: 
"ifconfig -a" 
会显示所有网络接口信息和是否在混杂模式。DEC OSF/1和IRIX等系统需要指定设备。要找 到系统中有什么网络接口,可以运行如下命令: 
# netstat -r 
Routing tables 
Internet: 
Destination Gateway Flags Refs Use Interface 
default iss.net UG 1 24949 le0 
localhost localhost UH 2 83 lo0 
然后通过如下命令检查每个网络接口: 
#ifconfig le0 
le0: flags=8863 
inet 127.0.0.1 netmask 0xffffff00 broadcast 255.0.0.1 
***者经常会替换ifconfig等命令来避开检查,因此一定要检查命令程序的校验值。 

在ftp.cert.org:/pub/tools/的cpm程序(SunOS平台)可以检查接口是否有混杂模式标记。 
这些命令只在sniffer与内核存在链接时有效。而在缺省情况,sniffer是没有与内核链接 的。大多数的Unix系统,例如Irix、Solaris、SCO等,都没有任何标记来指示是否处于混杂模式,因此***者能够窃听整个网络而却无法监测到它。 

如果机器上使用两块网卡,把一块设置为杂乱模式,并把IP地址设置为0.0.0.0,另一块卡处于正常的模式并是正确的地址,这样将很难发现SNIFFER的存在。 

注意:要监测只采集数据而不对任何信息进行响应的窃听设备,需要逐个仔细检查以太网上所有物理连接,不可能仅通过远程发送数据包或ping就可以检查计算机是否正在窃听. 


六、如何阻止sniffer 

<1>交换 

随着交换机的成本和价格的大幅度降低,交换机已成为非常有效的使sniffer失效的设备。目前 最常见的交换机在第三层(网络层)根据数据包目标地址进行转发,而不太采取集线器的广播方式,从理论上讲,通过交换设备对网络进行分段后,sniffer将无法透过边界而窥探另一边的数据包。但是,请注意:这是在边界设备不转发广播包的情况下(这也是通常的网络情况)。一旦***者使用spoofer诱骗某个边界设备而将自己的广播包流入不该进入的网段后,原理上还是在一个共享设备端使用sniffer,而实际上将是听到了边界的另一边).当然,这样会牵涉到ip欺诈和Mac欺诈的问题,然而,你别忘了,sniffer和spoofer是很少分开来的。 

<2>加密 

目前有许多软件包可用于加密连接,从而使***者即使捕获到数据,但无法将数据解密而失去窃听的意义。 

<3>***检测 

使用诸如Tripwire之类的工具,生成文件系统的MD5"数据指纹",及时发现被修改的系统文件; 

<4)使用antisniffer软件 

一些流行的检测SNIFFER的程序: 
[url]http://www.attrition.org/securit[/url] ... y/sniffer/promisc.c 
--是一个很小的C程序,当编译好后,会查找本地机器上任何处于杂乱模式的NIC网络适配卡。 

[url]http://www.attrition.org/security/newbie/security/sniffer/neped.c[/url] 
--是一个用来远程检查任何嗅探活动的程序,可惜它 只在LINUX下编译,当然你也可以简单的使用ifconfig-a来检查你的UNIX机器是否有PROMISC标志。 

[url]http://www.l0pht.com/antisniff/[/url]这是L0pht写的很好的反SNIFFER程序,L0PHT还打算公开LINUX版本上的源码版本。 

我下面介绍一下sentinel的用法: 

Sentinel主要是设计思想是portable,arrcurate implementation,就是说小巧点,精确实现几个熟知的杂乱方式探测技术。其中Sentinel支持三种方法的远程杂乱探测模式:DNS测试,Etherping测试,和ARP测试,其中还有一种ICMPping Latency(ICMP PING反应时间)正在开发中。 

此程序需要Libnet和libpcap库来支持,大家可以到下面的地址去下载: 
LIbnet 1.0: [url]http://www.packetfactory.net/Projects/libnet[/url] 
libpcap 0.4: [url]ftp://ftp.ee.lbl.gov/libpcap-0.4.tar.Z[/url] 

首先说下它其中使用的三种模式: 

--ARP测试模式: 
这种方法是采用发送一个ARP请求,其中包含所有正确信息除了伪造的目标主机MAC硬件地址给我们的目标主机,这样如果目标主机没有处于杂乱模式,它将不会理睬这些信息包,因为这些信息包其认为不是指定给它们的,所以不会进行响应和回复,但如果此目标机器处于杂乱模式,ARP请求就会发生并进行内核处理,通过机器的回应信息我们就可以知道其处于杂乱模式。这种方法结合内核的特性来查看机器的运作状态,请看下面的Etherping 测试模式。 

-- DNS测试模式: 
DNS测试主要是针对网络数据收集工具能执行IP到名字反转解析来提供DNS名字来代替IP地址(The DNS tests operate on the premise that many attacker network data gathering tools perform IP to name inverse resolution to provide DNS names in place of IP addresses)。在执行反转查询中,工具会从被动网络工具模式转变为主动网络工具,而那些没有监视网络书记的工具就不会去解析信息包中的IP地址。利用这种信息,ANTI SNIFFER工具可以自身在本地主机中变为杂乱模式并在我们网络中发送无数个伪造的主机,这样,ANTI SNIFFER工具就可以嗅探DNS请求来查看目标是否在请求解析那些不存在主机。 

--Etherping 测试模式: 
Etherping 测试模式依赖于目标主机的内核,也就所谓的内核测试。在通常情况下,硬件网络接口卡过滤和丢弃那些MAC地址不同于自己机器上的MAC地址的信息包或者不是广播Ethernet 地址的地址。就是说信息包是正确和实际的Ethernet地址或者是广播Ethernet地址,接口就会把这些地址COPY和传递给内核进行进一步处理。 

但某些系统假定包含在以太帧中的数据包含某个目标主机中正确的IP地址或者广播地址,但具有不同于本地主机的MAC地址,当NIC设置为杂乱模式,发送给目标主机的每个数据包它还是傻傻的传递给操作系统进行分析。这样通过发送包含正确IP地址和不正确MAC地址的ICMP ECHO包给要检测的主机,如果目标主机回应了我们的请求,我们就知道其处于杂乱模式了。 

多种LINUX内核存在这种问题,其中NETBSD也可以利用这个问题来检测杂乱模式,但需要使用广播地址的信息包,这种信息包使用带伪造ether帧的IP地址,如66:66:66:66:66:66. 

关于WINDOWS95,98,NT的操作系统在杂乱模式中确实是检查信息包ETHER地址的,如果信息包的NIC ETHER地址符合本地主机就让堆栈来处理。但WINDOWS对广播的ether信息包存在问题,在普通环境下,如机器不在杂乱模式下,NIC只把含有起本身MAC地址的信息包或者ether地址是ff:ff:ff:ff:ff:ff传递给内核。但当在杂乱模式中驱动程序是检查ETHER地址,但它只检查ETHER地址的第一个八未组是否为Oxff就来判断信息包是否为广播或者其他,因此如果我们建立一个包含EHTER地址为ff:00:00:00:00:00的IP正确的信息包并发送给目标机器,如果其进行了响应的回应,就表示起处于杂乱模式。 

但对WINDOWS的这种方法是依赖于所用的驱动程序的,默认的微软驱动程序有此特性并且大多数供应商的驱动程序也有此特性,但某些NIC过滤广播只是依靠第一个八为组,所以这些卡不适合此方法。 

--网络和机器的反应时间测试(也可以说ICMP PING反应时间): 
这种模式是比较有效的测试方法,依据是靠对操作系统的影响来测试。但其中的坏处就是这些测试会在短期内产生一些多数量的网络通信。 

这些测试假定当网络卡不处于杂乱模式时提供硬件过滤,这样的话,信息包不是指定给本身机器的将被网络卡丢弃。当在这中情况下,在网络通信信息量将动态增长对操作系统的影响很小,相反的处于杂乱状态的机器由于不对这层进行过滤,就把这些信息传递给系统或者用户模式进行过滤,会对操作系统产生比较大的影响。简单的说,我们先正常情况下PING一机器,再我们构建很多伪造的TCP连接来ping程序来ping目标,并且注意RTT(round trip time),这样处于杂乱模式的机器由于会处理这些垃圾信息包,并影响系统并导致网络反映时间增加,然后来比较各个RTT,经过多次测试和人工判断就能决定目标机器上是否存在SNIFFER。 

Sentinel是根据这些方法来进行测试的程序,是有源代码形式发放的。使用于OPENBSD 2.6 ;FREEBSD 3.X;NETBSD 1.4.1;LINUX2.2.X平台。 

编译后使用方法为: 

#./sentinel -t 192.168.0.1 -a 是ARP测试。 

#./sentinel -t 192.168.0.1 -e 是etherping test; 

#./sentinel -t 192.168.0.1 -f 1.1.1.1 -d 是DNS测试; 

#./sentinel -t 192.168.0.1 -f 1.1.1.1 -d -a -e 是允许所有模式进行测试