sniff,sniff教程

sniff教程 - 网络安全 - 电脑教程网

sniff教程

日期:2006-03-28   荐:

一.有关sniffer及sniffer的含义
sniffers(嗅探器)几乎和internet有一样久的历史了.sniffer是一种常用的收集有用数据方法,这些数据可以是用户的帐号和密码,可以是一些商用机密数据等等。随着internet及电子商务的日益普及,internet的安全也越来越受到重视。在internet安全隐患中扮演重要角色之一的sniffer以受到越来越大的关注,所以今天我要向大家介绍一下介绍sniffer以及如何阻止sniffer。  
大多数的黑客仅仅为了探测内部网上的主机并取得控制权,只有那些"雄心勃勃"的黑客,为了控制整个网络才会安装特洛伊木马和后门程序,并清除记录。他们经常使用的手法是安装sniffer。
  在内部网上,黑客要想迅速获得大量的账号(包括用户名和密码),最为有效的手段是使用 "sniffer" 程序。这种方法要求运行sniffer 程序的主机和被监听的主机必须在同一个以太网段上,故而在外部主机上运行sniffer是没有效果的。再者,必须以root的身份使用sniffer 程序,才能够监听到以太网段上的数据流。谈到以太网sniffer,就必须谈到以太网sniffing。
那么什么是以太网sniffer呢?  
以太网sniffing是指对以太网设备上传送的数据包进行侦听,发
现感兴趣的包。如果发现符合条件的包,就把它存到一个log文件中
去。通常设置的这些条件是包含字"username"或"passWord"的包。
  它的目的是将网络层放到promiscuous模式,从而能干些事情。
promiscuous模式是指网络上的所有设备都对总线上传送的数据进行
侦听,并不仅仅是它们自己的数据。根据第二章中有关对以太网的工
作原理的基本介绍,可以知道:一个设备要向某一目标发送数据时,
它是对以太网进行广播的。一个连到以太网总线上的设备在任何时间
里都在接受数据。不过只是将属于自己的数据传给该计算机上的应用
程序。
  利用这一点,可以将一台计算机的网络连接设置为接受所有以太
网总线上的数据,从而实现sniffer。
  sniffer通常运行在路由器,或有路由器功能的主机上。这样就能对大量的数据进行监控。sniffer属第二层次的攻击。通常是攻击者已经进入了目标系统,然后使用sniffer这种攻击手段,以便得到更多的信息。
  sniffer除了能得到口令或用户名外,还能得到更多的其他信息,比如一个其他重要的信息,在网上传送的金融信息等等。sniffer几乎能得到任何以太网上的传送的数据包。黑客会使用各种方法,获得系统的控制权并留下再次侵入的后门,以保证sniffer能够执行。在solaris 2.x平台上,sniffer 程序通常被安装在/usr/bin 或/dev目录下。黑客还会巧妙的修改时间,使得sniffer程序看上去是和其它系统程序同时安装的。
大多数以太网sniffer程序在后台运行,将结果输出到某个记录文件中。黑客常常会修改ps程序,使得系统管理员很难发现运行的sniffer程序。
  以太网sniffer程序将系统的网络接口设定为混合模式。这样,它就可以监听到所有流经同一以太网网段的数据包,不管它的接受者或发送者是不是运行sniffer的主机。 程序将用户名、密码和其它黑客感兴趣的数据存入log文件。黑客会等待一段时间 ----- 比如一周后,再回到这里下载记录文件。
讲了这么多,那么到底我们可以用什么通俗的话来介绍sniffer呢?
计算机网络与电话电路不同,计算机网络是共享通讯通道的。共享意味着计算机能够接收到发送给其它计算机的信息。捕获在网络中传输的数据信息就称为sniffing(窃听)。
  以太网是现在应用最广泛的计算机连网方式。以太网协议是在同一回路向所有主机发送数据包信息。数据包头包含有目标主机的正确地址。一般情况下只有具有该地址的主机会接受这个数据包。如果一台主机能够接收所有数据包,而不理会数据包头内容,这种方式通常称为"混杂" 模式。
  由于在一个普通的网络环境中,帐号和口令信息以明文方式在以太网中传输, 一旦入侵者获得其中一台主机的root权限,并将其置于混杂模式以窃听网络数据,从而有可能入侵网络中的所有计算机。
