CNVD-2018-01084 远程代码执行复现
Dlink DIR 615/645/815 路由上远程代码执行漏洞。漏洞存在于 /htdocs/cgibin
二进制文件中,原因是 service.cgi
中未经过滤就将用户输入拼接到命令中。
复现环境
- 漏洞固件 Firmware:DIR-645_A1_FW: v1.02b08 (for WW) (tw官网选择 DIR-645 第一个文件)
版本号为 v1.02(v1.03完成修复) - qemu v5.2
- Ubuntu 18.04
- ida 7.5(能搞 mips 反编译工具都行)
直接运行如下:
漏洞分析
strrchr
匹配出 /
后面的参数后,strcmp
匹配参数进入各个服务函数:
定位到 servicecgi_main
。getenv
提取参数依据两种请求方式分别给 v2 赋值,不匹配或为空则退出;提取请求方式后,将参数传入 cgibin_parse_request
解析 http 请求:
到里面分别提取REQUEST_URI
、 CONTENT_TYPE
、CONTENT_LENGTH
,
当解析无误后返回上层函数,然后进入权限认证:
在这个认证函数内部的函数 sess_get_uid
,可以看到是从 HTTP_COOKIE 里面获取 uid 判断:
进入 sub_40A950
将 URL ? 后面部分与关键词匹配,如果一致就开始准备进入拼接命令字符串:
lxmldbc_system
里面将预制指令和 URL 里面参数进行拼接:
Event 命令字符串为:"event %s > /dev/null"
,中间我们可以加上任意指令比如:"event &ls& > /dev/null"
开始测试前,权限认证那里由于少文件等,要将那个函数 patch 改一下。把跳转 session 改掉不然会卡一段时间,因为仿真没有 /var/session
文件;v1 的复制改为 1 就是代表有权限:
测试一下,启动命令:
-0:传入第一个参数,进入 servicecgi_main
-E:选项传入自定义的环境变量
-strace:显示具体信息
1 | sudo chroot . ./qemu-mipsel \ |
启动后,报错解析不了:
加上调试解析函数看都是解析正确,单步调试就发现是成功解析后执行 retrun 函数并没有返回到上一层,而是继续往下执行 95 行的 retrun v9 这是的 v9 为 -1 :
cataLpa 师傅复现文章也出现相同情况,推测可能是 qemu 仿真问题。这里可以直接改寄存器或者 patch 一下。
再次启动,这次就正常回显,但是没有运行附加进去的指令:
附加上 -strace
查看一下详细信息:
1 | sudo chroot . ./qemu-mipsel -g 1234 -strace \ |
指令已经附加上去,应该是 qemu 环境问题运行不了。