CNVD-2018-01084 漏洞复现
CNVD-2018-01084 漏洞复现
前言
最近摆大烂,好像什么也没干,简单复现下这个漏洞
固件下载
之前想要复现
D-link
的漏洞时,去官网找附件不是没有就是小版本不对,zikh26
师傅给我说了一个网址这个上面D-link
的附件基本都有 https://ftp.dlink.ru/pub/Router/
漏洞复现
查看了一下官方文档发现漏洞是 /htdocs/cgibin
程序中的 service.cgi
二进制文件静态分析
既然都锁定了漏洞函数就是直接分析一下怎么调用的
这个漏洞是命令注入大概率是通过 system
,结合漏洞在 service.cgi
中通过交叉应用查看调用关系
servicecgi_main函数
进入 servicecgi_main
函数,发现需要给 REQUEST_METHOD
赋值为 POST
或 GET
都可以
cgibin_parse_request函数
下面就会进入 cgibin_parse_request
函数,通过分析下面的调用流程发现 cgibin_parse_request
的返回值大于零
进入这个函数发现还需要对 CONTENT_TYPE
, CONTENT_LENGTH
, REQUEST_URI
赋值,具体是什么往下面分析一下。
发现首先会将 REQUEST_URI
以?
进行字符串分割
在 sub_402B40
函数中会以 =
进行分割然后再以 &
进行分割 格式大概是 aaa?bbb=ccc&ddd
在下面将 CONTENT_TYPE
的前 0xc
和 off_42C014中的application/
进行比较,第三个参数 v7
其实就是 CONTENT_LENGTH
如果成功了就会调用 &off_42C014)[3 * v16 - 1]
其中 v16
是 1
,最后调用的是 sub_403B10
进入 sub_403B10
发现首先就是一个比较,也就是说 application/
后面需要跟 x-www-form-urlencoded
,因为 cgibin_parse_request
函数的返回值必须为非负数,进入 sub_403B10
调试一下发现因该是对发送数据的处理,我没有发送数据,调试发现返回值不为零就没有细看
然后就返回到 servicecgi_main
函数中进入 sess_ispoweruser
在里面会进入 sess_validate
在进入 sub_407660
中,在这个函数中会打开一文件,我是 qemu
模拟的没有这些文件,就直接 patch
掉或着用 set
修改寄存器的值
继续向下走发现是在匹配字符串的,具体这个字符串在哪里控制就调试看看
脚本
qemu-mipsel-static -g 1234 -L . \
-0 "service.cgi" \
-E REQUEST_METHOD="GET" \
-E REQUEST_URI="aaa?bbb=ccc&ddd" \
-E CONTENT_LENGTH=10 \
-E CONTENT_TYPE="application/x-www-form-urlencoded" \
./htdocs/cgibin
发现是 bbb
也就是 ?
后面 =
前面
至于问什么选着 EVENT
因为他拼接的字符串 event %s > /dev/null
, event
不是命令,这样就可以直接输入 ;cmd;
下面就进入 lxmldbc_system
函数了,但是 ida
上面显示的有点错错误,参数显示的不正确
ida
中
调试发现还有一个参数位置在 =
和 &
中间
看看伪代码因该是拼接到 event %s > /dev/null
中最后被 system
执行
修改改本如下
qemu-mipsel-static -g 1234 -L . \
-0 "service.cgi" \
-E REQUEST_METHOD="GET" \
-E REQUEST_URI="aaa?EVENT=;ls;&ddd" \
-E CONTENT_LENGTH=10 \
-E CONTENT_TYPE="application/x-www-form-urlencoded" \
./htdocs/cgibin
成功执行