前言
本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274
本文分析 Vault 7
中泄露的 RouterOs
漏洞。漏洞影响 6.38.5
以下的版本。
What's new in 6.38.5 (2017-Mar-09 11:32):
!) www - fixed http server vulnerability;
文中涉及的文件:
链接: https://pan.baidu.com/s/1i5oznSh 密码: 9r43
正文
补丁对比&&漏洞分析
首先我们先来看看漏洞的原理,漏洞位于 www
文件。
我们需要拿到 www
文件, 直接用 binwalk
提取出 router os
镜像文件的所有内容。
binwalk -Me mikrotik-6.38.4.iso
然后在提取出的文件中搜索即可。
同样的方法提取出 mikrotik-6.38.5.iso
中的 www
文件。
然后使用 diaphora
插件 对 这两个文件进行补丁比对 (因为 6.38.5
正好修复了漏洞)
首先打开 www_6384
(6.38.4版本的文件), 然后使用 diaphora
导出 sqlite
数据库, diaphora
使用这个数据库文件进行 diff
操作。
然后打开 www_6385
(6.38.5版本的文件),使用 diaphora
进行 diff
找到相似度比较低的函数
选中要查看差异的 条目 ,然后右键
可以选择查看 diff
的选项,使用 diff pseudo-code
就可以对 伪c
代码 diff
对比 diff
可以发现, 修复漏洞后的程序 没有了 alloca
, 而是直接使用 string::string
构造了 字符串。
下面直接分析 www_6384
.
获取 content-length
的值之后,就传给了 alloca
分配内存。
这里和前文不同的是,这里 alloca
的参数是 无符号数。
所以我们能修改的是栈顶以上的数据,触发崩溃的poc.
poc
from pwn import *
def makeHeader(num):
return "POST /jsproxy HTTP/1.1
Content-Length: " + str(num) + "
"
s1 = remote("192.168.2.124", 80)
s1.send(makeHeader(-1) + "A" * 1000)
注:ip 按实际情况设置
调试环境搭建&&Poc测试
首先我们得先安装 routeros
, 使用 vmware
加载 iso
注: routeros
是 32 位的, 硬盘类型要为 ide
否则会找不到驱动。
然后开启虚拟机,就会进入
按 a
选择所有 ,然后按 i
进行安装,然后一直输入 y
确定即可。
安装完成后,重启,就会进入 登录界面了,使用 admin
和空密码登录即可。
然后输入 setup
,接着输入 a
, 按照提示配置好 ip
地址。
然后就可以使用 ssh
登录了。
Router Os
对 linux
做了大量的裁剪,所以我们需要给系统增加一些文件方便进行调试,busybox
和 gdbserver
(文件在百度云内)。
要增加文件需要使用一个 live-cd
版的 linux
挂载 router os
的磁盘分区,增加文件。这里使用了 ubuntu
.
关闭虚拟机,设置光盘镜像,然后修改引导为 光盘即可进入 live-cd
。
选择 try ubuntu
, 进入系统后,挂载 /dev/sda1
和 /dev/sda2
把 busybox
和 gdbserver
放到 bin
目录(不是在/dev/sda1
就是在 /dev/sda2
)下,然后在 etc
目录下新建 rc.d/run.d/S99own
, 内容为
#!/bin/bash
mkdir /ram/mybin
/flash/bin/busybox-i686 --install -s /ram/mybin
export PATH=/ram/mybin:$PATH
telnetd -p 23000 -l bash
umount
然后去掉光盘, 重新启动,应该就可以 telnet 192.168.2.124 23000
连接了。
此时使用
gdbserver.i686 192.168.2.124:5050 --attach $(pidof www)
如图
然后 gdb 连上去。
target remote 192.168.2.124:5050
运行poc
,程序崩溃。
参考: