mikrotik 漏洞复现(二)
字数 1463 2025-08-30 06:50:11
MikroTik漏洞复现与分析
漏洞概述
本文档详细分析MikroTik路由器系统中的两个关键漏洞:CVE-2018-1156(栈缓冲区溢出漏洞)和CVE-2018-1158(资源耗尽漏洞)。这两个漏洞都存在于MikroTik RouterOS系统中,可能被攻击者利用来执行任意代码或导致系统拒绝服务。
CVE-2018-1156 - 栈缓冲区溢出漏洞
漏洞描述
这是一个经过授权的栈缓冲区溢出漏洞,存在于/nova/bin/licupgr程序中。漏洞成因是调用了不安全的sprintf函数而没有对格式化字符串长度进行限制。
漏洞分析
-
漏洞函数:
- 程序中使用了
sprintf函数而没有限制格式化字符串长度 - 从4.49.0版本开始改用
snprintf函数限制了格式化字符串长度
- 程序中使用了
-
漏洞触发条件:
a2[1360]必须为0a4必须为0(所以!a4为1)v6必须为1才能不进入46行的if条件
-
调用链分析:
- 调用路径:
www→loader→licupgr - 在
nova/etc/loader/system.x3文件中,/nova/bin/licupgr映射到编号55
- 调用路径:
漏洞复现步骤
-
程序调用流程分析:
- Web请求通过80端口发送到
www程序 www程序加载/nova/lib/www/jsproxy.p作为Servletjsproxy.p处理POST请求并调用JSProxyServlet::doPost- 消息通过
threadExchangeMessage和Looper::exchMessage传递 loader程序通过Unix socket/ram/novasock接收消息
- Web请求通过80端口发送到
-
调试过程:
- 在
loader程序中定位fork和execve调用 - 修改代码使父进程走子进程路线以便调试
- 最终
execl调用licupgr程序
- 在
-
漏洞利用:
- 测试
passwd=%s格式化字符串的溢出长度 - 根据报错的EIP确定偏移(1002)
- 构造ROP链(程序几乎没有保护措施)
- 测试
漏洞修复
从4.49.0版本开始,使用snprintf替代sprintf限制了格式化字符串长度。
CVE-2018-1158 - 资源耗尽漏洞
漏洞描述
这是一个由于递归解析嵌套结构体导致系统资源耗尽的漏洞,存在于/nova/lib/www/jsproxy.p中。
漏洞分析
-
消息格式解析:
- 程序解析Winbox message字符串格式数据
- 不同类型对应不同的插入函数
- 'm'类型表示子结构体(嵌套message)
-
漏洞触发机制:
- 当解析到'm'类型时,会递归调用解析函数
- 构造全部为子结构体的字符串会导致无限递归
- 每次递归都会消耗系统资源
漏洞复现
-
调试过程:
- 修改IDA基址与加载基址一致以便分析
- 定位到递归解析函数
- 观察递归深度和资源消耗情况
-
漏洞利用:
- 构造全部为子结构体的消息字符串
- 系统内存被快速耗尽
- 最终导致系统关机或拒绝服务
漏洞修复
应对递归深度进行限制,或对嵌套结构体数量进行限制。
总结
这两个漏洞展示了MikroTik RouterOS系统中不同类型的安全问题:
- CVE-2018-1156是经典的缓冲区溢出漏洞,由于使用不安全函数导致
- CVE-2018-1158是资源管理不当导致的拒绝服务漏洞
修复建议:
- 替换所有不安全的字符串处理函数
- 对递归调用和嵌套结构体深度进行限制
- 启用更多安全保护机制(如栈保护)