返回列表 发帖

[转帖]SNIFFER的含义和工作原理 +如何捕获数据包+防范

[这个贴子最后由凉心无悔在 2005/05/07 00:30am 第 2 次编辑]

SNIFFER的含义和工作原理
作者:未知
作者:夏忠焱 来源:http://www.net130.com
一.有关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方式的能力)
  可见,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个字节。用户名和口令都包含在这一部分中,这是我们关心的真正部分。工人,也可以嗅探给定接口上的所有报文,如果有足够的空间进行存储,有足够的那里进行处理的话,将会发现另一些非常有趣的东西……
简单的放置一个嗅探器宾将其放到随便什么地方将不会起到什么作用。将嗅探器放置于被攻击机器或网络附近,这样将捕获到很多口令,还有一个比较好的方法就是放在网关上。如果这样的话就能捕获网络和其他网络进行身份鉴别的过程。这样的方式将成倍地增加我们能够攻击的范围。

[转帖]SNIFFER的含义和工作原理 +如何捕获数据包+防范

如何捕获数据包
手把手教你捕获数据包
文章作者:nirvana     文章来源:转载     发布时间:2005-02-10 10:07:54
经常看到论坛有人问起关于数据包的截获、分析等问题,幸好本人也对此略有所知,也写过很多的sniffer,所以就想写一系列的文章来详细深入的探讨关于数据包的知识。
我希望通过这一系列的文章,能使得关于数据包的知识得以普及,所以这系列的每一篇文章我都会有由浅入深的解释、详细的分析、以及编码步骤,另外附上带有详细注释的源码(为了照顾大多数朋友,我提供的都是MFC的源码)。
不过由于也是初学者,疏漏之处还望不吝指正。
本文凝聚着笔者心血,如要转载,请指明原作者及出处,谢谢!^_^
OK,. Let’s go !  Have fun!! q^_^p
第二篇   手把手教你捕获数据包
目录:
一.捕获数据包的实现原理
二.捕获数据包的编程实现:
1.   raw socket的实现方法
2.   Winpcap的实现方法
a.      枚举本机网卡的信息
b.      打开相应网卡并设置为混杂模式
c.       截获数据包并保存为文件

作者:
CSDN  VC/MFC 网络编程版主 PiggyXP

一.捕获数据包的实现原理:--------------------------------------------------------------------
在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的的数据包。
所以我们要想实现截获流经网络设备的所有数据包,就要采取一点特别的手段了:
将网卡设置为混杂模式。
这样一来,该主机的网卡就可以捕获到所有流经其网卡的数据包和帧。
但是要注意一点,这种截获仅仅是数据包的一份拷贝,而不能对其进行截断,要想截断网络流量就要采用一些更底层的办法了,不在本文的讨论范围之内。

二. 捕获数据包的编程实现:
1.raw socket的实现方法--------------------------------------------------------------------
不同于我们常用的数据流套接字和数据报套接字,在创建了原始套接字后,需要用WSAIoctl()函数来设置一下,它的定义是这样的
int WSAIoctl(
  SOCKET s,
  DWORD dwIoControlCode,
  LPVOID lpvInBuffer,
  DWORD cbInBuffer,
  LPVOID lpvOutBuffer,
  DWORD cbOutBuffer,
  LPDWORD lpcbBytesReturned,
  LPWSAOVERLAPPED lpOverlapped,
  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
虽然咋一看参数比较多,但是其实我们最关心的只是其中的第二项而已,我们需要做的就是把第二项设置为SIO_RCVALL,讲了这么多其实要做的就是这么一行代码,很简单吧?^_^
当然我们还可以指定是否亲自处理IP头,但是这并不是必须的。
完整的代码类似与如下这样,加粗的代码是与平常不同的需要注意的地方:
( 为了让代码一目了然,我把错误处理去掉了,下同)

#include “WinSock2.h”
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)

SOCKET SnifferSocket
  WSADATA wsaData;
  iFlag=WSAStartup(MAKEWORD(2,2),&wsaData);           //开启winsock.dll
                                 
SnifferSocket=WSASocket(AF_INET,             //创建raw  socket
SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);

  char FAR name[128];                                //获取本机IP地址
gethostname(name, sizeof(name));
  struct hostent FAR * pHostent;
  pHostent = gethostbyname(name);

  SOCKADDR_IN sa;                           //填充SOCKADDR_IN结构的内容
  sa.sin_family = AF_INET;
  sa.sin_port = htons(6000);           // 端口号可以随便改,当然与当然系统不能冲突
  memcpy(&(sa.sin_addr),pHostent->h_addr,pHostent->h_length);

