ARP协议原理与攻击

ARP的概念

OSI模型回顾

基础模型:
每一层的作用:

Mac地址

只要确定了 IP 地址后,就能够向这个 IP 地址所在的主机发送数据报,这是我们所熟知的事情。但是再往深了想,IP 地址只是标识网络层的地址,那么在网络层下方数据链路层是不是也有一个地址能够告诉对方主机自己的地址呢?是的,这个地址就是MAC 地址。
MAC 地址的全称是 Media Access Control Address ,译为媒体访问控制地址,它是网络上以太网或网络适配器的唯一标识符。MAC 地址能够区分不同的网络接口,并用于多种网络技术,尤其是大多数 IEEE802 网络。
MAC 地址也称为物理地址,硬件地址和老化地址。
MAC 地址主要用于识别数据链路中互联的节点,如下图所示:
MAC 地址长 48 bit ,在使用网卡 (NIC) 的情况下, MAC 地址一般都会烧入 ROM 中。因此,任何一个网卡的 MAC 地址都是唯一的。 MAC 地址的结构如下
MAC 地址中的 3 - 24 位表示厂商识别码,每个 NIC 厂商都有特定唯一的识别数字。 25 - 48 位是厂商内部为识别每个网卡而用。因此,可以保证全世界不会有相同 MAC 地址的网卡。
在自己电脑上可以通过 ipconfig(windows)/ifconfig(linux) 等查看自己的 mac 地址。

ARP是什么?

ARP 协议的全称是 Address Resolution Protocol( 地址解析协议 ) ,它是一个通过用于实现 IP 地址到 MAC 地址 的映射,即询问目标 IP 对应的 MAC 地址 的一种协议。 ARP 协议在 IPv4 中极其重要。
注意: ARP 只用于 IPv4 协议中, IPv6 协议使用的是 Neighbor Discovery Protocol ,译为邻居发现协议,它被纳入 ICMPv6 中。
简而言之, ARP 就是一种解决地址问题的协议,它以 IP 地址为线索,定位下一个应该接收数据分包的主机 MAC 地址。如果目标主机不在同一个链路上,那么会查找下一跳路由器的 MAC 地址。

ARP工作原理

工作机制

假设 A B 位于同一链路,不需要经过路由器的转换,主机 A 向主机 B 发送一个 IP 分组,主机 A 的地址是 192.168.1.2 ,主机 B 的地址是 192.168.1.3 ,它们都不知道对方的 MAC 地址是啥,主机 C 和 主机D 是同一链路的其他主机。

 

主机 A 想要获取主机 B MAC 地址,通过主机 A 会通过 广播 的方式向以太网上的所有主机发送一个 ARP 请求包 ,这个 ARP 请求包中包含了主机 A 想要知道的主机 B IP 地址。
主机 A 发送的 ARP 请求包会被同一链路上的所有主机 / 路由器接收并进行解析。每个主机 / 路由器都会检查 ARP 请求包中的信息,如果 ARP 请求包中的 目标 IP 地址 和自己的相同 ,就会将自己主机的 MAC 地址写入响应包返回主机 A 2。
由此,可以通过 ARP IP 地址获取 MAC 地址,实现同一链路内的通信。
如果是不同链路怎么办呢?
这就要使用到 代理 ARP 了,通常 ARP 会被路由器隔离,但是采用代理 ARP (ARP Proxy) 的路由器可以将 ARP 请求转发给临近的网段。使多个网段中的节点像是在同一网段内通信。

广播和单播

广播(Broadcast)

