mikrotik 漏洞复现(三)
字数 1394 2025-08-30 06:50:11
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字段) - 文件描述符不直接返回客户端,而是存储在服务端会话中
- 服务端返回session ID(
-
文件读取(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读取文件内容
- 使用7号功能打开文件,构造合法路径如
-
目录穿越:
- 使用三层
./..返回系统根目录 - 示例路径:
./.././.././../../etc/passwd
- 使用三层
-
缓冲区溢出利用:
- 构造特殊UDP数据包
- 触发
sub_8054607函数中的循环 - 通过精心设计的数据覆盖返回地址
防御建议
- 严格验证所有用户提供的路径
- 实现完整的目录遍历防护
- 为缓冲区操作添加长度检查
- 及时更新到MikroTik提供的最新固件版本
技术总结
CVE-2018-14847漏洞展示了多个安全问题:
- 不安全的路径处理导致目录遍历
- 会话管理设计缺陷
- 缓冲区操作缺乏边界检查
- 指针安全问题
这些问题的组合使得攻击者能够实现未授权的任意文件读写,甚至可能导致远程代码执行。