实验三 ARP原理与ARP欺骗
【实验名称】
ARP原理与ARP欺骗
【实验目的】
1、熟悉Linux中telnet服务及telnet命令的用法;
*2、熟悉Linux中arpspoof工具的用法;
3、在发送方是主机、接收方是本网络上的另一个主机;发送方是主机、接收方是另一个网络上的主机;发送方是路由器、接收方是本网络上的一个主机;发送方是路由器、接收方是另一个网络上的主机等四种典型情况下,观察ARP高速缓存表的变化,观察Wireshark截获的ARP数据包,分析ARP协议的工作过程以及ARP协议的工作原理;
【实验要求】
1、根据实验需要,搭建实验环境;建立或修改虚拟实验网络;
2、按照实验步骤,认真完成实验;采取截图、拍照等形式记录实验结果;
3、依据课本和课堂讲解,详细分析实验结果、验证理论知识;
4、认真完成实验报告,按时提交实验指导老师。
【实验环境】
1、操作系统:Linux操作系统,要求内核支持Tun模块、Vlan模块等,本实验在CentOS7操作系统中测试通过;
2、操作权限:部分操作需具有root权限;
3、应用软件:需安装命令行工具:tunctl、vconfig等;需安装服务程序telnet-server等;需安装客户程序telnet等;需安装工具软件tuxcut及其依赖软件;需安装编辑工具gedit或其它文本编辑工具;需安装网络分析软件Wireshark及其依赖软件;其它常用必备的应用软件;
4、实验网络拓扑:ARP原理与ARP欺骗实验网络拓扑如图1所示:
利用Linux命令或编辑执行脚本,构建虚拟实验网络如图2所示:
5、参考脚本:构建如图所示虚拟实验网络,可参考如下脚本:
#!/bin/sh
set -x
#开启ip分组转发
sysctl -w net.ipv4.ip_forward=1
#创建br53及其相连的NS
#创建Bridge
brctl addbr br53
#创建namespace
ip netns add ns531
ip netns add ns532
ip netns add ns53gw
ip netns add ns53m
#将各namespace中的lo接口上线
ip netns exec ns531 ip link set lo up
ip netns exec ns532 ip link set lo up
ip netns exec ns53gw ip link set lo up
ip netns exec ns53m ip link set lo up
#创建veth pair
ip link add tap531 type veth peer name tap531_p
ip link add tap532 type veth peer name tap532_p
ip link add tap53gw type veth peer name tap53gw_p
ip link add tap53m type veth peer name tap53m_p
#把tap迁移到namespace
ip link set tap531 netns ns531
ip link set tap532 netns ns532
ip link set tap53gw netns ns53gw
ip link set tap53m netns ns53m
#把相应tap添加到Bridge中
brctl addif br53 tap531_p
brctl addif br53 tap532_p
brctl addif br53 tap53gw_p
brctl addif br53 tap53m_p
#配置相应tap的IP地址
ip netns exec ns531 ip addr add local 192.168.53.1/24 dev tap531
ip netns exec ns532 ip addr add local 192.168.53.2/24 dev tap532
ip netns exec ns53gw ip addr add local 192.168.53.254/24 dev tap53gw
ip netns exec ns53m ip addr add local 192.168.53.250/24 dev tap53m
#根据需要将Bridge及相关tap状态设置为up
ip link set br53 up
ip link set tap531_p up
ip link set tap532_p up
ip link set tap53gw_p up
ip netns exec ns531 ip link set tap531 up
ip netns exec ns532 ip link set tap532 up
ip netns exec ns53gw ip link set tap53gw up
#攻击者53m暂时不上线,需要时手动上线
ip link set tap53m_p up
ip netns exec ns53m ip link set tap53m up
#为br53所连各NS配置默认网关
ip netns exec ns531 route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.53.254
ip netns exec ns532 route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.53.254
ip netns exec ns53m route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.53.254
#创建br54及其相连的NS
#创建Bridge
brctl addbr br54
#创建namespace
ip netns add ns541
ip netns add ns54gw
#将各namespace中的lo接口上线
ip netns exec ns541 ip link set lo up
ip netns exec ns54gw ip link set lo up
#创建veth pair
ip link add tap541 type veth peer name tap541_p
ip link add tap54gw type veth peer name tap54gw_p
#把tap迁移到namespace
ip link set tap541 netns ns541
ip link set tap54gw netns ns54gw
#把相应tap添加到Bridge中
brctl addif br54 tap541_p
brctl addif br54 tap54gw_p
#配置相应tap的IP地址
ip netns exec ns541 ip addr add local 192.168.54.1/24 dev tap541
ip netns exec ns54gw ip addr add local 192.168.54.254/24 dev tap54gw
#根据需要将Bridge及相关tap状态设置为up
ip link set br54 up
ip link set tap541_p up
ip link set tap54gw_p up
ip netns exec ns541 ip link set tap541 up
ip netns exec ns54gw ip link set tap54gw up
#为br54所连各NS配置默认网关
ip netns exec ns541 route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.54.254
#连接53网关和54网关
#创建veth pair
ip link add tap992 type veth peer name tap993
#把tap迁移到namespace
ip link set tap992 netns ns53gw
ip link set tap993 netns ns54gw
#配置相应tap的IP地址
ip netns exec ns53gw ip addr add local 192.168.99.2/24 dev tap992
ip netns exec ns54gw ip addr add local 192.168.99.3/24 dev tap993
#将相关tap状态设置为up
ip netns exec ns53gw ip link set tap992 up
ip netns exec ns54gw ip link set tap993 up
#为两台路由器配置静态路由
#为53GW配置静态路由,直连路由不用配置
ip netns exec ns53gw route add -net 192.168.54.0/24 gw 192.168.99.3
#为54GW配置静态路由,直连路由不用配置
ip netns exec ns54gw route add -net 192.168.53.0/24 gw 192.168.99.2
【实验步骤】
步骤1:创建虚拟实验网络,验证网络拓扑:
执行“实验环境”一节中提供的参考脚本,或利用Linux命令直接创建虚拟实验网络。创建好的网络应满足“实验环境”一节中的网络拓扑的要求。
通过执行Linux命令brctl show查看交换机当前连接的接口状态,验证交换机br53已连接ns531、ns532、ns53m、ns54gw;交换机br54已连接ns541、ns54gw。
示例:
用 ip netns list命令查询已经建立的NS列表,查询到的NS应该与“实验环境”一节中的网络拓扑一致,包括所有的主机和路由器。
示例:
在所有NS内执行ifconfig -n命令查看NS内的网络接口配置,验证网络拓扑。查询到NS内部网络接口的配置应该与“实验环境”一节中的网络拓扑图一致。
示例:
在所有NS内执行route -nee命令,查看并验证各NS内路由表。各NS路由表应如下图所示:
步骤2:在各主机和路由器(所有NS)的ARP缓存表为空的情况下,从主机ns531上执行telnet命令,连接主机ns532上的telnet服务,完成远程登录。
观察Wireshark在各网络接口截获的数据包,分析发送方是主机、接收方是本网络上的另一个主机时,ARP协议的工作过程以及工作原理;观察192.168.53.0/24网络上各主机和路由器ARP缓存表的变化,分析ARP缓存的更新策略;观察Wireshark截获的数据包,尝试分析数据,获取远程登录时的用户名和密码。
执行ip -all netns exec arp -n命令,查看各主机(NS)的ARP缓存表,确保ARP缓存表为空。
如果缓存表不空,在相应的NS内执行命令arp -d ,逐条删除arp缓存,或执行 ip neighbour flush dev 清空指定接口的ARP缓存表。
示例:
或:
在主机ns531、ns532、ns53gw上执行wireshark &命令,后台打开wireshark软件,在接口tap531、tap532和tap53gw上抓包观察。
在主机ns532上执行in.telnetd -iN -debug 23 &,手动单次启动telnetnet服务器。
其中:-i和-N参数使telnet服务器收到请求时,不再向DNS服务器反向查询IP地址,可以加快telnet服务器的响应速度。
在主机ns531上执行telnet 192.168.53.2命令,远程登录主机ns532,通信结束后关闭telnet。
示例:
记录并观察Wireshark软件的抓包结果,分析发送方是主机、接收方是本网络上的另一个主机时,ARP协议的工作过程以及工作原理。
执行ip -all netns exec arp -n命令,查看各NS的ARP缓存表,记录并观察ns531、ns532和ns53gw的ARP缓存表,分析ARP缓存的更新策略。
在主机ns531或ns532上,利用Wireshark软件的功能,尝试恢复TCP流数据,获取远程登录时的用户名和密码。
步骤3:在各主机和路由(所有NS)的ARP缓存表为空的情况下,从主机ns531上执行telnet命令,连接主机ns541上的telnet服务,完成远程登录。
观察Wireshark在各网络接口截获的数据包,分析发送方是主机、接收方是另一个网络上的主机;发送方是路由器、接收方是本网络上的一个主机;发送方是路由器、接收方是另一个网络上的主机等三种情况下,ARP协议的工作过程以及工作原理;观察网络路径上各主机和路由器的ARP缓存表的变化,分析ARP缓存的更新策略。
采用步骤2中的方法,执行ip -all netns exec arp -n命令,查看各主机(NS)的ARP缓存表,确保ARP缓存表为空。
在主机ns531、ns53gw、ns54gw、ns541上执行wireshark &命令,后台打开wireshark软件,在接口tap531、tap53gw、tap992、tap993、tap54gw和tap541上抓包观察。
在主机ns541上执行in.telnetd -iN -debug 23 &,手动单次启动telnetnet服务器。
在主机ns531上执行telnet 192.168.54.1命令,采用与步骤2相同的过程,远程登录主机ns541,通信结束后关闭telnet。
记录并观察Wireshark软件的抓包结果,分析发送方是主机、接收方是另一个网络上的主机;发送方是路由器、接收方是本网络上的一个主机;发送方是路由器、接收方是另一个网络上的主机等三种情况下,ARP协议的工作过程以及工作原理。
执行ip -all netns exec arp -n命令,查看各NS的ARP缓存表,记录并观察ns531、ns53gw、ns54gw和ns541的ARP缓存表,分析ARP缓存的更新策略。
*步骤4:在各主机和路由器(所有NS)的ARP缓存表为空的情况下,在主机ns53m上启动arpspoof程序,针对主机ns531的接口192.168.53.1及其默认网关192.168.53.254发起双向ARP欺骗。在ARP欺骗过程中观察Wireshark截获的ARP数据包,观察被欺骗主机ns531和网关ns53gw的ARP高速缓存表的变化,分析ARP欺骗的原理;从主机ns531上执行telnet命令,连接主机ns541上的telnet服务,完成远程登录,观察主机ns53m上截获的数据包,尝试分析数据,获取远程登录时的用户名和密码,分析ARP协议面临的网络安全威胁。
采用步骤2中的方法,执行ip -all netns exec arp -n命令,查看各主机(NS)的ARP缓存表,确保ARP缓存表为空。
在主机ns531、ns53m和ns53gw上执行wireshark &命令,后台打开wireshark软件,在接口tap531、tap53m和tap53gw上抓包观察。
在ns53m上,执行arpspoof -i tap53m -t 192.168.53.1 -r 192.168.53.254命令,启动对192.168.53.1和192.168.53.254的ARP欺骗。
示例:
在欺骗过程中,记录并观察wireshark在各接口截获的数据包,在主机ns531、ns53m上和路由器ns53gw上执行arp -n命令,记录并观察arp缓存表的变化,分析arp欺骗的原理。
在主机ns541上执行in.telnetd -iN -debug 23 &,手动单次启动telnetnet服务器。
在主机ns531上执行telnet 192.168.54.1命令,采用与步骤2相同的过程,远程登录主机ns541,通信结束后关闭telnet。
在主机ns53m上,用“ctrl+c”中止arpspoof的执行,记录并观察arpspoof中止欺骗的过程,记录并观察该过程中Wireshark截获的数据包,在arpspoof中止执行后,在主机ns531、ns53m上和路由器ns53gw上执行arp -n命令,记录并观察arp缓存表的变化,分析arpspoof中止过程的工作原理和原因。
在主机ns53m上,利用Wireshark软件的功能,尝试恢复TCP流数据,获取远程登录时的用户名和密码,分析ARP协议面临的网络安全威胁。
【实验结果及分析】
步骤1:创建虚拟实验网络,验证网络拓扑:
执行“实验环境”一节中提供的参考脚本,或利用Linux命令直接创建虚拟实验网络。创建好的网络应满足“实验环境”一节中的网络拓扑的要求。
通过执行Linux命令brctl show查看交换机当前连接的接口状态,验证交换机br53已连接ns531、ns532、ns53m、ns54gw;交换机br54已连接ns541、ns54gw。
连接状态如下:
用 ip netns list命令查询已经建立的NS列表,查询到的NS应该与“实验环境”一节中的网络拓扑一致,包括所有的主机和路由器。
示例:
在所有NS内执行ifconfig -n命令查看NS内的网络接口配置,验证网络拓扑。查询到NS内部网络接口的配置应该与“实验环境”一节中的网络拓扑图一致。
部分配置图如下:

在所有NS内执行route -nee命令,查看并验证各NS内路由表。各NS路由表应如下图所示:

步骤2:
在各主机和路由器(所有NS)的ARP缓存表为空的情况下,从主机ns531上执行telnet命令,连接主机ns532上的telnet服务,完成远程登录。观察Wireshark在各网络接口截获的数据包,分析发送方是主机、接收方是本网络上的另一个主机时,ARP协议的工作过程以及工作原理;观察192.168.53.0/24网络上各主机和路由器ARP缓存表的变化,分析ARP缓存的更新策略;观察Wireshark截获的数据包,尝试分析数据,获取远程登录时的用户名和密码。
·执行ip -all netns exec arp -n命令,查看各主机(NS)的ARP缓存表,确保ARP缓存表为空。
已经确保为全空:

在主机ns531、ns532、ns53gw上执行wireshark &命令,后台打开wireshark软件,在接口tap531、tap532和tap53gw上抓包观察。
之前实验已经实现,不再重复截图
在主机ns532上执行in.telnetd -iN -debug 23 &,手动单次启动telnetnet服务器。
首次执行后报错,排查后发现是telnet工具的服务端软件未安装,安装后成功:

其中:-i和-N参数使telnet服务器收到请求时,不再向DNS服务器反向查询IP地址,可以加快telnet服务器的响应速度。
在主机ns531上执行telnet 192.168.53.2命令,远程登录主机ns532,通信结束后关闭telnet。
示例:
正确的命令 ctrl+] 然后在telnet 命令行输入 quit 就可以退出了
记录并观察Wireshark软件的抓包结果,分析发送方是主机、接收方是本网络上的另一个主机时,ARP协议的工作过程以及工作原理。
Tap531接口部分抓包结果如下:


