Sniffer,中文可以翻译为嗅探器,是一种基于被动侦听原理的网络分析方式。使用这种技术方式,可以监视网络的状态、数据流动情况以及网络上传输的信息。当信息以明文的形式在网络上传输时,便可以使用网络监听的方式来进行攻击。将网络接口设置在监听模式,便可以将网上传输的源源不断的信息截获。Sniffer技术常常被黑客们用来截获用户的口令,据说某个骨干网络的路由器网段曾经被黑客攻入,并嗅探到大量的用户口令。但实际上Sniffer技术被广泛地应用于网络故障诊断、协议分析、应用性能分析和网络安全保障等各个领域。
本文将详细介绍Sniffer的原理和应用。
一、Sniffer 原理
1.网络技术与设备简介
在讲述Sniffer的概念之前,首先需要讲述局域网设备的一些基本概念。
数据在网络上是以很小的称为帧(Frame)的单位传输的,帧由几部分组成,不同的部分执行不同的功能。帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上,通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧已到达,然后对其进行存储。就是在这个传输和接收的过程中,嗅探器会带来安全方面的问题。
每一个在局域网(LAN)上的工作站都有其硬件地址,这些地址惟一地表示了网络上的机器(这一点与Internet地址系统比较相似)。当用户发送一个数据包时,这些数据包就会发送到LAN上所有可用的机器。
如果使用Hub/即基于共享网络的情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的数据包则不予响应(换句话说,工作站A不会捕获属于工作站B的数据,而是简单地忽略这些数据)。如果某个工作站的网络接口处于混杂模式(关于混杂模式的概念会在后面解释),那么它就可以捕获网络上所有的数据包和帧。
但是现代网络常常采用交换机作为网络连接设备枢纽,在通常情况下,交换机不会让网络中每一台主机侦听到其他主机的通讯,因此Sniffer技术在这时必须结合网络端口镜像技术进行配合。而衍生的安全技术则通过ARP欺骗来变相达到交换网络中的侦听。
2.网络监听原理
Sniffer程序是一种利用以太网的特性把网络适配卡(NIC,一般为以太网卡)置为杂乱(promiscuous)模式状态的工具,一旦网卡设置为这种模式,它就能接收传输在网络上的每一个信息包。
普通的情况下,网卡只接收和自己的地址有关的信息包,即传输到本地主机的信息包。要使Sniffer能接收并处理这种方式的信息,系统需要支持BPF,Linux下需要支持SOCKET一PACKET。但一般情况下,网络硬件和TCP/IP堆栈不支持接收或者发送与本地计算机无关的数据包,所以,为了绕过标准的TCP/IP堆栈,网卡就必须设置为我们刚开始讲的混杂模式。一般情况下,要激活这种方式,内核必须支持这种伪设备Bpfilter,而且需要root权限来运行这种程序,所以sniffer需要root身份安装,如果只是以本地用户的身份进入了系统,那么不可能唤探到root的密码,因为不能运行Sniffer。
也有基于无线网络、广域网络(DDN, FR)甚至光网络(POS、Fiber Channel)的监听技术,这时候略微不同于以太网络上的捕获概念,其中通常会引入TAP (测试介入点)这类的硬件设备来进行数据采集。
3. Sniffer的分类
Sniffer分为软件和硬件两种,软件的Sniffer有 Sniffer Pro、Network Monitor、PacketBone等,其优点是易于安装部署,易于学习使用,同时也易于交流;缺点是无法抓取网络上所有的传输,某些情况下也就无法真正了解网络的故障和运行情况。硬件的Sniffer通常称为协议分析仪,一般都是商业性的,价格也比较昂贵,但会具备支持各类扩展的链路捕获能力以及高性能的数据实时捕获分析的功能。
基于以太网络嗅探的Sniffer只能抓取一个物理网段内的包,就是说,你和监听的目标中间不能有路由或其他屏蔽广播包的设备,这一点很重要。所以,对一般拨号上网的用户来说,是不可能利用Sniffer来窃听到其他人的通信内容的。
4.网络监听的目的
当一个黑客成功地攻陷了一台主机,并拿到了root权限,而且还想利用这台主机去攻击同一(物理)网段上的其他主机时,他就会在这台主机上安装Sniffer软件,对以太网设备上传送的数据包进行侦听,从而发现感兴趣的包。如果发现符合条件的包,就把它存到一个LOg文件中去。通常设置的这些条件是包含字“username”或“password”的包,这样的包里面通常有黑客感兴趣的密码之类的东西。一旦黑客截获得了某台主机的密码,他就会立刻进入这台主机。
如果Sniffer运行在路由器上或有路由功能的主机上,就能对大量的数据进行监控,因为所有进出网络的数据包都要经过路由器。
Sniffer属于第M层次的攻击。就是说,只有在攻击者已经进入了目标系统的情况下,才能使用Sniffer这种攻击手段,以便得到更多的信息。
Sniffer除了能得到口令或用户名外,还能得到更多的其他信息,比如一个重要的信息、在网上传送的金融信息等等。Sniffer几乎能得到任何在以太网上传送的数据包。
二、Sniffer产品介绍
网络的安全性和高可用性是建立在有效的网络管理基础之上的,网络管理包括配置管理、故障管理、性能管理、安全管理和计费管理五大部分。对于企业计算机网络来说,网络故障管理主要侧重于实时的监控,而网络性能管理更看中历史分析。
Sniffer网络分析仪是一个网络故障、性能和安全管理的有力工具,它能够自动地帮助网络专业人员维护网络,查找故障,极大地简化了发现和解决网络问题的过程,广泛适用于Ethernet、Fast Ethernet、Token Ring、Switched LANs、FDDI、X.25、DDN、Frame Relay、ISDN、ATM和Gigabits等网络。
1.1 Sniffer产品的基本功能包括:
• 网络安全的保障与维护
1. 对异常的网络攻击的实时发现与告警;
2. 对高速网络的捕获与侦听;
3. 全面分析与解码网络传输的内容;
• 面向网络链路运行情况的监测
1. 各种网络链路的运行情况;
2. 各种网络链路的流量及阻塞情况;
3. 网上各种协议的使用情况;
4. 网络协议自动发现;
5. 网络故障监测;
• 面向网络上应用情况的监测
1. 任意网段应用流量、流向;
2. 任意服务器应用流量、流向;
3. 任意工作站应用流量、流向;
4. 典型应用程序响应时间;
5. 不同网络协议所占带宽比例;
6. 不同应用流量、流向的分布情况及拓扑结构;
• 强大的协议解码能力,用于对网络流量的深入解析
1. 对各种现有网络协议进行解码;
2. 对各种应用层协议进行解码;
3. Sniffer协议开发包(PDK)可以让用户简单方便地增加用户自定义的协议;
• 网络管理、故障报警及恢复
运用强大的专家分析系统帮助维护人员在最短时间内排除网络故障;
1.2 实时监控统计和告警功能
根据用户习惯,Sniffer可提供实时数据或图表方式显示统计结果,统计内容包括:
网络统计:如当前和平均网络利用率、总的和当前的帧数及字节数、总站数和激活的站数、协议类型、当前和总的平均帧长等。
协议统计:如协议的网络利用率、协议的数、协议的字节数以及每种协议中各种不同类型的帧的统计等。
差错统计:如错误的CRC校验数、发生的碰撞数、错误帧数等。
站统计:如接收和发送的帧数、开始时间、停止时间、消耗时间、站状态等。最多可统计1024个站。
帧长统计:如某一帧长的帧所占百分比,某一帧长的帧数等。
当某些指标超过规定的阈值时,Sniffer可以自动显示或采用有声形式的告警。
Sniffer可根据网络管理者的要求,自动将统计结果生成多种统计报告格式,并可存盘或打印输出。
1.3 Sniffer实时专家分析系统
高度复杂的网络协议分析工具能够监视并捕获所有网络上的信息数据包,并同时建立一个特有网络环境下的目标知识库。智能的专家技术扫描这些信息以检测网络异常现象,并自动对每种异常现象进行归类。所有异常现象被归为两类:一类是symptom(故障征兆提示,非关键事件例如单一文件的再传送),另一类是diagnosis(已发现故障的诊断,重复出现的事件或要求立刻采取行动的致命错误)。经过问题分离、分析且归类后,Sniffer将实时地,自动发出一份警告、对问题进行解释并提出相应的建议解决方案。
Sniffer与其他网络协议分析仪最大的差别在于它的人工智能专家系统(Expert System)。简单地说,Sniffer能自动实时监视网络,捕捉数据,识别网络配置,自动发现网络故障并进行告警,它能指出:
网络故障发生的位置,以及出现在OSI第几层。
网络故障的性质,产生故障的可能的原因以及为解决故障建议采取的行动。
Sniffer 还提供了专家配制功能,用户可以自已设定专家系统判断故障发生的触发条件。
有了专家系统,您无需知道那些数据包构成网络问题,也不必熟悉网络协议,更不用去了解这些数据包的内容,便能轻松解决问题。
1.4 OSI全协议七层解码
Sniffer的软件非常丰富,可以对在各种网络上运行的400多种协议进行解码,如TCP/IP、Novell Netware、DECnet、SunNFS、X-Windows、HTTP、TNS SLQ*Net v2(Oracle)、Banyan v5.0和v6.0、TDS/SQL(Sybase)、X.25、Frame Realy、PPP、Rip/Rip v2、EIGRP、APPN、SMTP等。还广泛支持专用的网络互联桥/路由器的帧格式。
Sniffer可以在全部七层OSI协议上进行解码,目前没有任何一个系统可以做到对协议有如此透彻的分析;它采用分层方式,从最低层开始,一直到第七层,甚至对ORACAL数据库、SYBASE数据库都可以进行协议分析;每一层用不同的颜色加以区别。
Sniffer对每一层都提供了Summary(解码主要规程要素)、Detail(解码全部规程要素)、Hex(十六进制码)等几种解码窗口。在同一时间,最多可以打开六个观察窗口。
Sniffer还可以进行强制解码功能(Protocl Forcing),如果网络上运行的是非标准协议,可以使用一个现有标准协议样板去尝试解释捕获的数据。
Sniffer提供了在线实时解码分析和在线捕捉,将捕捉的数据存盘后进行解码分析二种功能。
二、Sniffer的商业应用
Sniffer被 Network General公司注册为商标,这家公司以出品Sniffer Pro系列产品而知名。目前最新版本为Sniffer Portable 4.9,这类产品通过网络嗅探这一技术方式,对数据协议进行捕获和解析,能够大大帮助故障诊断和网络应用性能的分析鉴别。
Network General 已经被NetScout公司收购。
三、Sniffer的扩展应用
1、专用领域的Sniffer
Sniffer被广泛应用到各种专业领域,例如FIX (金融信息交换协议)、MultiCast(组播协议)、3G (第三代移动通讯技术)的分析系统。其可以解析这些专用协议数据,获得完整的解码分析。
2、长期存储的Sniffer应用
由于现代网络数据量惊人,带宽越来越大。采用传统方式的Sniffer产品很难适应这类环境,因此诞生了伴随有大量硬盘存储空间的长期记录设备。例如nGenius Infinistream等。
3、易于使用的Sniffer辅助系统
由于协议解码这类的应用曲高和寡,很少有人能够很好的理解各类协议。但捕获下来的数据却非常有价值。因此在现代意义上非常流行如何把协议数据采用最好的方式进行展示,包括产生了可以把Sniffer数据转换成Excel的BoneLight类型的应用和把Sniffer分析数据进行图形化的开源系统PacketMap等。这类应用使用户能够更简明地理解Sniffer数据。
4、无线网络的Sniffer
传统Sniffer是针对有线网络中的局域网而言,所有的捕获原理也是基于CSMA/CD的技术实现。随着WLAN的广泛使用,Sniffer进一步扩展到802.11A/B/G/N的无线网络分析能力。无线网络相比传统网络无论从捕获的原理和接入的方式都发生了较大改变。这也是Sniffer技术发展趋势中非常重要的部分.
B. 网络中有哪些协议可用作链路检测
关于链路检查,不知你说的哪个层面的。
1、对于用户侧,若仅仅是个adsl之类的,等到modem中,看上下行协商的速率参数就行了,1M是1024K,依次累加。若是线路有环,一般拨号提示电话占线。
2、对于运营商级别的网络,可以通过设备端口状态,网管来检测,环路检测不好发现,但是华为老款交换机(如:S2403等,具有环路发现功能。
3、lldp是链路层设备检测协议,不能检测运营商线路。
C. 如何用C语言检测网络是否连接上、已连接、已断开状态
如果对方断开连接的话,那么readNum = recv ( socketId, rcvBuf, rcvBufSize, 0 );
readNum返回值应该是0,可以根据返回值判断
还有一种办法,就是做一个心跳检测,定时发送消息,如果发送失败就知道对方不在了
D. 数据链路层的差错的检测和恢复(奇偶校验码,CRC校验,校验和),各种运算
在原始的物理传输线路上传输数据信号是有差错的,存在一定的误码率,数据链路层存在的目的就是给原始二进制位流增加一些控制信息 ,实现如何在有差错的线路上进行无差错传输
数据设定为M位,冗余位设定为R位,如果位数满足即认为不出错,如果位数不满足即肯定出错
差错产生的原因
信道的电气特性引起信号幅度,频率,相位的畸变,信号反射,串扰,闪电,大功率电机的启停等
计算机网络中出现的差错是连续的还是离散的差错? → 是连续的突发性的差错
比如传了一个这样的位串0001101001,连续的差错:比如一共出错了3位,连续的出错在一起。离散的差错:一共出错了3位,不是连续出的,是分散出的
保证帧正确,按序送交上层(顺序要对,不能重复也不能跳帧)。在接收方能够判断接收的数据是否正确,若错误还可能要恢复错误
纠错控制主要由接收方做,能检查出错并定位到是哪儿出错了
接收方通过反馈机制告诉发送方出错,发送方通过重发的方式恢复差错
☆自动纠错比检错反馈重发机制代价大,在发生数据丢失的情况下,只是自动纠错机制无法进行差错恢复,还是需要检错反馈重发机制
一个帧包括m个数据位,r个校验位(是冗余位,和m位的有效数据是无关的),称为n位码字(n=m+r),我们希望r尽量短,并且尽量有一个固定长度
加入了冗余位,使接收方知道有差错发生,但不知道什么差错,然后请求重发
加入了足够多的冗余位,使接收方不仅知道有差错发生,并知道哪些位发生差错
两个编码的海明距离: 两个编码不相同位的个数
例:0000000000与0000011111的海明距离是5
编码方案的海明距离: 编码方案中任两个编码海明距离的最小值
ASCII这样的连续编码的海明距离都是1
为检测d位错,编码方案的海明距离应至少为d+1
当发生d位错时,不会由一种合法编码变为另一种合法编码,也就是想要由一种合法编码变为另一种合法编码,需要d+1以上出错
对接收方来讲,它判定一个编码是否出错的唯一依据是这个编码是否是一个合法的编码。即使接收方收到了一个合法的编码,它也无法判断是否是一个合法编码,因为它不知道这个合法编码原本就是合法的,还是出错以后也依然是一个合法编码。因此需要海明距离应至少为d+1
在数据链路层一般是不用这种检错方法的,因为检错率太低
若接收方收到的字节奇偶结果不正确,就可以知道传输中发生了错误
增加奇偶校验位后海明距离由1变为2,因此根据“为检测d位错,编码方案的海明距离应至少为d+1”,可以检查出一位二进制位的差错
用这种方法,有一位出错时,就会由合法编码(奇校验时1的个数为奇数,偶校验时1的个数为偶数)变成一种非合法编码(奇数校验时1的个数为偶数,偶校验时1的个数为奇数)
为纠正d位错,编码方案的海明距离应至少为2d+1
当发生d位错时,出错编码仍然最接近于原始的正确编码
例:现在有一个编码方案,这个编码方案之中只有4种合法编码↓
0000000000
0000011111
1111100000
1111111111
它们之间的海明距离为5,按照定理,能够纠正2位错
假设接收方收到了这样的编码:0001100000,很明显这是个非法编码,怎么样纠正
呢?我们知道出错的位数是≤ 2位的,它和第一种的海明距离为2,和第二种为7,和
第三种为3,和第四种为8,离它最近的是第一种编码。它采用这种就近恢复的原则将
出错的编码恢复到原始编码
数据链路层用的最多的一种检错方法
但是高层(网络层,传输层)是不用这种检错方法的,而用检验和的方法
生成多项式G(x)
发方,收方事前约定。这里的约定是数据链路层的协议已经定义该协议使用什么生成多项式
生成多项式的高位和低位必须为1
生成多项式必须比传输信息对应的多项式短
(现在最多用的是CRC-32,生成多项式是32位,能否保证生成多项式比传输的对应的多项式短呢?从原始数据来讲保证不了,但是到数据链路层时加了传输层的头,网络层的头之后肯定能保证大于32位。比如现在的Internet网络,例如在传输层使用TCP加20个字节,在网络层IP又加了20个字节,已经超过32位了,所以肯定能保证)
理论上来讲生成多项式的阶越高,检错率越高
硬件实现CRC校验
四个多项式已经成为国际标准
CRC码(增加的r位冗余位检错码,即校验和)加在帧尾(效率比较高),使带CRC码的帧的多项式能被G(x)除尽:接收方接收时,用G(x)去除它,若有余数,则传输出错
• 模2加法运算定义为:(对应于逻辑异或)
0+0=0 0+1=1 1+0=1 1+1=0
例如0101+0011=0110
• 模2减法运算定义为:(对应于逻辑异或)
0-0=0 0-1=1 1-0=1 1-1=0
例如0110-0011=0101
• 模2乘法运算定义为:
0x0=0 0x1=0 1x0=0 1x1=1
• 模2除法运算定义为:
0 ÷1=0 1÷1=1
利用模2减求余数,余数最高位为1,则商1,否则商0,每商1位则余数减少1位,
直到余数位数少于除数位数
按位与运算:
按位与运算符”&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现
例如: 9 & 5
00001001(9的二进制补码)
&
00000101 (5的二进制补码)
00000001
可见9 & 5 =1
最高位作为符号位,若符号位为0,则表示正数,若符号位为1,则表示负数
其余各位代表数值本身的绝对值(以二进制表示)
绝对值相同的正数和负数,它们除了符号位不同外,其他各位都相同
一个数如果值为正,则它的反码与原码相同
一个数如果值为负,则将其符号位置为1,其余各位为对原码相应数据位取反
(取反:二进制中有0和1两种状态,取反就是取与当前状态相反的状态,1取反等于0,0取反等于1)
正数的补码与反码,原码相同
负数的补码则将其最高位置为1,其余各位为对原码的相应数据位取反,再对整个数加1
即 X为负数时,【X】补 = 【X】反+1
(+0)补 = 00000000
(-0)反 = 11111111
(-0)补 = 11111111 + 1 = 100000000→进位1舍去→00000000
假设用一个字节表示一个数,补码的表示范围为:-128 ----- +127
用反码表示的最小值为:-128,其反码为:10000000
用反码表示的最大值为:+127,其反码为:01111111
按位或运算符”|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的两个二进位有一个为1时,结果位就为1.参与运算的两个数均以补码出现
例如:9|5
00001001
| 00000101
00001101(十进制为13)
可见9|5=13
~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反
例如:~9
~(0000000000001001)结果为:1111111111110110
按位异或运算符” ^ ”是双目运算符。其功能是参与运算的两数各对应的二进位相异或。当两对应的二进位相异时,结果为1。参与运算数仍以补码出现
例如:9^5
00001001
^ 00000101
00001100(十进制为12)
左移运算符” << ”是双目运算符。其功能是把 ” << ”左边的运算数的各二进位全部左移若干位,由” << ”右边的数指定移动的位数,高位丢弃,低位补0
例如:a=00000011(十进制3),a << 4,结果为:00110000(十进制48)
右移运算符” >> ”是双目运算符。其功能是把” >> ”左边的运算数的各二进制全部右移若干位,” >> ”右边的数指定移动的位数
例如:a=15(00001111),a >>2,结果为00000011(十进制3)
计算方法例:
※CRC码计算还有一个好处:
我们希望不管m是多少位的,但是冗余位r是越短越好,而且最好位数是固定的。用这CRC码的好处就是生成多项式是多少阶的,那么最后的余数(冗余位)的位数就是多少位。如果是n阶的,那么最后就是4位
循环冗余校验法检验不出来的错的情况:收到的位串虽然是错误的,但是恰巧能被生成多项式整除,这个时候检测不出来
适用于高层协议,如IP,TCP,UDP等
校验码放在前面或后面影响都不大,所以绝大多数是放在前面的
检错率低于循环冗余校验法
在↓例子中,如果第1位和第9位同时出错,或者第2位和第10位同时出错···出错,那么它们取反相加的数是不变的,这个时候是检查不出错的。但是网络当中连续突发的错占绝大部分,这种跳跃性的出错概率很小,所以检验和的检错率还是比较高的
高层不用冗余校验法的原因是,冗余校验法主要采用除的计算方式,比累加的(校验和)计算方式效率要低,而数据链路层用这种方法可以用硬件实现,但是网络层和传输层一般只能通过软件实现,那么效率就降低了。而且数据链路层已经提供了比较可靠的支持,所以高层就可以用这种检错率相对低一点的检错法
检验字段初值置0,数据拆分成与检验字段等长的分片,不足部分补0,将所有分片逐位取反,并连续累加,丢弃最高进位,计算结果置于检验字段。接收端执行相同的过程(分段处理,取反累加,把累加出的校验和与校验码字段当中保存的校验和进行比对,如果是完全一致就没错),并将计算结果和传输过来的检验和进行比较以确定是数据是否出现差错