ARP欺骗与中间人攻击

2023-02-12 10:57:43 浏览数 (1)

在上一篇 WIFI密码破解笔记中说到如何探测附近开放的AP并且破解进入,那么进入别人据局域网我们能干些什么呢?换句话说如果别人进入了我们内部网络,会有什么影响?本文简要介绍了ARP和MITM原理,并在实际环境中对目标主机的流量进行劫持。可以看到公共网络中普遍存在许多不安全的问题,藉此来说说局域网中的客户端究竟面临着怎样的隐私泄漏和安全风险。

什么是ARP

ARP全称为Address Resolution Protocol,即地址解析协议。是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主 发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。

例如,在Linux命令行下:

代码语言:javascript复制
$ arp -a

Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.1.1            ether    0A-11-22-33-44-01   C                     wlan0
192.168.1.2            ether    0A-11-22-33-44-02   C                     wlan0

可以看到局域网中其他客户端的内网地址和MAC地址。

工作过程

现假设主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02; 当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,以下为工作流程:

  • 第1步:根据主机A上的路由表内容,IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址。
  • 第2步:如果主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广 播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址 匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。
  • 第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。
  • 第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
  • 第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了。

工作要素:ARP缓存

ARP缓存是个用来储存IP地址和MAC地址的缓冲区,其本质就是一个IP地址->MAC地址的对应表,表中每一个条目分别记录了网络上其他主机的IP地址和对应的MAC地址。每一个以太网或令牌环网络适配器都有自己单独的表。

当地址解析协议被询问一个已知IP地址节点的MAC地址时,先在ARP缓存中查看,若存在,就直接返回与之对应的MAC地址,若不存在,才发送ARP请求向局域网查询。为使广播量最小,ARP维护IP地址到MAC地址映射的缓存以便将来使用。ARP缓存可以包含动态和静态项目。动态项目随时间推移自动添加和删除。每个动态ARP缓存项的潜在生命周期是10分钟。新加到缓存中的项目带有时间戳,如果某个项目添加后2分钟内没有再使用,则此项目过期并从ARP缓存中删除;如果某个项目已在使用,则又收到2分钟的生命周期;如果某个项目始终在使用,则会另外收到2分钟的生命周期,一直到10分钟的最长生命周期。静态项目一直保留在缓存中,直到重新启动计算机为止。

ARP欺骗与MITM

MITM,全称为Man In The Middle,即中间人。地址解析协议是建立在网络中各个主机互相信任的基础上的,它的诞生使得网络能够更加高效的运行,但其本身也存在缺陷。ARP地址转换表是依赖于计算机中高速缓冲存储器动态更新的,而高速缓冲存储器的更新是受到更新周期的限制的,只保存最近使用的地址的映射关 系表项,这使得攻击者有了可乘之机,可以在高速缓冲存储器更新表项之前修改地址转换表,实现攻击。ARP请求为广播形式发送的,网络上的主机可以自主发送 ARP应答消息,并且当其他主机收到应答报文时不会检测该报文的真实性就将其记录在本地的MAC地址转换表,这样攻击者就可以向目标主机发送伪ARP应答报文,从而篡改本地的MAC地址表。ARP欺骗可以导致目标计算机与网关通信失败,更会导致通信重定向,所有的数据都会通过攻击者的机器。攻击者再对目标和网关之间的数据进行转发,则可作为一个“中间人”,实现监听目标却又不影响目标正常上网的目的。

攻击实现

具体的中间人攻击,大体上可以分为以下几个步骤:

  1. 对目标主机进行ARP欺骗,声称自己是网关。
  2. 转发目标的NAT数据到网关,维持目标的外出数据。
  3. 对网关进行ARP欺骗,声称自己是目标主机。
  4. 转发网关的NAT数据到目标主机,维持目标的接收数据。
  5. 监听劫持或者修改目标的进入和外出数据,从而实现攻击。

其中1,3都是ARP欺骗;2,4都是转发,下面会分别说到。

ARP欺骗

ARP欺骗又叫ARP投毒(ARP poisoning),实现方式有很多,但其原理都是通过不断向攻击目标发送ARP replies,从而实现重定向从一个主机(或所有主机)到另一个主机的数据包的目的。 这里以dsniff工具集的arpspoof命令为例:

