写在开头的话:

    非常、非常老的文章了,刚才在鬼仔博客,翻老文章看到的。

    原文出处及作者已无从考证(虽然开头写着出处信息),原文日期起码早于:2005/04/29 10:49,可能更早,搜到一个内容中有“对在路由器上进行sniffer的一点点探索_mix_2003_6.txt”的结果,看名字可能是2003年6月的,不追究这个了。。

    说来也惭愧,2005、2006 年那时,还在上学,压根不知道电脑是个神马玩意儿,我接触网络很迟……

    早几年也有过文中这种想法,不过由于很多原因一直未能研究,原来早已有前辈研究过,今天又翻出来了,干脆转过来了,还有点参考价值。

------------------------------------------------- ↓ 正文开始 ↓ --------------------------------------------------

|---------------------- 对在路由器上进行sniffer的一点点探索 --------------------|
|-------------------------------------------------------------------------------|
|------------------------------ mix <cnxhacker.net> ----------------------------|
|------------------------- Our Team <www.cnxhacker.com> ------------------------|

国内很少有文章介绍怎样在路由器上实现sniffer,至少我在google上面没有搜到过任何中文资料,而且我问过的很多人也都没有一个很好的答复,就连英文资料我也只是在著名的 PHRACK 杂志的56期中看到了一篇而已,你可以在 http://www.wu-long.net/01/mix/goods/18.txt 看到我对这篇文章的翻译《当我们完全控制CISCO路由器时能够做的事情》(副原文)。

按照我的个人理解,我将在路由器上建立sniffer这种技术分为以下三种手法:

1.目标主机和攻击者服务器在同一边沿路由器下,然后攻击者使用ARP欺骗,冒充目标主机的边沿路由器IP。
<*> 这种手法和交换机下的sniffer非常的相似,只是将要伪造的IP换成了路由器而已。

2.攻击者使用CISCO路由器的管理接口,在PC机上使用路由器相应的管理软件进行监视。
<*> 这种手法是比较正规化的一种,它直接利用了CISCO的管理软件来获取数据。

3.在路由器上使用隧道技术,将目标主机和另一主机相联接,然后使用sniffer从这台主机上获取数据。
<*> 这种手法就是 PHRACK 文章里提到的方法,隧道另一端的主机还必须具备保证目标主机的正常通信能力。

我当然没有把那种通过装有win2k或其他系统的PC机作为软路由的情况算上来,我这里讨论的完全只是硬件路由设备,并以世界上广泛应用了的CISCO路由器做例子。

----| 3. 原理分析

按照上文的分析,我们将分三部分来解释这三种手法,最后我还会另外添加两个我自己的想法来拓展一下思路。

]部分I:

手法一和其他普通的交换环境下的sniffer原理是一样的。我们通过对目标机器使用MAC洪水包或ARP欺骗,改写目标主机的静态连路表,从而可以伪造出路由器的IP(这个欺骗部分的原理,网上有很多文章已经分析得非常精彩了,我就不再多说了)。这样当目标机器将数据默认的发送到他的边沿路由器的时候,他的数据将发送到我们的主机上,然后我们在自己的主机上面通过适当的软件就可以接收到目标主机的数据信息,同时还要将这些数据发送给真正的路由器,以保证目标主机信息通道的完整与畅通。

这种手法并不能够完全的sniffer到经过路由器的所有的数据,只能适用于1 to 1的模式下。在下面的简单实践中,我将给出一个完整的例子,其中我使用了小榕写的ARPSniffer软件来实现sniffer路由器。

]部分II:

CISCO路由器的管理接口其实是CISCO公司的一把双刃剑,一方面它极大的方便了管理员对路由器的远程控制,通过在路由器上配置好SNMP代理,我们可以在远程使用基于SNMP应用协议的管理软件(如CISCO WORKS 2000)进行远程管理,也可以在路由器上开放80端口,用浏览器进行远程管理。另一方面,他也极大的方便了那些恶意入侵者对路由器的远程控制,他们可以像真正的管理员一样对路由器进行远程管理,只要记得将管理日志清楚干净就好了。

这里的这个接口技术当然是由CISCO公司技术保密了的,我们也不好做太多的猜测,我用下图简单的描述出整个数据的流程图吧。

internat网
|
|
管理者PC机 <----------控制信息----------> CISCO路由器 <----------用户数据----------> 目标机器

在管理者(或恶意入侵者)的PC机上运行着CISCO公司发布的专用管理软件,就可以监视并控制着经过路由器的所有数据信息,当然就可以从中捕获想要的数据信息。

