局域网arp攻击_网络安全基础之ARP攻击和防御

本文转载于 SegmentFault 社区

作者:吴小风


前言

在看这篇文章之前,请大家先看下交换机的工作原理,不知大家有没有想过数据链路层中头部协议数据帧的目的MAC地址是如何获取的呢?这就是今天的主角ARP协议,通过广播来获取IP地址对应的MAC地址。

问:广播有很多种,交换机可以广播,ARP协议可以广播,IP地址可以广播等等,有啥区别吗?

答:交换机广播和ARP协议广播比较容易混淆,因为都是交换机上发生的事情,下面我们来看下这部分,IP地址广播请看路由部分博客


交换机广播

25acb8658467a7c4d7af2ca622ab6984.png

上图会在下面阐述ARP原理和攻击的时候同样用到 ,结合上图我们来看下交换机广播的场合:

现做出如下假设:三个小圆圈表示局域网内的三台网络设备,IP地址分别为10.0.0.1、10.0.0.2、10.0.0.3;MAC地址分别为AA、BB、CC(简写,实际MAC长度为6个字节)。长方形表示AA设备向CC设备通信时准备发送的数据帧。

设备AA将数据发送到交换机1;

交换机解析数据帧,获取目标MAC,查询MAC地址表,但是MAC地址表中没有查到设备CC的MAC地址和交换机接口的关系,这个时候交换机为了知道谁的MAC是CC,则需要广播,即交换机向每个端口都发送一份数据帧;

MAC地址不是CC的设备会忽略收到的数据帧,而MAC为CC的设备会接受数据帧,进行下一步处理。

总结:交换机只在MAC地址表没有目标MAC的时候才会广播。

问:一开始长方形中的CC设备的MAC地址是怎么知道的呢?

答:这就是接下来要讲的ARP协议的工作


ARP协议

还是以上图交换机的原理图为例,来分析下ARP协议的原理,现在做出假设长方形中的CC设备MAC地址AA设备一开始不知道,来分析下获取CC设备MAC地址的流程:

  1. 数据帧中一开始因为不知道CC设备的MAC地址,这个时候需要将目标MAC地址填充为FF-FF-FF-FF-FF-FF

  2. 假设工作在局域网,交换机解析数据帧,获取到目标MAC地址为FF-FF-FF-FF-FF-FF,交换机会自动广播,将数据帧发送给局域网内的每台设备

  3. 局域网内的所有设备解析数据帧,获取到MAC地址为FF-FF-FF-FF-FF-FF,即便不是自己的MAC地址所有设备也会解析数据帧。目标IP是自己的设备,则会封装数据帧返回给发送者,并告知发送方自己的MAC地址;如果目标IP不是自己,则相应的设备会丢弃数据帧

  4. 收到CC设备的MAC后,AA设备会缓存到ARP缓存表。原因是为了避免下次发送数据给CC设备的时候,还要再次使用ARP协议去获取MAC地址

总结ARP协议原理:

  1. 发送ARP广播请求,请求内容为我是xxx,我的MAC是xxx,IP是xxx的MAC是多少?

  2. 接受ARP单播应答

问:ARP缓存表怎么看?

答:arp /help可以查看ARP相关的信息,arp /a可以查看本台计算机的arp表数据

如下图所示:

05e1259959bbc601996e1b2c71ea419c.png


ARP攻击

还是以上图交换机的原理图为例,来分析下ARP协议的攻击,现在假设长方形中的CC设备的MAC地址AA设备一开始不知道,并假设BB为攻击设备:

  1. 数据帧中因为不知道CC设备的MAC地址,这个时候需要将目标MAC地址填充为FF-FF-FF-FF-FF-FF

  2. 假设工作在局域网,交换机解析数据帧,获取到目标MAC地址为FF-FF-FF-FF-FF-FF,交换机会自动广播,将数据发送给局域网内的每台设备

  3. 局域网内的所有设备解析数据帧,获取到MAC地址为FF-FF-FF-FF-FF-FF,即便不是自己的MAC地址所有设备也会解析数据帧。目标IP是自己的设备,则会封装数据帧返回给发送者,并告知发送方自己的MAC地址;如果目标IP不是自己,则相应的设备会丢弃数据帧。但是这个时候BB为攻击设备,即便数据帧中目标IP不是自己,它会伪造自己的MAC地址,然后冒充CC设备做出ARP响应

  4. AA设备这时候会收到2个ARP响应信息,如果CC设备的ARP响应先到AA设备,BB设备后伪造的ARP响应会覆盖CC设备的ARP响应。那么此时AA设备将无法与CC设备通信,因为AA设备的ARP表中与CC设备IP对应关系的MAC是BB设备的MAC,IP与MAC不匹配是无法通信的。

问:如果上述流程中BB设备的ARP响应的信息先到AA设备,那么AA就可以与CC设备通信了吗?

答:BB设备可以连续构造ARP响应,只要AA设备再次发送ARP数据帧,BB设备也是可以攻击AA设备通信的

