深入学习sniffer

  hubertzou 随着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 () 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。 你希望检查sniffer是否能运行sniffit:~/#sniffit-d-p7-t66.66.66.7,并且开另一个窗口: sniffit:~/$telnettarget.com7,,你可以看到sniffer将你telnet到对方7号端口echo服务的包捕获了。 你希望截获target.com上的用户密码sniffit:~/#sniffit-p23-t66.66.66.7 target.com主机的根用户声称有奇怪的FTP连接并且希望找出他们的击键sniffit:~/#sniffit-p21-l0-t66.66.66.7 你希望能阅读所有进出target.com的信件sniffit:~/#sniffit-p25-l0-b-t66.66.66.7&,或者sniffit:~/#sniffit-p25-l0-b-s66.66.66.7& 你希望使用用户交互界面sniffit:~/#sniffit-i 有错误发生而且你希望截获控制信息sniffit:~/#sniffit-Picmp-b-s66.66.66.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 你可以用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在和这两个工具中成功应用。最新的WinPcap是版本2.02,修补了2.01版本中的一些缺陷,并且支持WIN2000。具体信息和源代码可以在下面这个站点找到: 下面是在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 交换 随着交换机的成本和价格的大幅度降低,交换机已成为非常有效的使sniffer失效的设备。目前 最常见的交换机在第三层(网络层)根据数据包目标地址进行转发,而不太采取集线器的广播方式,从理论上讲,通过交换设备对网络进行分段后,sniffer将无法透过边界而窥探另一边的数据包。但是,请注意:这是在边界设备不转发广播包的情况下(这也是通常的网络情况)。一旦入侵者使用spoofer诱骗某个边界设备而将自己的广播包流入不该进入的网段后,原理上还是在一个共享设备端使用sniffer,而实际上将是听到了边界的另一边).当然,这样会牵涉到ip欺诈和Mac欺诈的问题,然而,你别忘了,sniffer和spoofer是很少分开来的。 加密 目前有许多软件包可用于加密连接,从而使入侵者即使捕获到数据,但无法将数据解密而失去窃听的意义。 入侵检测 使用诸如Tripwire之类的工具,生成文件系统的MD5″数据指纹”,及时发现被修改的系统文件; 趁着有脾气装潇洒,有本钱耍个性,

深入学习sniffer

相关文章:

你感兴趣的文章:

标签云: