谈网络嗅探技术的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中国科技信息2006年第1期 CHINA SCIENCE AND TECHNOLOGY INFORMATION Jan.2006
嗅探(Sniffer)技术就是从网络上截获传播的数据流,它是网络安全领域里一项非常重要的技术。

因为对于任何一个“Hacker”来说,他们可以用这种非常隐蔽的方式得到网络中传输的大量的敏感信息,如Telnet,ftp账号和密码等等明文传送的信息。

与主动扫描相比,这种嗅探的行为更加让管理员难以察觉,操作起来也不是很复杂!
而对于网络管理人员来说,也可以“以其人之道还至其人之身”,利用嗅探技术对网络活动进行监控,并及时发现各种攻击行为!使用嗅探技术截获的网络数据可以作为时下很流行的入侵检测系统的数据来源,按照通用入侵检测架构(CIDF)规则数据截获子系统位于入侵检测系统的最底层,其主要目的是从网络环境中获取事件,并向其他部分提供事件。

嗅探技术将是实现入侵检测的基础,否则,巧妇难为无米之炊,入侵检测就无从谈起。

在这篇文章里,我们主要探讨在Linux下如何利用C语言来实现一个嗅探程序!我们首先假设所有的主机在一个局域网内。

在看具体实现方法之前,让我们先了解以太的工作原理:
第一点:以太网采用载波侦听/冲突检测(CSMA/CD)技术
载波侦听是指在网络中的每个站点权利相同,在传输自己的数据之前,首先监听信道是否空闲,如果空闲,就传输自己的数据,如果信道被占用,就等待信道空闲。

而冲突检测则是为了防止发生两个站点同时监测到网络没有被使用时而产生冲突。

以太网正是采用了载波侦听/冲突检测技术,使用了广播机制,所以,所有与网络连接的工作站都可以看到网络上传递的数据。

第二点:网络一般分为共享网络和交换网络,通过HUB连接起来的子网为共享式网络,通过这种网络传播的所有数据包发往每一个主机。

另一种是通过交换机连接的交换式网络。

一般在我们使用的局域网或校园中多为共享式网络,所以本文中暂不考虑交换式网络。

第三点:我们日常使用的以太网卡的都是采用48位的MAC地址,在一般情况下,网卡只接收——MAC地址与自己相匹配的数据帧。

而网卡要完成收发数据包的工作,是有两种接收模式:
混杂模式:不管数据帧中的目的地址是否与自己的地址匹配,都接收下来
非混杂模式:只接收目的地址相匹配的数据帧,以及广播数据包(和组播数据包)
因此,我们只要把网卡设置为混杂模式就可以利用它监听网络上的流量。

于是,我们的设计思路就很清晰了:利用以太网的广播机制抓取网络数据——这种抓取技术是依赖网卡的。

而共享式网络上,网卡可以
谈网络嗅探技术的实现
李莹 张俊杰 河南交通职业技术学院计算机科学系 450000
摘 要:嗅探(Sniffer)技术就是从网络上截获传播的数据流,它是网络安全领域里一项非常重要的技术。

对于黑客来说,嗅探技术比主动扫描更加让管理员难以察觉,操作起来也不是很复杂。

同样对于网络管理员来说,可以利用它对网络活动进行监控,并及时发现各种攻击行为。

使用嗅探技术截获的网络数据还可以作为时下很流行的入侵检测系统的数据来源。

本文从分析以太网的工作原理入手,提出利用以太网的广播机制依赖网卡的抓取网络数据方法。

并在Linux系统下利用常用的C语言来实现一个嗅探程序。

关键词:网络;数据截获;实现
通过广播监听到网络上的所有数据包,这就是嗅探技术也是网络数据采集的理论基础。

具体来说:在一般情况下,来源于应用程序的IP报文被封装成以太网帧,它是数据链路层的报文,包含有源地址、需要传送的信息和目的IP地址(通过ARP协议进行映射为一个6字节的目的以太网址,经常叫做MAC地址)!但在链路层中并不存在路线的概念,源主机发出的帧不会直接指向目的主机,而是基于广播方式传播,网络中的所有网卡都能看到它的传输。

