假设主机 A 192.168.1.2,B 192.168.1.3,C 192.168.1.4; 网关 G 192.168.1.1; 在同一局域网,主机A和B通过网关G相互通信,就好比A和B两个人写信,由邮递员G送信,C永远都不会知道A和B之间说了些什么话。但是并不是想象中的那么安全,在ARP缓存表机制存在一个缺陷,就是当请求主机收到ARP应答包后,不会去验证自己是否向对方主机发送过ARP请求包,就直接把这个返回包中的IP地址与MAC地址的对应关系保存进ARP缓存表中,如果原有相同IP对应关系,原有的则会被替换。
这样C就有了偷听A和B的谈话的可能,继续思考上面的例子:
C假扮邮递员,首先要告诉A说:“我就是邮递员” (C主机向A发送构造好的返回包,源IP为G 192.168.1.1,源MAC为C自己的MAC地址),愚蠢的A很轻易的相信了,直接把“C是邮递员”这个信息记在了脑子里;
C再假扮A,告诉邮递员:“我就是A” (C向网关G发送构造好的返回包,源IP为A 192.168.1.2,源MAC地址为自己的MAC地址),智商捉急的邮递员想都没想就相信了,以后就把B的来信送给了C,C当然就可以知道A和B之间聊了些什么
ARP单向欺骗就更好理解了,C只向A发送一个返回包,告诉A:G 192.168.1.1 的MAC地址为 5c-63-bf-79-1d-fa(一个错误的mac地址),A把这个信息记录在了缓存表中,而G的缓存表不变,也就是说,A把数据包给了C,而G的包还是给A,这样就是ARP单向欺骗了。
环境:
路由器:NETGEAR30 IP:10.0.0.1/MAC:A0:40:A0:83:44:2F
实施ARP欺骗的主机(下面简称中间人):win10(关闭防火墙) IP:10.0.0.2/MAC:E4:70:B8:C1:8A:63
被ARP欺骗的主机(下面简称受害机):win10(关闭防火墙) IP:10.0.0.3/MAC:60:57:18:2F:C4:3E
两台主机通过Wifi同路由器连接。出于演示目的,受害机不断ping路由器,模拟内网通信。注意,整个过程是真实环境,并不是在虚拟机中完成。
在不开启ARP欺骗的情况下,中间人肯定收不到受害机发往路由器的数据包(广播包除外)。我们来看下此时路由器和受害机之间的ICMP通信情况:
从Packet List中任意选取一组请求和响应包:
Packet detail面板显示:ICMP请求包的"Ethernet II"桢中源地址MAC和目标地址MAC正是路由器和受害机的MAC地址,符合预期;
ICMP响应包也是同理。
顺带检查一下受害机的arp表,目前还算正常,显示路由器10.0.0.1的MAC是A0:40:A0:83:44:2F:
2.2).开启ARP欺骗
我们借助Cain&Abel在中间人10.0.0.2上完成ARP欺骗。开启Cain,切换到Sniffer标签-选择混迹在局域网中的网卡后,点击Start Sniffer(工具栏上网卡形状的图标)-点击Add to List(工具栏上+图标),之后Cain会自动扫描并在列表框中显示局域网中的主机。
扫描完毕,点击Sniffer标签页右下角的APR标签-点击Add to List-选择要局域网中要被欺骗的主机及该主机对应的路由器:
配置完毕后,点击工具栏Start APR按钮(黄黑相间的辐射标志),此时局域网ARP欺骗已经开始。中间人可以接受到受害者的ICMP包以及来自路由器的回应:
再次查看受害机的ARP表,发现它到路由器的表项被篡改了:
虽然路由器和受害机受到ARP欺骗的影响,傻乎乎的把数据发给中间人10.0.0.2,倒也不是发现不了。如果在受害机上打开Wireshark,还是能看到中间人因为发起ARP欺骗而留下了大量痕迹:
从中可以看到发往/来自10.0.0.1的数据包的MAC地址并不是路由器的MAC,这不仅反映了本机已经受到ARP欺骗的事实,还暴露了中间人的MAC地址,这倒方便网管揪出局域网里的害群之马!
参考:
1.中间人攻击——ARP欺骗的原理、实战及防御