我们一般小时候经常会跳广播体操,这就是广播的一个事例,主机和与他连接的所有端系统相连,主机将信号发送给所有的端系统。
单播(Unicast)
单播最大的特点就是 1 1 ,早期的固定电话就是单播的一个例子,单播示意图如下。
ARP缓存
现在我们知道了发送一次 IP 分组前通过发送一次 ARP 请求 就能够确定 MAC 地址。 那么是不是每发送一 次都得经过广播 -> 封装 ARP 响应 -> 返回给主机这一系列流程呢?
想想看,浏览器是如何做的呢?浏览器内置了缓存能够缓存你最近经常使用的地址,那么 ARP 也是一样的。ARP 高效运行的关键就是维护每个主机和路由器上的 ARP 缓存 ( 或表 ) 。这个缓存维护着每个 IP 到MAC 地址的映射关系。通过把第一次 ARP 获取到的 MAC 地址作为 IP MAC 的映射关系到一个 ARP缓存表中,下一次再向这个地址发送数据报时就不再需要重新发送 ARP 请求了,而是直接使用这个缓存表中的 MAC 地址进行数据报的发送。每发送一次 ARP 请求,缓存表中对应的映射关系都会被更新。
通过 ARP 缓存,降低了网络流量的使用,在一定程度上防止了 ARP 的大量广播。
一般来说,发送过一次 ARP 请求后,再次向相同目标主机发送请求的几率比较大,因此使用 ARP 缓存能够减少 ARP 包的发送,除此之外,不仅仅 ARP 请求的发送方能够缓存 ARP 接收方的 MAC 地址,接收方也能够缓存 ARP 请求方的 IP MAC 地址,如下所示;
  不过,MAC 地址的缓存有一定期限,超过这个期限后,缓存的内容会被清除 
我们可以在 Linux 或者 Windows 中使用 arp 命令查看 ARP 缓存。选项 -a 用于显示两个系统缓存中所有的缓存项。
Linux 中使用 arp 查询缓存 :
主要包含五项:
  • 主机名 --- 对应一个 IP 地址
  • 硬件地址类型
  • 硬件地址
  • 标志
  • 本地网络接口
标志主要分为 三类 : C M P C 表示的是由 ARP 协议动态学习。 M 类可以通过 arp -s 增加一条。 P类表示的是 发布 ,对于任何 P 类项目,主机对输入的 ARP 请求都返回一个 ARP 响应。这个选项用于配置代理 ARP
我们在 Windows 中进行 ARP 缓存查询 :
Windows 中的 ARP 程序显示了 IPv4 的地址,它的接口是十六进制数, Windows 版本还指出地址是手动输入还是 ARP 动态学习的。在上面的例子中,既有静态的也有动态的。 48 位的 MAC 地址被显示为 6个十六进制数,在 Linux 中使用 : 号,在 Windows 中使用 - 进行分隔。

ARP结构

我们上面说到, ARP 对想要知道 MAC 地址的目标主机会首先发送 ARP 请求,那么这个请求中都携带哪些信息呢?下面是在以太网中转换一个 IPv4 的地址常用的 ARP 请求或响应的报文格式。
前面 14 个字节构成标准以太网的首部,前两个字段 DST SRC 分别表示
  以太网的目的地址 和 以太网的源地址  
