安全学习记录——网络篇(三)动态路由协议OSPF

本文介绍了RIP协议的基本工作原理,以及OSPF如何通过Dijkstra算法优化路由和减少传输限制。同时讨论了OSPF的局限性和可能存在的漏洞,如hello包欺骗和LSA伪造,这些主要用于破坏性攻击而非常规渗透。
摘要由CSDN通过智能技术生成

经过之前基本网络设备的学习,我们了解到了,路由是当今网络的基础,一切终端的网络访问都需要通过路由。一般情况下只需要给路由连接设备的端口配上这个设备同网段的IP 就可以实现网络访问。但是距离永远是网络访问无法避免的问题,过长的传输会导致信号出现问题,就算是激光没办法通过卫星上的反光板的全反射让地球另一边的人看到地上绿色的光点。所以,要在信号失真前夕,通过一个设备辨认出信号然后再发送出去,一点一点传递,最终使对方收到正确的信息,就像点烽火台一样一个接一个地点。所以,现实中的网络传输一定经过了很多路由的转发,无论我们把那些地上立着的高塔叫什么,中继站、基站都可以,他们转发的原理都是一样的,所以我统一称作路由。那么,一个路由想要通过另一个路由发送信息到再下一个设备上,需要设定跳过的这个路由的IP以及目的地的IP,也就是说,一个路由上必须记录下一条网络上所有设备的IP才能发信息到任何设备上,只要它们在物理上连接上了,设备会自动去寻找和端口相同网段的设备(也就是相邻设备)转发信息直到到达目标。所以就有了RIP,routing information protocol来帮助路由交换IP地址。

RIP协议

RIP是一种很简单的交换IP地址的方法,假设现在有两个路由,每个路由里存着对外的端口IP和内网终端IP,因为这两个路由通过10.10.1.x连接在一起,所以它们可以通过这条路径来交换自己的信息,于是,R1就把自己有的IP发给R2, R2也把自己有的IP发给R1。

R1: 192.168.123.254
    10.10.1.1
R2: 192.168.124.254
    10.10.1.2

于是两个路由器就会自动添加自己不存在的IP,这样R1就知道了如果想要找192.168.124.x的设备,需要通过10.10.1.2去转发,因为它自己端口上没有这个网段,R2收到后知道192.168.124.x是自己端口上的就会发给自己下面的指定设备,如果一个网段它们两个都没有,那么就会继续转发给下一路由R3上,直到有一个路由找到了目标设备或者整条路上一个都没有,于是R1就会说time out。而如果路由表上没有就直接unreachable了。这个过程一次叫做一跳。

R1: 192.168.123.254
    10.10.1.1
    192.168.124.254
    10.10.1.2

R2: 192.168.124.254
    10.10.1.2
    192.168.123.254
    10.10.1.1

那么问题来了,假设全球每个三到四个人算一个小家庭,每个家庭至少有一个路由器,那么全球至少就有20多亿个路由器,难道说我们在连接时,不仅路由表需要记录至少70亿终端+20亿路由的IP列表,当我们想连接某个设备时就需要去遍历20亿台路由最后再说找不到吗?(现实当然不是这样的,只是个极其简陋且夸张的例子,因为全球总共就40多亿IP,假设IP无限且能端对端通信)那样时间会不会太长了。所以RIP设定了一个限制,15跳极其以内可达,以外就是超时。这就对如何架设路由提出了要求,所以,基站这种覆盖范围大,信号强的“超大型路由”就极其有用了。