一句话,sniffer就是一个用来窃听的黑客手段和工具。
二、sniffer的工作原理
  通常在同一个网段的所有网络接口都有访问在物理媒体上传输的所有数据的能力,而每个网络接口都还应该有一个硬件地址,该硬件地址不同于网络中存在的其他网络接口的硬件地址,同时,每个网络至少还要一个广播地址。(代表所有的接口地址),在正常情况下,一个合法的网络接口应该只响应这样的两种数据帧:
  1、帧的目标区域具有和本地网络接口相匹配的硬件地址。
  2、帧的目标区域具有"广播地址"。
  在接受到上面两种情况的数据包时,nc通过cpu产生一个硬件中断,该中断能引起操作系统注意,然后将帧中所包含的数据传送给系统进一步处理。
  而sniffer就是一种能将本地nc状态设成(promiscuous)状态的软件,当nc处于这种"混杂"方式时,该nc具备"广播地址",它对所有遭遇到的每一个帧都产生一个硬件中断以便提醒操作系统处理流经该物理媒体上的每一个报文包。(绝大多数的nc具备置成 promiscuous方式的能力)

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  

  可见,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的工作环境
snifffer就是能够捕获网络报文的设备。嗅探器的正当用处在于分析网络的流量,以便找出所关心的网络中潜在的问题。例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器来作出精确的问题判断。
嗅探器在功能和设计方面有很多不同。有些只能分析一种协议,而另一些可能能够分析几百种协议。一般情况下,大多数的嗅探器至少能够分析下面的协议:
1.标准以太网
2.tcp/ip
3.ipx
4.decnet
嗅探器通常是软硬件的结合。专用的嗅探器价格非常昂贵。另一方面,免费的嗅探器虽然不需要花什么钱,但得不到什么支持。
嗅探器与一般的键盘捕获程序不同。键盘捕获程序捕获在终端上输入的键值,而嗅探器则捕获真实的网络报文。嗅探器通过将其置身于网络接口来达到这个目的——例如将以太网卡设置成杂收模式。(为了理解杂收模式是怎么回事,先解释局域网是怎么工作的)。
数据在网络上是以很小的称为帧(ftame)的单位传输的帧由好几部分组成,不同的部分执行不同的功能。(例如,以太网的前12个字节存放的是源和目的的地址,这些位告诉网络:数据的来源和去处。以太网帧的其他部分存放实际的用户数据、tcp/ip的报文头或ipx报文头等等)。
帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上。通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧的到达,然后对其进行存储。就是在这个传输和接收的过程中,嗅探器会造成安全方面的问题。
每一个在lan上的工作站都有其硬件地址。这些地址唯一地表示着网络上的机器(这一点于internet地址系统比较相似)。当用户发送一个报文时,这些报文就会发送到lan上所有可用的机器。
在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的报文则不予响应(换句话说,工作站a不会捕获属于工作站b的数据,而是简单的忽略这些数据)。
如果某在工作站的网络接口处于杂收模式,那么它就可以捕获网络上所有的报文和帧,如果一个工作站被配置成这样的方式,它(包括其软件)就是一个嗅探器。
嗅探器可能造成的危害:
1.嗅探器能够捕获口令
2.能够捕获专用的或者机密的信息
3.可以用来危害网络邻居的安全,或者用来获取更高级别的访问权限
事实上,如果你在网络上存在非授权的嗅探器就以为着你的系统已经暴露在别人面前了。(大家可以试试天行2的嗅探功能)
一般我们只嗅探每个报文的前200到300个字节。用户名和口令都包含在这一部分中,这是我们关心的真正部分。工人,也可以嗅探给定接口上的所有报文,如果有足够的空间进行存储,有足够的那里进行处理的话,将会发现另一些非常有趣的东西……
简单的放置一个嗅探器宾将其放到随便什么地方将不会起到什么作用。将嗅探器放置于被攻击机器或网络附近,这样将捕获到很多口令,还有一个比较好的方法就是放在网关上。如果这样的话就能捕获网络和其他网络进行身份鉴别的过程。这样的方式将成倍地增加我们能够攻击的范围。
三.谁会使用sniffers
可能谁都回知道谁会使用sniffer,但是并不是每个使用它的人都是网络高手,因为现在有很多的sniffer都成了傻瓜似的了,前段时间用的最多的不外乎oicq sniffer。我想那些喜欢查好友ip的朋友都应该记得它吧。呵呵,我都使用过它,现在当然不用了啊!
当然系统管理员使用sniffer来分析网络信息交通并且找出网络上何处发生问题。一个安全管理员可以同时用多种sniffer, 将它们放置在网络的各处,形成一个入侵警报系统。对于系统管理员来说sniffer是一个非常好的工具,但是它同样是一个经常被黑客使用的工具.骇客安装sniffer以获得用户名和账号,信用卡号码,个人信息,和其他的信息可以导致对你或是你的公司的极大危害如果向坏的方面发展。当它们得到这些信息后,骇客将使用密码来进攻其他的internet 站点甚至倒卖信用卡号码。

 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  