以太网的目的地址如果是 ff:ff:ff:ff:ff:ff 全部为 f 表示广播地址,在同一广播域中的所有以太网接口可以接收这些帧。后面紧跟着的是 ARP 请求的长度 / 类型, ARP 请求 和 ARP 应答这个值为 0x0806
  •  硬件类型 表示硬件地址的类型,硬件地址常见的有 MAC 物理或者以太网地址,对于以太网来说,
  • 此值为 1。 
  • 协议类型 指出映射的协议地址类型,对于 IPv4 地址,这个值是 0x0800
  • 硬件大小和 协议大小 分别指出硬件地址和协议地址的字节数。对于以太网中使用 IPv4 ARP 请求或应答,它们的值分别是 6 4。
  • Op 字段指出如果是 ARP 请求,Op = 1ARP 应答 ,Op = 2RARP 请求 Op = 3RARP 应答,Op = 4。
  • 紧跟在 Op 之后的是 发送方硬件地址 (MAC 地址 ) 发送方的协议地址 (IPv4 地址 ) 目的硬件地址 目的协议地址
  • 填充字段 由于以太网规定最小数据长度为 64 字节, ARP 帧长度只有 46 字节,因此有 18 字节填充位,填充位的内容没有定义,与具体实现相关。
    • FCS 4 个字节的帧校验序列( Frame Check Sequence FCS ),采用 32 CRC 循环冗余校验对从" 目标 MAC 地址 " 字段到 " 数据 " 字段的数据进行校验。

    ARP抓包理解原理

    这个地方主要利用 WIRESHARK 进行抓包,下载地址为:
    https://www.wireshark.org/download.html

    基础设置

    临时设置:
    也可以永久设置:
    去掉 16 进制窗口:
    最终效果:

    抓包ARP

    arp -a查看arp信息:

    arp -d 清除 arp 缓存 ( 需要管理员权限 )
    开始 ping ip
    太多数据了,过滤:
    这就是我们刚刚 ping arp 请求和响应:
    icmp 协议:

    ARP攻击原理

    网络中有 A B C 三台主机,主机 A 与主机 B 正常通信,主机 C 进入网络,开始实施 ARP 欺骗。
    首先,主机 C 给主机 A 发一个 ARP 应答报文,报文显示主机 B IP 地址映射主机 C MAC ,主机 A 收到这个报文,更新自己的ARP 缓存表,修改主机 B IP 地址对应的 MAC 。这样,其后主机 A 发往主机 B 的数据包均会发给主机C
    如果主机 C 不转发该数据包到主机 B ,则主机 B 认为与主机 A 的通信发生故障,而主机 A 无法察觉。
    如果主机 C 转发数据包到主机 B ,则主机 B 与主机 A 之间的通信不受影响,仅仅是主机 C 监听到主机 A 到主机 B的数据包。同理,主机 C ARP 应答报文欺骗主机 B ,则主机 B 发往主机 A 的数据包被主机 C 监听。

    ARP攻击的分类

    ARP 是一种非常不安全的协议,目前已经有很多涉及 ARP 的攻击,最主要的就是使用代理 ARP 功能假扮主机,对 ARP 请求作出应答,通过伪造 ARP 数据包来窃取合法用户的通信数据,造成影响网络传输速率和盗取用户隐私信息等严重危害。
    ARP 主要攻击方式分为下面这几种:

    ARP 泛洪攻击:通过向网关发送大量 ARP 报文,导致网关无法正常响应。首先发送大量的 ARP 请求报文,然后又发送大量虚假的 ARP 响应报文,从而造成网关部分的 CPU 利用率上升难以响应正常服务请求,而且网关还会被错误的 ARP 缓存表充满导致无法更新维护正常 ARP 缓存表,消耗网络带宽资源。

    ARP 欺骗主机攻击 ARP 欺骗主机的攻击也是 ARP 众多攻击类型中很常见的一种。攻击者通过 ARP 欺骗使得局域网内被攻击主机发送给网关的流量信息实际上都发送给攻击者。主机刷新自己的ARP 使得在自己的 ARP 缓存表中对应的 MAC 为攻击者的 MAC ,这样一来其他用户要通过网关发送出去的数据流就会发往主机这里,这样就会造成用户的数据外泄。
    欺骗网关的攻击 : 欺骗网关就是把别的主机发送给网关的数据通过欺骗网关的形式使得这些数据通过网关发送给攻击者。这种攻击目标选择的不是个人主机而是局域网的网关,这样就会攻击者源源不断的获取局域网内其他用户韵数据.造成数据的泄露,同时用户电脑中病毒的概率也会提升。
    中间人攻击 : 中间人攻击是同时欺骗局域网内的主机和网关,局域网中用户的数据和网关的数据会发给同一个攻击者,这样,用户与网关的数据就会泄露。
    这里应该还要加一条网关到攻击的数据流。

    ARP攻击复现

    攻击准备

    攻击机: kali
    被攻击机: centos7 靶机
    被攻击机: winserver2008
    欺骗主机实现断网攻击

    先在kali中获取需要攻击的目标ip地址以及网关的ip地址:

    # 扫描对应网段所有存活的主机
    fping -asg 192.168.3.0/24
    # 或者使用也可以得到对应的效果
    nmap -sP 192.168.3.0/24
    

    我们确定需要攻击的目标 ip 192.168.3.155
    网关的 ip 192.168.3.1
    也是就我们的 winserver2008 靶机。
    注意:在执行攻击之前很多命令都需要管理员权限。
    这里要用到一个 arp 欺骗工具: arpspoof , 这个工具 kali 里面直接输入对应的命令回车,如果没有会让你安装。
    这个工具相当于可以不停的去发送欺骗数据包。
    arpspoof -i 网卡 -t 目标IP 网关
    也可以使用反向欺骗:
    arpspoof -i 网卡 -t 网关 目标IP
    攻击之前先确定目标主机是可以上网的:
    执行命令:
    # 这条命令的意思:
    # -i 指定网卡 eth0 kali自己的网卡
    # -t 指定目标主机IP
    # 192.168.3.155 目标主机IP
    # 192.168.3.1 网关的IP
    # 意思就是不停的告诉 目标主机, 我是网关我是网关, 然后就断网了
    arpspoof -i eth0 -t 192.168.3.155 192.168.3.1
    

    执行之后,目标主机:
    要想结束断网,直接结束 arp 欺骗即可

    流量转发窃取用户隐私数据(中间人)

    原理
    在上面的例子中我们将 winserver2008 给断网了,是因为我们没有开启流量转发。
    我们要想获取用户的隐私数据,那么必须要让用户在 不知情 的情况下,进行上网,然后输入一些隐私数据,比如:用户名和密码之类的。
    这个时候我们就需要开启 kali 的流量转发,要让 winserver2008能够上网这个时候的流程就变成了:winserver2008 ====>kali====> 网关 =====>kali=====>winserver2008
    相当于就是 winserver2008 将数据发送到 kali 的网卡, kali 网卡再将数据转发给网关。
    那么我们要做的事情就是:
    kali 欺骗 winserver2008 自己是网关 = 》 正向欺骗
    kali 欺骗 网关 自己是 winserver2008 = 》 反向欺骗
    这样相当于是 kali 对流量进行了 中转
    开启流量转发
    echo 1 > /proc/sys/net/ipv4/ip_forward 1
    /proc/sys/net/ipv4/ip_forward 是配置文件,默认内容为 0 ,表示 IP 转发是关闭的,使用上述命令将该配置文件的内容改写为1 ,表示开启 IP 转发。开启 IP 转发后 流量会经过 kali 的主机而后再去到目标所以这时开启arpspoof 那么目标就不会断网,因为流量通过了 kali 主机那么我们就可以拦截相关数据。
    欺骗winserver2008

    查看 winserver2008:
    欺骗网关
    新开一个窗口:
    开启wireshark进行抓包

    winserver2008 中去 ping 一下 centos 靶机: 192.168.3.141
    然后看是否能抓到:
    确实抓到了包。
    wireshark 抓到的二层协议的包,我们要想得到用户的铭感数据,那么需要抓传输层协议的包,也就是抓http包。
    ettercap 进行铭感数据获
    kali 中新开一个窗口:
    # -T 文本模式显示
    # -q 安静模式
    # -i 指定网卡
    ettercap -Tq -i eth0

    然后在 winserver2008 中进行一个网址的登录:
    观察 ettercap
    ettercap 这个工具很强大,可以干很多事情。但是不要去乱作。

    ARP防御

    1. 主机级被动检测
    当系统接收到来自局域网上的 ARP 请求时,系统检查该请求发送端的 IP 地址是否与自己的 IP 地址相同。如果相同,则说明该网络上另有一台机器与自己具有相同的IP 地址。
    2. 主机级主动检测
    主机定期向所在局域网发送查询自己 IP 地址的 ARP 请求报文。如果能够收到另一 ARP 响应报文,则说明该网络上另有一台机器与自己具有相同的IP 地址。
    3. 服务器级检测
    当服务器收到 ARP 响应时,为了证实它的真实性,根据反向地址解析协议 (RARP) 就用从响应报文中给出的MAC 地址再生成一个 RARP 请求,它询问这样一个问题: 如果你是这个 MAC 地址的拥有者,请回答你的IP 地址 。这样就会查询到这个 MAC 地址对应的 IP 地址,比较这两个 IP 地址,如果不同,则说明对方伪造了ARP 响应报文。
    4. 网络级检测
    配置主机定期向中心管理主机报告其 ARP 缓存的内容。这样中心管理主机上的程序就会查找出两台主机报告信息的不一致,以及同一台主机前后报告内容的变化。这些情况反映了潜在的安全问题。或者利用网络嗅探工具连续监测网络内主机硬件地址与IP 地址对应关系的变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值