关于ARP、MAC、IP欺骗以及TCP劫持

>>转自:飘零的代码 piao2010 ’s blog

三个多月没更新博客,期间也有在学习和总结一些东西,只是或多或少都涉及到公司相关的信息(业务,JVM,WebServer)所以不便写出来,有时候写到一半发现又不太合适然后删除,很郁闷。之前一直比较关注web安全层面,如SQL注入、XSS、CSRF等等 ,然后HTTP协议层面,如HTTP Slowloris ,逐渐接触应用层以下(OSI七层模型)的东西,比如TCP SYN Flood相关。最近在学习ARP、MAC、IP欺骗,交换网络sniff以及TCP劫持相关的东西,查阅的都是01-03年左右的文档(越是底层的技术越是持久哈),总算不涉及公司相关信息,拿出来充充数。
注:本文只供研究参考之用,如作其他用途,概与本人无关。飘零的代码 http://piao2010.com

简单描述下实验场景:同一局域网内,网关A,攻击者B,受害者C。

涉及到工具:主要是hunt-1.5和dsniff工具包(dsniff安装过程比较艰辛,主要是软件依赖的库太旧了,好在有同学给出了各依赖库的包http://blog.netonline.me/2010/09/lansecurity-dsniff.html/ 最后一步安装dsniff的时候注意指定这些库的路径./configure –help 可以查到)
工具使用相关说明在README里都比较详细了,另外需要知道TCP/IP协议相关的基础知识(请参考《TCP/IP详解》或者RFC)。

首先说下ARP欺骗,主要参考http://www.rootsecure.net/content/downloads/pdf/arp_spoofing_slides.pdf 和 http://www.ibm.com/developerworks/cn/linux/l-arp/

ARP欺骗是攻击者B主动发送ARP响应来欺骗受害者C对ARP缓存表中网关A的IP和MAC映射进行更新,使网关的IP对应B的MAC,如此一来受害者C对网关A发送的数据就全部走到了攻击者B这里,那么B很容易就可以对数据进行sniff甚至篡改,最后再把数据转发给真正的网关A(B事先开启ip_forward功能)。
同样地攻击者B主动发送ARP响应来欺网关A对ARP缓存表中受害者C的IP和MAC映射进行更新,使受害者C的IP对应B的MAC,如此一来网关A对受害者C发送的数据就全部走到了攻击者B这里,那么B很容易就可以对数据进行sniff甚至篡改,最后再把数据转发给真正的受害者C(同样B事先开启ip_forward功能)。
现在看起来B已经顺利对A和C之间的通信进行了监控甚至篡改。ARP欺骗是基于MAC与IP映射关系的欺骗,对于网络层以上是透明的,所以也就达到了TCP劫持的目的,甚至是基于ssh v1的MITM(dsniff工具包里的sshmitm可以实现)。另外一些基于源IP地址信任的策略也轻松突破了(攻击者B不用开启ip_forward),就是实现了IP的欺骗(注意场景:局域网内哈)。还有就是《ARP协议揭密》一文中利用ICMP重定向报文进行跨网段的ARP欺骗因为条件有限我未做测试,实践过的同学请告知。
ARP欺骗的防御:网络中任意两节点之间双向IP+MAC静态绑定是最好的办法,当然维护成本也是比较高的。对于不能静态绑定的环境,可以参考http://www.xfocus.net/articles/200711/960.html 一文,正好我也安装了某ARP防火墙,发现文中的思路应该已经被采用,毕竟是07年的文章了。

再说下公网的IP欺骗,当然我说的是TCP连接(ICMP UDP这些随便你怎么玩),实现起来会很费劲,传说中凯文米特尼克做过。从理论上看:攻击者B首先要对受信任者C进行Flood以免它对目标A的TCP产生RST回应而影响效果(这步不算难),然后攻击者B伪装C的IP对目标A发起SYN,目标A会向受信任者C回应SYN+ACK,所以C这个时候必须无响应,作为攻击者B收不到A给C的SYN+ACK,所以我们必须对A的TCP ISN进行预测(这个是难点,相关技术自行Google之),然后以正确的ACK值(A的ISN+1)和我们要发送的数据回复给目标A完成一次攻击。当然只是理论,我没有测试过。

最后说下MAC欺骗,主要参考http://www.cnblogs.com/wuxdotnet/archive/2010/04/07/1706654.html 和 http://huaidan.org/archives/2199.html
鉴于前面提到ARP欺骗的危害如此之大,所以一些网络环境里主机(网关)之间采用双向IP+MAC静态绑定来防御ARP欺骗。如此一来我们似乎没法在这种环境里面进行sniff(亲,场景是交换网络,不是共享网络哈),有一种比较暴力的方法就是泛洪交换机的MAC地址(dsniff工具包里的macof可以实现),这样确实会使交换机以广播模式工作(变成HUB工作方式)从而达到嗅探的目的,但是会造成交换机负载过大,网络缓慢和丢包甚至瘫痪。这个时候MAC欺骗就派上用场了,ARP欺骗是欺骗了IP/MAC的应关系,而MAC欺骗则是欺骗了MAC/PORT(交换机的端口)的对应关系。还是以攻击者B劫持受害者C作为例子(da为目的MAC,sa为源MAC):
首先攻击者B发送任意da=网关A.mac、sa=受害者C.mac的数据包到网关,这样就表明C.mac 对应的是port.B,在一段时间内,交换机会把发往C.mac的数据帧全部发到攻击者B。这个时间一直持续到C主机发送一个数据包,或者另外一个da=网关A.mac、sa=C.mac的数据包产生前。
然后攻击者B收到网关A发给受害者C的数据,记录或修改之后要转发给C,在转发前要发送一个ARP请求C.MAC的广播,这个包是正常的,MAC信息为:da=FF:FF:FF:FF:FF:FF、sa=B.mac。这个数据帧表明了B.mac对应port.B,同时会激发C主机响应一个应答ARP包 MAC信息为:da=B.mac、sa=C.mac,这个数据帧表明了 C.mac对应port.C。至此,对应关系已经恢复,攻击者B将劫持到的数据可顺利转发至受害者C。这样就完成了一次劫持,MAC欺骗攻击隐蔽性强,可以在ARP防火墙和双向绑定的环境中工作。攻击具有时间分段特性,所以受害者C的流量越大,劫持频率也越低,网络越稳定。
MAC欺骗的防御:高级的交换机可以采用ip+mac+port 绑定,控制CAM表的自动学习,当然维护成本也会很高,除非网络节点比较稳定,很少增减节点。

参考资料:
http://www.rootsecure.net/content/downloads/pdf/arp_spoofing_slides.pdf http://www.ibm.com/developerworks/cn/linux/l-arp/
http://www.xfocus.net/articles/200711/960.html
http://www.cnblogs.com/wuxdotnet/archive/2010/04/07/1706654.html
http://huaidan.org/archives/2199.html
http://blog.netonline.me/2010/09/lansecurity-dsniff.html/
《TCP/IP详解》

你可能感兴趣的:(Hacking)