问:AA虽然无法与CC设备通信,但CC设备可以与AA正常通信吗?

答:可以的,因为CC设备没有遭到攻击,CC设备ARP表里存储的IP和MAC地址的关系是正确的

问:ARP攻击是必须通过单播响应才能出发吗?

答:广播也可以触发ARP攻击,而且范围更广。如果BB设备一直发送ARP广播,冒充自己是网关(即构造自己是网关的ARP响应),那么局域网内的所有设备(除了攻击者)的ARP表里网关的IP地址和MAC地址关系都将不正确,造成的影响是断网。


ARP欺骗

这次以ARP攻击的例子为前提,来分析下ARP协议的欺骗,我们对上述流程中第三步做如下改变:

  1. 局域网内的所有设备解析数据帧,获取到MAC地址为FF-FF-FF-FF-FF-FF,即便不是自己的MAC地址所有设备也会解析数据帧。目标IP是自己的设备,则会封装数据帧返回给发送者,并告知发送方自己的MAC地址;如果目标IP不是自己,则相应的设备会丢弃数据帧。但是这个时候BB为攻击设备,即便数据帧中目标IP不是自己,BB却还是用自己网卡真实的MAC地址,做出ARP响应。

  2. 然后BB在与CC正常通信,这个时候BB起到中间转发的作用,但是AA能与CC正常通信。BB设备可以实现监听、窃取、篡改、控制流量等目的,但不中断AA设备和CC设备通信。

问:啥时候是ARP攻击,啥时候是ARP欺骗?

答:攻击者提供虚假报文的MAC就是ARP攻击,攻击者提供自己真实的MAC就是ARP欺骗


ARP防御

  1. 静态ARP绑定

    ARP表的静态数据优先级高于动态数据,因此我们直接在ARP表内绑定IP和MAC的关系不会被动态ARP响应覆盖。还是以上图交换机的原理图为例,比如AA设备手动绑定网关的IP地址和MAC地址,那么AA设备即便遭到ARP攻击,也不会出现断网的情况。虽然会收到冒充自己是网关的ARP攻击响应,但是会置之不理。同样AA设备和CC设备互相通信,双方互相绑定了AA和CC设备的IP和MAC地址,这时候BB设备即使想进行ARP欺骗,也无法实现。

    问:静态ARP绑定怎么感觉有点不方便呢?

    答:为了防止遭到ARP攻击,需要收集所有要进行通信的设备IP和MAC,然后添加到自己的ARP表里面,更要命的是ARP表是存放在内存中,机器重启后需要重新输入所有设备的IP和MAC地址关系,相当麻烦。

  2. 硬件级ARP防御

    上述静态ARP绑定的方式工作量太大,要想从根本上解决ARP攻击,还需要从交换机上下手。交换机原本工作在二层,只能识别数据帧,但是为了解决dhcp攻击和ARP攻击等,企业级交换机增加了解析其它上层协议的功能【当然相应的价格就贵了】。解决ARP攻击的方案是在交换机上绑定每个端口的IP(配合DHCP服务器)和MAC地址的关系。

  • 第一次BB设备与交换机通信,交换机记录下BB设备的端口IP和MAC地址关系;

  • 当BB设备攻击,冒充自己是CC的时候,假如想进行攻击,就需要伪造自己的MAC,那么交换机检测到MAC与原来的记录不一样就会进行拦截。假如想进行欺骗,势必需要冒充CC的IP才行,这时候交换机检测到IP与原来记录的IP不一样同样会把攻击拦截了。


- END -b36aaef97dc512c75cacdd12d6d5796c.png

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

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

相关文章

SocketServer模块,hmac模块验证client合法性

hmac模块: 1.模块初识: import hmac # h hmac.new() #括号里要给它连个bytes类型,一个是自定义的secret_key,一个是你想进行加密的bytes # 密文 h.digest() # hmac.compare_digest() #括号内传另外一个密文,看是否相…

以实例让你真正明白mapreduce---填空式、分布(分割)编程

问题导读:1.如何在讲mapreduce函数中的字符串等信息,输出到eclipse控制台?2.除了使用下文方法,还有其它方法输出到控制台?3.map中,系统默认接受的value值是什么?4.reduce输出不是自己想要的结果…

使用Spring编写和使用SOAP Web服务

在RESTful Web服务时代,我有机会使用SOAP Web Service。 为此,我选择了Spring ,这是因为我们已经在项目中使用Spring作为后端框架,其次它提供了一种直观的方式来与具有明确定义的边界的服务进行交互,以通过WebServiceT…

前端---vscode 的基本使用

1. vscode 的基本介绍 全拼是 Visual Studio Code (简称 VS Code) 是由微软研发的一款免费、开源的跨平台代码编辑器,目前是前端(网页)开发使用最多的一款软件开发工具。 2. vscode 的安装 下载网址: Download Visual Studio Code - Mac, Linux, Windows选择对应…

