防范网络嗅探
作者:自由的猪
最普遍的安全威胁来自内部,同时这些威胁通常都是致命的,其破坏性也远大于外部威胁。其中网络嗅探对于安全防护一般的网络来说,操作简单同时威胁巨大,很多黑客也使用嗅探器进行网络入侵的渗透。
网络嗅探器对信息安全的威胁来自其被动性和非干扰性,使得网络嗅探具有很强的隐蔽性,往往让网络信息泄密变得不容易被发现。本文分析了网络嗅探的原理,分析了一些实例,提出解决方案和介绍实践经验。
一 嗅探器攻击原理
嗅探器(sniffer) 是利用计算机的网络接口截获目的地为其他计算机的数据报文的一种技术。它工作在网络的底层,把网络传输的全部数据记录下来. 嗅探器可以帮助网络管理员查找网络漏洞和检测网络性能。嗅探器可以分析网络的流量,以便找出所关心的网络中潜在的问题。
不同传输介质的网络的可监听性是不同的。一般来说,以太网被监听的可能性比较高,因为以太网是一个广播型的网络;FDDI Token被监听的可能性也比较高,尽管它并不是一个广播型网络,但带有令牌的那些数据包在传输过程中,平均要经过网络上一半的计算机;微波和无线网被监听的可能性同样比较高,因为无线电本身是一个广播型的传输媒介,弥散在空中的无线电信号可以被很轻易的截获。一般情况下,大多数的嗅探器至少能够分析下面的协议:
标准以太网
TCP/IP
IPX
DECNET
FDDI Token
微波和无线网。
实际应用中的嗅探器分软、硬两种。软件嗅探器便宜易于使用,缺点是往往无法抓取网络上所有的传输数据(比如碎片),也就可能无法全面了解网络的故障和运行情况;硬件嗅探器的通常称为协议分析仪,它的优点恰恰是软件嗅探器所欠缺的,但是价格昂贵。目前主要使用的嗅探器是软件的。
嗅探器捕获真实的网络报文。嗅探器通过将其置身于网络接口来达到这个目的--例如将以太网卡设置成杂收模式。数据在网络上是以帧(Frame)的单位传输的。帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上。通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧的到达,然后对其进行存储。就是在这个传输和接收的过程中,每一个在LAN上的工作站都有其硬件地址。这些地址唯一地表示着网络上的机器。当用户发送一个报文时,这些报文就会发送到LAN上所有可用的机器。在一般情况下,网络上所有的机器都可以"听"到通过的流量,但对不属于自己的报文则不予响应。如果某在工作站的网络接口处于杂收模式,那么它就可以捕获网络上所有的报文和帧,如果一个工作站被配置成这样的方式,它(包括其软件)就是一个嗅探器。这也是嗅探器会造成安全方面的问题的原因。通常使用嗅探器的入侵者,都必须拥有基点用来放置嗅探器。对于外部入侵者来说,能通过入侵外网服务器、往内部工作站发送木马等获得需要,然后放置其嗅探器,而内部破坏者就能够直接获得嗅探器的放置点,比如使用附加的物理设备作为嗅探器(例如,他们可以将嗅探器接在网络的某个点上,而这个点通常用肉眼不容易发现。除非人为地对网络中的每一段网线进行检测,没有其他容易方法能够识别出这种连接(当然,网络拓扑映射工具能够检测到额外的IP地址)。
嗅探器可能造成的危害:
嗅探器能够捕获口令;
能够捕获专用的或者机密的信息;
可以用来危害网络邻居的安全,或者用来获取更高级别的访问权限;
分析网络结构,进行网络渗透。
二 嗅探器攻击实例
Linux、Unix环境下的嗅探器有:Tcpdump、Nmap、Linuxsniffer、hunt、sniffit 等。Linsniffer是一个简单实用的嗅探器。它主要的功能特点是用来捕捉用户名和密码,它在也这方面非常出色。注:编译该软件需要所在的Linux系统上必须的网络包含文件(tvp.h、ip.h、inet.hif_t、her.h)。 虽然这个工具易于使用,但是Linsniffer需要完整的IP头文件,包括常常存储在/usr/include/net和 /usr/include/netinet的头文件,在编译前确保PATH变量包含/usr/include。
获得这个软件后,进入src目录,使用下面的命令来编译Linsniffer: $ cc linsniffer.c -o linsniffer
要运行Linsniffer,使用下面的命令:$ linsniffer
启动以后linsniffer将创建一个空文件:tcp.log来存储嗅探结果。
举例说明,在一台测试的Linux服务器中创建一个名为“goodcjh”的用户,密码为“fad”。然后在主机CJH上使用该用户来登录这台Linux服务器,并进行一些常见的用户操作。下面是进行的一次ftp过程:
CJH$ ftp www.red.net
Connected to www.red.net.
220 www.red.net FTP server Wed Aug 19 02:55:52 MST 2002) ready.
Name (www.red.net:root): goodcjh
331 Password required for goodcjh.
Password:
230 User goodcjh logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -al
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 14
drwxrwxr-x 4 goodcjh goodcjh 1024 May 20 19:35 .
drwxr-xr-x 6 root root 1024 May 20 19:28 ..
-rw-rw-r-- 1 goodcjh goodcjh 96 May 20 19:56 .bash_history
-rw-r--r-- 1 goodcjh goodcjh 49 Nov 25 2002 .bash_logout
-rw-r--r-- 1 goodcjh goodcjh 913 Nov 24 2002 .bashrc
-rw-r--r-- 1 goodcjh goodcjh 650 Nov 24 2002 .cshrc
-rw-r--r-- 1 goodcjh goodcjh 111 Nov 3 2002 .inputrc
-rwxr-xr-x 1 goodcjh goodcjh 186 Sep 1 2002 .kshrc
-rw-r--r-- 1 goodcjh goodcjh 392 Jan 7 2002 .login
-rw-r--r-- 1 goodcjh goodcjh 51 Nov 25 2002 .logout
-rw-r--r-- 1 goodcjh goodcjh 341 Oct 13 2002 .profile
-rwxr-xr-x 1 goodcjh goodcjh 182 Sep 1 2002 .profile.ksh
drwxr-xr-x 2 goodcjh goodcjh 1024 May 14 12:16 .seyon
drwxr-xr-x 3 goodcjh goodcjh 1024 May 14 12:15 lg
226 Transfer complete.
ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 14
drwxrwxr-x 4 goodcjh goodcjh 1024 May 20 19:35 .
drwxr-xr-x 6 root root 1024 May 20 19:28 ..
-rw-rw-r-- 1 goodcjh goodcjh 96 May 20 19:56 .bash_history
-rw-r--r-- 1 goodcjh goodcjh 49 Nov 25 2002 .bash_logout
-rw-r--r-- 1 goodcjh goodcjh 913 Nov 24 2002 .bashrc
-rw-r--r-- 1 goodcjh goodcjh 650 Nov 24 2002 .cshrc
-rw-r--r-- 1 goodcjh goodcjh 111 Nov 3 2002 .inputrc
-rwxr-xr-x 1 goodcjh goodcjh 186 Sep 1 2002 .kshrc
-rw-r--r-- 1 goodcjh goodcjh 392 Jan 7 2002 .login
-rw-r--r-- 1 goodcjh goodcjh 51 Nov 25 2002 .logout
-rw-r--r-- 1 goodcjh goodcjh 341 Oct 13 2002 .profile
-rwxr-xr-x 1 goodcjh goodcjh 182 Sep 1 2002 .profile.ksh
drwxr-xr-x 2 goodcjh goodcjh 1024 May 14 12:16 .seyon
drwxr-xr-x 3 goodcjh goodcjh 1024 May 14 12:15 lg
226 Transfer complete.
ftp> ls -F
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 14
drwxrwxr-x 4 goodcjh goodcjh 1024 May 20 19:35 ./
drwxr-xr-x 6 root root 1024 May 20 19:28 ../rw-rw-r-- 1 goodcjh goodcjh 96 May 20 19:56 .bash_history
-rw-r--r-- 1 goodcjh goodcjh 49 Nov 25 2002 .bash_logout
-rw-r--r-- 1 goodcjh goodcjh 913 Nov 24 2002 .bashrc
-rw-r--r-- 1 goodcjh goodcjh 650 Nov 24 2002 .cshrc
-rw-r--r-- 1 goodcjh goodcjh 111 Nov 3 2002 .inputrc
-rwxr-xr-x 1 goodcjh goodcjh 186 Sep 1 2002 .kshrc*
-rw-r--r-- 1 goodcjh goodcjh 392 Jan 7 2002 .login
-rw-r--r-- 1 goodcjh goodcjh 51 Nov 25 2002 .logout
-rw-r--r-- 1 goodcjh goodcjh 341 Oct 13 2002 .profile
-rwxr-xr-x 1 goodcjh goodcjh 182 Sep 1 2002 .profile.ksh*
drwxr-xr-x 2 goodcjh goodcjh 1024 May 14 12:16 .seyon/
drwxr-xr-x 3 goodcjh goodcjh 1024 May 14 12:15 lg/
226 Transfer complete.
ftp> cd lg
250 CWD command successful.
ftp> ls -F
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 8
drwxr-xr-x 3 goodcjh goodcjh 1024 May 14 12:15 ./
drwxrwxr-x 4 goodcjh goodcjh 1024 May 20 19:35 ../rw-r--r-- 1 goodcjh goodcjh 70 Aug 22 2002 lg3_colors
-rw-r--r-- 1 goodcjh goodcjh 629 Aug 22 2002 lg3_prefs
-rw-r--r-- 1 goodcjh goodcjh 728 Aug 22 2002 lg3_soundPref
-rw-r--r-- 1 goodcjh goodcjh 2024 Aug 22 2002 lg3_startup
drwxr-xr-x 2 goodcjh goodcjh 1024 May 14 12:15 lg_layouts/
226 Transfer complete.
ftp> cd lg_layouts
250 CWD command successful.
上面是一个典型的用户操作过程。现在我们看看Linsniffer产生的嗅探结果:
CJH => www.red.net [21]
USER goodcjh
PASS fad
SYST
PORT 172,16,0,1,4,192
LIST -al
PORT 172,16,0,1,4,193
LIST
PORT 172,16,0,1,4,194
LIST -F
CWD lg
PORT 172,16,0,1,4,195
LIST -F
输出的内容是很直观的。首先它记录这是从主机 CJH 到 Linux 主机 www.red.net 的 FTP 连接:主机 CJH => linux.red.net [21]。然后,Linsniffer 捕获了 goodcjh 的用户名和密码。最后,Linsniffer 记录了用户 goodcjh 使用的每一个命令:
SYST
PORT 172,16,0,1,4,192
LIST -al
PORT 172,16,0,1,4,193
LIST
PORT 172,16,0,1,4,194
LIST -F
CWD lg
PORT 172,16,0,1,4,195
LIST -F
可见,Linsniffer 的输出结果非常简洁,并且非常适于窃听密码及记录常见的活动。但缺点是不适合于进行更加复杂的分析。
嗅探器可以帮助网络管理员查找网络漏洞和检测网络性能。嗅探器是一把双刃剑,它也有很大的危害性。嗅探器的攻击非常普遍。一个位置好的嗅探器可以捕获成千上万个口令。1994年一个最大的嗅探器攻击被发现. 这次攻击被认为是危害最大的一次,许多可以FTP,Telnet或远程登陆的主机系统都受到了危害。在这件事故(攻击者处于Rahul.net)中,嗅探器只运行18小时。在这段时间里,有几百台主机被泄密。“受攻击者包括268个站点,包括MIT、美国海军和空军、Sun、IBM、NASA、和加拿大、比利时大学一些主机……”
三 嗅探器的安全防范
1、检测嗅探器。
检测嗅探器可以采用检测混杂模式网卡的工具。由于嗅探器需要将网络中入侵的网卡设置为混杂模式才能工作,能够检测混杂模式网卡的AntiSniff是一个工具。软件可以在http://www.l0pht.com/antisniff/下载,另外还有详细的使用说明。
证明你的网络有嗅探器有两条经验:
网络通讯丢包率非常高: 通过一些网管软件,可以看到信息包传送情况,最简单是ping命令。它会告诉你掉了百分之多少的包。如果你的网络结构正常,而又有20%-30%数据包丢失以致数据包无法顺畅的流到目的地。就有可能有人在监听,这是由于嗅探器拦截数据包导致的。
网络带宽出现反常:通过某些带宽控制器,可以实时看到目前网络带宽的分布情况,如果某台机器长时间的占用了较大的带宽,这台机器就有可能在监听。应该也可以察觉出网络通讯速度的变化。
对于SunOS、和其它BSD Unix系统可以使用lsof(该命令显示打开的文件)来检测嗅探器的存在。lsof的最初的设计目地并非为了防止嗅探器入侵,但因为在嗅探器入侵的系统中,嗅探器会打开其输出文件,并不断传送信息给该文件,这样该文件的内容就会越来越大。如果利用lsof发现有文件的内容不断的增大,我们就怀疑系统被嗅探。因为大多数嗅探器都会把截获的"TCP/IP"数据写入自己的输出文件中。这里可以用:ifconfig le0检查端口.然后用:
#/usr/sbin/lsof >test
#vi test 或 grep [打开的端口号]
检测文件大小的变化。
注意如果你确信有人接了嗅探器到自己的网络上,可以去找一些进行验证的工具。这种工具称为时域反射计量器(Time Domaio Reflectometer,TDR)。TDR对电磁波的传播和变化进行测量。将一个TDR连接到网络上,能够检测到未授权的获取网络数据的设备。不过很多中小公司没有这种价格昂贵的工具。
2、将数据隐藏,使嗅探器无法发现。
嗅探器非常难以被发现, 因为它们是被动的程序一个老练的攻击者可以轻易通过破坏日志文件来掩盖信息。它们并不会给别人留下进行核查的尾巴.。完全主动的解决方案很难找到,我们可以采用一些被动的防御措施:
安全的拓扑结构;
会话加密;
用静态的ARP或者IP-MAC对应表代替动态的。
安全的拓扑结构:
嗅探器只能在当前网络段上进行数据捕获。这就意味着,将网络分段工作进行得越细,嗅探器能够收集的信息就越少。但是,除非你的公司是一个ISP,或者资源相对不受限制,否则这样的解决方案需要很大的代价。网络分段需要昂贵的硬件设备。有三种网络设备是嗅探器不可能跨过的:交换机、路由器、网桥。我们可以通过灵活的运用这些设备来进行网络分段。大多数早期建立的内部网络都使用HUB集线器来连接多台工作站,这就为网络中数据的泛播(数据向所有工作站流通),让嗅探器能顺利地工作提供了便利。普通的嗅探器程序只是简单地进行数据的捕获,因此需要杜绝网络数据的泛播。 随着交换机的价格下降,网络改造变得可行且很必要了。不使用HUB而用交换机来连接网络,就能有效地避免数据进行泛播,也就是避免让一个工作站接收任何非与之相关的数据。 对网络进行分段,比如在交换机上设置VLAN,使得网络隔离不必要的数据传送。一般可以采用20个工作站为一组,这是一个比较合理的数字。然后,每个月人为地对每段进行检测(也可以每个月采用MD5随机地对某个段进行检测)。网络分段只适应于中小的网络。如果有一个500个工作站的网络,分布在50个以上的部门中,那么完全的分段的成本上是很高的。
会话加密:
会话加密提供了另外一种解决方案。不用特别地担心数据被嗅探,而是要想办法使得嗅探器不认识嗅探到的数据。这种方法的优点是明显的:即使攻击者嗅探到了数据,这些数据对他也是没有用的。S/key和其它一次性口令技术一样,使窃听帐号信息失去意义。S/key的原理是远程主机已得到一个口令(这个口令不会在不安全的网络中传输),当用户连接时会获得一个"挑战"(challenge)信息,用户将这个信息和口令经过某个算法运算,产生正确的"响应"(response)信息(如果通讯双方口令正确的话)。这种验证方式无需在网络中传输口令,而且相同的"挑战/响应"也不会出现两次。S/key可从以下网址得到:ftp://thumper.bellcore.com/pub/nmh/skey。它的缺点是所有帐号信息都存放在一台主机中,如果该主机被入侵,则会危及整个网络安全。另外配置它也不是一件简单的事情。Kerberos包括流加密rlogind和流加密telnetd等,它可以防止入侵者捕获用户在登录完成后所进行的操作。 在加密时有两个主要的问题:一个是技术问题,一个是人为问题。
技术是指加密能力是否高。例如,64位的加密就可能不够,而且并不是所有的应用程序都集成了加密支持。而且,跨平台的加密方案还比较少见,一般只在一些特殊的应用之中才有。人为问题是指,有些用户可能不喜欢加密,他们觉得这太麻烦。用户可能开始会使用加密,但他们很少能够坚持下。总之我们必须寻找一种友好的媒介-使用支持强大这样的应用程序,还要具有一定的用户友好性。使用secure shell、secure copy或者IPV6协议都可以使得信息安全的传输。传统的网络服务程序,SMTP、HTTP、FTP、POP3和Telnet等在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,嗅探器非常容易就可以截获这些口令和数据.SSH的英文全称是Secure Shell。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间服务器"这种攻击方式就不可能实现了,而且也能够防止DNS和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替telnet,又可以为ftp、pop、甚至ppp提供一个安全的"通道"。SSH绑定在端口22上,其连接采用协商方式使用RSA加密。身份鉴别完成之后,后面的所有流量都使用IDEA进行加密。SSH(Secure Shell)程序可以通过网络登录到远程主机并执行命令。SSH的加密隧道保护的只是中间传输的安全性,使得任何通常的嗅探工具软件无法获取发送的内容。它提供了很强的安全验证可以在不安全的网络中进行安全的通信.所以它是防范嗅探器的一种方法。
用静态的ARP或者IP-MAC对应表代替动态的ARP或者IP-MAC对应表。
该措施主要是进行渗透嗅探的防范,采用诸如ARP欺骗手段能够让入侵者在交换网络中顺利完成嗅探。网络管理员需要对各种欺骗手段进行深入了解,比如嗅探中通常使用的ARP欺骗,主要是通过欺骗进行ARP动态缓存表的修改。在重要的主机或者工作站上设置静态的ARP对应表,比如win2K系统使用arp命令设置,在交换机上设置静态的IP-MAC对应表等,防止利用欺骗手段进行嗅探的手法。
除了以上三点另外还要重视重点区域的安全防范 。这里说的重点区域,主要是针对嗅探器的放置位置而言。入侵者要让嗅探器发挥较大功效,通常会把嗅探器放置在数据交汇集中区域,比如网关、交换机、路由器等附近,以便能够捕获更多的数据。因此,对于这些区域就应该加强防范,防止在这些区域存在嗅探器。
四 防范嗅探器应用案例
1、Linux下SSH安装
在www.ssh.com,下载最新版本软件包SSH2,最好下载源程序软件包自己进行编译。
# tar -zxvf ssh2-2.4.0.tar.gz
# cd ssh2-2.4.0
# ./configure ;# make ;#make install
这一过程实际上将服务器软件包及客户端软件一起安装了,不必再次安装客户端软件包。 安装程序将SSH2软件包安装在/usr/local/bin及/usr/local/sbin下。
2、配置
SSH的配置文件在/etc/ssh2下,其中包括sshd2的主机公钥和私钥:hostkey和hostkey.pub。这两个文件通常是在安装SSH时自动生成的。你可以通过下面的命令重新来生成它们:(而ssh2_config 文件一般情形下无需修改)
# rm /etc/ssh2/hostkey*
# ssh-keygen2 -P /etc/ssh2/hostkey
3、启动SSH服务器
在UNIX/Linux环境下,服务器程序放置在/usr/local/sbin目录下,启动方法如下:
# sshd
# ps x
如果不希望每次重启动系统,都要手工运行启动,在rc.local中加入一行/usr/local/sbin/sshd。
4、使用SSH
安装好ssh之后,我们可以很方便地在远程服务器上利用ssh获得一个shell。例如,假设我执行:
# ssh cjh@red.forge.net
首先看到系统提示输入密码,输入后我就在远程机器上获得了一个shell。从这里开始,ssh的会话过程和telnet会话相似。但SSH能够确信所有在我和服务器之间传输的数据都已经经过加密。如果你很熟悉rsh和它的选项,那么你很快就可以开始使用ssh。ssh被设计成和rsh具有相同的运作方式。一般情况下,能够用rsh作为传输端口的程序都允许用ssh来替代(例如rsync)。安全复制命令scp的用法也很简单,它的语法和cp的语法很相似。例如,要把my.php文件复制到cjh.org服务器,则我们使用如下命令:
# scp my.php cjh@cjh.org:/usr/local/apache/htdocs/
此时,我们将看到密码输入提示(正如ssh)。接下来,本地机器当前目录下的my.php文件被复制到cjh.org的/usr/local/apache/htdocs/,使用的登录名字是cjh。从使用上看,与Telnet没有什么不同之处。而且有了SSH客户端软件,如果你要上传文件,不必向以前一样再开一个FTP窗口,再次认证,然后上传文件。使用SSH客户端自带的scp工具,就可以直接将文件上传到远端服务器上。
scp命令是SSH中最方便有用的命令,如果告诉你在两台服务器之间直接传送文件,仅用scp-个命令就完全解决.你可以在一台服务器上以root身份运行:
#scp servername:/home/ftp/pub/file1./
这样就把另一台服务器上的文件/home/ftp/pub/file1直接传到本机器的当前目录下。
以上我们讲的是技术方面,对于网络的安全,管理显得格外重要。除网络管理员外其他人员禁止在网络中使用任何嗅探工具包括一些企业高级管理人员,是完全有必要的。这能从制度上明确限制一些工作站主动使用嗅探器的情况。
对于网络管理员来说更重要的是要建立安全意识,了解你的用户(系统管理员越熟悉自己的用户和用户的工作习惯,就越能快速发现不寻常的事件,而不寻常的事件往往意味着系统安全问题。)、定期检查你网络中的重点设备如服务器,交换机,路由器。最好配备一些专业工具比如前边介绍的TDR。网络管理员还要给用户提供安全服务。对用户要定期发送安全邮件,发送邮件是让用户具有安全意识。管理意识是提高安全性的另-个重要因素。如果用户的管理部门对安全要求不强烈,只靠系统管理员也不行。最好让管理部门建立一套每个人都必须遵守的安全标准,如果系统管理员在此基础再建立自己的安全规则,就强化了安全。管理有助于加强用户意识,让用户明确,信息是有价值的资产。系统管理员应当使安全保护方法对用户尽可能地简单,提供一些提高安全的工具。网络管理员要建立合理的用户痛苦量(痛苦量是指安全限制引起的抵制的函数),不能仅仅从技术上考虑问题,还要站在用户的观点上考虑。例如,我们能够想每次Macintosh用户登录时都使用S/Key吗?用户知道的关于安全的知识越多,网络安全就更有保障。
五 总结
嗅探器技术被广泛应用于网络维护和管理方面,它工作的时候就像一部被动声纳,默默的接收看来自网络的各种信息,通过对这些数据的分析,网络管理员可以深入了解网络当前的运行状况,以便找出网络中的漏洞。在网络安全日益被注意的今天.我们不但要正确使用嗅探器.还要合理防范嗅探器的危害.嗅探器能够造成很大的安全危害,主要是因为它们不容易被发现。对于一个安全性要求很严格的企业,在使用技术防范的同时安全管理的制度建设也是非常重要的。
嗅探器技术并非尖端科技,只能说是安全领域的基础课题。对嗅探器技术的研究并不要求太多底层的知识,它并不神秘。实际上我们的一些网管软件,和一些网络测试仪都使用了嗅探器技术。只是许多计算机软件供应商对其一直讳莫如深。回避这个基本事实是不明智的。了解掌握它才是关键。这也笔者的写作动机。