利用scapy伪造ARP应答

网络2层通讯依赖正确的MAC地址,而ARP协议又非常脆弱(不安全),最著名的就是ARP欺诈。

家用网络设备一般不会有ARP防护功能,因此可以轻松的对家庭局域网其他用户进行ARP污染,阻止他们正常的上网行为。

Python有一款很方便的网络工具库叫做scapy(注意不是scrapy),可以轻松构造各种网络协议请求,因此我就拿它来演示如何构造ARP欺诈应答,对局域网用户进行污染。

ARP正常请求/应答

家里的电脑上网,默认网关是路由器192.168.2.1,因此当访问百度等网站时会ARP请求192.168.2.1的MAC地址。

我们手动模拟这个ARP请求,了解一下ARP的工作过程。

首先引入scapy库:

然后构造一个ARP广播请求,发送并等待应答:

这里op=1表示这是ARP的request而不是response,请求解析的地址是192.168.2.1。

调用sr1表示” send&receive 1次”,也就是发送请求等待1个应答并返回。

打印出ARP请求和ARP应答:

可以看到,发送的ARP请求目标mac地址是全0,也就是ARP广播,局域网都会收到。

而应答来自192.168.2.1,其MAC地址是0e:53:0e:a6:e3:c0。

污染舍友电脑

舍友的电脑同样会发送ARP请求路由器的MAC地址,如果我们假装路由器向其回复一个错误MAC地址,那么舍友就无法正常上网了。

更实用的是,我们可以把自己电脑的MAC地址回复给舍友电脑,这样舍友电脑的流量就会发给我们的电脑,我们就可以对其上网流量进行分析了。

上述代码描述了整个网络环境:

  • 我的电脑是192.168.2.203,MAC地址是0e:53:0e:a6:e3:c0。
  • 舍友电脑是192.168.2.169,MAC地址是62:db:d5:bf:34:43。
  • 路由器是192.168.2.1,MAC地址不重要。

在我的电脑中运行上述代码,将构造一个ARP应答欺诈。

我们要污染舍友电脑,让它认为192.168.2.1的MAC地址是0e:53:0e:a6:e3:c0,因此ARP的hwsrc是我的电脑,而psrc是路由器IP。

目标MAC和IP地址就是舍友电脑。

ARP属于3层协议,我们在2层需要定向发给舍友电脑,因此链路层Ether头的dst mac要写成舍友电脑,源MAC写自己的地址就行。

最后用/可以把网络包从高层->底层拼装起来,然后循环的sendp发送即可,iface指定包的网卡出口。

最后

如果我们去看舍友电脑上的arp -na命令,会看到192.168.2.1已经被污染为我的电脑,但是偶尔还会变成路由器MAC。

这是因为路由器也会定时的ARP探测局域网设备,而路由器发出的ARP广播会携带自己正确的MAC地址,导致舍友电脑的ARP缓存被纠正。

因此,我们在攻击时一定要注意循环发送欺诈应答,这样才可以持续对舍友电脑进行干扰。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~