三.sniffer是如何在网络上实施的
谈这个问题之前还应该先说一下ethernet的通讯。通常在同一个网段的所有网络接口都有访问在媒体上传输的所有数据的能力,而每个网络接口都还应该有一个硬件地址,该硬件地址不同于网络中存在的其它网络接口的硬件地址,同时,每个网络至少还要一个广播地址。在正常情况下,一个合法的网络接口应该只响应这样的两种数据帧:   

  1帧的目标区域具有和本地网络接口相匹配的硬件地址。   

  2帧的目标区域具有“广播地址”。   

  在接受到上面两种情况的数据包时,网卡通过cpu产生一个硬件中断。该中断能引起操作系统注意,然后将帧中所包含的数据传送给系统进一步处理。而sniffer就是一种能将本地网卡状态设成杂乱模式(promiscuous mode)的软件。当网卡处于杂乱模式时,该网卡具备“广播地址”,它对所有遇到的每一个帧都产生一个硬件中断以提醒操作系统处理每一个报文包。(绝大多数的网卡具备设置成杂乱模式的能力。
  可见,sniffer工作在网络环境中的底层,它会拦截所有的正在网络上传送的数据。通过相应的软件处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体布局。值得注意的是:sniffer是极其安静的,它是一种消极的安全攻击。
四.哪里可以得到sniffer
我们讲的sniffer,主要是在unix系统下运用的,至于那些oicq sniffer就不在我们讨论的范围。
sniffer是黑客们最常用的入侵手段之一。你可以在经过允许的网络中运行sniffer,了解它是如何有效地危及本地机器安全。
  sniffer可以是硬件,也可以是软件。现在品种最多,应用最广的是软件sniffer,绝大多数黑客们用的也是软件sniffer。
  以下是一些也被广泛用于调试网络故障的sniffer工具:
  (一).商用sniffer:
  1. network general.
  network general开发了多种产品。最重要的是eXPert sniffer,它不仅仅可以sniff,还能够通过高性能的专门系统发送/接收数据包,帮助诊断故障。还有一个增强产品"distrbuted sniffer system"可以将unix工作站作为sniffer控制台,而将sniffer agents(代理)分布到远程主机上。
  2. microsoft's net monitor
  对于某些商业站点,可能同时需要运行多种协议--netbeui、ipx/spx、tcp/ip、802.3和sna等。这时很难找到一种sniffer帮助解决网络问题,因为许多sniffer往往将某些正确的协议数据包当成了错误数据包。microsoft的net monitor(以前叫bloodhound)可以解决这个难题。它能够正确区分诸如netware控制数据包、nt netbios名字服务广播等独特的数据包。(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记录描述了那次的攻击,howmitnickhackedtsutomushimomurawithanipsequenceattack
( http://www.attrition.org/security/newbie/security/sniffer/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...等等。
(三).unix下的sniffer
unix下的sniffer,我比较倾向于snoop.snoop是按solaris的标准制作的,虽然snoop不像是sniffer pro那样好,但是它是一个可定制性非常强的sniffer,在加上它是免费的(和solaris附一起).谁能打败它的地位?你可以在极短时间内抓获一个信息包或是更加深的分析.如果你想学习如何使用snoop,看下面的url:
http://www.enteract.com/~lspitz/snoop.Html

 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  

(四).linux下的sniffer工具
linux下的sniffer工具,我推荐tcpdump。
[1].tcpdump的安装
在linux下tcpdump的安装十分简单,一般由两种安装方式。一种是以rpm包的形式来进行安装。另外一种是以源程序的形式安装。
  1. rpm包的形式安装
  这种形式的安装是最简单的安装方法,rpm包是将软件编译后打包成二进制的格式,通过rpm命令可以直接安装,不需要修改任何东西。以超级用户登录,使用命令如下:
    #rpm -ivh tcpdump-3_4a5.rpm
  这样tcpdump就顺利地安装到你的linux系统中。怎么样,很简单吧。
  2. 源程序的安装
  既然rpm包的安装很简单,为什么还要采用比较复杂的源程序安装呢?其实,linux一个最大的诱人之处就是在她上面有很多软件是提供源程序的,人们可以修改源程序来满足自己的特殊的需要。所以我特别建议朋友们都采取这种源程序的安装方法。
  · 第一步 取得源程序 在源程序的安装方式中,我们首先要取得tcpdump的源程序分发包,这种分发包有两种    形式,一种是tar压缩包(tcpdump-3_4a5.tar.z),另一种是rpm的分发包(tcpdump-3_4a5.src.rpm)。这两种     形式的内容都是一样的,不同的仅仅是压缩的方式.tar的压缩包可以使用如下命令解开:
     #tar xvfz tcpdump-3_4a5.tar.z
    rpm的包可以使用如下命令安装:
     #rpm -ivh tcpdump-3_4a5.src.rpm
    这样就把tcpdump的源代码解压到/usr/src/redhat/sources目录下.

  · 第二步 做好编译源程序前的准备活动
    在编译源程序之前,最好已经确定库文件libpcap已经安装完毕,这个库文件是tcpdump软件所需的库文件。同样,你同时还要有一个标准的c语言编译器。在linux下标准的c 语言编译器一般是gcc。 在tcpdump的源程序目录中。有一个文件是makefile.in,configure命令就是从makefile.in文件中自动产生makefile文件。在makefile.in文件中,可以根据系统的配置来修改bindest 和 mandest 这两个宏定义,缺省值是
      bindest = @sbindir @
      mandest = @mandir @
    第一个宏值表明安装tcpdump的二进制文件的路径名,第二个表明tcpdump的man 帮助页的路径名,你可以修改它们来满足系统的需求。

  · 第三步 编译源程序
    使用源程序目录中的configure脚本,它从系统中读出各种所需的属性。并且根据makefile.in文件自动生成makefile文件,以便编译使用.make 命令则根据makefile文件中的规则编译tcpdump的源程序。使用make install命令安装编译好的tcpdump的二进制文件。
    总结一下就是:
      # tar xvfz tcpdump-3_4a5.tar.z
      # vi makefile.in
      # . /configure
      # make
      # make install

[2].tcpdump的使用
  tcpdump采用命令行方式,它的命令格式为:
  tcpdump [ -adeflnnopqstvx ] [ -c 数量 ] [ -f 文件名 ]
          [ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]
          [ -t 类型 ] [ -w 文件名 ] [表达式 ]

  1. tcpdump的选项介绍
   -a    将网络地址和广播地址转变成名字;
   -d    将匹配信息包的代码以人们能够理解的汇编格式给出;
   -dd    将匹配信息包的代码以c语言程序段的格式给出;
   -ddd    将匹配信息包的代码以十进制的形式给出;
   -e    在输出行打印出数据链路层的头部信息;
   -f    将外部的internet地址以数字的形式打印出来;
   -l    使标准输出变为缓冲行形式;
   -n    不把网络地址转换成名字;
   -t    在输出的每一行不打印时间戳;
   -v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
   -vv    输出详细的报文信息;
   -c    在收到指定的包的数目后,tcpdump就会停止;
   -f    从指定的文件中读取表达式,忽略其它的表达式;
   -i    指定监听的网络接口;
   -r    从指定的文件中读取包(这些包一般通过-w选项产生);
   -w    直接将包写入文件中,并不分析和打印出来;
   -t    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程 调用)和snmp(简单网络管理协议;)

  2. tcpdump的表达式介绍
   表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会被截获。
   在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.
   第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。
   第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型。fddi指明是在fddi(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。

 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  

   除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'or' ,'';
   这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来说明。
   (1)想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
    #tcpdump host 210.27.48.1
   (2) 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令:(在命令行中适用括号时,一定要
    #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
   (3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2
   (4)如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
    #tcpdump tcp port 23 host 210.27.48.1

  3. tcpdump 的输出结果介绍
   下面我们介绍几种典型的tcpdump命令的输出信息
   (1) 数据链路层头信息
   使用命令#tcpdump --e host ice
   ice 是一台装有linux的主机,她的mac地址是0:90:27:58:af:1a
   h219是一台装有solaric的sun工作站,它的mac地址是8:0:20:79:5b:46;上一条命令的输出结果如下所示:
21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ice.telne
t 0:0(0) ack 22535 win 8760 (df)
  分析:21:50:12是显示的时间, 847509是id号,eth0 <表示从网络接口eth0 接受该数据包,eth0 >表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机h219的mac地址,它表明是从源地址h219发来的数据包. 0:90:27:58:af:1a是主机ice的mac地址,表示该数据包的目的地址是ice . ip 是表明该数据包是ip数据包,60 是数据包的长度, h219.33357 > ice.telnet 表明该数据包是从主机h219的33357端口发往主机ice的telnet(23)端口. ack 22535 表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.

  (2) arp包的tcpdump输出信息
   使用命令#tcpdump arp
   得到的输出结果是:
  22:32:42.802509 eth0 > arp who-has route tell ice (0:90:27:58:af:1a)
  22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)
  分析: 22:32:42是时间戳, 802509是id号, eth0 >表明从主机发出该数据包, arp表明是arp请求包, who-has route tell ice表明是主机ice请求主机route的mac地址。 0:90:27:58:af:1a是主机ice的mac地址。

  (3) tcp包的输出信息
   用tcpdump捕获的tcp包的一般输出信息是:
  src > dst: flags data-seqno ack window urgent options
  src > dst:表明从源地址到目的地址, flags是tcp包中的标志信息,s 是syn标志, f (fin), p (push) , r (rst) "." (没有标记); data-seqno是数据包中的数据的顺序号, ack是下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针. options是选项.

  (4) udp包的输出信息
   用tcpdump捕获的udp包的一般输出信息是:
  route.port1 > ice.port2: udp lenth
  udp十分简单,上面的输出行表明从主机route的port1端口发出的一个udp数据包到主机ice的port2端口,类型是udp, 包的长度是lenth上面,我就详细介绍了tcpdump的安装和使用,希望会对大家有所帮助。如果想要熟练运用tcpdump这个linux环境下的sniffer利器,还需要大家在实践中总结经验,充分发挥它的威力。
(五).windows平台上的sniffer
我推荐netxray和sniffer pro软件,想必大家都用过他们,不过我在这儿还要再简单介绍一下他们。
netxray的使用说明
1.1.1.1----2.2.2.2----3.3.3.3----4.4.4.4 这是一个sharehub连接下的局域网


5.5.5.5 这是一个8080端口上的http/FTP proxy


internet

启动capture,进入capture setting,选择profiles-->new,
以default为模板,起名叫proxy,选择ok-->done,
设置过滤所有目标ip是5.5.5.5的报文,即any---->5.5.5.5
开始抓包,同时从本机使用http proxy,然后就可以停止抓包。
选中一个目标ip是5.5.5.5的报文,按鼠标右键,选择"编辑显示过滤",
选择"数据模式",选择add pattern,到tcp层选中8080目标端口,
用鼠标选择"设置数据",起名"目标端口8080"。回去选择"应用显示
过滤"。以后用proxy规则过滤将只过滤目标ip是5.5.5.5、目标端口

 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  

是8080的报文。要是对协议分析熟悉,根本不用写这么多,以后
要问netxray的使用说明,请直奔主题,否则回答起来实在罗嗦。
关键是有些人太懒惰,不乐意自己实践。
如何指定源端口、目标端口?

1. 注意data pattern和address是逻辑与的关系
2. 进入data pattern设置页
比如你想设置这样一个过滤规则,源端口是2323或者目标端口是2323
的ip包,先选中第一行,用toggle and/or调整成or,因为你的逻辑表达式
的最外层是 or
3. 选择add pattern,在弹出的对话框里设置

packet 34 2 hex
从顶头开始填写 09 13,因为十进制的2323对应十六进制的0x0913,而ip包
使用网络字节顺序,高字节在低地址。
起名任意,比如源端口2323,确定

再次选择add pattern
packet 36 2 hex 从顶头开始填写 09 13
起名任意,比如目标端口2323,确定

于是最外层的or下有两个叶子,分别对应两个pattern。
4. 还有很多变化,但都和这个基本例子差不多,你的过滤规则可以非常复杂。
最外层的or表示它下面的所有叶子之间都是or的关系,所以我建议当你企图
建立一个非常复杂的规则的时候先写出逻辑表达式再来操作,以免不必要的
重复劳动。
如何抓ftp/pop3口令明文?

netxray所谓的高级协议过滤事实上就是端口过滤,用(2)中介绍的方法指定源端口
目标端口均过滤0x00 0x17,就可以达到和指定telnet过滤一样的效果。netxray
认为telnet就是23端口,所以如果想捕捉一个非标准telnetd的通信,必须自己
指定端口过滤。此外pwin98下services文件的修改不影响netxray认为telnet就是
端口23。

每次指定捕捉telnet协议,但显示的时候可能会发现有些包没有标记成telnet,而
是tcp,为什么?因为这些标记成tcp的包没有telnet数据区,虽然在完整的物理帧
中有数据,但根据ip报头中的 ntohs( ip->tot_len ) ,对于ip报文来说没有telnet
数据区。物理帧中为什么有?可能是考虑"填充",我不知道是数据链路层从内核返
回的时候带上来的"填充",还是对端发送的时候就已经"填充",在linux下用
sock_packet抓包也存在同样的问题,一般情况下recvfrom返回的字节数减去各个
报头长度得到数据区长度,但出现"填充"时就不是这样了,所以处理ip协议族时,
一定要用 ntohs( ip->tot_len ),我写linuxkiller时才认真注意到这个问题。
那么用netxray时,不要看第三栏,那里是完整的物理帧,有很多干扰信息,应该看
第二栏的数据区。

如果是分析telnet协议并还原屏幕显示,只需要抓从server到client的回显数据即
可,因为口令不回显,这种过滤规则下抓不到口令明文。在linux下编程实现时需要
考虑95个可打印字符、汉字以及32个控制字符的显示过滤问题。如果想抓telnet的
口令明文,需要抓client到server的数据。pred写的sniff监听别人的bbs登录就象
看动画,但看不到口令,应该是只抓从server到client的回显数据。

nethackii可以抓pop3/ftp/telnet的口令,对于前两者很容易实现,因为有pass关
键字可以鉴别,后者稍微麻烦些,需要重组。值得一提的是FoxMail的邮件监视器,
简直就是定时发送口令明文,用netxray抓从client到server包,指定过滤pass关键
字,非常清楚。下面简单说一下这个设置:

先指定ip过滤规则,应该只指定 any <--> any,或者干脆不指定ip地址,以最大
可能地捕捉口令。
然后增加一个过滤模式,packet 54 4 hex 0x50 41 53 53
再增加一个过滤模式,packet 54 4 hex 0x70 61 73 73
两者是or模式,后者是因为这种关键字在网络传输中大小写不敏感,比如
CuteFTP发送的是pass。剩下的就是等口令来了。注意,不必指定过滤特定高级协
议,直接指定过滤ip协议族就可以了,用这种办法ftp/pop3口令是很容易看清楚的。
因为许多ftp/pop3的口令可以telnet 23,所以......
这里的使用说明可以用于sniffer pro 2.6,因为这两个东西实际是一个公司的。
虽然很多人告诉我sniffer pro比netxray强大,但是我个人觉得在协议分析方面
netxray比sniffer pro要方便,虽然支持的协议少了点,但是在设置过滤规则和
应用过滤规则等小操作上,显然sniffer pro没有吸取netxray的精华,这些小操
作平时很难遇到,但真正做协议分析指定一些复杂的过滤规则的时候就会碰上。

今天我们介绍的是如何抓取rpc报文,下面给出的办法仅仅是种尝试而已。

因为rpc server使用动态端口,所以你无法进行常规的端口过滤设置,如果一定
要设置可能需要尝试,具体例子请参看<< rpc/xdr/nfs系列之----nfs/mount协议 >>

这里给一种不是很科学的办法:

1. 指定进行ip过滤,设置any <--> rpc server ip

 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  

2. 指定对tcp以及udp协议进行过滤,因为rpc server可能的底层支持协议包括二者。
3. 进入data pattern设置页,用toggle and/or调整成or,因为你的逻辑表达式
的最外层是 or
4. 选择add pattern,在弹出的对话框里设置

protocol 60 8 hex 00 00 00 00 00 00 00 02
起名tcp rpc call

5. 同4的步骤,依次选择add pattern,在弹出的对话框里设置

protocol 60 4 hex 00 00 00 01
起名tcp rpc reply

protocol 32 8 hex 00 00 00 00 00 00 00 02
起名udp rpc call

protocol 32 4 hex 00 00 00 01
起名udp rpc reply

这里给的办法仅仅代表一种思路,如果你发现并没有抓住某个特定rpc server
的报文,可以自行调整过滤规则。要理解这个过滤规则,需要rpc本身的知识,
可以参看<< rpc/xdr/nfs系列 >>。

我曾经想设置远程程序号的过滤规则,但发现rpc reply报文中没有固定字段对
应远程程序号,只好放弃。如果你只想抓rpc call报文,可以考虑这个思路。
netxray发包前可以在decode状态下编辑,sniffer pro 2.6却不象netxray那样
善解人意,只能进行二进制编辑。sniffer pro的add pattern里的tab键极其混
帐,并且这里也不提供decode支持。始终不能理解这些地方。不过破解版的
netxray在decode时有些地方对不准,菜单window也不时失灵。

暂略(回头补吧,没时间了)


3.6据说比3.5加强了一些,包括退出后僵尸进程的问题,启动中乱报错问题,现在似
乎支持拨号适配器上的抓包了(以前如何我还真没测试过),但在过滤规则上毫无改观。
以前过滤规则全部在升级过程中丢掉了,只好重新设置。下面是ip过滤规则的设置:

1.从菜单上选择capture-->filter,选择左上角的[ new profile ]按钮,输入你觉得
切合要求的名字,比如ip。这里有个小窍门,如果你已经有一个合理可用的default
规则,就先选中default规则,然后点击左上角的[ new profile ]按钮,那么新规
则以default规则为模板生成。

2.不要动tcp/udp port页、address页

3.选中layer 3+页,假设所有的复选框都选中了,因为我们设置的是ip过滤规则,要求
抓取所有ip报文。

注意lanexplorer把arp归入layer 3+页,如果你的确只想抓ip报文,清除该页第一个
arp复选框。反之,如果你只想抓arp报文,应该清空layer 3+页后只选择该页第一个
arp复选框。

4.选中layer 2/3页,假设所有的复选框都清空了,从左边开始,在ethernet ii栏里只
选择ip/arp复选框,注意和layer 3+页之间的关系。

3.5版这里会自动替你选中llc栏里的ip复选框以及snap栏里的ip/arp复选框,3.6版
没有这个毛病了。

5.选中layer 2页,假设所有的复选框都清空了,在vlan栏里选中others复选框,mac栏
根据需要指定,比如只想抓取单播ip报文,就只选中unicast复选框。vlan栏里
others复选框必须选中,至于为什么,不清楚。

回头看第三条,如果想抓arp报文,因为arp request是广播报文,为了同时抓取请求
和响应报文,必须在mac栏里选中broadcast复选框。当然,只选中unicast复选框,
将抓取所有arp reply报文。

点击中文的[ 确定 ]按钮(太奇怪了,lanexplorer为什么这里出现了中文按钮,而其
他地方没有)

6.从菜单上选择capture-->filter,选中你要使用的过滤过则,如果刚刚创建过新规则,
默认的当前过滤规则就是新规则。从菜单上选择capture-->start。

今天调试一个程序的时候,由于需要利用sigalrm进行arp欺骗,需要抓几个arp响应
报文确认定时机制起作用了,但又不想都抓,arp报文太多了。

1. 以default为模板复制一条规则arp

2. 在"高级过滤"里选中arp协议

3. 在"数据模板"里选择"增加模板",此时默认是and规则

4. 依次输入或选择

packet 28 4 hex

5. 从顶头开始输入

c0 a8 0a 19

就是说源ip为192.168.10.25

描述性文字任意,比如srcip == 192.168.10.25

6. 一路确定下去即可

事实上平时设置过滤规则不需要这样麻烦,可以先用母体规则(比如default)抓取一
些报文,然后用鼠标选中你需要的报文,保持不动的情况下进入过滤规则设置界面,
新建一个过滤规则arp,此时"数据模板"里的"设置数据"按钮可用,在左面选择你感
兴趣的数据域,点击"设置数据",会自动替你生成一个"数据模板",然后根据需要稍
微修改一下即可。即使你对tcp/ip协议非常熟悉,也没有必要自己计算偏移量。
<>里的"数据模板"一样推荐采用这个办法指定。

四.sniffer的安装使用
我们主要以sniffit为例分别介绍在nt和linux下的应用。
  [1] 在linux下的sniffit
   安装软件的安装很简单:
  1、用tar zvfx sniffit.*.*.*.tgz将下载下来的sniffit.*.*.*.tgz解压缩到你想要的目的文件夹,如果版本是0.3.7的话,你会看到该目录下出现一个sniffit.0.3.7的目录。   

 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  

  2、cd sniffit.0.3.7
  3、./configure && make,只要在这个过程中终端上没有意外的error信息
出现,你就算编译成功了--可以得到一个二进制的sniffit文件。
  4、make clean把不用的垃圾扫掉……

  、使用方法
  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文件:
  #define plugin1_name "myplugin"

 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  

  #define plugin1(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在 http://netgroup-serv.polito.it/windump 和 http://netgroup-serv.polito.it/analyzer 这两个工具中成功应用。最新的winpcap是版本2.02,修补了2.01版本中的一些缺陷,并且支持win2000。具体信息和源代码可以在下面这个站点找到:
   http://netgroup-serv.polito.it/winpcap/
  下面是在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 \device\packet_{31bb7ed2-125e-11d4-8f11-d79985727802}' to force the choice,read the readme.first on how to force network devices.的提示,于是我按照其提示所示,使用了sniffit -f \device\packet_{31bb7ed2-125e-11d4-8f11-d79985727 802} -t 192.168.0.1 -p 21命令,这时出现下面的提示:
  forcing device to \device\packet_{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-------->我隐藏了,xixi
  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口连接。

 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  

标签: