查看: 4622|回复: 2

Arp反欺骗策略

[复制链接]
发表于 2008-3-1 08:20:58 | 显示全部楼层 |阅读模式
创建时间:2007-11-11
文章属性:原创
文章提交:backspray (nimaozhi_at_163.com)

近来与Arp相关恶意软件越来越猖獗,受害者的也不少,国内的各大杀毒厂商也纷纷推出Arp防火墙。但大部分防火墙虚有其表,原因下面会具体介绍。这篇文章不是科普,主要是思路,更想起到抛砖引玉的作用。让世界清静一点。此外,末学接触并熟悉Arp协议到写出Arp欺骗和反欺骗的test code,前前后后也不过一个星期多一点的时间。经验有限,疏漏之处,再所难免,各位见谅。
    Arp协议和Arp欺骗这里就不做介绍了。网络这方面的文章比比皆是。
为了便于理解,下面构造一些名词:
假如局域网内,有网关,发起欺骗的主机(以下简称欺骗主机),受骗主机
双向欺骗:欺骗主机使得网关认为欺骗主机是受骗主机同时让受骗主机认为欺骗主机是网关;
单向欺骗网关:欺骗主机只使网关认为欺骗主机是受骗主机;
单向欺骗目标主机:欺骗主机只使受骗主机认为它是网关;
    Arp除了能sniffer之外,现在比较流行的做法就是利用Arp进行HTTP挂马的情况了。所以下面考虑的影响基本以这个角度的方面来衡量。
    由于环境不同,继续往下分,一个机房被Arp欺骗的情,机房一般以服务器为主,对外发的数据多以http应答包为主,此时单向欺骗目标主机的危害比较大。另外一个普通的公司,家庭,及网吧之类的局域网环境,对外发的数据多以http请求为主,接收的数据多以http应答包为主,此时单向欺骗网关危害比较大。
    还有的就是和网关有关了,网关简单的先分两种:
1、支持IP和mac绑定的;
2、不支持IP和mac绑定。
支持IP和mac绑定的网关都好办,所以这里就不讨论这种情况了,主要讨论不支持IP和mac绑定的情况:
下面举的例子都是Arp双向欺骗已经存在的情况,装上Arp FW后FW将处理情况。
第一种情况——普通公司,家庭,及网吧之类局域网环境下,网关不支持IP和mac绑定:
先说欺骗策略,说到这里不得不提Arpspoof(以下简称as),最近流行这个工具,并且开源,好分析,也确实写的不错。我手头拿到的3.1版本的源代码。若不修改as代码,在当前情况下,并处在双向欺骗时,只要把配置文件稍微改改,就能够实现利用ARP挂马。但如果受骗主机绑定了正确网关的mac,就不灵了。但如果有人修改了as代码,使其能支持gzip解码,并且把本应发给受害主机的包,重组并解码然后再发给受害主机。就又能欺骗了。
然后再回来看看现在国内的Arp FW。比较弱的,FW一进去,连正确的网关mac都检测不出来,需要手动填。好点的能自动检测正确的网关的mac。一般步骤是:
1.    获取当前网关mac(如利用sendARP函数等等);
2.    利用网关IP发一个广播包,获取网关的mac;
3.    抓包对比,如果第一步和第二步获得网关的mac相同,则认为网关mac不是伪造的。如过第二步获得两个Arp reply,则把这两个包与第一步的mac对比,相同的说明是伪造的。如果第二步只获得一个Arp reply,以第二步获得mac为准。
检测到正确网关mac后,就静态的绑定网关IP和mac,防止别人伪造网关。
    基本上都这么搞,这个思路是有缺陷的。没错,是可以防的住现在的as。因为as发Arp欺骗包间隔是3s,如果不改源代码的话。在这个的时间间隔下,这三步是有能力获得正确的网关,但是如果把间隔设短,甚至没有间隔发Arp欺骗包的话。现在国内市面上的Arp FW全都倒下。我测了两款,这里把测的结果说一下:
    1、金山Arp FW,二话不说,倒下了。(as如果不设间隔的话能实现双向欺骗)。
    2、360 Arp FW,倒下了,倒的挺爱的。它倒下的同时,如果你点击重新获取正确网关,它等几秒后,报告有Arp攻击。我一看攻击报告里头的恶意mac,结果恶意的mac恰恰是正确网关发来的。(不设间隔的话能双向欺骗)。
    瑞*的我没测。因为我没搞到它的注册码。向一个有可能有哥们要。结果被那哥们鄙视了,他的原话是“没有哦垃圾瑞星我才不用那”(聊天记录直接CTRL+V出来,连错别字都我都没改)。现在若评世界上哪一款杀软的自身进程最多,瑞*应该能排第一吧。^_^
    虽然没测,但结果应该是跑不掉的。因为Arp协议在那里摆着。
    先说为什么间隔3s的话,能检测到正确网关mac,在执行第二步时,在发广播包之前必须先发一个Arp reply给网关,告诉网关自己正确的mac,然后网关才能把它本身的mac发给受骗主机。这个过程必须在3s内完成。因此如果as的spoof不设间隔的话。那么网关在接收了你的ip和mac之后。发起欺骗的主机马上就去网关那把它改回来。这样受骗主机虽然发了广播包,但是网关根据mac,会把它本身的mac发给欺骗主机而不是发给受骗主机,这样受骗主机依然得不到正确网关的mac。另外,哪怕受骗主机得到了正确的网关mac,也只能保证自己对外发包不受欺骗,但是收到的包还是会被欺骗的。当然FW可以和as玩拉锯,二者都争先恐后的去网关那边刷自己的mac。但是这样导致是容易丢包。
    其实这种状况还是有一个相对的解决方案。就是彻底的改头换面掉。同时改自己的IP和mac,不论FW用什么添加ndis虚拟网卡,或者通过代码直接就把当前IP和mac替掉。获得正确网关mac才有保证,否则连正确网关mac都拿不到。其它的就更不用说了(至于什么手动填网关mac之类的。就先不讨论了。知道网关是什么东西的用户原没有想象中的那么多)。
    说这是一个相对的解决方案,是因为前提是局域网内得有富余的IP资源。另外它还有一些弊端。就是如果有些机器关机的话,而受害者替换了它的IP之后,以后将造成冲突。当然也是有解决方案了。比较多,这里就先不讨论了。
    因此,先要确定哪些IP是未被使用的,可以广播Arp request 局域网各个IP的mac,如果有人应答的话说明这个IP被用,没人应答的话,就是富余的IP了。
    只要把自己的IP和mac一改
    改了之后,迅速刷新网关,获得正确网关的mac之后,可以询问用户是否改回来,改回来,因为无法避免丢包。网速也容易受影响。
    第二种关于机房Arp欺骗的情况这里就不多说,参考上面文字。有几点要说明的是,机房里,外网IP和内网IP是映射的,同时改IP和mac是会导致断网的,有一定危险性。另外获得正确网关的mac后,IP和mac必须改回来。也就是说在机房这种情况下,丢包是免不了的。
         若您对本文有任何看法,欢迎给E我,backspray008@gmail.com
回复

使用道具 举报

发表于 2008-3-1 09:30:19 | 显示全部楼层
以下是相关基础资料,供参考


1 ARP协议概述
IP数据包常通过以太网发送。以太网设备并不识别32位IP地址:它们是以48位以太网地址传输以太网数据包的。因此,IP驱动器必须把IP目的地址转换成以太网网目的地址。在这两种地址之间存在着某种静态的或算法的映射,常常需要查看一张表。地址解析协议(Address Resolution Protocol,ARP)就是用来确定这些映象的协议。
ARP工作时,送出一个含有所希望的IP地址的以太网广播数据包。目的地主机,或另一个代表该主机的系统,以一个含有IP和以太网地址对的数据包作为应答。发送者将这个地址对高速缓存起来,以节约不必要的ARP通信。
如果有一个不被信任的节点对本地网络具有写访问许可权,那么也会有某种风险。这样一台机器可以发布虚假的ARP报文并将所有通信都转向它自己,然后它就可以扮演某些机器,或者顺便对数据流进行简单的修改。ARP机制常常是自动起作用的。在特别安全的网络上, ARP映射可以用固件,并且具有自动抑制协议达到防止干扰的目的。
图1是一个用作IP到以太网地址转换的ARP报文的例子。在图中每一行为32位,也就是4个八位组表示,在以后的图中,我们也将遵循这一方式。
200453020201.jpeg (8.57 KB, 下载次数: 17)
硬件类型字段指明了发送方想知道的硬件接口类型,以太网的值为1。协议类型字段指明了发送方提供的高层协议类型,IP为0806(16进制)。硬件地址长度和协议长度指明了硬件地址和高层协议地址的长度,这样ARP报文就可以在任意硬件和任意协议的网络中使用。操作字段用来表示这个报文的目的,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4。
当发出ARP请求时,发送方填好发送方首部和发送方IP地址,还要填写目标IP地址。当目标机器收到这个ARP广播包时,就会在响应报文中填上自己的48位主机地址。

2 ARP使用举例
我们先看一下linux下的arp命令(如果开始arp表中的内容为空的话,需要先对某台主机进行一个连接,例如ping一下目标主机来产生一个arp项):
d2server:/home/kerberos# arp
Address          HWtype  HWaddress         Flags Mask            Iface
211.161.17.254   ether   00:04:9A:AD:1C:0A      C                 eth0
Address:主机的IP地址
Hwtype:主机的硬件类型
Hwaddress:主机的硬件地址
Flags Mask:记录标志,"C"表示arp高速缓存中的条目,"M"表示静态的arp条目。
用"arp --a"命令可以显示主机地址与IP地址的对应表,也就是机器中所保存的arp缓存信息。这个高速缓存存放了最近Internet地址到硬件地址之间的映射记录。高速缓存中每一项的生存时间一般为20分钟,起始时间从被创建时开始算起。
d2server:/home/kerberos# arp -a
(211.161.17.254) at 00:04:9A:AD:1C:0A [ether] on eth0
可以看到在缓存中有一条211.161.17.254相对应的arp缓存条目。
d2server:/home/kerberos# telnet 211.161.17.21
Trying 211.161.17.21...
Connected to 211.161.17.21.
Escape character is '^]'.
^].
telnet>quit
connetion closed.

在执行上面一条telnet命令的同时,用tcpdump进行监听:
d2server:/home/kerberos# tcpdump -e dst host 211.161.17.21
tcpdump: listening on eth0
我们将会听到很多包,我们取与我们arp协议相关的2个包:
1  0.0                 000:F8:0A:FB:83         FF:FF:FF:FF:FF:FF  arp  60
                        who has 211.161.17.21 tell d2server
2  0.002344(0.0021)        00:E0:3C:43:0D:24         000:F8:0A:FB:83  arp  60
                        arp reply 211.161.17.21 is at 00:E0:3C:43:0D:24                       

在第1行中,源端主机(d2server)的硬件地址是000:F8:0A:FB:83。目的端主机的硬件地址是FF:FF:FF:FF:FF:FF,这是一个以太网广播地址。电缆上的每个以太网接口都要接收这个数据帧并对它进行处理。
第1行中紧接着的一个输出字段是arp,表明帧类型字段的值是0x0806,说明此数据帧是一个ARP请求或回答。
在每行中,单词后面的值60指的是以太网数据帧的长度。由于ARP请求或回答的数据帧长都是42字节(28字节的ARP数据,14字节的以太网帧头),因此,每一帧都必须加入填充字符以达到以太网的最小长度要求:60字节。
第1行中的下一个输出字段arp who-has表示作为ARP请求的这个数据帧中,目的I P地址是211.161.17.21的地址,发送端的I P地址是d2server的地址。tcpdump打印出主机名对应的默认I P地址。
从第2行中可以看到,尽管ARP请求是广播的,但是ARP应答的目的地址却是211.161.17.21(00:E0:3C:43:0D:24)。ARP应答是直接送到请求端主机的,而是广播的。tcpdump打印出arp reply的字样,同时打印出响应者的主机ip和硬件地址。
在每一行中,行号后面的数字表示tcpdump收到分组的时间(以秒为单位)。除第1行外,每行在括号中还包含了与上一行的时间差异(以秒为单位)。
这个时候我们再看看机器中的arp缓存:
d2server:/home/kerberos# arp -a (211.161.17.254) at 00:04:9A:AD:1C:0A [ether] on eth0 (211.161.17.21) at 00:E0:3C:43:0D:24 [ether] on eth0

arp高速缓存中已经增加了一条有关211.161.17.21的映射。
再看看其他的arp相关的命令:
d2server:/home/kerberos# arp -s 211.161.17.21 00:00:00:00:00:00
d2server:/home/kerberos# arp
Address          HWtype  HWaddress        Flags Mask       Iface
211.161.17.254     ether   00:04:9A:AD:1C:0A     C            eth0
211.161.17.21      ether   00:00:00:00:00:00      CM           eth0
d2server:/home/kerberos# arp -a
(211.161.17.254) at 00:04:9A:AD:1C:0A [ether] on eth0
(211.161.17.21) at 00:00:00:00:00:00 [ether] PERM on eth0

可以看到我们用arp -s选项设置了211.161.17.21对应的硬件地址为00:00:00:00:00:00,而且这条映射的标志字段为CM,也就是说我们手工设置的arp选项为静态arp选项,它保持不变没有超时,不像高速缓存中的条目要在一定的时间间隔后更新。
如果想让手工设置的arp选项有超时时间的话,可以加上temp选项
d2server:/home/kerberos# arp -s 211.161.17.21 00:00:00:00:00:00 temp
d2server:/home/kerberos# arp -a
(211.161.17.254) at 00:04:9A:AD:1C:0A [ether] on eth0
(211.161.17.21) at 00:00:00:00:00:00 [ether] on eth0
d2server:/home/kerberos# arp
Address        HWtype  HWaddress         Flags Mask      Iface
211.161.17.254   ether   00:04:9A:AD:1C:0A     C            eth0
211.161.17.21    ether   00:00:00:00:00:00       C            eth0

可以看到标志字段的静态arp标志"M"已经去掉了,我们手工加上的是一条动态条目。
请大家注意arp静态条目与动态条目的区别。
在不同的系统中,手工设置的arp静态条目是有区别的。在linux和win2000中,静态条目不会因为伪造的arp响应包而改变,而动态条目会改变。而在win98中,手工设置的静态条目会因为收到伪造的arp响应包而改变。
如果您想删除某个arp条目(包括静态条目),可以用下面的命令:
d2server:/home/kerberos# arp -d 211.161.17.21  
d2server:/home/kerberos# arp -a
(211.161.17.254) at 00:04:9A:AD:1C:0A [ether] on eth0
(211.161.17.21) at  on eth0
可以看到211.161.17.21的arp条目已经是不完整的了。
还有一些其他的命令,可以参考linux下的man文档:
d2server:/home/kerberos# man arp


3 ARP欺骗
我们先复习一下上面所讲的ARP协议的原理。在实现TCP/IP协议的网络环境下,一个ip包走到哪里,要怎么走是靠路由表定义,但是,当ip包到达该网络后,哪台机器响应这个ip包却是靠该ip包中所包含的硬件mac地址来识别。也就是说,只有机器的硬件mac地址和该ip包中的硬件mac地址相同的机器才会应答这个ip包,因为在网络中,每一台主机都会有发送ip包的时候,所以,在每台主机的内存中,都有一个 arp--> 硬件mac 的转换表。通常是动态的转换表(该arp表可以手工添加静态条目)。也就是说,该对应表会被主机在一定的时间间隔后刷新。这个时间间隔就是ARP高速缓存的超时时间。
通常主机在发送一个ip包之前,它要到该转换表中寻找和ip包对应的硬件mac地址,如果没有找到,该主机就发送一个ARP广播包,于是,主机刷新自己的ARP缓存。然后发出该ip包。
了解这些常识后,现在就可以谈在以太网络中如何实现ARP欺骗了,可以看看这样一个例子。
3.1 同一网段的ARP欺骗
200453020201.jpeg (8.57 KB, 下载次数: 2)
如图2所示,三台主机

A: ip地址 192.168.0.1 硬件地址 AA:AA:AA:AA:AA:AA
B: ip地址 192.168.0.2 硬件地址 BB:BB:BB:BB:BB:BB
C: ip地址 192.168.0.3 硬件地址 CC:CC:CC:CC:CC:CC

一个位于主机B的入侵者想非法进入主机A,可是这台主机上安装有防火墙。通过收集资料他知道这台主机A的防火墙只对主机C有信任关系(开放23端口(telnet))。而他必须要使用telnet来进入主机A,这个时候他应该如何处理呢?
我们这样考虑,入侵者必须让主机A相信主机B就是主机C,如果主机A和主机C之间的信任关系是建立在ip地址之上的。如果单单把主机B的ip地址改的和主机C的一样,那是不能工作的,至少不能可靠地工作。如果你告诉以太网卡设备驱动程序, 自己IP是192.168.0.3,那么这只是一种纯粹的竞争关系,并不能达到目标。我们可以先研究C这台机器如果我们能让这台机器暂时当掉,竞争关系就可以解除,这个还是有可能实现的。在机器C当掉的同时,将机器B的ip地址改为192.168.0.3,这样就可以成功的通过23端口telnet到机器A上面,而成功的绕过防火墙的限制。

上面的这种想法在下面的情况下是没有作用的,如果主机A和主机C之间的信任关系是建立在硬件地址的基础上。这个时候还需要用ARP欺骗的手段让主机A把自己的ARP缓存中的关于192.168.0.3映射的硬件地址改为主机B的硬件地址。
我们可以人为的制造一个arp_reply的响应包,发送给想要欺骗的主机,这是可以实现的,因为协议并没有规定必须在接收到arp_echo后才可以发送响应包.这样的工具很多,我们也可以直接用snifferpro抓一个arp响应包,然后进行修改。
你可以人为地制造这个包。可以指定ARP包中的源IP、目标IP、源MAC地址、目标MAC地址。
这样你就可以通过虚假的ARP响应包来修改主机A上的动态ARP缓存达到欺骗的目的。
下面是具体的步骤:
他先研究192.0.0.3这台主机,发现这台主机的漏洞。
根据发现的漏洞使主机C当掉,暂时停止工作。
这段时间里,入侵者把自己的ip改成192.0.0.3
他用工具发一个源ip地址为192.168.0.3源MAC地址为BB:BB:BB:BB:BB:BB的包给主机A,要求主机A更新自己的arp转换表。
主机更新了arp表中关于主机C的ip-->mac对应关系。
防火墙失效了,入侵的ip变成合法的mac地址,可以telnet 了。
上面就是一个ARP的欺骗过程,这是在同网段发生的情况,但是,提醒注意的是,在B和C处于不同网段的时候,上面的方法是不起作用的。

3.2 不同网段的ARP欺骗
200453020201.jpeg (8.57 KB, 下载次数: 4)
如图3所示A、C位于同一网段而主机B位于另一网段,三台机器的ip地址和硬件地址如下:

A: ip地址 192.168.0.1 硬件地址 AA:AA:AA:AA:AA:AA
B: ip地址 192.168.1.2 硬件地址 BB:BB:BB:BB:BB:BB
C: ip地址 192.168.0.3 硬件地址 CC:CC:CC:CC:CC:CC

在现在的情况下,位于192.168.1网段的主机B如何冒充主机C欺骗主机A呢?显然用上面的办法的话,即使欺骗成功,那么由主机B和主机A之间也无法建立telnet会话,因为路由器不会把主机A发给主机B的包向外转发,路由器会发现地址在192.168.0.这个网段之内。

现在就涉及到另外一种欺骗方式―ICMP重定向。把ARP欺骗和ICMP重定向结合在一起就可以基本实现跨网段欺骗的目的。

什么是ICMP重定向呢?

ICMP重定向报文是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台机器使用非优化路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由。路由器也会把初始数据报向它的目的地转发。

我们可以利用ICMP重定向报文达到欺骗的目的。

下面是结合ARP欺骗和ICMP重定向进行攻击的步骤:
为了使自己发出的非法ip包能在网络上能够存活长久一点,开始修改ip包的生存时间ttl为下面的过程中可能带来的问题做准备。把ttl改成255. (ttl定义一个ip包如果在网络上到不了主机后,在网络上能存活的时间,改长一点在本例中有利于做充足的广播)
下载一个可以自由制作各种包的工具(例如hping2)
然后和上面一样,寻找主机C的漏洞按照这个漏洞当掉主机C。
在该网络的主机找不到原来的192.0.0.3后,将更新自己的ARP对应表。于是他发送一个原ip地址为192.168.0.3硬件地址为BB:BB:BB:BB:BB:BB的ARP响应包。
好了,现在每台主机都知道了,一个新的MAC地址对应192.0.0.3,一个ARP欺骗完成了,但是,每台主机都只会在局域网中找这个地址而根本就不会把发送给192.0.0.3的ip包丢给路由。于是他还得构造一个ICMP的重定向广播。
自己定制一个ICMP重定向包告诉网络中的主机:"到192.0.0.3的路由最短路径不是局域网,而是路由,请主机重定向你们的路由路径,把所有到192.0.0.3的ip包丢给路由。"
主机A接受这个合理的ICMP重定向,于是修改自己的路由路径,把对192.0.0.3的通讯都丢给路由器。
入侵者终于可以在路由外收到来自路由内的主机的ip包了,他可以开始telnet到主机的23口。

其实上面的想法只是一种理想话的情况,主机许可接收的ICMP重定向包其实有很多的限制条件,这些条件使ICMP重定向变的非常困难。

TCP/IP协议实现中关于主机接收ICMP重定向报文主要有下面几条限制:
新路由必须是直达的
重定向包必须来自去往目标的当前路由
重定向包不能通知主机用自己做路由
被改变的路由必须是一条间接路由

由于有这些限制,所以ICMP欺骗实际上很难实现。但是我们也可以主动的根据上面的思维寻找一些其他的方法。更为重要的是我们知道了这些欺骗方法的危害性,我们就可以采取相应的防御办法。
回复

使用道具 举报

发表于 2008-3-3 08:40:54 | 显示全部楼层
1.    获取当前网关mac(如利用sendARP函数等等);
2.    利用网关IP发一个广播包,获取网关的mac;

不是很明白,如果当前的网关的MAC已经是假的,1和2步骤获得的难道不也都同样是假的么,请高手解惑
回复

使用道具 举报

您需要登录后才可以回帖 登录 | CSNA会员注册

本版积分规则

快速回复 返回顶部 返回列表