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函数而没有对格式化字符串长度进行限制。

漏洞分析

  1. 漏洞函数

    • 程序中使用了sprintf函数而没有限制格式化字符串长度
    • 从4.49.0版本开始改用snprintf函数限制了格式化字符串长度
  2. 漏洞触发条件

    • a2[1360]必须为0
    • a4必须为0(所以!a4为1)
    • v6必须为1才能不进入46行的if条件
  3. 调用链分析

    • 调用路径:wwwloaderlicupgr
    • nova/etc/loader/system.x3文件中,/nova/bin/licupgr映射到编号55

漏洞复现步骤

  1. 程序调用流程分析

    • Web请求通过80端口发送到www程序
    • www程序加载/nova/lib/www/jsproxy.p作为Servlet
    • jsproxy.p处理POST请求并调用JSProxyServlet::doPost
    • 消息通过threadExchangeMessageLooper::exchMessage传递
    • loader程序通过Unix socket /ram/novasock接收消息
  2. 调试过程

    • loader程序中定位forkexecve调用
    • 修改代码使父进程走子进程路线以便调试
    • 最终execl调用licupgr程序
  3. 漏洞利用

    • 测试passwd=%s格式化字符串的溢出长度
    • 根据报错的EIP确定偏移(1002)
    • 构造ROP链(程序几乎没有保护措施)

漏洞修复

从4.49.0版本开始,使用snprintf替代sprintf限制了格式化字符串长度。

CVE-2018-1158 - 资源耗尽漏洞

漏洞描述

这是一个由于递归解析嵌套结构体导致系统资源耗尽的漏洞,存在于/nova/lib/www/jsproxy.p中。

漏洞分析

  1. 消息格式解析

    • 程序解析Winbox message字符串格式数据
    • 不同类型对应不同的插入函数
    • 'm'类型表示子结构体(嵌套message)
  2. 漏洞触发机制

    • 当解析到'm'类型时,会递归调用解析函数
    • 构造全部为子结构体的字符串会导致无限递归
    • 每次递归都会消耗系统资源

漏洞复现

  1. 调试过程

    • 修改IDA基址与加载基址一致以便分析
    • 定位到递归解析函数
    • 观察递归深度和资源消耗情况
  2. 漏洞利用

    • 构造全部为子结构体的消息字符串
    • 系统内存被快速耗尽
    • 最终导致系统关机或拒绝服务

漏洞修复

应对递归深度进行限制,或对嵌套结构体数量进行限制。

总结

这两个漏洞展示了MikroTik RouterOS系统中不同类型的安全问题:

  1. CVE-2018-1156是经典的缓冲区溢出漏洞,由于使用不安全函数导致
  2. CVE-2018-1158是资源管理不当导致的拒绝服务漏洞

修复建议:

  1. 替换所有不安全的字符串处理函数
  2. 对递归调用和嵌套结构体深度进行限制
  3. 启用更多安全保护机制(如栈保护)
MikroTik漏洞复现与分析 漏洞概述 本文档详细分析MikroTik路由器系统中的两个关键漏洞:CVE-2018-1156(栈缓冲区溢出漏洞)和CVE-2018-1158(资源耗尽漏洞)。这两个漏洞都存在于MikroTik RouterOS系统中,可能被攻击者利用来执行任意代码或导致系统拒绝服务。 CVE-2018-1156 - 栈缓冲区溢出漏洞 漏洞描述 这是一个经过授权的栈缓冲区溢出漏洞,存在于 /nova/bin/licupgr 程序中。漏洞成因是调用了不安全的 sprintf 函数而没有对格式化字符串长度进行限制。 漏洞分析 漏洞函数 : 程序中使用了 sprintf 函数而没有限制格式化字符串长度 从4.49.0版本开始改用 snprintf 函数限制了格式化字符串长度 漏洞触发条件 : a2[1360] 必须为0 a4 必须为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 作为Servlet jsproxy.p 处理POST请求并调用 JSProxyServlet::doPost 消息通过 threadExchangeMessage 和 Looper::exchMessage 传递 loader 程序通过Unix socket /ram/novasock 接收消息 调试过程 : 在 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是资源管理不当导致的拒绝服务漏洞 修复建议: 替换所有不安全的字符串处理函数 对递归调用和嵌套结构体深度进行限制 启用更多安全保护机制(如栈保护)