Dlink DIR 615/645/815 路由上远程代码执行漏洞。漏洞存在于 /htdocs/cgibin 二进制文件中,原因是 service.cgi 中未经过滤就将用户输入拼接到命令中。

复现环境

版本号为 v1.02(v1.03完成修复)

  • qemu v5.2
  • Ubuntu 18.04
  • ida 7.5(能搞 mips 反编译工具都行)

直接运行如下:

image-20210209215850264

漏洞分析

strrchr 匹配出 / 后面的参数后,strcmp 匹配参数进入各个服务函数:

image-20210209215637987

定位到 servicecgi_maingetenv 提取参数依据两种请求方式分别给 v2 赋值,不匹配或为空则退出;提取请求方式后,将参数传入 cgibin_parse_request 解析 http 请求:

image-20210209220241088

到里面分别提取REQUEST_URICONTENT_TYPECONTENT_LENGTH

image-20210209221145009

当解析无误后返回上层函数,然后进入权限认证:

image-20210209221306768

在这个认证函数内部的函数 sess_get_uid ,可以看到是从 HTTP_COOKIE 里面获取 uid 判断:

image-20210209221716723

进入 sub_40A950 将 URL ? 后面部分与关键词匹配,如果一致就开始准备进入拼接命令字符串:

image-20210209222749033

lxmldbc_system 里面将预制指令和 URL 里面参数进行拼接:

image-20210209222937398

Event 命令字符串为:"event %s > /dev/null" ,中间我们可以加上任意指令比如:"event &ls& > /dev/null"

开始测试前,权限认证那里由于少文件等,要将那个函数 patch 改一下。把跳转 session 改掉不然会卡一段时间,因为仿真没有 /var/session 文件;v1 的复制改为 1 就是代表有权限:

image-20210209232026784

image-20210209231657216

测试一下,启动命令:

-0:传入第一个参数,进入 servicecgi_main

-E:选项传入自定义的环境变量

-strace:显示具体信息

sudo chroot . ./qemu-mipsel \
-0 "service.cgi" \
-E REQUEST_METHOD="POST" \
-E CONTENT_LENGTH=10 \
-E REQUEST_URI="service.cgi?EVENT=%26ls%26" \
-E CONTENT_TYPE="application/x-www-form-urlencoded" \
-E HTTP_COOKIE="uid=skye231" \
./htdocs/cgibin 

启动后,报错解析不了:

image-20210209230233246

加上调试解析函数看都是解析正确,单步调试就发现是成功解析后执行 retrun 函数并没有返回到上一层,而是继续往下执行 95 行的 retrun v9 这是的 v9 为 -1 :

image-20210209231306395

cataLpa 师傅复现文章也出现相同情况,推测可能是 qemu 仿真问题。这里可以直接改寄存器或者 patch 一下。

再次启动,这次就正常回显,但是没有运行附加进去的指令:

image-20210209232205679

附加上 -strace 查看一下详细信息:

sudo chroot . ./qemu-mipsel -g 1234 -strace \
-0 "service.cgi" \
-E REQUEST_METHOD="POST" \
-E CONTENT_LENGTH=10 \
-E REQUEST_URI="service.cgi?EVENT=%26ls%26" \
-E CONTENT_TYPE="application/x-www-form-urlencoded" \
-E HTTP_COOKIE="uid=skye231" \
./htdocs/cgibin 

image-20210209233118432

指令已经附加上去,应该是 qemu 环境问题运行不了。

参考文章

https://wzt.ac.cn/2019/09/05/CNVD-2018-01084/

Last modification:February 9th, 2021 at 11:46 pm