可是,这种路由的交换效率还是太低了,因为现实网络并不是一条直线,而是有大量的岔路。一个外地人去罗马旅游,假设她/他每次都只转15次弯,在没有地图的情况下,怎么知道要往哪里转呢,只能不断地试错排除,最后这位可怜的女士/先生可能一周都在罗马三环外兜圈子。当然,网络中她/他更可能在岔路口分身(广播),一个路口去一个分身,最后可能有一个能在15次分身内到达罗马。但是,分身是要消耗资源的。我们经常听说条条大路通罗马,那是因为我们知道罗马在哪个方向,有了大方向,就算没有地图我们也可以摸一条路出来,而如果大家都摸了一遍前人没走过的路那么地图不就有了,这样,后来旅游的人无论从什么地方开始都能够选择对自己而言最快的道路去往罗马。而且旅游的人并不全是哑巴,非得按照规划好了的路走到底,在每一个岔路问一问前面的路况,无论哪条路在堵车,只要提前知道了,也可以换路来提高效率。OSPF协议就是用来解决这个问题的

OSPF

Open shortest path first,OSPF是用来帮助我们在动态路由环境中找到最短传输路径的一个协议,说是协议,其实核心是dijkstra最短路径算法,协议更多的是帮助我们创造出算法所需要的环境以及执行算法的结果。简单说明一下最短路径是怎么来的,借用一下别人的图:现在我们需要从A出发,求A到每个点的最短距离。

首先,我们需要一个表,或者叫矩阵,随便怎么叫,来表示每一个点到不同点的距离,相邻就写出来,不相邻就写为无限,字体颜色表示引用,字背景颜色表示更新:

纵到横ABCDEF
A010--4----
B100826--
C--801515
D421506--
E--616012
F----5--120

然后开始第一层距离计算,只看相邻的距离,从A出发

ABCDEF
A010 A-B--4 A-D----

第二次我们看看有一次中转的话分别有什么结果,首先选取相邻最短的D,然后拿所有点到D的距离去加4,也就是上面表中的D行的数字加4再与第一次距离进行比较,只保留每个的最小值以及这个值代表的路径,如果是无穷就用已有的数字替换:

ABCDEF
A-D4+4=84+2=64+15=194+0=44+6=104+--=--
最终06 A-D-B19 A-D-C4 A-D10 A-D-E--

在上面AD行都被选取过了,所以接下来我们需要选取除了AD行以外最短的那一行,也就是B行,同样的步骤,但是此时,我们不能再使用第一个距离表的内容了,因为A-B的距离已经被A-D-B更新,每个距离只能加6,一切按照最新结果来,还是拿计算结果来和上面的结果比对,保留较小值的路径:

ABCDEF
A-D-B6+10=166+0=66+8=146+2=86+6=126+--=--
最终06 A-D-B14 A-D-B-C4 A-D10 A-D-E--

同样的步骤,ADB以外最短的是E,所以选取E计算结果:

ABCDEF
A-D-E10+--=--10+6=1610+1=1110+6=1610+0=1010+12=22
最终06 A-D-B11 A-D-E-C4 A-D10 A-D-E22 A-D-E-F

然后是C

ABCDEF
A-D-E-C11+--=--11+8=1911+0=1111+15=2611+1=1211+5=16
最终06 A-D-B11 A-D-E-C4 A-D10 A-D-E16 A-D-E-C-F

最后还剩下F

ABCDEF
A-D-E-C-F16+--=--16+--=--16+5=2116+--=--16+12=2816+0=16
最终06 A-D-B11 A-D-E-C4 A-D10 A-D-E16 A-D-E-C-F

遍历结束后我们就求出了A到所有点的最短路径,至于代码如何实现,我也不会,我们只需要明白,最短路径算法可以帮助我们及时找到最高效的传输路径就行了。最短路径算法的优势就在于,我们不再需要在乎到底转了几个弯了,去掉了原本路由传输的限制,并且提升了效率。

我们前面说到,协议是为了提供算法的环境基础和执行算法结果而存在的,那协议是如何工作的呢?我们需要首先知道算法需要什么。

在最短路径算法中,想要知道每个点到其它所有点的距离首先要知道相邻的点有哪些,然后就是相邻点“距离”的关键量,比如带宽、时间差的计算,这样我们才能得出第一张矩阵表。那张线路图只是帮助我们去理解网络结构的,执行算法只需要矩阵。所以,路由首先需要找一找谁是自己的邻居。这个相邻关系并不是主动去建立的,而是本身就相邻只是它们互相不知道对方存在而已。于是路由就会发送一个hello包出去,邻居收到了hello包后会把发送者的route ID添加进自己hello包的邻居部分然后再发出去,当路由收到了hello包并看到里面有自己的ID时就建立起了邻居关系。

