我用一个例子疏通“路由器漏洞 & 复现”【建议收藏!!】
一、介绍 该缺陷存在于 Cisco IOS XR 软件的 Cisco Discovery Protocol 中,它可能导致黑客的攻击。
“该漏洞是 Cisco Discovery Protocol 中字段字符串输入的错误验证所致。黑客可以通过向受影响设备发送恶意 Cisco Discovery Protocol 数据包以利用漏洞。” “被成功利用的漏洞可能导致堆栈溢出,黑客便可以执行任意代码。”
Cisco 专家指出,其他黑客也可以利用此缺陷。美国国家安全局(NSA)声称该漏洞在漏洞排名中位居前 25。 IOS XR 网络操作系统 运行包括 NCS 540 560、NCS 5500、8000 和 ASR 9000 系列的 Cisco 路由器,该漏洞还会影响至少全球范围内都启用了 Cisco Discovery Protocol 的第三方白盒路由器和 Cisco 产品。Cisco 于 2020 年 2 月解决了 CVE-2020-3118 漏洞,以 CDPwn 跟踪其他四个严重问题。
二、实验工具与环境 2.1 实验工具 IDA 7.5,Xshell,gdbserver,gdb。
2.2 软件环境 XR 模拟器,kali 虚拟机。
三、复现过程 3.1 漏洞触发及 FMT 原理分析 本漏洞为格式化字符串漏洞,在同一函数中连续三次调用 snprintf 造成,通过 IDA 逆向 cdp 文件,找到漏洞点。
需要构造合适的 cdp 报文触发漏洞,cdp 协议格式如下图所示:
Scapy 库提供了构造 cdp 报文的 API,直接每个字段都构造一部分内容发送过去,用于确定漏洞点。
在 snprintf 出现的三个地址,即 0x41830F、0x418334 和 0x418359 处下断点,发送以上代码构成的数据包,使用 gdb 调试,可以得知三处 snprintf 的参数分别是 CDPMsgPortID、CDPMsgPlatform 和 CDPMsgVTPMgmtDomain。
64 位程序中,前 6 个参数存在寄存器中,从第 7 个参数开始才会出现在栈中,format 是 snprintf 函数的第 3 个参数,因此发送”%4$p”命令用来解析相对于 format 的第 4 个参数地址,即 snprintf 的第 7 个参数地址。
gdb 中输入 n 单步执行后查看内存,转化为 ASCII 码可以发现第 7 个参数就是栈顶存储的值。
0x7fffbca39d60 相对栈顶 0x7fffbca39cd0 偏移为 0x90,64 位程序每个参数占 8 位,所以 0x7fffbca39d60 是相对于 format 的第 22 个参数地址,即 snprintf 的第 25 个参数地址。以此可以实现任意内存写入。
3.2 漏洞利用 利用思路是将 strncmp 函数的 got 表地址改为 system 函数地址,进而远程代码执行。
system 函数地址为 0x399480ffa0,strncmp 函数地址为 0x3994481a70,两个地址只有最后 6 位(3 字节)不同。strncmp 函数 got 表地址为 0x622530。
构造 payload,payload1 写入 strncmp 函数的 got 地址(6432048 为 0x622530 的十进制形式)。
Payload2 修改 strncmp 函数 got 表指向地址(0x3994481a70)的最后两个字节,即将 0xffa0 写入栈空间 0x7fffbca39d60 处,覆盖原地址的 1a70;由于一共需要修改 3 字节,已修改 2 字节,还需要修改 1 字节,因此为保证写入栈空间的连续性,下一次写入需从 6432048+2 处开始写入;前面已经写入了 65440(0xffa0),因此 payload2 后半部分应该是 6366610(6432048+2-65440)。
payload3 用于修改 got 表指向地址的倒数第 3 个字节,写入 128(0x80)即可。
payload1 = %6432048c%4hn%6366610c%4hhn 输入 payload,对路由器进行调试。执行第一个 snprintf 后,payload1 将 got 表地址写入了栈中。
执行第二个 snprintf,输入 payload2。栈顶存放指针指向了 0x622532,而 strncmp 的 got 表指向地址的最后两个字节已经被修改。
执行第三个 snprintf,可以看到 strncmp 的 got 表已被修改为指向 system 函数。
在 0x399480ffa0 处下断点执行过去,发现参数全为 A,在构造 cdp 包的程序中由 CDPMsgDeviceID 控制。
使用 socat 命令,在 kali 中设置对应端口监听,最终即可反弹 shell。
与 XR 中的 cdp 进程号比对,完全相同,可以判断该漏洞利用成功。
我是一名渗透工作者,常年游走在漏洞当中,大家在学习中遇到任何问题,都可以申请加入我所在的亲亲箘,前面是:603 中间是:916 后面是:224,还有更多网络安全全套视频、工具包、书籍、应急响应笔记等着你,点这里获取
exp 如下所示:
评论