D-Link系列路由器未授权命令执行漏洞 (CVE-2019-16920)

0x01.漏洞概述

1.简介

D-Link设备中出现未经身份验证的命令注入漏洞(FG-VD-19-117/CVE-2019-16920),该漏洞可造成远程代码执行。

2.受影响的D-Link产品:

DIR-655 ,DIR-866L,DIR-652,DHP-1565,DIR-855L,DAP-1533,DIR-862L,DIR-615,DIR-835,DIR-825等

0x02.漏洞起因

该漏洞由于错误的身份验证检查而造成,这里我们对登录操作进行代理查看传输的数据

upload successful

这里我们可以发现我们访问登录界面login_pic.asp而post数据发送的位置确是apply_sec.cgi,这时候可以确定处理登录请求的是apply_sec.cgi

0x03.提取固件

upload successful

这里使用DIR-866L进行测试,使用binwalk成功提取固件

0x04.查找apply_sec.cgi

upload successful

grep查找apply_sec.cgi,路由器处理数据大都在底层的二进制文件中,由于lib一般存放的是一些库文件,可以确定www/cgi/ssi是apply_sec.cgi代码所在的文件

0x05.ghidra分析ssi

upload successful

通过搜索apply_sec.cgi发现代码位于do_ssc函数中,接下来我们来分析do_ssc函数

upload successful

这里可以看出current_user,user_username的值从nvram中获取

upload successful

往下分析可以看到将current_user的值与变量acStack160的值进行比较,CURRENT_USER在NVRAM中值只有在经过成功的用户登录设定,所以默认它的价值没有被初始化,acStack160的值是base64encode(user_username)的结果,默认情况下user_username设置为admin,因此iVar2不可能返回0的值,因此不会返回错误的asp页面

upload successful

继续往下分析,函数put_querystring_env()对输入的post数据进行处理,跟进分析

upload successful

这里可以看到将数据保存到env中,然后我们回到调用函数继续分析函数query_vars()

upload successful

这提供了action的值,该值保存在env中的acStack288。如果执行成功,函数将返回值0。

回到调用函数继续往下分析,当iVar2等于0时,我们进入if条件。它将URI值与字符串“ /apply_sec.cgi”进行比较。如果是,则ppcVar3将指向SSC_SEC_OBJS数组,否则,它将指向SSC_OBJS数组

upload successful

ppcVar3指向SSC_SEC_OBJS数组,该数组是操作值的列表。如果输入的值不在列表中,则程序将跳转到LAB_0040a458,它输出错误:”No OBJS for action:”

通过上面的分析,我们知道既是我们没有进行正确的身份验证,代码人能正常的执行,这是我们可以在/apply_sec.cgi下执行任意符合SSC_SEC_OBJS数组的操作

upload successful

SSC_SEC_OBJS操作数组在哪里,通过双击可以看到ssc_sec_action_register调用

upload successful
查看调用者,最后可以发现调用函数是init_plugin()函数,而且也知道了存储数组的地址是0051d89c

upload successful

由于ghidra查看数组的信息不够清晰,所以这里使用了ida进行分析

upload successful

跳到指定地址,发现了多个action处理方式,漏洞所在的是ping_test这个action

upload successful

接着我们去分析一下ping_test的处理函数

upload successful

upload successful

sub_41A010函数从参数ping_ipaddr中获取其值。它通过inet_aton(),inet_ntoa()函数将其转换,然后执行ping操作,这里由于过滤不严能够使用换行符%0a执行系统命令

0x06.漏洞验证

upload successful

在攻击者的vps服务器上,开启apache2服务

upload successful

通过burp代理将action改为ping_test,同时添加ping_ipaddr要ping的地址,通过%0a换行符,%20空格执行curl命令访问攻击者的vps服务器

upload successful

然后查看服务器的apache的日志,可以看到目标ip成功访问,说明目标机器已经成功执行系统命令

0x07.修复建议

受影响的设备部分已经过了修复生命周期,这意味着供应商将不会为我们发现的问题提供修复程序,对于这类设备希望用户能够更新设备,对于没有过生命周期的设备,希望用户能及时升级固件,安装修复程序

0x08.参考链接

1.https://www.fortinet.com/blog/threat-research/d-link-routers-found-vulnerable-rce.html