要注意的是,邻居本身就在物理上存在,需要的是建立关系,就好比我们搬进了新家,要找邻居去哪找呢,隔壁门啊,至于门背后是帅哥美女还是彪男悍妇那要敲门后才知道。不可能再敲门之前就知道邻居是谁,也不可能坐飞机去美国跟人说我是你邻居人家就认。所以,路由的hello只会发到隔壁连通的路由上,不可能随便成邻居。而路由的route ID本身就会显示在发送信息中,所以也不需要特别添加。到此为止,路由两两间就建立起了邻居关系。一个线路图就开始被搭建出来。

之后路由就会开始构建database description数据库描述包来描述自己的各种情况,形成link-state advertisement链路状态通告然后发给自己所有的邻居,最后依靠人民群众的力量形成link-state database链路状态数据库,在这个过程中LSA会被泛洪给邻居。所谓泛洪其实就是一传十十传百,遇到啥都跟邻居说,这样可以很好的帮助每一个路由器了解整个链路的实时状态以此来计算传输路线。但是泛洪会导致资源浪费,比如,遇到八卦时,人们只会想到我还没给谁说,而不管对方是否早就知道,于是在回家的路上可能已经听了十几遍但到家后家里人还是会围上来说:我跟你说,那个谁怎么怎么。让人心烦,然后第二天,反转了!第三天,再反转!导致我们看新闻跟以前追剧一样跌宕起伏,令人疲惫。路由也是一样,泛洪会导致路由过多的收到相同的信息,以及无差别地发送和更新信息,导致网络风暴,整个网络一刻不停地保持高峰状态。而这种事情只要有一丁点变化就会发生一次。就像这样的一个超大矩阵,无数只山羊天天在耳边叨叨。

那么怎么来解决这个问题呢,和网络设备两两互联导致接口过多一样,设定一个转换中心不久好了嘛,这样一个\frac{n(n-1)}{2}数量级的网络就成了n。这个我就懒得去推了,就算完全躺平不卷高中级别也有教的。没读到这个程度?那混生意场比搞技术门槛低而且赚钱得多。

但是又创建一个新设备来集成路由吗?那以后如果这种设备多了是不是还要在上面再发明个新设备?参考一下我们的国家政治体系,一个国家有很多人,这么多人要怎么通过某种方式进行合作,创建一个组织,订立组织内部的规矩,所有人按能力分配到不同位置上做不同的工作(起码明面上要看能力),但是管理者是怎么来的呢,当然是被选出来的(起码形式上是这样),这样普通人之间就不用太过在意外面到底发生了什么,只需要由核心的那部分人告诉他们需要做什么就行,而与外界的交互当然也是由核心部分的人去完成,而就算核心那个人挂了,大家仍然能很快选出继承人。如果说人没有私心和欲望,那这就是效率相当高的体系,我们的身体也是如此运转的。路由没有欲望,只会按照规则做事,所以,选举机制当然可以在路由网络上完美执行。既然是为了解决资源占用问题那么选举就不能复杂了,反正机器几乎不会出错,也不会忘记初心,所以只要人为设定优先级就行,当优先级相同时就看route ID,最大的作为designate route,第二个就是backup designate route,所有的LSA由DR来汇总处理,而一旦DR挂了,BDR就成为DR,然后再选出新的BDR。当然,邻居还是得自己去say hello。DR接收信息,计算结果,告知指定路由发消息给谁。就这样OSPF就完成了信息汇总和算法结果执行的过程。至于实际配置方法极其简单,在路由上,所有的hello发包都是半自动的:

ospf 1 //开启ospf 如果两个路由后面的数字不同则无法互通,因为属于不同的ospf
area 0 //创建一个ospf 1的区域,本区域边界上路由可连通的设备可被本区域内所有设备连通
network 192.168.2.0 0.0.0.255 //将192.168.2网段填入area 0中,此区域下所有设备都应为这个网段,若需要可再添加。
quit //退出到最基础的界面
ospf 1 route-id 1.1.1.1 //设置路由id,用于选举,如果不设置默认为本区域接入端口最大ip
OSPF漏洞

我学网络不是为了成为网络工程师,而是为了了解各个细枝末节上可能存在的安全问题,以方便今后深入研究,而不是单纯为了找漏洞到处求渗透工具,输几行命令就开始喝茶等结果。所以,在比较详细地了解了OSPF的完整流程后,回到最初的问题上来,它到底有什么漏洞。

首先我们从最最基础的地方开始,最高效的渗透手段往往采用物理连接。于是就想到,用路由直接接入网络,然后把ID设高是不是就变成DR了?首先,要别的路由全都开启OSPF才能连上,而我们在了解了OSPF之后就能发现,这个东西好像并不适合在超大型网络中使用,比如公网,因为就算有DR,它消耗资源仍然偏多。小型网络的路由不会超过三个,而且也不需要路由互通,所以OSPF一般适合于企业内部。虽然很多企业更喜欢IS-IS,但那是后面的内容了。企业内网自己架设路由会不设优先级?所以这个方法是没有用的,而且当一个网络中选举好了DR,在它没挂之前是不会更换的。再有一个问题,如果我们都能在人家企业内架设路由了,那为什么不选择更简单的方式去渗透呢。

根据之前ARP欺骗的例子,我们将目光投向OSPF的两个数据包,是否可以通过伪造hello包和LSA来进行欺骗呢,还是老问题,OSPF并不是传递信息的协议,也不对权限有任何的操作,它只是用来帮助路由找邻居,构建路况图的方法。而且,路由设定完成后如果网络结构本身没有变化,我们无法从任何地方抓到LSA数据包,唯一能看到的只有各个路由器在到处hello。因此我们无法直接通过伪造OSPF的数据包来实现任何远控、注入、偷窃等渗透手段。

那学这个岂不是一点用都没有?我们上面说到了,一个使用OSPF的网络中,所有的设备会不断地到处说hello,而hello数据包中带有路由的邻居。似乎我们可以根据这个去一条链路一条链路地抓包、扫描,从最开始的路由逐步摸清对方整个网络基本框架,方便我们做渗透的前期收集,绘制网络拓补图,然后搭建模拟环境来进行可行性实验。但问题还是,得连上路由啊。可行性并不高。

所以hello包最佳的用法应该是持续快速地欺骗目标路由,甚至导致邻居表溢出,使其认为自己没有邻居从而断网。断网的方法有很多,这只是其中一种,只适用于OSPF。

同时,我们应该知道,整个网络传输是根据LSA的结果来进行的。从LSA报文中我们能看到一个LS sequence number,这个表示序列号,这表明LSA本身对于伪造的LSA是有一定的防御能力的,通过序号排列可以比较简单地排除掉那些不正常的数据包,但是,天下武功唯快不破,快速周期性地发送报文以至于超过OSPF所规定的最LSA生成发送的最小时间间隔,或者连续发送两个序列号逐步增大的报文且都大于目标的报文时,可以避开LSA的反击机制(也就是重置序列号),从而使网络失效。

这一片篇文章讲得非常全:这里面讲到一个很有意思的幻影路由攻击,我还没看懂。OSPF路由协议脆弱性研究及分析-Research and Analysis on the Vulnerability of OSPF Routing Protocol (iie.ac.cn)

总之,OSPF的漏洞几乎全部是用来实现使大型网络失效的破坏性攻击,这种攻击需要防范但是没有太大攻击的意义,毕竟这种攻击基本一辈子就能搞一次,任何意义上的。弄狠了世界通缉也不是不可能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值