ARP协议是建立在信任局域网内所有结点的基础上的,是一种无状态协议,只要收到目标MAC是自己的ARP reply包或arp广播包,都会接受并缓存到本地主机内的ARP cache表,ARP欺骗就是利用此点,通过发送大量ARP欺骗报文“淹没”正常ARP报文,使得网络内主机ARP cache表内记录错误的MAC信息,达到了欺骗目的。
(1)单一主机欺骗
这一类欺骗主要是“网关欺骗”。主机X(攻击者)申称自己为主机A,伪造出数据包不间断假冒网关,欺骗网内其它主机,达到阻止被骗主机访问外部网络,甚至截获数据包窃取信息的目的。
(2)全子网轮询欺骗(固定MAC)
T时刻,主机X(攻击者)申称自己为主机A(子网内IP最小的一台主机);
T+N时刻,主机X(攻击者)申称自己为主机B;
……
T+M时刻,主机X(攻击者)申称自己为主机Z(子网内IP最大的一台主机);
这一类欺骗攻击者会从自身所在子网内IP地址最小的一台主机开始欺骗,隔一段时间N,欺骗下一台IP+1的主机,一直到本子网内IP地址最大的一台主机。在实际检测中,攻击者绝大多数都使用自己的MAC。时刻N与攻击主机的包发送频率有关。
(3)全子网轮询欺骗(随机伪造MAC)
这类形式欺骗与第二种形式类似,轮询欺骗子网内所有主机,不同的是,攻击者对每一个IP进行欺骗都会使用随机产生的伪造MAC地址,以达到躲避检测的目的。
常见的ARP防御方法是通过IP、MAC用户端和网关处双向静态绑定来实现。此方案在小规模网络内颇有成效,而在大规模网络中就存在不易部署、难管理,治标不治本等问题。因此,我们总结出对付ARP攻击的最佳方法是找到攻击源头,见如下4种方法:
端口镜像
通过对各子网网关接口的镜像,可以获得子网内第一手的网络情况。例如:
Cisco6006(config)#monitor session 1 source vlan 2 - 9 both // 对vlan2至vlan9做端口镜像
Cisco6006(config)#monitor session 1 destination interface GigabitEthernet 1/2 // 将vlan2至vlan9镜像的数据发送到G1/2接口。通过在端口G1/2上接入sniffer嗅探机,获取子网2至子网9内的数据包,并对所获报文进行分析,找出ARP欺骗数据包,即可确定“攻击元凶”。
优点:可以获取被镜像网络内真实的网络情况;对上述三类ARP欺骗都可以有效检测。不足:将多个子网数据镜像到一个端口,所得数据量过大;路由器放置分散时,嗅探机必须做相应的分散部署,不便集中操作。
第1步 分析路由器日志
当发生ARP欺骗时,网络中会出现攻击者和被攻击者“争抢”更新路由器ARP cache表的情况,而路由器则会在日志中记录大量的“冲突”信息,这些信息中会包含攻击者的MAC,最后通过分析log就可以查找到发起攻击的“元凶”。
优点:需要处理的数据量小;便于集中部署;针对ARP欺骗的第一种类型,“网关欺骗”定位准确;不足:由于攻击者发送大量的攻击数据包,淹没了被攻击者的正常数据包,造成网关不能收到正确的ARP reply,因而造成不能记录主机MAC冲突信息。此方法对两种“全子网轮询欺骗”效果不佳。
分析路由器ARP表
ARP攻击结果会使主机和网关的ARP表保留错误MAC记录,因此直接分析ARP表也十分有效。经我校网络检测发现,当某一子网发生ARP欺骗,该子网网关路由器ARP表中将有多个IP对应同一MAC的情况。这种情况可能还有一种解释,就是该MAC地址对应主机绑定了多个IP。但通过调查,该主机并未拥有多个IP地址,而且每过几个N时刻(据检测,N≈2秒),该MAC所对应的IP会自动变化,根据这一情况,我们也可找出攻击“元凶”。
优点:需要处理的数据量小;便于集中部署;针对第二种类型的ARP欺骗定位准确;不足:只能针对第二种类型的ARP欺骗进行定位。
动态MAC地址库分析
针对第三种攻击模式,我们采用“动态MAC地址库分析”的方法来解决随机伪造MAC的ARP欺骗。原理是将路由器ARP表中MAC地址摘取出来,与“全网MAC地址库”进行比对,如果摘取的MAC不在MAC地址库中,该MAC就被疑似为攻击者MAC,而所对应交换机端口将被关闭等待具体的调查落实。同时,该MAC将被加入到“全网MAC地址库”记录。
应用实例
从前文可知,针对不同类型的ARP欺骗,应采取相应的方法,在具体的部署实施过程中,应多种方法配合使用。我校的网络层汇聚交换机部署分散,分布在多个校区、多个网络机房内,根据实际情况,我们没有采用第一种方法,而是将方法二、方法三、方法四结合使用。
我校的“ARP欺骗动态检测防御系统”是建立在Linux AS4系统平台上,通过使用多个Shell脚本分析路由器日志、ARP表来确定ARP欺骗源的MAC地址,然后使用snmpwalk命令到接入交换机中去查找接入端口,并通过snmpset命令关闭查找到的端口,最终生成网页通知用户。
分析并确定ARP欺骗源MAC
分析路由器日志确定ARP欺骗源MAC
在Cisco路由器中我们通过如下命令将系统日志记录到日志服务器中:
Cisco(config)#logging facility local3 // 定义将一些错误信息记录到日志服务器,MAC地址冲突就属于这一类
Cisco(config)#logging source-interface GigabitEthernet1/1 // 定义发送日志的接口
Cisco(config)#logging 202.201.X.X // 定义日志服务器的IP地址
在日志服务器中将看到记录着这样一些信息的文件:
3w4d: %IP-4-DUPADDR: Duplicate address 210.26.50.1 on Vlan305, sourced by 0010.dc44.fed8
3w4d: %IP-4-DUPADDR: Duplicate address 210.26.50.1 on Vlan305, sourced by 0010.dc44.fed8
黑体字部分就是“网关欺骗”类型攻击者的主机MAC地址。通过Shell脚本,我们可以提取出欺骗源的MAC信息,并提交给第二步去处理。
分析路由器ARP表确定ARP欺骗源MAC
Linux系统中使用net-snmp的snmpwalk命令可以提取路由器的ARP CACHE表,如:
snmpwalk -v1 -Cc -c public 10.239.4.1 1.3.6.1.2.1.3.1.1.2 >/etc/cron.5min/arptable-v1代表使用SNMP协议v1版本;-Cc是忽略OID值渐增的情况,后面的“1.3.6.1.2.1.3.1.1.2”就是Cisco路由器的ARP表的OID值;-c后面要有所要查看设备的snmp可读的community值,我们这里以public为例;我们将snmpwalk命令执行的结果定向到/etc/cron.5min/arptable这个文件中,得到如下格式的arptable文件:
RFC1213-MIB::atPhysAddress.39.1.219.246.62.161 = Hex-STRING: 00 E0 FC 00 31 BD
RFC1213-MIB::atPhysAddress.39.1.219.246.62.163 = Hex-STRING: 00 E0 FC 00 31 BD
RFC1213-MIB::atPhysAddress.39.1.219.246.62.166 = Hex-STRING: 00 E0 FC 00 31 BD
斜体部分是IP地址,黑体部分是MAC地址。由于我校不允许用户在一块网卡上绑定多个IP地址,因此上面的例子可以看作ARP欺骗。我们用Shell脚本对前面所生成的arptable文件中的MAC地址部分执行一个For循环的比较,当某一个MAC出现2次以上时,此MAC记录为ARP欺骗的主机的MAC,提交给第二步去处理。
动态MAC地址库分析
由于我校入网时不登记用户MAC,因此,我们的“MAC地址库”是动态生成的。具体做法是:通过对基于Linux平台DHCP服务器上的dhcpd.leases文件进行操作,提取出网络内主机获得IP时的MAC作为我们的“MAC地址库”中的源地址。因为主机在申请IP时所使用的MAC地址对于我们来说是真实的、可信的MAC。通过1个月的采集,我校的MAC地址数维持在29000个左右,这构成了我们的“MAC地址库”。以后每个星期执行一次上述采集过程动态更新“MAC地址库”。
然后我们还是通过使用snmpwalk命令提取到接入交换机的MAC-PORT对应表:
snmpwalk -v1 -Cc -c public $managerip 1.3.6.1.2.1.17.4.3.1.2 >/etc/cron.5min/mactable
这里的变量$managerip是我们定义的接入交换机管理IP地址,定义一个FOR循环对所有的交换机循环执行,得到如下格式的mactable文件:
SNMPv2-SMI::mib-2.17.4.3.1.2.0.4.97.78.226.229 = INTEGER: 22
其中斜体部分就是MAC地址,不过是点分十进制表示形式。使用Shell脚本将此MAC换算成点分十六进制形式,并与“MAC地址库”中的MAC地址逐一进行比较,如果不在“MAC地址库”中,此MAC记录为ARP欺骗的主机的MAC,提交给第二步去处理。
由于我校“MAC地址库”地址数较多,进行动态MAC地址库分析较费时间,此过程在单独一台服务器上运行。上述过程我们都是通过定义Linux定时任务系统Cron来定时执行。
第 2 步 确定ARP欺骗源的接入交换机端口
还是通过使用snmpwalk命令可以提取到接入交换机的MAC-PORT对应表:
snmpwalk -v1 -Cc -c public $managerip 1.3.6.1.2.1.17.4.3.1.2 >/etc/cron.5min/macport
得到macport文件由如下格式:
SNMPv2-SMI::mib-2.17.4.3.1.2.0.4.97.78.226.229 = INTEGER: 22
斜体部分MAC所对应的交换机端口号。为同样如前所述,将点分十进制的MAC形式转换为十六进制形式并与前面提交的ARP欺骗源MAC进行比较,如果查找到所对应的$managerip和端口号(附值给$port)提交到第三步。
第3步 关闭ARP欺骗源的接入交换机端口
使用snmpset命令关闭交换机端口:
snmpset -v1 -c public $managerip ifAdminStatus.$port
这里的$managerip与$port变量是由第二步中所提交的交换机IP和该MAC所对应的交换机端口号。
第4步 网页通知用户
我校已经有用户房间和交换机端口所对应的数据库,所以在第三步确定到的交换机端口号很容易定位到具体的用户房间。我们将此对应信息使用echo命令重定向到一个html文件,用户可以方便的查看自己的端口是否被“ARP防御系统”关闭。根据需要我们还为管理员提供关闭端口的日志信息,包括:端口关闭的时间、端口所对在的交换机IP、用户的MAC地址等信息。出于安全考虑,这些信息只公布关闭端口所对应的房间号以及该端口所对应的后四位MAC地址。
特别声明:本站注明稿件来源为其他媒体的文/图等稿件均为转载稿,本站转载出于非商业性的教育和科研之目的,并不意味着赞同其观点或证实其内容的真实性。如转载稿涉及版权等问题,请作者在两周内速来电或来函联系。