bind(SnifferSocket,(LPSOCKADDR)&sa,sizeof(sa));            //绑定
  // 置ioctl来接收所有网络数据,关键步骤
  DWORD dwBufferLen[10] ;
  DWORD dwBufferInLen = 1 ;
  DWORD dwBytesReturned = 0 ;
  WSAIoctl(SnifferSocket, IO_RCVALL,&dwBufferInLen, izeof(dwBufferInLen),
        &dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );
至此,实际就可以开始对网络数据包进行嗅探了,而对于数据包的接收还是和普通的socket一样,通过recv()函数来完成,因为这里涉及到不同的socket模型,接收方法差别很大,所以在此就不提供接收的代码了。

2.winpcap的实现方法:-----------------------------------------------------------------------
winpcap驱动包,是我们玩转数据包不可或缺的好东东,winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报,主要为我们提供了四大功能:
功能:
    1> 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;
    2> 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;
    3> 在网络上发送原始的数据报;
    4> 收集网络通信过程中的统计信息
如果环境允许的话(比如你做的不是木马程序),我还是推荐大家用winpcap来截获数据包,因为它的功能更强大,工作效率更高,唯一的缺点就是在运行用winpcap开发的程序以前,都要在主机上先安装winpcap的driver。
而且一会我们就会发现它比raw socket功能强大的多,而且工作得更为底层,最明显的理由就是raw socket捕获的数据包是没有以太头的,此乃后话。
至于怎么来安装使用,请参考本系列的系列一《手把手教你玩转ARP包中的》,里面有详细的加载winpcap驱动的方法^_^
废话不多说了,让我们转入正题, 具体用winpcap来截获数据包需要做如下的一些工作:
A . 枚举本机网卡的信息(主要是获得网卡的名称)
   其中要用到pcap_findalldevs函数,它是这样定义的
   /*************************************************
int pcap_findalldevs  (  pcap_if_t **    alldevsp,
                             char *    errbuf
                          )
     功能:
             枚举系统所有网络设备的信息
     参数:  alldevsp:  是一个pcap_if_t结构体的指针,如果函数pcap_findalldevs函数执行成功,将获得一个可用网卡的列表,而里面存储的就是第一个元素的指针。
             Errbuf:    存储错误信息的字符串
     返回值: int :   如果返回0 则执行成功,错误返回 -1。
  *************************************************/
   我们利用这个函数来获得网卡名字的完整代码如下:

       pcap_if_t* alldevs;
       pcap_if_t* d;
       char errbuf[PCAP_ERRBUF_SIZE];
       pcap_findalldevs(&alldevs,errbuf);       // 获得网络设备指针
       for(d=alldevs;d;d=d->next)               // 枚举网卡然后添加到ComboBox中
       {
d->name;                            // d->name就是我们需要的网卡名字字符串,按照你// 自己的需要保存到你的相应变量中去
       }
pcap_freealldevs(alldevs);               // 释放alldev资源

请期待下文。。。。。^_^
B. 打开相应网卡并设置为混杂模式:
   在此之前肯定要有一段让用户选择网卡、并获得用户选择的网卡的名字的代码,既然上面已经可以获得所有网卡的名字了,这段代码就暂且略过了。
   我们主要是要用到 pcap_open_live 函数,不过这个函数winpcap的开发小组已经建议用pcap_open 函数来代替,不过因为我的代码里面用的就是pcap_open_live,所以也不便于修改了,不过pcap_open_live使用起来也是没有任何问题的,下面是pcap_open_live的函数声明:
/*************************************************
pcap_t* pcap_open_live  (  char *    device,
                             int    snaplen,
  int    promisc,
  int    to_ms,
  char *    ebuf
)
     功能:
           根据网卡名字打开网卡,并设置为混杂模式,然后返回其句柄
     参数:
           Device  : 就是前前面我们获得的网卡的名字;
           Snaplen :  我们从每个数据包里取得数据的长度,比如设置为100,则每次我们只是获得每个数据包 100 个长度的数据,没有什么特殊需求的话就把它设置为65535最大值就可以了;
           Promisc:这个参数就是设置是否把网卡设置为“混杂模式”,设置为 1 即可;
           to_ms :   超时时间,毫秒,一般设置为 1000即可。
     返回值:
           pcap_t :  类似于一个网卡“句柄”之类的,不过当然不是,这个参数是后面截获数据要用到的。
******************************************************************************/
虽然看起来比较复杂,不过用起来还是非常简单的,其实 1 行就OK了:
    pcap_t* adhandle;
       char errbuf[PCAP_ERRBUF_SIZE];
