cisco设备CDP协议漏洞分析与挖掘

简介

去年还在研究挖洞的时候注意到了cisco设备的CVE-2020-3119漏洞,其实也是搞研究时间长了的一种直觉,觉得这个攻击面还可以再挖一挖,最终也是fuzz出一个DOS的洞CVE-2022-20625,也算还好吧,就简单分享一下。
注意:这篇笔记写于2021年4月向cisco报告漏洞之后,现在一些环境配置步骤等等可能已经发生变化。

环境搭建

固件提取有两种方法:一是搭建好环境之后ssh拷贝出固件;二是用How to mount a qcow2 disk image这里面的方法挂载qcow2文件,得到bin文件之后解压得到固件。我看参考的博客里面说第二种方法可以,但是我没有成功,我是用的第一种方法。

这里我们通过GNS3去仿真。我的环境是这样的:windows物理机上运行了VMware,在VMware里运行了GNS3 VM,在GNS3 VM里通过qemu运行交换机。然后VMware还运行了一个ubuntu虚拟机,在ubuntu虚拟机里面可以telnet到交换机和执行其他操作。建议windows物理机内存>=16G。

下载GNS3-2.2.19-all-in-one-regular.exe然后直接双击安装。勾选GNS3 WebClient和GNS3 VM。

GNS3 VM类型选择VMware Workstation。

因为要去下载虚拟机所以需要等待一段时间,也可以手动从gns的网站上下载。

安装完成启动之后选择Run appliances in a virtual machine。

其他全部默认即可,这里记得把CPU和RAM改大一点,因为运行交换机至少都需要8G。然后就会在vmware中打开GNS3 VM。

这个时候你看见GNS3 VM是绿色的说明就成功了。如果不是绿色的说明还有问题。

然后去gns3的网站上下载NX-OSv 9000的appliance。

点击File-Import appliance导入我们下载的appliance。

我们需要有对应版本固件的fd文件和qcow2文件。这个fd文件还是可以在gns3的网站上下载(https://docs-v1.gns3.com/appliances/cisco-nxosv9k.html), qcow2文件需要到cisco的网站上下载。

成功导入之后在switches中就可以看到了。然后我们新建一个project,把它拖进去,再在End devices中选择Cloud拖进去。我们把Cloud拖进去的时候可以选择宿主机或者GNS3 VM作为Server,这里选择GNS3 VM。

然后把它们连起来,再点击绿色的三角形启动设备。

从ubuntu的虚拟机里面用GNS3界面显示的telnet命令连接上去。

等待一段时间之后会让你输入yes/skip/no配置一个什么东西,我输的是skip。然后用用户名admin,密码为空就可以登录了。

最后需要配置交换机的ip地址。我们可以看到,我们设置连接的网卡是Ethernet 1/8,对应的MAC地址是0c:05:f5:bc:de:08。

找到这个MAC地址对应的网卡给它设置ip地址。

最后把ubuntu虚拟机上的公钥放到交换机的/root/.ssh/authorized_keys就可以用ssh登录了。有时交换机会crash掉出现No autoboot or failed autoboot. falling to loader这样的提示。目前没有找到好的解决方法,只能每次都重装一遍。如果有知道怎么办的师傅还希望能告知下。

漏洞复现

这里因为参考文章中都给出了非常详细的分析所以就不再赘述。根据参考文章得到一个非常简单的POC,效果如下:

漏洞挖掘

我们可以想一下如果是我们自己去挖怎么才能去挖到这个协议里面的漏洞。如果大家去复现了这个漏洞就会发现cdpd程序crash掉之后会自动重启并显示类似于Service “xxx” (PID 5883) hasn’t caught signal 11 (core will be saved)这样的信息。

那么这里我的想法就是dumb fuzzer,基于scapy实现的cdp去发变异的数据包。很多人特别是新手挖洞可能会有顾虑,特别是这种黑盒设备的网络协议fuzz不像在PC端有AFL之类非常完善的现成工具,一会儿想怎么去做代码覆盖率一会想怎么去做crash监控,其实没有必要,先把dumb fuzzer做出来,挖不到洞再完善。我给其他厂商报过的一些溢出的洞有的也是dumb fuzzer搞出来的。并且其实我觉得cdp协议的这种情况dumb fuzzer已经足够了,因为scapy实现的cdp已经足够完善,不存在说有了代码覆盖率的fuzzer能构造出的数据包dumb fuzzer就构造不出来;至于crash监控因为这个进程crash掉之后会自动重启,并且我也不熟悉这个设备,所以其实也没什么好的办法,只能人肉时不时看一下。

这就是我搞出来的crash:

接下来为了分析crash需要提取core dump。首先我们在ubuntu虚拟机上用vsftp搭建一个ftp服务器,这个很简单具体步骤就不说了。然后在交换机上启用interface vlan:

给它设一个IP地址,在ubuntu虚拟机里面能ping到就行。

这时就可以通过ftp把core dump拷贝到我们的ubuntu虚拟机上方便进一步分析。

1
copy core://<slot #>/<PID> ftp://<FTP IP addr>/<directory>/<filename>

参考资料

1.CDPwn系列之CVE-2020-3119分析

2.CVE-2020-3119 Cisco CDP协议栈溢出漏洞分析

3.How to select and download a Cisco switch core file

4.Retrieving Core files from Cisco Nexus switching platforms

作者

houjingyi

发布于

2022-03-19

更新于

2022-03-19

许可协议