建立Win32 Console Project时会出“error LNK1123” 错误

VS2010在经历一些更新后,建立Win32 Console Project时会出“error LNK1123” 错误,解决方案为将 项目|项目属性|配置属性|清单工具|输入和输出|嵌入清单 “是”改为“否”即可,但是没新建一个项目都要这样设置一次。在建立VS2010 Win32 Proje…

将同时共享的用户数量限制为20_共享充电宝市场需求及计划

18269363827 冯从2016-2018年这些时间中共享充电宝市场空间巨大,据权威数据显示共享充电宝市场整个用户数量实现了从0-5888万的巨大增幅,2019年共享充电市场用户规模将继续保持大幅增长至年底达1亿用户规模。在2019年充电宝租赁市场气势盛大,…

mysql中limit用法

使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已 经为我们提供了这样一个功能。 SELECT*FROMtableLIMIT [offset,]rows |rows OFFSET offsetLIMIT 子句可以被用于强制 SELECT 语句返回…

Redis实现之整数集合

整数集合 整数集合(insert)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。举个栗子,如果我们创建一个只包含五个元素的集…

启动rocketmq 报错_RocketMQ为什么要保证订阅关系的一致性?

前段时间有个朋友向我提了一个问题,他说在搭建 RocketMQ 集群过程中遇到了关于消费订阅的问题,具体问题如下:然后他发了报错的日志给我看:the consumers subscription not exist我第一时间在源码里找到了报错的位置:or…

scala rest_使用路标的Scala和Java的Twitter REST API

scala rest如果您已经阅读了此博客上的其他文章,您可能会知道我喜欢创建各种数据集的可视化。 我刚刚开始一个小项目,在这里我想可视化来自Twitter的一些数据。 为此,我想直接从Twitter检索有关关注者的信息和个人资料信息。 我实际上开始寻找…

MySql中关于某列中相同数值连续出现次数的统计

MySql中关于某列中相同数值连续出现次数的统计 原表如下: www.2cto.com 100 101 102 100 100 103 104 102 102 105 106 101 101 输出如下: www.2cto.com 100 1 101 2 102 3 100 4 100 4 103 5 104 6 10…

设计模式之- 外观模式(Facade Pattern)

外观模式 外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式&…

python的while和for循环

while语句,提供了编写通用循环的一种方法,而for语句是用来遍历序列对象内的元素,并对每个元素运行一个代码块。break,continue用在循环内,跳出整个循环或者跳出一次循环。 一、while循环 1、一般格式 格式:首行以及测试…

go build 无文件_GO笔记之详解GO的编译执行流程

上篇文章介绍了Golang在不同系统下的安装,并完成了经典的Hello World案例。在这个过程中,我们用到了go run命令,它完成源码从编译到执行的整个过程。今天来详细介绍下这个过程。简单理解,go run 可等价于 go build 执行。 build命…

使用Spring Security和jdbc的Spring Boot第2部分

在上一篇文章中,我们基于Spring Security发出请求的默认表架构实现了安全性。 考虑到用户和角色,应用程序开发人员使用适合其需求的架构。 Spring使我们能够指定所需的查询,以便检索用户名,密码和角色等信息。 我们的自定义表将…

MySQL的一些简单语句

mysql 统计 表的数量:SELECT COUNT(1) FROM information_schema.TABLES WHERE TABLE_SCHEMA 你的数据库; MySQL的一些基础语句: 行是记录 列是字段 创建库 CREATE DATABASE [IF NOT EXISTS] 数据库名 [参数[ 参数] [ 参数]...]; 参数: CHARACTER …

【题解】Atcoder ARC#90 F-Number of Digits

Atcoder刷不动的每日一题... 首先注意到一个事实&#xff1a;随着 \(l, r\) 的增大&#xff0c;\(f(r) - f(l)\) 会越来越小。考虑暴力处理出小数据的情况&#xff0c;我们可以发现对于左端点 \(f(l) < 7\) 的情况下&#xff0c;右端点的最大限度为 \(\frac{10^8}{8} 10^7…

java分页查询_面试官:数据量很大,分页查询很慢,有什么优化方案?

准备工作一般分页查询使用子查询优化使用 id 限定优化使用临时表优化关于数据表的id说明《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与…

Python逐行读取文件内容

f open("foo.txt") # 返回一个文件对象 line f.readline() # 调用文件的 readline()方法 while line:print line, # 后面跟 , 将忽略换行符# print(line, end )   # 在 Python 3中使用line f.readline()f.close() 也…

原型模式精讲

原型模式是一种创建型模式,也是属于创建对象的一种方式,像西游记里面的孙悟空吹猴毛也属于原型模式,克隆出来了一群的猴子猴孙,还有细胞的分裂,spring中的Bean的生命周期好像有一个单例还有个原型&#xff0c;那个原型就是每次请求都复制一个对象出来,官方的定义是:用原型实例指…