每个网卡都会检查帧开始的6个字节(目的主机的MAC地址),但是在非混杂模式下,只有和目的地址相符合的网卡,才接收这个帧,于是这个帧被网络驱动程序分解去掉报头等,还原成原来的IP报文,通过网络协议栈传送至接收的应用程序!
在LINUX内核版本中有一个名为PF_PACKET的协议簇,它在理论上是数据链路层的,基于网卡驱动程序的。

在混杂模式下,可以直接从链路层(就是网线)获取数据帧。

建立这样的一个socket需要root权限,编程时把uid设为0。

这样从packetsocket读到的数据就是链路层格式的数据,但经过处理(socket函数的第二个参量SOCK_DGRAM表示要去掉第二层的数据头,第三个参量ETH_P_IP表示只接收ipv4的数据包)后,缓冲区内的内容是个完整的IP包(未经任何其它处理)。

分析工作交由数据分析程序去做。

具体实现方法如下:
1、将网卡设置为混杂模式
可以采用了Linux内核中提供的PF_PACKET类型的socket,用设备驱动程序中对设备的I/O通道进行管理的ioctl( )函数设置:
首先使用root权限打开一个packetsocket再执行
packet_socket = socket(PF_PACKET,int socket_type, int protocol); 
在不同Linux版本可能会有不同的函数调用,但本质上都是打开一个socket或者通过open打开一个设备)通过ioctl( )或者setsockopt( )设置为混杂模式。

2、用PF_PACKET协议簇抓包
#include <stdio.h>#include <string.h>#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>#include <sys/types.h>#include <linux/in.h>
#include <linux/if_ether.h>#include <net/if.h>#include <sys/ioctl.h>
int main(int argc, char **argv)
{ int sock, n; char buffer[2048];unsigned char *iphead, *ethhead; structifreq ethreq;
if ( (sock=socket(PF_PACKET,SOCK_RAW, htons(ETH_P_IP)))<0)
{ perror("socket"); exit(1); } /* Set the network card in promiscuos mode*/
strncpy(ethreq.ifr_name,"eth0",IFNAMSIZ);
if (ioctl(sock,SIOCGIFFLAGS,?req)==-1)
 { perror("ioctl"); close(sock);exit(1); }
ethreq.ifr_flags|=IFF_PROMISC;
if (ioctl(sock,SIOCSIFFLAGS,?req)==-1){ perror("ioctl"); close(sock); exit(1); }
 while (1)
{ printf("----------\n"); n =recvfrom(sock,buffer,2048,0,NULL,NULL);printf("%d bytes read\n",n); /* Check tosee if the packet contains at least *complete Ethernet (14), IP (20) and TCP/UDP * (8) headers. */
 if (n<42) {
perror("recvfrom():"); printf("Incomplete packet (errno is %d)\n",errno);
close(sock); exit(0); }ethhead = buffer;
printf("Source MAC address: ""%02x:%02x:%02x:%02x:%02x:%02x\n",
ethhead[0],ethhead[1],ethhead[2],ethhead[3],ethhead[4],ethhead[5]);
printf("Destination MAC address: ""%02x:%02x:%02x:%02x:%02x:%02x\n",
ethhead[6],ethhead[7],ethhead[8],ethhead[9],ethhead[10],ethhead[11]);
iphead = buffer+14; /* Skip Ethernetheader */
if (*iphead==0x45) { /* Double checkfor IPv4 * and no options present */printf("Source host %d.%d.%d.%d\n",
根据(4)式可得:
其中h(z)为整函数。

由(6),(7)式可:
注意到λ(f)为有穷非整数,而λ(e故:λ(f)<λ(eh) (8)用定理1的证明方法可得:
致谢:作者真诚感谢导师姚卫红老师给予的指导与帮助!。

相关文档
最新文档