相对其他的几种手法而言,我们使用这种方法sniffer要正规一点,毕竟是CISCO公司自己开发的技术产品,而且对路由器的其他功能影响最少。但是这种手法需要的软件是比较难以得到的。

我们经常使用的Sniffer Pro可以使用SNMP团体字符串对Switch交换机进行监控,从中得到数据,他支持从CISCO Catalyst 2900 ~ 6509大部分型号的交换机设备。但是我好像还没有看到有直接支持路由器的软件,就连CISCO WORKS 2000在网上也都没有广泛流传。

]部分III:

隧道技术的原理是利用一种新的协议进行数据包的封装,仍然套用当前的IP头格式,通过IP封包,不需要指明网络的传输路径,数据包就能透明地到达目的地。

PHRACK 的文章中就是使用的这种隧道技术,将目标主机与我们的主机连接起来,他在其中使用了GRE协议(通用路由器连接)进行数据封装的,这种封装结构只适合于路由器和访问服务器之间建立的隧道。用户可以Ping通隧道的另一端。PHRACK 的文章中似乎也只是提到捕捉ping的ICMP数据包,没有提到其他数据的问题。而在我找到的其他资料里面显示,似乎使用IPIP协议封装数据能够更好的体现出这种隧道技术在我们做sniffer时候的优越性,可以封装并传送其他的上网数据信息。显而易见,这种手法同样只是适用于1 to 1的模式,不能够获取路由器上经过的所有数据。

设置方面,我们需要通过进入路由器的隧道模式(Tunnel Mode),来完成相应的配置。在后面的简单实践中,我会提到相关的设置命令并给出详细的意义。然后你可以对照我前面提到的 PHRACK 文章仔细体会(建议看原文)。

其实,隧道中封装数据的格式还有aurp、cayman、dvmrp、eon、multipoint、nos,这几种协议都有其各自不同的应用。但是,在我找到的CCNA2.0中文版教材中根本就没有提到隧道模式(Tunnel Mode)的任何技术,所以希望专业的路由器管理员能够share资料出来。

OK,以上部分就是我对sniffer路由器几种手法的简单分析。其实你可以充分的发挥你的想象,想出其他更多的技术手段,我这里还想说说我的另外两个思路:

1.使用静态路由表来改变数据链路,当我们改变了数据链路以后,我们同样可以使用和隧道技术差不多的手段获取感兴趣的数据资料。

2.修改路由器的设置,为目标主机在路由器上添加一个PC网关。这种手法就像是把目标主机置入一个局域网中,通过在添加的PC网关上建立sniffer来获取数据。

----| 4. 简单实践

其实,我是非常有兴趣将以上三种手法一一的在路由器上面实现的,但由于现有的条件问题的制约,我没有任何能力去实现这些东西,所以我这里只能为各种手法提供较为详细的理论上的操作,希望大家谅解!尽管如此,我还是将第一种手法通过了实践验证,而第三中手法中使用的所有命令我都通过CISCO路由器的一个拟操作程序执行过。

1.ARP欺骗
<*> 这里我使用了小榕写的ARPSniffer来简单的实践了一下,先来看看他的使用说明:
ArpSniffer [IP1] [IP2] [Sniffer TCP Port] [LogFile]

[IP1]带入我们的路由器,[IP2]带入我们目标主机的IP地址,我们当然是要捕获所有数据包,所以[Sniffer TCP Port]用*带入,最后的[LogFile]数据日志记录文件当然就看个人习惯了。

比如,路由器IP是192.168.0.1,目标机器的IP是192.168.0.2,那么我们这样使用命令:
ARPSniffer 192.168.0.1 192.168.0.2 * log.txt

2.软件管理
<*> 没有相关软件,所以无法测试。

3.建立隧道
<*> 首先我们使用en密码进入路由器的特权模式,然后输入以下命令:
configure term //进入全局配置模式
int tunnel0 //为隧道命名
ip address 192.168.0.1 255.255.255.0 //建立一条隧道,并且分配合法的IP地址
tunnel mode gre ip //使用GRE协议封装数据包
tunnel source Ethernet0/0/0 //在以太网上实现隧道
tunnel destination 192.168.1.1 //设定隧道目的IP地址
show interfaces Tunnel0 //查看隧道Tunel0的所有配置情况
这样我们就在192.168.0.1和192.168.1.1之间建立起了一个隧道,而且可以在其中捕获ping的数据包。