// 打开网卡,并且设置为混杂模式
// pCardName是前面传来的网卡名字参数
adhandle = pcap_open_live(pCardName,65535,1,1000,errbuf);

C. 截获数据包并保存为文件:------------------------------------------------------
     当然,不把数据包保存为文件也可以,不过如果不保存的话,只能在截获到数据包的那一瞬间进行分析,转眼就没了^_^
所以,为了便于日后分析,所以高手以及我个人经常是把数据包保存下来的慢慢分析的。
但是注意网络流量,在流量非常大的时候注意硬盘空间呵呵,常常几秒中就有好几兆是很正常的事情。
下面首先来详细讲解一下,这个步骤中需要用到的winpcap函数:
/**************************************************************
pcap_dumper_t* pcap_dump_open  (  pcap_t *    p,
                                      const char *    fname
)
功能:
      建立或者打开存储数据包内容的文件,并返回其句柄
参数:
       pcap_t *    p     :前面打开的网卡句柄;
      const char * fname :要保存的文件名字   
返回值:
       pcap_dumper_t* : 保存文件的描述句柄,具体细节我们不用关心
***************************************************************/
/***************************************************************
int pcap_next_ex          (  pcap_t *    p,
                              struct pcap_pkthdr **    pkt_header,
  u_char **    pkt_data
)
功能:
      从网卡或者数据包文件中读取数据内容
参数:
      pcap_t *    p:    网卡句柄
      struct pcap_pkthdr ** pkt_header: 并非是数据包的指针,只是与数据包捕获驱动有关的一个Header
      u_char ** pkt_data:指向数据包内容的指针 ,包括了协议头  
返回值:
          1 : 如果成功读取数据包
          0 :pcap_open_live()设定的超时时间之内没有读取到内容
          -1: 出现错误
          -2: 读文件时读到了末尾
***************************************************************/
/***************************************************************
void pcap_dump  (  u_char *    user,
                       const struct pcap_pkthdr *    h,
  const u_char *    sp
)  
功能:
      将数据包内容依次写入pcap_dump_open()指定的文件中
参数:
      u_char * user   :  网卡句柄
      const struct pcap_pkthdr * h: 并非是数据包的指针,只是与数据包捕获驱动有关的一个Header
      const u_char * sp: 数据包内容指针   
返回值:
          Void
****************************************************************/
下面给出一段完整的捕获数据包的代码,是在线程中写的,为了程序清晰,我去掉了错误处理代码以及线程退出的代码,完整代码可下载文后的示例源码,老规矩,重要的步骤用粗体字标出。
我们实际在捕获数据包的时候也最好是把代码放到另外的线程中。
/*********************************************************
*   进程:
*                   这个是程序的核心部分,完成数据包的截获
*     参数:
*                   pParam: 用户选择的用来捕获数据的网卡的名字
*********************************************************/
UINT CaptureThread(LPVOID pParam)
{
       const char* pCardName=(char*)pParam;          // 转换参数,获得网卡名字                       

       pcap_t* adhandle;
       char errbuf[PCAP_ERRBUF_SIZE];            
       // 打开网卡,并且设置为混杂模式
adhandle=pcap_open_live(pCardName,65535,1,1000,errbuf);      {

       pcap_dumper_t* dumpfile;
// 建立存储截获数据包的文件
       dumpfile=pcap_dump_open(adhandle, "Packet.dat");   

       int re;
       pcap_pkthdr* header;      // Header
       u_char* pkt_data;         // 数据包内容指针
// 从网卡或者文件中不停读取数据包信息
       while((re=pcap_next_ex(adhandle,&header,(const u_char**)&pkt_data))>=0)
      {
          // 将捕获的数据包存入文件
              pcap_dump((unsigned char*)dumpfile,header,pkt_data);     
       }
       return 0;
}  
将个线程加入到程序里面启动以后。。。等等,如何来启动这个线程就不用我说了吧,类似这样的代码就可以
::AfxBeginThread(CaptureThread,chNIC);     // chNIC是网卡的名字,char* 类型
启动线程一段时间以后(几秒中就有效果了),可以看到数据包已经被成功的截获下来,并存储到程序目录下的Packet.dat文件中。
=====================================================
至此,数据包的截获方法就讲完了,大家看了这篇文章,其实你就一定也明白了,无论是raw socket的方法还是winpcap的方法,其实都很简单的,真的没有什么东西,只是会让不明白原理的人看起来很神秘而已,isn’t it?
呵呵,不过也不要高兴的太早,这个保存下来的数据包文件,你可以试着用UltraEdit打开这个文件看看,是不是大部分都是乱码?基本上没有什么可读性,这是因为:
此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。
呵呵,所以我们要走的路还很长,这只是刚刚入门而已^_^

TOP

[转帖]SNIFFER的含义和工作原理 +如何捕获数据包+防范

命令行下可以解读TCP数据报内容的Sniffer 作者:未知 作者:brain_ 来源:http://blog.csdn.net/brain_/ #include "stdafx.h" #include "stdio.h" #include "string.h" #include "mstcpip.h" #include "Winsock2.h" #pragma comment(lib,"WS2_32.lib") #define STATUS_FAILED 0xFFFF //定义异常出错代码 #define MAX_PACK_LEN 65535 //接收的最大 IP 报文 #define MAX_ADDR_LEN 16 //点分十进制 地址的最大长度 #define MAX_HOSTNAME_LAN 255 //最大主机名长度 typedef struct _iphdr //定义IP首部 { unsigned char h_lenver; //4 位首部长度+4 位IP 版本号 unsigned char tos; //8 位服务类型TOS unsigned short total_len; //16 位总长度(字节) unsigned short ident; //16 位标识 unsigned short frag_and_flags; //3 位标志位 unsigned char ttl; //8 位生存时间TTL unsigned char proto; //8 位协议(TCP 或其他) unsigned short checksum; //16 位IP 首部校验和 unsigned int sourceIP; //32 位源IP 地址 unsigned int destIP; //32 位目的IP 地址 }IP_HEADER; typedef struct _tcphdr //定义TCP 首 部 { USHORT th_sport; //16 位源端口 USHORT th_dport; //16 位目的端口 unsigned int th_seq; unsigned int th_ack; unsigned char th_lenres; //4 位首部长度/6 位保留字 unsigned char th_flag; //6 位标志位 USHORT th_win; //16 位窗口大小 USHORT th_sum; //16 位校验和 USHORT th_urp; //16 位紧急数据偏移量 }TCP_HEADER; SOCKET SockRaw; char* TcpFlag[6]={ //定 义TCP 标志位 "FIN ", //FIN: 表示发送端已经没有数据要求传输了,希望释放连接。 "SYN ", //SYN: 标志位用来建立连接,让连接双方同步序列号。如果SYN=1而ACK=0,则表示该数据包为连接请求,如果SYN=1而ACK=1则表示 接受连接。 "RST ", //RST: 用来复位一个连接。RST标志置位的数据包称为复位包。一般情况下,如果TCP收到的一个分段明显不是属于该主机上的任何一 个连接,则向远端发送一个复位包。 "PSH ", //PSH: 如果置位,接收端应尽快把数据传送给应用层。 "ACK ", //ACK: 为确认标志位。如果为1,表示包中的确认号时有效的。否则,包中的确认号无效。 "URG " //URG: 为紧急数据标志。如果它为1,表示本数据包中包含紧急数据。此时紧急数据指针有效。 }; bool ParamTcp =true; // -t 关注TCP 报文 char *strFromIpFilter=NULL; // 源IP 地址 过滤 char *strDestIpFilter=NULL; // 目的地址过 滤 //Referrence int DecodeIpPack(char *,int); int DecodeTcpPack(char *); void CheckSockError(int,char*); void usage(void); bool GetCmdLine(int, char **); // void main(int argc, char ** argv) { int iErrorCode; char RecvBuf[MAX_PACK_LEN] = { 0 }; usage(); if(GetCmdLine(argc, argv)==true) exit(0); //初始化SOCKET WSADATA wsaData; iErrorCode = WSAStartup(MAKEWORD(2,1),&wsaData); CheckSockError(iErrorCode, "WSAStartup"); SockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_IP); CheckSockError(SockRaw, "socket"); //获取本机IP 地址 char FAR name[MAX_HOSTNAME_LAN]; iErrorCode = gethostname(name, MAX_HOSTNAME_LAN); CheckSockError(iErrorCode, "gethostname"); struct hostent FAR * pHostent; pHostent = (struct hostent * )malloc(sizeof(struct hostent)); pHostent = gethostbyname(name); SOCKADDR_IN sa; sa.sin_family = AF_INET; sa.sin_port = htons(6000); memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length); iErrorCode = bind(SockRaw, (PSOCKADDR)&sa, sizeof(sa)); CheckSockError(iErrorCode, "bind"); //设置SOCK_RAW 为SIO_RCVALL,以便接收所有的IP 包 DWORD dwBufferLen[10] ; DWORD dwBufferInLen = 1 ; DWORD dwBytesReturned = 0 ; iErrorCode=WSAIoctl(SockRaw, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL ); CheckSockError(iErrorCode, "Ioctl"); //侦听IP 报文 while(true) { memset(RecvBuf, 0, sizeof(RecvBuf)); iErrorCode = recv(SockRaw, RecvBuf, sizeof(RecvBuf), 0); CheckSockError(iErrorCode, "recv"); iErrorCode = DecodeIpPack(RecvBuf, iErrorCode); CheckSockError(iErrorCode, "Decode"); } } //IP 解包程序 int DecodeIpPack(char *buf, int iBufSize) { IP_HEADER *pIpheader; int iProtocol, iTTL; char szProtocol[4]; char szSourceIP[MAX_ADDR_LEN], szDestIP[MAX_ADDR_LEN]; SOCKADDR_IN saSource, saDest; pIpheader = (IP_HEADER *)buf; //Check Proto iProtocol = pIpheader->proto; strncpy(szProtocol, "TCP", 4); if(iProtocol==IPPROTO_TCP) { //Check Source IP saSource.sin_addr.s_addr = pIpheader->sourceIP; strncpy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN); if (strFromIpFilter) if (strcmp(strFromIpFilter,szSourceIP)) return true; //Check Dest IP saDest.sin_addr.s_addr = pIpheader->destIP; strncpy(szDestIP, inet_ntoa(saDest.sin_addr), MAX_ADDR_LEN); if (strDestIpFilter) if (strcmp(strDestIpFilter,szDestIP)) return true; //TTL iTTL = pIpheader->ttl; //Output printf("%s ", szProtocol); printf("%s->%s ", szSourceIP, szDestIP); printf("bytes=%d TTL=%d ",iBufSize,iTTL); //Calculate IP Header Length int iIphLen = sizeof(unsigned long) * (pIpheader->h_lenver & 0xf); //Decode Sub Protocol:TCP DecodeTcpPack(buf+iIphLen); } return true; } //SOCK 错误处理程序 void CheckSockError(int iErrorCode, char *pErrorMsg) { if(iErrorCode==SOCKET_ERROR) { printf("%s Error:%d\n", pErrorMsg, GetLastError()); closesocket(SockRaw); exit(0); } } //TCP 解包程序 int DecodeTcpPack(char * TcpBuf) { TCP_HEADER * pTcpHeader; pTcpHeader = (TCP_HEADER * )TcpBuf; printf("Port:%d->%d ", ntohs(pTcpHeader->th_sport),ntohs(pTcpHeader->th_dport)); unsigned char FlagMask = 1; int HdrLen = (pTcpHeader->th_lenres)>>2; printf("\n%s",((BYTE *)pTcpHeader)+HdrLen); for( int i=0; i<6; i++ ) { if((pTcpHeader->th_flag) & FlagMask) printf("%s",TcpFlag); else printf(" "); FlagMask=FlagMask<<1; } printf("\n"); return true; } //命令行参数处理 bool GetCmdLine(int argc, char ** argv) { for(int i=1;i { if(argv[0]!=';/';) return true; else { switch (argv[1]) { case ';f';: case ';F';: { strFromIpFilter=(char*)malloc(16*sizeof(char)); memset(strFromIpFilter,0,16*sizeof(char)); strcpy(strFromIpFilter,argv+3); break; } case ';d';: case ';D';: { strDestIpFilter=(char*)malloc(16*sizeof(char)); memset(strDestIpFilter,0,16*sizeof(char)); strcpy(strDestIpFilter,argv+3); break; } case ';?';: return true; break; default: break; } } } printf("\nWill Sniffer"); printf(" TCP"); if(strFromIpFilter) printf(" FromIp:%s",strFromIpFilter); if(strDestIpFilter) printf(" DestIp:%s",strDestIpFilter); printf("\n\tCTRL+C to quit\nStart:\n"); return (false); } void usage(void) { printf("\tSinffer for Win2K Console\n"); printf("USAGE:\n"); printf("\t/f: fromIP Output Packets FromIp=fromIP (default ALL)\n"); printf("\t/d: destIP Output Packets DestIp=destIP (default ALL)"); printf("\nExample:\n"); printf("\tsniffer.exe /d:192.168.15.233\n"); printf("\tsniffer.exe /f:192.168.15.231\n");

TOP

[转帖]SNIFFER的含义和工作原理 +如何捕获数据包+防范

防范网络嗅探
--------------------------------------------------------------------------------
www.hackbase.com 阅读:19985 时间:2005-5-6 8:05:07 来源:www.hackbase.com  
最普遍的安全威胁来自内部,同时这些威胁通常都是致命的,其破坏性也远大于外部威胁。其中网络嗅探对于安全防护一般的网络来说,操作简单的同时威胁巨大,很多黑客也使用嗅探器进行网络入侵的渗透.. 网络嗅探器对信息安全的威胁来自其被动性和非干扰性,使得网络嗅探具有很强的隐蔽性,往往让网络信息泄密变得不容易被发现。本文分析了网络嗅探的原理,分析了一些实例,提出解决方案和介绍实践经验。
  一、 嗅探器攻击原理
  嗅探器(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: &#36; cc linsniffer.c -o linsniffer

  要运行Linsniffer,使用下面的命令:&#36; linsniffer

  启动以后linsniffer将创建一个空文件:tcp.log来存储嗅探结果。
  举例说明,在一台测试的Linux服务器中创建一个名为"goodcjh"的用户,密码为"fad"。然后在主机CJH上使用该用户来登录这台Linux服务器,并进行一些常见的用户操作。下面是进行的一次ftp过程:
  CJH&#36; 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.
嗅探器可能造成的危害:

  嗅探器能够捕获口令.
  能够捕获专用的或者机密的信息.
  可以用来危害网络邻居的安全,或者用来获取更高级别的访问权限.
  分析网络结构,进行网络渗透。
 二.嗅探器攻击实例
  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: &#36; cc linsniffer.c -o linsniffer

  要运行Linsniffer,使用下面的命令:&#36; linsniffer

  启动以后linsniffer将创建一个空文件:tcp.log来存储嗅探结果。
  举例说明,在一台测试的Linux服务器中创建一个名为"goodcjh"的用户,密码为"fad"。然后在主机CJH上使用该用户来登录这台Linux服务器,并进行一些常见的用户操作。下面是进行的一次ftp过程:
  CJH&#36; 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.

TOP

[转帖]SNIFFER的含义和工作原理 +如何捕获数据包+防范

防范网络嗅探
--------------------------------------------------------------------------------
www.hackbase.com 阅读:19986 时间:2005-5-6 8:05:07 来源:www.hackbase.com  
  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对应表代替动态的。
  安全的拓扑结构:

TOP

[转帖]SNIFFER的含义和工作原理 +如何捕获数据包+防范

防范网络嗅探
--------------------------------------------------------------------------------
www.hackbase.com 阅读:19988 时间:2005-5-6 8:05:07 来源:www.hackbase.com  
  嗅探器只能在当前网络段上进行数据捕获。这就意味着,将网络分段工作进行得越细,嗅探器能够收集的信息就越少。但是,除非你的公司是一个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,最好下载源程序软件包自己进行编译。
  &#35; tar -zxvf ssh2-2.4.0.tar.gz
  &#35; cd ssh2-2.4.0
  &#35; ./configure ;&#35; make ;&#35;make install
  这一过程实际上将服务器软件包及客户端软件一起安装了,不必再次安装客户端软件包。 安装程序将SSH2软件包安装在/usr/local/bin及/usr/local/sbin下。
2、配置

  SSH的配置文件在/etc/ssh2下,其中包括sshd2的主机公钥和私钥:hostkey和hostkey.pub。这两个文件通常是在安装SSH时自动生成的。你可以通过下面的命令重新来生成它们:(而ssh2_config 文件一般情形下无需修改)
  &#35; rm /etc/ssh2/hostkey*
  &#35; ssh-keygen2 -P /etc/ssh2/hostkey
  3、启动SSH服务器
  在UNIX/Linux环境下,服务器程序放置在/usr/local/sbin目录下,启动方法如下:
  &#35; sshd
  &#35; ps x
  如果不希望每次重启动系统,都要手工运行启动,在rc.local中加入一行/usr/local/sbin/sshd。
  4、使用SSH
  安装好ssh之后,我们可以很方便地在远程服务器上利用ssh获得一个shell。例如,假设我执行:
  &#35; ssh cjh@red.forge.net
  首先看到系统提示输入密码,输入后我就在远程机器上获得了一个shell。从这里开始,ssh的会话过程和telnet会话相似。但SSH能够确信所有在我和服务器之间传输的数据都已经经过加密。如果你很熟悉rsh和它的选项,那么你很快就可以开始使用ssh。ssh被设计成和rsh具有相同的运作方式。一般情况下,能够用rsh作为传输端口的程序都允许用ssh来替代(例如rsync)。安全复制命令scp的用法也很简单,它的语法和cp的语法很相似。例如,要把my.php文件复制到cjh.org服务器,则我们使用如下命令:
  &#35; 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身份运行:
&#35;scp servername:/home/ftp/pub/file1./

  这样就把另一台服务器上的文件/home/ftp/pub/file1直接传到本机器的当前目录下。
  以上我们讲的是技术方面,对于网络的安全,管理显得格外重要。除网络管理员外其他人员禁止在网络中使用任何嗅探工具包括一些企业高级管理人员,是完全有必要的。这能从制度上明确限制一些工作站主动使用嗅探器的情况。
  对于网络管理员来说更重要的是要建立安全意识,了解你的用户(系统管理员越熟悉自己的用户和用户的工作习惯,就越能快速发现不寻常的事件,而不寻常的事件往往意味着系统安全问题。)、定期检查你网络中的重点设备如服务器,交换机,路由器。最好配备一些专业工具比如前边介绍的TDR。网络管理员还要给用户提供安全服务。对用户要定期发送安全邮件,发送邮件是让用户具有安全意识。管理意识是提高安全性的另-个重要因素。如果用户的管理部门对安全要求不强烈,只靠系统管理员也不行。最好让管理部门建立一套每个人都必须遵守的安全标准,如果系统管理员在此基础再建立自己的安全规则,就强化了安全。管理有助于加强用户意识,让用户明确,信息是有价值的资产。系统管理员应当使安全保护方法对用户尽可能地简单,提供一些提高安全的工具。网络管理员要建立合理的用户痛苦量(痛苦量是指安全限制引起的抵制的函数),不能仅仅从技术上考虑问题,还要站在用户的观点上考虑。例如,我们能够想每次Macintosh用户登录时都使用S/Key吗?用户知道的关于安全的知识越多,网络安全就更有保障。
  五、总结

  嗅探器技术被广泛应用于网络维护和管理方面,它工作的时候就像一部被动声纳,默默的接收看来自网络的各种信息,通过对这些数据的分析,网络管理员可以深入了解网络当前的运行状况,以便找出网络中的漏洞。在网络安全日益被注意的今天.我们不但要正确使用嗅探器.还要合理防范嗅探器的危害.嗅探器能够造成很大的安全危害,主要是因为它们不容易被发现。对于一个安全性要求很严格的企业,在使用技术防范的同时安全管理的制度建设也是非常重要的。
  嗅探器技术并非尖端科技,只能说是安全领域的基础课题。对嗅探器技术的研究并不要求太多底层的知识,它并不神秘。实际上我们的一些网管软件,和一些网络测试仪都使用了嗅探器技术。只是许多计算机软件供应商对其一直讳莫如深。回避这个基本事实是不明智的。了解掌握它才是关键。这也笔者的写作动机

TOP

[转帖]SNIFFER的含义和工作原理 +如何捕获数据包+防范

如何防御Sniffer攻击
作者:未知
来源:www.hackbase.com  
1.怎样发现 Sniffer
   Sniffer最大的危险性就是它很难被发现,在单机情况下发现一个Sniffer还是比较容易的,可以通过查看计算机上当前正在运行的所有程序来实现,当然这不一定可靠。
   在UNIX系统下可以使用下面的命令:ps-aux。这个命令列出当前的所有进程、启动这些进程的用户、它们占用CPU的时间以及占用多少内存等等。
   在Windoos系统下,可以按下Ctrl+Alt+Del键,查看任务列表。不过,编程技巧高的Sniffer即使正在运行,也不会出现在这里。
   另一个方法就是在系统中搜索,查找可怀疑的文件。但人侵者用的可能是他们自己写的程序,所以这给发现Sniffer造成相当大的困难。还有许多工具能用来查看你的系统会不会处于混杂模式,从而发现是否有一个Sniffer正在运行。 但在网络情况下要检测出哪一台主机正在运行Sniffer是非常困难的,因为Sniffer是一种被动攻击软件,它并不对任何主机发出数据包,而只是静静地运行着,等待着要捕获的数据包经过。
  2.抵御 Sniffer
   虽然发现一个Sniffer是非常困难的,但是我们仍然有办法抵御Sniffer的嗅探攻击。既然Sniffer要捕获我们的机密信息,那我们干脆就让它捕获,但事先要对这些信息进行加密,黑客即使捕捉到了我们的机密信息,也无法解密,这样,Sniffer就失去了作用。
   黑客主要用Sniffer来捕获Telnet、FTP、POP3等数据包,因为这些协议以明文在网上传输,我们可以使用一种叫做SSH的安全协议来替代Telnet等容易被Sniffer攻击的协议。
   SSH又叫Secure Shell,它是一个在应用程序中提供安全通信的协议,建立在客户/服务器模型上。SSH服务器分配的端口是22,连接是通过使用一种来自RSA的算法建立的。在授权完成后,接下来的通信数据用IDEA技术来加密。这种加密方法通常是比较强的,适合于任何非秘密和非经典的通信。
   SSH后来发展成为F-SSH,提供了高层次的、军方级别的对通信过程的加密。它为通过TCP/IP的网络通信提供了通用的最强的加密。如果某个站点使用F—SSH,用户名和口令就不再重要了。目前,还没有人突破过这种加密方法。即使是Sniffer,收集到的信息将不再有价值。有兴趣的读者可以参看与SSH相关的书籍。
   另一种抵御Sniffer攻击的方法是使用安全的拓扑结构。因为Sniffer只对以太网、令牌环网等网络起作用,所以尽量使用交换设备的网络可以从最大程度上防止被Sniffer窃听到不属于自己的数据包。还有一个原则用于防止Snther的被动攻击 一个网络段必须有足够的理由才能信任另一网络段。网络段应该从考虑具体的数据之间的信任关系上来设计,而不是从硬件需要上设计。一个网络段仅由能互相信任的计算机组成。通常它们在同一个房间里,或在同一个办公室里,应该固定在建筑的某一部分。注意每台机器是通过硬连接线接到集线器(Hub)的,集线器再接到交换机上。由于网络分段了,数据包只能在这个网段上被捕获,其余的网段将不可能被监听。
   所有的问题都归结到信任上面。计算机为了和其他计算机进行通信,它就必须信任那台计算机。系统管理员的工作就是决定一个方法,使得计算机之间的信任关系很小。这样,就建立了一种框架,告诉你什么时候放置了一个Sniffer,它放在哪里,是谁放的等等。
   如果局域网要和Internet相连,仅仅使用_blank">防火墙是不够的。人侵者已经能从一个_blank">防火墙后面扫描,并探测正在运行的服务。应该关心的是一旦人侵者进人系统,他能得到些什么。你必须考虑一条这样的路径,即信任关系有多长。举个例子,假设你的Web服务器对计算机A是信任的,那么有多少计算机是A信任的呢?又有多少计算机是受这些计算机信任的呢?一句话,就是确定最小信任关系的那台计算机。在信任关系中,这台计算机之前的任何一台计算机都可能对你的计算机进行攻击并成功。你的任务就是保证一旦出现Sniffer,它只对最小范围有效。
   Sniffr往往是在攻击者侵人系统后使用的,用来收集有用的信息。因此,防止系统被突破很关键。系统安全管理员要定期的对所管理的网络进行安全测试,防止安全隐患。同时要控制拥有相当权限的用户的数量,因为许多攻击往往来自网络内部。
  3.防止 Sniffer的工具 Antisnff
   Antisniff是由著名黑客组织(现在是安全公司了)L0pht开发的工具,用于检测本地网络是否有机器处于混杂模式(即监听模式)。
   一台处于混杂模式的机器意味着它很可能已被入侵并被安装了Sniffer。对于网络管理员来说,了解哪台机器正处于混杂模式以作进一步的调查研究是非常重要的。
   Antisniff 1.X版运行在以太网的WindOWS NT系统中,并提供了简单易用的用户图形界面。该工具以多种方式测试远程系统是否正在捕捉和分析那些并不是发送给它的数据包。这些测试方法与其操作系统本身无关。
   Antisniff运行在本地以太网的一个网段上。如果在非交换式的C类网络中运行,Antisniff能监听整个网络;如果网络交换机按照工作组来隔离,则每个工作组中都需要运行一个Antisniff。原因是某些特殊的测试使用了无效的以太网地址,另外某些测试需要进行混杂模式下的统计(如响应时间、包丢失率等)。
   Antisniff的用法非常简便,在工具的图形界面中选择需要进行检查的机器,并且指定检查频率。对于除网络响应时间检查外的测试,每一台机器会返回一个确定的正值或负值。返回的正值表示该机器正处于混杂模式,这就有可能已经被安装了Sniffer。
   对于网络响应时间测试的返回值,建议根据第一次返回的数值计算标准值,然后再对在flood和非flood两次测试时返回的结果有较大变化的机器进行检查。一旦这些机器退出混杂模式返回到正常操作模式下,Antisniff的下一次测试将会记录到混杂模式和非混杂模式的差值(正值)。
   应该周期性地运行Antisniff,具体周期值根据不同的站点、不同的网络负荷、测试的机器数量和网站策略等而有所不同

TOP

返回列表 回复 发帖