Tap532接口部分抓包结果如下:

Tap53gw接口部分抓包结果如下:


执行ip -all netns exec arp -n命令,查看各NS的ARP缓存表,记录并观察ns531、ns532和ns53gw的ARP缓存表,分析ARP缓存的更新策略。

在主机ns531或ns532上,利用Wireshark软件的功能,尝试恢复TCP流数据,获取远程登录时的用户名和密码。
使用追踪tcp流的功能,找到了明文发送的账号和密码:

搜集资料与分析:
telnet是明文传输,是十分不安全的。经过查找,Telnet远程登录服务分为以下4个过程:
(1)本地与远程主机建立连接。该过程实际上是建立一个TCP连接,用户必须知道远程主机的Ip地址或域名;
(2)将本地终端上输入的用户名和口令及以后输入的任何命令或字符以NVT(Net Virtual Terminal)格式 传送到远程主机。该过程实际上是从本地主机向远程主机发送一个IP数据包;
(3)将远程主机输出的NVT格式的数据转化为本地所接受的格式送回本地终端,包括输入命令回显和命令执行结果;
(4)最后,本地终端对远程主机进行撤消连接。该过程是撤销一个TCP连接。
步骤3:
在各主机和路由(所有NS)的ARP缓存表为空的情况下,从主机ns531上执行telnet命令,连接主机ns541上的telnet服务,完成远程登录。观察Wireshark在各网络接口截获的数据包,分析发送方是主机、接收方是另一个网络上的主机;发送方是路由器、接收方是本网络上的一个主机;发送方是路由器、接收方是另一个网络上的主机等三种情况下,ARP协议的工作过程以及工作原理;观察网络路径上各主机和路由器的ARP缓存表的变化,分析ARP缓存的更新策略。
采用步骤2中的方法,执行ip -all netns exec arp -n命令,查看各主机(NS)的ARP缓存表,确保ARP缓存表为空。
已清空:

在主机ns531、ns53gw、ns54gw、ns541上执行wireshark &命令,后台打开wireshark软件,在接口tap531、tap53gw、tap992、tap993、tap54gw和tap541上抓包观察。
已经开启:

在主机ns541上执行in.telnetd -iN -debug 23 &,手动单次启动telnetnet服务器。
在主机ns531上执行telnet 192.168.54.1命令,采用与步骤2相同的过程,远程登录主机ns541,通信结束后关闭telnet.
过程如下:

记录并观察Wireshark软件的抓包结果,分析发送方是主机、接收方是另一个网络上的主机;发送方是路由器、接收方是本网络上的一个主机;发送方是路由器、接收方是另一个网络上的主机等三种情况下,ARP协议的工作过程以及工作原理。
各接口抓包情况如下:
Tap531:


Tap53gw:


Tap992:


Tap993:


Tap54gw:


Tap541:


执行ip -all netns exec arp -n命令,查看各NS的ARP缓存表,记录并观察ns531、ns53gw、ns54gw和ns541的ARP缓存表,分析ARP缓存的更新策略。

分析:
ARP表和接口捕获的数据包,都表明了ARP使用的四种典型状态:
(1)发送方为主机,接收方为同一网络上的另一台主机。此时发送方在分组上广播,找到目的主机的硬件地址(MAC地址)。
(2)发送方是主机,要把数据报发送到另一个网络商店一台主机。此时发送方发送ARP请求分组,找到网1上的一个路由器R1的硬件地址。剩下的工作由R1执行,是下面的(三)和(四)
(3)发送方是路由器R1,接受方为与R1在同一网络上的主机。此时R1在网络上广播找到接收方主机的硬件地址。
(4)发送方是路由器R1,接受方为与R1不在同一网络上的另一台主机H4。此时R1在网络上广播找到另一台路由器R2,剩余的工作由R2进行。
剩下的就是上述情况的反复。
步骤二模拟的就是在同一网络下ARP的使用情况。
步骤三模拟的是不同网络下主机间通信使用ARP的情况,现在一个网络内找到路由器R1,R1找到另一个路由器R2,R2再找到目的主机,