mikrotik 漏洞复现(三)
字数 1394 2025-08-30 06:50:11

MikroTik漏洞复现(CVE-2018-14847)深度分析

漏洞概述

CVE-2018-14847是MikroTik RouterOS中存在的一个严重漏洞,允许攻击者在未经授权的情况下读取和写入任意文件。该漏洞存在于Winbox协议处理中,主要涉及路径验证不严和会话管理问题。

漏洞分析

关键函数分析

漏洞核心位于sub_8050F5E函数中,该函数负责处理文件路径验证:

  1. 路径解析机制

    • 使用tokenize函数以"/"为分隔符拆分用户输入的路径
    • 对每个路径片段进行处理,检查是否存在目录遍历尝试
    • 检查逻辑存在缺陷:仅当".."出现在路径开头时才被判定为非法
  2. 路径验证绕过技巧

    • 在每个".."前添加"./"可绕过检查
    • 示例:etc/passwd会被接受为合法路径
    • 最终路径会与/home/web/webfig//var/pckg/拼接

敏感文件检测

isSensitiveFile函数负责检测敏感文件,触发条件包括:

  • .backup结尾
  • .json结尾
  • 包含.sensitive.子串

文件操作流程

  1. 文件打开(7号功能)

    • 服务端返回session ID(uFE0001字段)和文件大小(u2字段)
    • 文件描述符不直接返回客户端,而是存储在服务端会话中
  2. 文件读取(4号功能)

    • 使用之前获取的session ID标识要操作的文件
    • sub_8054196函数根据session ID查找对应的文件描述符

会话管理机制

  • 服务端维护会话状态,包含打开的文件描述符等信息
  • 客户端通过session ID维持与服务端的会话关联
  • 实验验证:打开两个不同文件,仅使用第二个文件的session ID仍可正确读取对应文件

额外发现的漏洞

1. 缓冲区溢出漏洞

触发条件

  • 发送超过49字节的UDP数据
  • 位于sub_8054607函数中的while循环

漏洞细节

  1. 初始复制长度由接收的UDP数据决定
  2. 后续每次复制长度由前一次复制的最后一个字节决定
  3. 无长度限制导致可覆盖栈上数据,包括返回地址

利用方法

  1. 构造初始复制长度为0x24
  2. 后续跟随23字节数据
  3. 第24字节控制下一轮复制长度
  4. 通过爆破技术覆盖返回地址

爆破脚本思路

  • 设置第一轮复制长度为固定值
  • 爆破后续各轮复制长度
  • 利用栈上原有值增加覆盖可能性

2. 指针解引用漏洞

(具体细节需进一步分析)

漏洞复现步骤

  1. 文件读取

    • 使用7号功能打开文件,构造合法路径如etc/passwd
    • 获取返回的session ID
    • 使用4号功能和session ID读取文件内容
  2. 目录穿越

    • 使用三层./..返回系统根目录
    • 示例路径:./.././.././../../etc/passwd
  3. 缓冲区溢出利用

    • 构造特殊UDP数据包
    • 触发sub_8054607函数中的循环
    • 通过精心设计的数据覆盖返回地址

防御建议

  1. 严格验证所有用户提供的路径
  2. 实现完整的目录遍历防护
  3. 为缓冲区操作添加长度检查
  4. 及时更新到MikroTik提供的最新固件版本

技术总结

CVE-2018-14847漏洞展示了多个安全问题:

  • 不安全的路径处理导致目录遍历
  • 会话管理设计缺陷
  • 缓冲区操作缺乏边界检查
  • 指针安全问题

这些问题的组合使得攻击者能够实现未授权的任意文件读写,甚至可能导致远程代码执行。

MikroTik漏洞复现(CVE-2018-14847)深度分析 漏洞概述 CVE-2018-14847是MikroTik RouterOS中存在的一个严重漏洞,允许攻击者在未经授权的情况下读取和写入任意文件。该漏洞存在于Winbox协议处理中,主要涉及路径验证不严和会话管理问题。 漏洞分析 关键函数分析 漏洞核心位于 sub_8050F5E 函数中,该函数负责处理文件路径验证: 路径解析机制 : 使用 tokenize 函数以"/"为分隔符拆分用户输入的路径 对每个路径片段进行处理,检查是否存在目录遍历尝试 检查逻辑存在缺陷:仅当".."出现在路径开头时才被判定为非法 路径验证绕过技巧 : 在每个".."前添加"./"可绕过检查 示例: etc/passwd 会被接受为合法路径 最终路径会与 /home/web/webfig/ 或 /var/pckg/ 拼接 敏感文件检测 isSensitiveFile 函数负责检测敏感文件,触发条件包括: 以 .backup 结尾 以 .json 结尾 包含 .sensitive. 子串 文件操作流程 文件打开(7号功能) : 服务端返回session ID( uFE0001 字段)和文件大小( u2 字段) 文件描述符不直接返回客户端,而是存储在服务端会话中 文件读取(4号功能) : 使用之前获取的session ID标识要操作的文件 sub_8054196 函数根据session ID查找对应的文件描述符 会话管理机制 服务端维护会话状态,包含打开的文件描述符等信息 客户端通过session ID维持与服务端的会话关联 实验验证:打开两个不同文件,仅使用第二个文件的session ID仍可正确读取对应文件 额外发现的漏洞 1. 缓冲区溢出漏洞 触发条件 : 发送超过49字节的UDP数据 位于 sub_8054607 函数中的while循环 漏洞细节 : 初始复制长度由接收的UDP数据决定 后续每次复制长度由前一次复制的最后一个字节决定 无长度限制导致可覆盖栈上数据,包括返回地址 利用方法 : 构造初始复制长度为0x24 后续跟随23字节数据 第24字节控制下一轮复制长度 通过爆破技术覆盖返回地址 爆破脚本思路 : 设置第一轮复制长度为固定值 爆破后续各轮复制长度 利用栈上原有值增加覆盖可能性 2. 指针解引用漏洞 (具体细节需进一步分析) 漏洞复现步骤 文件读取 : 使用7号功能打开文件,构造合法路径如 etc/passwd 获取返回的session ID 使用4号功能和session ID读取文件内容 目录穿越 : 使用三层 ./.. 返回系统根目录 示例路径: ./.././.././../../etc/passwd 缓冲区溢出利用 : 构造特殊UDP数据包 触发 sub_8054607 函数中的循环 通过精心设计的数据覆盖返回地址 防御建议 严格验证所有用户提供的路径 实现完整的目录遍历防护 为缓冲区操作添加长度检查 及时更新到MikroTik提供的最新固件版本 技术总结 CVE-2018-14847漏洞展示了多个安全问题: 不安全的路径处理导致目录遍历 会话管理设计缺陷 缓冲区操作缺乏边界检查 指针安全问题 这些问题的组合使得攻击者能够实现未授权的任意文件读写,甚至可能导致远程代码执行。