论文关键词:嗅探器 数据包 协议栈 以太网
论文摘要:Sniffer是一种强大的网络分析工具,它集成了很多可以有力解决网络问题的功能。Sniffer可以实时地列出流经多个网卡(包括Modem,ISDN,ADSL)的数据包,它还支持基于某些应用的数据包捕捉。通过它,你可以获得你所感兴趣的某个应用的所有网络流量。
今天,Sniffer成为了网络监控器和网络分析器的专用名词,它通常还代表收集数据和信息的方法。ISS把它这样定义:Sniffer是一种利用自身网络接口来对目的地是其它计算机的数据包进行捕捉的一种工具。
本文介绍并研究了Sniffer相关技术,重点是在Linux系统下如何实现Sniffer并获得相关数据包,并且详细介绍了Linux环境下Sniffer的实现过程。通过阅读本论文,您会对Sniffer有大致的了解,还可以得知如何在Linux系统环境下实现一个Sniffer的详细过程。同时,本文还简略介绍TCP/IP协议栈和Sniffer实现过程的关系,详尽分析了TCP/IP中各个层次。
第一章 Sniffer简介
1.1 什么是Sniffer ?
Sniffer又叫“嗅探器”,是一种威胁性极大的被动攻击工具。使用这种工具,可以监视网络的状态、数据流动情况以及网络上传输的信息。当信息以明文的形式在网络上传输时,便可以使用网络监听的方式来进行攻击。黑客们常常利用它来截获用户私人信息,网络管理员也常常用它来监视网络状态,分析网络流量,排除网络故障等。Sniffer分为软件和硬件两种,软件的Sniffer有 NetXray、Packetboy、Net monitor等,其优点是物美价廉,易于学习使用,同时也易于交流;缺点是无法抓取网络上所有的传输,某些情况下也就无法真正了解网络的故障和运行情况。硬件的Sniffer通常称为协议分析仪,一般都是商业性的,价格也比较贵。
ISS ( Int ernetS ecurityS ystem)为Sniffer这样定义:Sniffer是利用计算机的网络接口截获目的地为其他计算机的数据报文的一种工具。我们一般认为Sniffer是指在运行以太网协议、TCP/ IP协议、IPX协议或者其他协议的网络上,可以攫取网络信息流的软件或硬件。Sniffer早期主要是分析网络的流量,以便找出所关心的网络中潜在的问题。Sniffer的存在对网络系统管理员是至关重要的,网络系统管理员通过Sniffer可以诊断出大量的不可见模糊问题(如网络瓶颈、错误配置等),监视网络活动,完善网络安全策略,进行行之有效的网络管理。
众所都知,在以太网中,所有的通讯都是广播的,也就是说通常在同一个网段的所有网络接口都可以访问在物理媒体上传输的所有数据,在正常的情况下,一个网络接口应该只响应单播和广播两种数据帧。对于网卡,一般都具备“正常模式”和“混杂模式”两种模式。网卡在“混杂模式”下可以接收非本地址的数据帧。
所以,简单说来,Sniffer就是在网卡处于“混杂模式”下,捕捉流经本网卡的所有数据包,并根据接收到的数据包,来进行一些应用,例如流量控制等。
1.2 Sniffer的应用
在内部网上,黑客要想迅速获得大量的账号(包括用户名和密码),最为有效的手段是使用 "sniffer" 程序。这种方法要求运行Sniffer 程序的主机和被监听的主机必须在同一个以太网段上,并且要求要以root用户登陆,运行成功,就能够监听到本以太网段上的数据流。黑客会使用各种方法,获得系统的控制权并留下再次侵入的后门,以保证sniffer能够执行。大多数 "ethernet sniffer"程序在后台运行,将结果输出到硬盘存储上的某个记录文件中。
Internet是由众多的局域网所组成,这些局域网一般是以太网、令牌网的结构。数据在这些网络上是以很小的称为帧(Frame)的单位传输的,帧通过特定的网络驱动程序进行成型,然后通过网卡发送到网线上。由于以太网等很多网络(常见共享HUB连接的内部网)是基于总线方式,物理上是广播的,同一物理网段的所有主机的网卡都能接收到这些以太网帧。当网络接口处于正常状态时,网卡收到传输来的数据帧,网卡内的芯片程序先接收数据头的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,如果认为是目的地址为本机地址的数据帧或是广播帧,则接收并在接收后产生中断信号通知CPU,否则就丢弃不管,CPU得到中断信号产生中断,操作系统就根据网卡驱动程序中设置的网卡中断程序地址调用驱动程序接收数据,驱动程序接收数据后放入信号堆栈让操作系统处理。通过修改网卡存在一种特殊的工作模式,在这种工作模式下,网卡不对目的地址进行判断,而直接将它收到的所有报文都传递给操作系统进行处理。这种特殊的工作模式,称之为混杂模式(Promiscuous Mode).
Sniffer就是通过将网卡设置为混杂模式,它对遇到的每一个帧都产生一个硬件中断以便提醒操作系统处理流经该物理媒体上的每一个报文包。Sniffer工作在网络环境中的底层,它会拦截所有的正在网络上传送的数据,并且通过相应的软件处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体布局。
另外,Sniffer一个更重要的作用就是进行网络监控。Sniffer通过捕捉流经本主机的所有数据包,然后对这些捕捉的数据包进行上层分析,进而得出关于网络流量等信息,为网络管理员做出某些决策提供证据。一般用户管理员会在服务器上运行一个Sniffer,通过捕捉数据包,然后进行详尽分析,就可以得到一些信息,例如,哪些主机在和服务器网络通信,这些主机分别在服务器上做了哪些操作。得到这些信息后,系统管理员就可以做一些决策,使得本服务器更加安全。
一般来说,snifer可以截获的不仅仅是用户的ID和口令,它还可以截获敏感的经济数据(如信用卡号)、秘密的信息(E—mail)和专有信息。基于入侵者可利用的资源,一个Sniffer可能截获网络上所有的信息。从sniffer上可以得到所有的信息,只要你有足够的存储空间。近年来.sniffer技术出现了新的重要特征。传统的sniffer技术是被动地监听网络通信、用户名和口令。新的snifer技术出现了主动地控制通信数据的特点.把sniffer技术扩展到了一个新的领域。sniffer既可以作为网络故障的诊断工具,也可以作为黑客嗅探和监听的工具。sniffer技术除了目前在传统的网络侦测管理外,也开始被应用在资讯保全的领域。可以这样说,snifer技术是一把双刃剑,如何更好地利用它,了解它的一些特性,这将为我们带来便利。
目前Sniffer工具的应用一般分为以下几个方面:
1. 分布式Sniffer系统(Sniffer Distributed): 分布式的Sniffer系统适用于管理大型企业网络或远距离的由多个网络段组成的网络。它由一个或数个中心控制台以及多个Sniffer服务器组成,每个Sniffer服务器可以放在一个网络段中,自动监视网络情况。每个Sniffer服务器都具有一个IP地址,可以和中心控制台通信,服务器根据中心控制台的命令实时监视分析网络,并将分析结果返回给中心控制台分布式系统,通过中央控制平台和分布全网的网络分析(Distributed Sniffer System, DSS)全天候地监控整个网络的运行情况。
2. 远程监测的分布式Sniffer系统(DSS/RMON): 通过结合中央控制平台与分布全网的网络分析器,同步收集RMON2统计数据,全天候地监控整个网络运行情况,主要包括分布式远程监控分析器(DSS/RMON Analysis Software)和分布式远程监控服务器(DSS/RMON Server), DSS/RMON探测器对OSI模型的七层结构均进行分析,直接监控网络状态,并把收集到的数据通过网络送达服务器,管理员则可在远端通过网络连接到服务器实现对网络的远程控制。
3. Web技术: Web技术与网络管理技术相结合,是网络管理发展的新趋势,基于Web的网络管理系统允许管理员在网络的任何位置,通过Web浏览器访问具有网络管理功能的服务器,进行网络管理;Web浏览器对计算机的硬件要求很低管理员依靠简单、廉价的计算平台就能访问具有管理功能的代理服务器。同样也可以将Web技术和Sniffer技术相结合,为用户提供一个用于管理互联网流量的完整的端到端视图。
4. 在交换环境下Sniffer的使用: 共享连接的局域网是基于总线方式,物理上是广播的,同一物理网段的所有主机的网卡都能接收到这些以太网帧。交换机(switch)采用交换方式来传输数据,这样一台机器就无法得到与他无关的网络数据了。为了允许网络管理人员在switch环境下仍让可以得到其他任何一台机器的网络数据,采用了端口镜像技术(Port mirroring)。交换机就会把所有的网络数据都向该端口复制一份。这样在该端口上的机器就和以前一样,能够得到任何数据了。现在大多数switch产品都支持此项技术。
5. 结合人工智能技术: 利用Sniffer“专家分析”技术(Expert Analysis),专家系统能够自动检测诸如拒绝连接、吞吐量降低等多种网络故障征兆,并且及时地阻止其发展成为致命的网络性能问题,并且能够根据当有们狗网络运行状况提出优化方案,以提高网络的运行效率,给出智能管理方案。同时具有学习与主动发觉网络问题的能力。当一个网络异常被发现时,立刻正确地指出其原因以便帮助去解决它。
6. Sniffer无线解决方案(Sniffer Wireless网络分析器): Sniffer无线解决方案高效率设计构建起一个精密而安全的无线LAN基础架构。
1.3 常用Sniffer系统简介
Sniffer 可分软、硬两种,软件Sniffer有它的优点,价格成本相对较低,易于学习使用,同时也易于交流,缺点是无法抓取网络上所有的传输,比如碎片、fragment, short event等等,某些情况下也就无法真正了解网络的故障和运行情。硬件的Sniffer通常称为协议分析仪,一般都比较贵的,商用化的工具产品如美国网络联盟公司的Sniffer网络协议分析仪。以下是当前比较流行的
Sniffer软件。
表1.1 比较流行的Sniffer软件
因为Sniffer工具比较多,所以还存在很多其他的Sniffer工具,在此,我们仅详细介绍Ethereal和tcpdump两种常用的Sniffer工具。
Ethereal是一个开放源码的网络分析系统,也是是目前最好的开放源码的网络协议分析器,支持Linux和windows平台。Ethereal起初由Gerald Combs开发,随后由一个松散的etheral团队组织进行维护开发。它目前所提供的强大的协议分析功能完全可以媲美商业的网络分析系统,自从1998年发布最早的0.2版本至今,大量的志愿者为ethereal添加新的协议解析器,如今ethereal已经支持五百多种协议解析。很难想象如此多的人开发的代码可以很好的融入系统中;并且在系统中加入一个新的协议解析器很简单,一个不了解系统的结构的新手也可以根据留出的接口进行自己的协议开发。这都归功于ehereal良好的设计结构。事实上由于网络上各种协议种类繁多,各种新的协议层出不穷。一个好的协议分析器必需有很好的可扩展性和结构。这样才能适应网络发展的需要不断加入新的协议解析器。
tcpdump是linux平台下一个很重要的Sniffer工具,作为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的工具之一。tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的 FreeBSD系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。
1.4 Sniffer技术发展状况
当前将Sniffer技术应用在网络管理中还不是十分的普遍,即使己经在网络管理中使用了Sniffer技术,其也是处于一种辅助的、次要的位置,在表1.1中的产品,大部分都是孤立的Sniffer技术的产品,少有真正实现Sniffer技术和网络管理的集成,形成一个完善的功能强大的Sniffer网络管理系统。
在Snif fer技术的发展和应用中, Sniffer技术公司(Sniffer Technologies)起到了巨大的推动作用,Sniffer技术公司的品牌和方法己经成为监控局域网和广域网性能的事实工业标准,提出和实现了许多Sniffer技术的热点研究方向和行之有效的网络管理解决方案,在创新技术与解决方案领域领先于市场和同类公司。Sniffer技术公司是全球第五大软件公司美国网络联盟(Network Associates,Inc.简称NAI)下属的一家分公司,专门提供各种网络和应用程序管理解决方案,占领着世界80%的市场份额。在Sniffer技术的基础之上,Sniffer技术公司结合分布式、人工智能、远程监视、无线LAN等技术推出了一系列的Sniffer网络管理产品。该公司的”Sniffer网络全视野”(Sniffer Total Network Visiblity简称TVN)是一套端对端的优化网络性能和确保网络运行的智能管理解决方案,包括Sniffer Basic、Sniffer Pro Lan, Sniffer ProWan. Sniffer Pro HighSpeed组成的便携式分析套件和分布式分析套件。除了Sniffer技术公司的Sniffer产品外,还有一些公司的产品,它们的功能和应用范围一般非常有限或用于一些专用的设备,推广不如Sniffer技术公司。
1.5 为什么要实现此系统?
在linux平台下,tcpdump作为一种很常用的Sniffer工具,功能很强大,但是有一个比较大的缺点,就是界面不够友好,不太方面用户操作,尤其是对计算机知识不太熟悉的普通用户。
基于以上原因,我以此作为研究课题,目标就是能够做出一个界面类似Ethereal的Sniffer工具,以方便用户操作。
第二章 Sniffer 和 TCP/IP 之间的关系
2.1 Sniffer和TCP/IP关系
Sniffer和TCP/IP关系非常紧密,Sniffer的实现是严格按照TCP/IP的层次关系实现的。一般来说,Sniffer可以解析的各种协议在TCP/IP协议栈中都有定义和实现,现在最常用的Ethereal工具支持可达500种协议。
Sniffer一般从上到下包括抓包模块,解析模块,应用模块这三个模块,之间的关系如图2.1所示。
图2.1 Sniffer和TCP/IP协议栈关系
2.2 TCP/IP 的层次结构
TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议,又叫网络通讯协议,这个协议是Internet国际互联网络的基础。TCP/IP是网络中使用的基本的通信协议。虽然从名字上看TCP/IP包括两个协议,传输控制协议(TCP)和网际协议(IP),但TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传输和电子邮件等,而TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说TCP/IP是Internet协议族,而不单单是TCP和IP.
internet实现互联的关键是TCP/IP协议。在internet内部,计算机之间互相发送信息包进行通信,TCP/IP协议对这种信息包的传输方式作了具体的规定。基于TCP/IP协议的服务很多,人们比较熟悉的有WWW服务,FTP服务,电子邮件服务,不太熟悉的有TFTP服务,NFS服务,Finger服务等等。这些服务都存在不同程度上的安全缺陷,当用户用防火墙保护站点时,就需要考虑该提供哪些服务,要禁止哪些服务。
TCP/IP协议簇主要包括四层,从上到下依次是应用层、运输层、网络层、链路层,它们之间层次关系如图2.2所示
图2.2 TCP/IP各层次关系
第三章 本系统的详细介绍
3.1 系统的各个模块
1. Capturer模块
功能描述:捕捉流过网卡的每个package,然后把此包写入文件Package.DAT,同时,把此包的size写入文件Table.DAT
相关模块: Display模块
通过”共享内存“两者通信,实现在Display模块可以通过命令控制Capturer的状态(暂停,停止,运行)
相关文件: Package.DAT,Table.DAT
2: Buffer模块
模块描述: 为了减少读写硬盘的次数,实现此缓冲区,此缓冲区大小 = 100 * 2048 (bytes),最多缓存100个Package。
相关模块: Display, Display模块直接从Buffer中调取数据,而不是直接读取硬盘来调取数据
相关文件: Package.DAT, Table.DAT
相关结构:
char Tab[TAB_SIZE] : Tab是一个Table,里面存放着各个package在文件Package.DAT的绝对偏 移量
3: Display模块
模块描述:此模块是程序中最重要的一个模块,通过此模块,用户可以以‘detail’和‘simple’模式查看包,另外,通过此模块还可以通过命令控制capturer的状态(暂停,运行,停止)
相关模块:
Capture : 在Display模块内控制Capturer的状态
Buffer : Display的数据都来自Buffer模块
Decode : 每个包经过“解包模块”后再显示出来
4: Decode
模块说明:即对每个package进行翻译,以直观的形式显示出来,这个模块里面又根据网络的层次对每一层的数据进行解析
相关模块:
Display :把解析的数据以直观的形式显示出来
3.2 各个模块的关系
图2.3用图形的方式展现了系统各个模块之间的关系,通过它,您可以看到以下内容:
1. 各个模块之间的关系
2. 数据的简单流向
图2.3 各模块的关系及数据流向
promiscuous模式,Promiscuous模式是指网络上的所有设备都对总线上传送的数据进行侦听,并不仅仅是它们自己的数据。
Decode模块以Capture模块接收到的数据作为输入进行拆包。接收模块所接受的包是未经过加工的原始数据包,因此,在此模块中要对数据进行拆包,得到用户传输的原始数据。
Display模块从拆包模块中得到输入。显示各个Package的简要信息或详尽信息,从而实现Snifer的网络监控和嗅探功能。
3.3 文件的组织结构
本系统具有可扩展性,编程采纳了软件工程思想,提供了可扩展性,具体文件介绍如下:
Capture.c : 本文件和抓包模块相关,负责抓取流经网卡的数据包,并存入硬盘中的包数据文件
Display.c : 本文件和显示模块、缓冲模块相关,由于特殊设计的原因,本模块完成以下“缓冲”和“显示”功能,另外,本模块编码也是系统中最难的部分,用到了相关的数据结构和算法。
net_card_ctrl.c:
本文件和网卡控制模块相关,作用就是控制网卡的模式,通过设置,可以使得网卡工作在“正常模式”和“混杂模式”
Decode_each_pack.c
:本文件主要和解码模块相关,可以对报文进行层次性解析,这也是本系统可扩展性的体现。
Eth.c : 本文件的作用是负责对ethernet层次的报文进行解码,显示一些信息,然后再把报文传递给它的下一层进行解析
Eth_header.h: 定义了ethernet报文头的格式及其相应的操作函数,为报文操作提供统一接口
ip.c : 本文件的作用是负责对ip报文层次的报文进行解码,显示一些信息,然后再把报文传递给它的下一层进行解析
ip_header.h: 定义了ip报文头的格式及其相应的操作函数,为报文操作提供统一接口
tcp.c :本文件的作用是负责对tcp报文层次的报文进行解码,显示一些信息,然后再把报文传递给它的下一层进行解析
tcp_header.h: 定义了tcp报文头的格式及其相应的操作函数,为报文操作提供统一接口
udp.c :本文件的作用是负责对udp报文层次的报文进行解码,显示一些信息,然后再把报文传递给它的下一层进行解析
udp_header.h: 定义了udp报文头的格式及其相应的操作函数,为报文操作提供统一接口
icmp.c :本文件的作用是负责对icmp报文层次的报文进行解码,显示一些信息,然后再把报文传递给它的下一层进行解析
icmp_header.h: 定义了icmp报文头的格式及其相应的操作函数,为报文操作提供统一接口
dhcp.c :本文件的作用是负责对dhcp报文层次的报文进行解码,显示一些信息,然后再把报文传递给它的下一层进行解析
dhcp_header.h: 定义了dhcp报文头的格式及其相应的操作函数,为报文操作提供统一接口
dns.c :本文件的作用是负责对dhcp报文层次的报文进行解码,显示一些信息,然后再把报文传递给它的下一层进行解析
dns_header.h: 定义了dns报文头的格式及其相应的操作函数,为报文操作提供统一接口
arp.c :本文件的作用是负责对arp报文层次的报文进行解码,显示一些信息,然后再把报文传递给它的下一层进行解析
arp_header.h: 定义了arp报文头的格式及其相应的操作函数,为报文操作提供统一接口
通过图2.4,您可以清晰看出程序文件的组织结构:
图2.4 文件组织结构
通过文件的组织层次结构,就可以看出来,各个协议都有自己的.c源文件和.h头文件,源文件主要实现解码功能,在它的相应的头文件中定义了本报文的格式和相应的处理函数。
通过文件的组织层次结构,还可以推断出来,随意的加入或者减少某个协议的解析是很简单的。例如,如果想加入对某个新协议的处理,那么只需要加入和这个相关的程序源程序和头文件。
3.4 本系统中的几个细节
在本系统的设计和实现过程中,数据结构和相关算法起到了很重要的作用,在这里,我们把这些细节详细列出,并给出对应的代码展示。
3.4.1 包数据的存取
被捕捉到的流经网卡的数据是以Package为单位的,当一个新的Package来到时,linux根据内部机制会发生中断,然后存入用户设定的缓冲区内,所以,我们要做的仅仅是这个缓冲区中取得所要的数据。
和Package相关的两个文件是:Package.DAT 和 Table.DAT。Package.DAT以二进制的形式存取捕捉到的包数据,Table.DAT存取各个包对应的大小信息,通过这两个文件,便可以任意取到任何的包数据。
Package.DAT存储包的二进制原始数据,所谓原始数据就是没有经过任何处理的字节流数据,之所以不进行任何处理的原因是增加数据的可用性,数据的原始性包括两个方面:
l 存储所有流经网卡的包,在此之前不进行任何过滤
l 对每个包的数据不进行任何处理
Table.DAT存储包的大小信息,存储方式也是采用二进制存储方式,每个包的大小可以用一个int类型数据表示,一个int数据就是四个字节,就是说,用4个字节来存储每个Package的大小信息。
这里举一个详细的例子来说明:假设截至到某时刻A,系统一共捕捉到了4个Package,这4个Package的大小信息分别为40 Bytes, 50 Bytes, 60 Bytes, 70 Bytes,则Package.DAT和Table.DAT的信息分别如图2.5 和 图2.6所示。这里我们做一个规定:Package的从0开始编号的,这一点和C语言中的数组一样。
Package.DAT的信息如图2.5所示:
图2.5 Package.DAT此刻的数据
根据此图,便可以得知,Package.DAT里面一共存储了220Bytes的数据,包括Pack0 = 40 Bytes, Pack1 = 50 Bytes, Pack2 = 60 Bytes, Pack3 = 70 Bytes
Table.DAT的信息如图2.6所示:
图2.6 Table.DAT此刻的数据
根据此图,便可以得知,Table.DAT里面一共存储了16Bytes的数据,包括Pack0的大小 = 40, Pack0的大小 = 50, Pack0的大小 = 60, Pack0的大小 = 70.
根据上面两个结构(或文件),再加上内存中的一个数组Tab[MAX],就可以算出任意编号的Package存储数据的绝对起始位移,算法如下:
例如:已知,Table.DAT中已经存放了4个package的size信息如下:
sizeof (pack_0) = 40 ;
sizeof (pack_1) = 50 ;
sizeof (pack_2) = 60 ;
sizeof (pack_3) = 70 ;
则Table的动作如下:
动作一:对应加载各个package的size
令 Tab[0] = 0 (便于以后算绝对偏移量)
Tab[1] = 40 ;
Tab[2] = 50 ;
Tab[3] = 60 ;
Tab[4] = 70
动作二:算出各个package在Package.DAT里的绝对偏移量和size大小
已知Tab[0]=0,Tab[1]=40,Tab[2]=50, Tab[3]=60,Tab[4]=70
执行:
for (i=0; i&<n; i++)
Tab[i+1] = Tab[i+1] + Tab[i] ;
则Tab[0]=0, Tab[1]=40, Tab[2]=90, Tab[3]=150, Tab[4]=220
offset(pack0)=0, size(pack0) = Tab[1] – Tab[0] = 40
Offset(pack1)=40, size(pack1) = Tab[2] – Tab[1] = 50
Offset(pack2)=90, size(pack2) = Tab[3] – Tab[2] = 60
Offset(pack3)=150, sizeof(pack3)=Tab[4] –Tab[3] = 70
…
Offset(packn)=Tab[n], sizeof(packn) = Tab[n+1] – Tab[n]
这样,经过计算之后,便可以得知任意一个Package的绝对起始位移,这样做的好处就是,可以快速取到任意一个Package的数据,提高系统效率。
与包的存取相关的核心代码如下(已经省略部分代码):