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
成功执行

                
            
        
浙公网安备 33010602011771号