利用RIPv1协议进行路由劫持攻击实验
在本次实验中,我将探讨RIPv1——可能最基础的路由协议。与VLAN实验类似,我在GNS3中构建此实验环境,并将其连接到运行Debian的VirtualBox虚拟机。计划是构建一个由三台路由器组成的网络,所有路由器均使用RIP同步路由信息。然后,我将使用攻击机向网络中注入虚假路由,从而将流量从其真实目标转移。
如果您不熟悉RIP,它是一种基于跳数的系统,其中每个跳数是一个单位,流量通过最少的跳数进行路由。更多信息请参阅维基百科文章。
实验网络构建
我最初使用与VLAN实验相同的3660镜像构建实验室,但在全部设置并运行后,检查所有路由器上的RIP路由信息时,发现所有路由都显示正确,但所有路由的度量值均为1,而不是正确的值。例如,在R1上,到192.168.1.0网络有两个跳数,但度量值仅为1。经过一些搜索,发现这是包括3660在内的一系列设备的已知问题,更多信息请参见GNS3论坛帖子。
因此,我使用3745重新构建了所有内容。这些设备工作正常,但在我关闭实验室并重新启动后,所有配置都丢失了。我以为自己搞砸了,重新构建了所有内容,并确保保存了所有内容。再次重启后,配置再次丢失。进一步搜索发现了这个论坛帖子,解释了该设备与Dynamips存在一个错误,导致无法在启动时恢复配置。
第三次尝试时,我使用了2611,这些是老旧且功能有限的设备,但最终成功运行。
我为每个设备添加了一个NM-4E模块,技术上这不是必需的,但提供了四个额外的以太网接口,可能以后会有用。
下表显示了每个路由器的配置:
| 主机 | 接口 | IP | 连接到 |
|---|---|---|---|
| R1 | e1/0 | 10.0.0.1 | R2 e1/0 |
| R1 | e1/3 | 192.168.0.1 | SW1 |
| R2 | e1/0 | 10.0.0.2 | R1 e1/0 |
| R2 | e1/1 | 11.0.0.2 | R3 e1/1 |
| R3 | e1/1 | 11.0.0.1 | R2 e1/1 |
| R3 | e1/3 | 192.168.1.1 | SW2 |
| C1 | VirtualPC 1 | 192.168.0.100 | SW1 |
| C2 | VirtualPC 2 | 192.168.1.100 | SW2 |
| C3 | VirtualPC 3 | 192.168.0.102 | SW1 |
| VBox | VirtualBox | 192.168.0.101 | SW1 |
SW1和SW2是标准的GNS3交换机。我尝试使用安装了交换机模块的3660以在未来提供更多灵活性,但由于某种原因,这没有正常工作,因此坚持使用通用的GNS3交换机。C3并不是真正必需的,但对于检查连接性很有用。
为便于设置所有内容,以下是使三台路由器进入正确状态的命令。(下载准备进行剪切和粘贴)
|
|
设置好路由器后,您可以在启用提示符下使用show ip route命令检查RIP是否正常运行。如帮助文本所述,左侧列中的R表示设备通过RIP学习了路由。假设您有正确的路由,可以通过ping其他设备来检查连接性。
设置虚拟PC和VirtualBox机器
如果所有工作正常,下一步是设置虚拟PC和VirtualBox机器。我在第一个GNS3和VirtualBox实验室中涵盖了大部分内容,因此这里不再重复所有内容,但现在我们需要额外一步,因为我们正在超越单个子网。
要离开我们的子网并看到外部世界,您需要在设置IP地址时添加默认网关。您可以在ip命令的第二个参数中执行此操作。网关IP是将子网连接到网络其余部分的机器的IP,因此对于C1,这是192.168.0.1,对于C2是192.168.1.1。
设置两台机器的IP后,您可以通过一些ping来检查连接性。
如果发现ping失败,最好的调试方法是返回路由器,检查每个路由器是否可以正确ping通,检查R1是否可以与R2上的两个IP通信,R2是否可以与R3通信,然后R1与R3通信。检查每个路由器的路由表,确保它知道将流量发送到哪里。如果所有这些都正常工作,则检查C1是否可以与每个路由器通信。分解所有内容,错误往往更容易找到。这就是C3可以有用的地方,以检查错误是否不在C1上。
对于VirtualBox机器,我使用与VLAN实验室中相同的机器。在这里,我设置了IP和默认路由,并再次测试连接性。
攻击
在所有设置之后,现在是时候攻击网络了。计划是劫持从C1发往C2的流量,并将其传递到VBox。这将通过生成我们自己的RIP数据包向网络中注入新路由来实现。我们需要发送一个数据包,广告到192.168.1.0/24子网的路由,其度量(跳数)低于真实路由器。检查R1上的路由表显示,到达192.168.1.0/24的度量是2,因此我们必须广告度量為1的路由才能成功。
我最初考虑使用某种攻击工具或在Scapy中创建自定义数据包,但在研究这个项目时,我遇到了Quagga,一个在软件中实现路由器的Linux包。由于这是专门设计用于与各种路由协议(包括RIP)通信的,我认为使用它比“攻击”工具要好得多。
Quagga设置非常简单,可以在VBox上安装:
|
|
配置文件存储在/etc/quagga中,我们只需要编辑以下两个文件:
daemons
|
|
ripd.conf
|
|
这简单地告诉路由器它在eth0上使用RIP,并广告到192.168.1.0/24的路由。
由于我们计划劫持发往C2的流量,我还向eth0添加了一个虚拟接口,其IP地址为C2,这使我们能够在流量到达时充当C2。如果您只想嗅探流量,可以在机器上创建一个虚拟接口并赋予适当的IP。我发现如果机器上没有具有正确网络IP的接口,事情就不如有了它那样工作。这可能只是我做事的方式,但由于设置接口很容易,无论如何都值得做。
要创建虚拟接口,您可以执行:
|
|
要创建虚拟接口,您可以执行:
|
|
在启动Quagga之前,让我们启动Wireshark,以便我们可以看到我们创建的数据包并确保它们看起来正确。要在GNS3中执行此操作,右键单击R1和SW1之间的链接,选择“Start capturing”,在右侧的捕获列表中,右键单击捕获并选择“Start Wireshark”。在Wireshark中添加RIP过滤器并将其放在一边。
现在一切就绪,我们可以启动Quagga。
|
|
切换回Wireshark,如果一切设置正确,您将开始看到来自192.168.0.101的RIP数据包,广告其能够以度量1路由到192.168.1.0。
要查看毒化是否有效,检查R1,看它认为到192.168.1.0的最佳路由是什么。
与上面的图像比较,可以看到路由已从:
|
|
变为:
|
|
我们现在就位,让我们通过劫持一些流量来证明这一点。在VBox上启动tcpdump监听ICMP流量,然后在C1上尝试ping C2(192.168.1.100)。
就这样,VBox正在接收来自C1(192.168.0.100)的ping,这些ping本应发往C2(192.168.1.100)。
总结
如您所见,这种攻击非常容易执行,不需要任何特殊的黑客工具。它稍微有限,因为一旦您毒化了路由,您就无法与原始目的地通信,除非您有第二条路由到它,因为您已经破坏了有效路由,这意味着您不能轻易进行中间人攻击。您还受到可以毒化的网络区域的限制,在这个例子中,可以让R1接受新路由,因为VBox只有一跳之遥,而C2有两跳。如果还有另一个网络连接到R3的右侧,那么从VBox的跳数将高于从R3的跳数,因此毒化不会影响它。
如果必须使用RIP,版本2通过添加身份验证提供了对此的小防御,我将在第二部分中探讨这一点及其有效性。