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.漏洞起因
该漏洞由于错误的身份验证检查而造成,这里我们对登录操作进行代理查看传输的数据
这里我们可以发现我们访问登录界面login_pic.asp而post数据发送的位置的确是apply_sec.cgi,这时候可以确定处理登录请求的是apply_sec.cgi
0x03.提取固件
这里使用DIR-866L进行测试,使用binwalk成功提取固件
0x04.查找apply_se
grep查找apply_sec.cgi,路由器处理数据大都在底层的二进制文件中,由于lib一般存放的是一些库文件,可以确定www/cgi/ssi是apply_sec.cgi代码所在的文件
0x05.ghidra分析ssi
通过搜索apply_sec.cgi发现代码位于do_ssc函数中,接下来我们来分析do_ssc函数
这里可以看出current_user,user_username的值从nvram中获取
往下分析可以看到将current_user的值与变量acStack160的值进行比较,CURRENT_USER在NVRAM中值只有在经过成功的用户登录设定,所以默认它的价值没有被初始化,acStack160的值是base64encode(user_username)的结果,默认情况下user_username设置为admin,因此iVar2不可能返回0的值,因此不会返回错误的asp页面
继续往下分析,函数put_querystring_env()对输入的post数据进行处理,跟进分析
这里可以看到将数据保存到env中,然后我们回到调用函数继续分析函数query_vars()
这提供了action的值,该值保存在env中的acStack288。如果执行成功,函数将返回值0。
回到调用函数继续往下分析,当iVar2等于0时,我们进入if条件。它将URI值与字符串“ /apply_sec.cgi”进行比较。如果是,则ppcVar3将指向SSC_SEC_OBJS数组,否则,它将指向SSC_OBJS数组
ppcVar3指向SSC_SEC_OBJS数组,该数组是操作值的列表。如果输入的值不在列表中,则程序将跳转到LAB_0040a458,它输出错误:”No OBJS for action:”
通过上面的分析,我们知道就是我们没有进行正确的身份验证,代码能正常的执行,这是我们可以在/apply_sec.cgi下执行任意符合SSC_SEC_OBJS数组的操作
SSC_SEC_OBJS操作数组在哪里,通过双击可以看到ssc_sec_action_register调用
查看调用者,最后可以发现调用函数是init_plugin()函数,而且也知道了存储数组的地址是0051d89c
由于ghidra查看数组的信息不够清晰,所以这里使用了ida进行分析
跳到指定地址,发现了多个action处理方式,漏洞所在的是ping_test这个action
接着我们去分析一下ping_test的处理函数
sub_41A010函数从参数ping_ipaddr中获取其值。它通过inet_aton(),inet_ntoa()函数将其转换,然后执行ping操作,这里由于过滤不严能够使用换行符%0a执行系统命令
0x06.漏洞验证
在攻击者的vps服务器上,开启apache2服务
通过burp代理将action改为ping_test,同时添加ping_ipaddr要ping的地址,通过%0a换行符,%20空格执行curl命令访问攻击者的vps服务器
然后查看服务器的apache的日志,可以看到目标ip成功访问,说明目标机器已经成功执行系统命令
0x07.修复建议
受影响的设备部分已经过了修复生命周期,这意味着供应商将不会为我们发现的问题提供修复程序,对于这类设备希望用户能够更新设备,对于没有过生命周期的设备,希望用户能及时升级固件,安装修复程序
-end