代码语言:javascript复制
$ arpspoof [-i interface] [-c own|host|both] [-t target] [-r] host

其中,
-i 指定使用的接口。
-c 指定当还原arp配置时t使用的MAC地址,默认为使用原来的MAC。(即当停止arpspoof命令后,默认取消毒化)
-t 指定要毒化的主机,如果不指定的话默认为局域网下所有主机。
-r 双向毒化(host和target),从而双向扑捉数据。(仅当同时指定 -t的时候才有效)
host 为你想要伪装成的主机,通常是本地网关。所有从target到host的数据包都被重定向到本机。

数据流转发

毒化了目标主机的ARP缓存表之后,其经过网关外出的数据流将会发送到攻击者的主机。但此时由于目的地址出错,目标主机对外的请求将无法到达,亦即无法访问互联网了。为了维持目标正常上网,需要我们在收到目标来的数据时将其进行转发到真正的网关。

首先开启端口转发,允许本机像路由器一样转发数据:

代码语言:javascript复制
$ echo 1 > /proc/sys/net/ipv4/ip_forward

有时不能这样直接修改,还有另外一种方法

代码语言:javascript复制
# 修改/etc/sysctl.conf文件,使得net.ipv4.ip_forward = 1;等于0为不转发。然后更新:
$ sysctl -p
# 或者直接
$ sysctl -w net.ipv4.ip_forward=1

此时本机收到的数据包含源地址和目的地址(外网地址),我们需要将其转发到网关。这里进行了(NAT)网络地址转换的功能,关于NAT可参考我前一篇文章P2P通信原理与实现:

代码语言:javascript复制
$ iptables -t nat -A POSTROUTING -p tcp -s 192.168.1.0/24 -j SNAT --to-source 192.168.1.110

这条命令的作用是修改本机的转发规则,将所有从本机出去的源地址为192.168.1.XXX的数据包都修改为本机地址192.168.1.110
其中,
-t 指定要操作的表,这里是nat
-A 即--append,表示增加一条规则。nat有三个内建规则,分别是
  PREROUTING,在数据包进入时改变其地址
  POSTROUTING,在数据包将要出去时改变其地址
  OUTPUT,在路由前改变本地产生的数据包地址
-p 表示数据包要检查的协议
-s 指定源地址。地址格式可以是网络名字,主机名字,IP地址或者是address/mask格式的网络地址。可以指定多个,-s前加!表示取补集
-j 指定规则的目标,即如果数据包符合规则该如何做;SNAT表示修改数据包的源地址,且此次链接的余下数据包都不再检查
--to-source 在SNAT选项下指定所转发数据包的新的源地址,这里设为192.168.1.110,即攻击者的地址

关于iptables的详细用途可以man iptables查看。上述命令描述了外出数据的转发规则,那么从外部来的数据要转发到被攻击主机上也是同理:

代码语言:javascript复制
$ iptables -t nat -A PREROUTING -p tcp -d 192.168.1.110 -j DNAT --to 192.168.1.114

在本机转发之前将数据包目的地址为192.168.1.110的修改为192.168.1.114(被攻击主机),然后转发出去。

其他工具

上面为了说明原理,吧arp毒化和数据转发分开做,其实利用现有的工具,可以很简单地执行上面的工作,例如用ettercap:

代码语言:javascript复制
$ ettercap -i wlan0 -Tq -M arp:remote /target/ /host/

一条命令即可完成arp毒化和转发的功能。其中-M表示指定MITM攻击。

后记

一旦中间人建立攻击成功,劫持了目标的上网流量,那么接下来也就为所欲为了。轻则监控目标的上网行为,就如同二十四小时站在你身后看你上网;或者劫持目标的cookie从而用目标的帐号登录诸如微博,人人,豆瓣等社交网站,浏览其隐私数据,进行发贴删贴等操作;重责进行钓鱼攻击,使目标下载恶意程序或者执行恶意脚本,从而威胁其计算机安全。当然,应对这种攻击的防范方法也有很多,最简单的一种就是绑定MAC地址,并且在网关MAC地址改变的时候发出提醒,从而防止ARP毒化攻击。还有就是最好不要在公共WiFi下浏览有重要隐私的网站,万一碰上不怀好意的人就在局域网中,那可就是真的“在阳光下行走”了。

0 人点赞